Spring整合Struts2
1.启动Spring容器
对于使用Spring的Web应用,无须手动创建Spring容器,而是通过配置文件,声明式地创建Spring容器。其中有两种方式:一是直接在web.xml文件中配置创建Spring容器;二是利用三方MVC框架的扩展点,创建Spring容器。下面使用方法一:
<!--使用ContextLoaderListener初始化Spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
如果有多个Spring配置文件,则还要加上下面的配置
<context-param>
<param-name>contextConfigLocation</param-name>
<!--多个配置文件之间以逗号隔开,或者使用classpath:test/application*.xml全部一起引入(src/test下)-->
<param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml</param-value>
</context-param>
如果需要在应用中获取ApplicationContext实例,则可以通过如下代码获取:
WebApplicationContextctx=WebApplicationContextUtils.getWebApplicationContext(servletContext);当然也可以通过Servlet的getAttribute("WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE")方法获取ApplicationContext。
完整web.xml配置文件如下:
<?xmlversion="1.0"encoding="UTF-8"?>
<web-appversion="2.5"xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!--使用ContextLoaderListener初始化Spring容器-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!--定义Struts2的FilterDispathcer的Filter-->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<!--FilterDispatcher用来初始化Struts2并且处理所有的WEB请求。-->
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
2.Action(LoginAction.java)
packagetest.action;
importcom.opensymphony.xwork2.Action;
importtest.service.*;
publicclassLoginActionimplementsAction{
//下面是用于封装用户请求参数的两个属性
privateStringusername;
privateStringpassword;
//用于封装处理结果的属性
privateStringtip;
//系统所用的业务逻辑组件
privateMyServicems;
publicvoidsetMs(MyServicems){
this.ms=ms;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetUsername(){
returnthis.username;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicStringgetPassword(){
returnthis.password;
}
publicvoidsetTip(Stringtip){
this.tip=tip;
}
publicStringgetTip(){
returnthis.tip;
}
//处理用户请求的execute方法
publicStringexecute()throwsException{
//调用业务逻辑组件的valid方法来,验证用户输入的用户名和密码是否正确
if(ms.valid(getUsername(),getPassword())){
setTip("哈哈,整合成功!");
returnSUCCESS;
}else{
returnERROR;
}
}
}
3.Struts配置文件(struts.xml)
<?xmlversion="1.0"encoding="GBK"?>
<!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constantname="struts.i18n.encoding"value="GBK"/>
<constantname="struts.devMode"value="true"/>
<packagename="lee"extends="struts-default">
<!--定义处理用户请求的Action,该Action的class属性不是实际处理类,而是Spring容器中的Bean实例-->
<actionname="loginPro"class="loginAction">
<resultname="error">/content/error.jsp</result>
<resultname="success">/content/welcome.jsp</result>
</action>
<!--让用户直接访问该应用时列出所有视图页面-->
<actionname="*">
<result>/content/{1}.jsp</result>
</action>
</package>
</struts>
4.业务处理Service(接口MyService.java和实现MyServiceImpl.java)
接口:
packagetest.service;
publicinterfaceMyService{
booleanvalid(Stringusername,Stringpass);
}
实现:
packagetest.service.impl;
importtest.service.*;
publicclassMyServiceImplimplementsMyService{
publicbooleanvalid(Stringusername,Stringpass){
//此处只是简单示范,故直接判断用户名、密码是否符合要求
if(username.equals("aaa")&&pass.equals("sss")){
returntrue;
}
returnfalse;
}
}
5.Spring配置文件(applicationContext.xml)
<?xmlversion="1.0"encoding="GBK"?>
<!--Spring配置文件的根元素,使用spring-beans-3.0.xsd语义约束-->
<beansxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<beanid="myService"class="test.service.impl.MyServiceImpl"/>
<!--让Spring管理的Action实例-->
<beanid="loginAction"class="test.action.LoginAction"scope="prototype">
<propertyname="ms"ref="myService"/>
</bean>
</beans>
6.测试页面
login.jsp:
<%@pagecontentType="text/html;charset=GBK"language="java"errorPage=""%>
<%@taglibprefix="s"uri="/struts-tags"%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head><title>登录页面</title></head>
<body>
<h3>用户登录</h3>
<s:formaction="loginPro">
<s:textfieldname="username"label="用户名"/><s:textfieldname="password"label="密码"/>
<tralign="center"><tdcolspan="2"><s:submitvalue="登录"theme="simple"/><s:resetvalue="重设"theme="simple"/></td></tr>
</s:form>
</body>
</html>
error.jsp:
<%@pagecontentType="text/html;charset=GBK"language="java"errorPage=""%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head><title>错误页面</title></head>
<body>
您不能登录!
</body>
</html>
welcome.jsp:
<%@pagecontentType="text/html;charset=GBK"language="java"errorPage=""%>
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<htmlxmlns="http://www.w3.org/1999/xhtml">
<head><title>错误页面</title></head>
<body>
您不能登录!
</body>
</html>
7.使用自动装配
使用自动装配,即让Spring管理Bean与Bean之间的依赖关系,自动将业务逻辑组件注入Struts2的Action实例中。下面采用按name来完成自动装配,按name装配时无须设置任何的Struts2常量。只需要修改上例中的两个配置文件。
struts.xml:
<?xmlversion="1.0"encoding="GBK"?>
<!DOCTYPEstrutsPUBLIC"-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.1.7//EN"
"http://struts.apache.org/dtds/struts-2.1.7.dtd">
<struts>
<constantname="struts.i18n.encoding"value="GBK"/>
<constantname="struts.devMode"value="true"/>
<packagename="lee"extends="struts-default">
<!--定义处理用户请求的Action,此处修改为原本的类路径-->
<actionname="loginPro"class="test.action.LoginAction">
<resultname="error">/content/error.jsp</result>
<resultname="success">/content/welcome.jsp</result>
</action>
<!--让用户直接访问该应用时列出所有视图页面-->
<actionname="*">
<result>/content/{1}.jsp</result>
</action>
</package>
</struts>
applicationContext.xml:
<?xmlversion="1.0"encoding="GBK"?>
<!--Spring配置文件的根元素,使用spring-beans-3.0.xsd语义约束-->
<beansxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!--此处去掉原来Action类的Bean,让其自动装配。只需让业务BeanID和Action类中的变量名相同-->
<beanid="ms"class="test.service.impl.MyServiceImpl"/>
</beans>