Struts2.2.1整合Spring3.0的两种步骤
Struts2.2.1整合Spring3.0的两种方法
首先让spring加入到web应用中,在web应用中一般是启动的时候初始化sping容器。我们知道servletContextListener可以做到这一点,该监听器在web应用启动时回调自定义方法--该方法就可以启动web容器。Sping提供了一个ContextLoaderListener该监听器实现了ServletContextListener接口,该类可以作为监听器使用。它在创建使自动查找web-inf下的applicationContext.xml配置文件。;
第一中整合方法:让Spring接管struts的业务控制器(也就是Action),换句话说就是让struts的action纳入spring的管理中。
我们知道Struts2的主要流程:先是请求到达Filter(也就是中央控制器),中央控制器通过解析struts.xml文件获取该请求是到哪一个业务控制器(也就是业务action),再通过反射创建这个业务控制器,我们这种整合就是让action的创建工作不再让struts的中央控制器去创建,而是用spring去创建,struts的中央控制器直接到spring的工厂中取Action即可。下面是具体的实例:
注意:此种方法需要引进spring的插件:struts2-spring-plugin-2.2.1.jar,Spring管理Action时一定要改变Action bean的scope不能将action的bean的scope设置为单例模式,需要改为:prototype 和 request两种。
此方法的缺点:
1,Spring管理Action,必须将每一个需要被管理的Action配置在applicationContext.xml文件中,而Struts的配置文件中也要配置每一个伪Action,配置两边未免冗余。
2,Action的业务逻辑租价接受容器注入,将导致代码的可读性降低。
1,Actin类:
2,service类:
3,配置文件strut-spring.xml(注:该文件应该用incluce标签包含到struts.xml文件中去)
4,applicationContext.xml配置文件:
<bean id="strutsSpringLogin" class="com.dd.action.StrutsSpringLogin">
<property name="sss" ref="strutsSpringLoginService"></property>
</bean>
<bean id="strutsSpringLoginService"
class="com.dd.service.StrutsSpringLoginService">
</bean>
5,登录页面:
6,登录成功页面:
7,登录失败页面
二:struts,spring的第二种整合方法:spring的自动装配。
所谓自动装配就是让spring插件自动将业务逻辑组建注入struts2的Action中,而无需使用ref显示指定以来Bean,spring容器会自动检查xml配置文件内容,为主调bean注入依赖bean,自动装配可以减少配置文件的工作量,但会减低依赖关系的透明性和清晰性。通过使用自动装配,可以让spring插件自动将业务逻辑组建注入struts2的action中。
下面是实例:
1,Action类;
2,service
3,struts的配置文件
4,spring的配置文件
5,用户入口页面:
6,登录成功页面:
首先让spring加入到web应用中,在web应用中一般是启动的时候初始化sping容器。我们知道servletContextListener可以做到这一点,该监听器在web应用启动时回调自定义方法--该方法就可以启动web容器。Sping提供了一个ContextLoaderListener该监听器实现了ServletContextListener接口,该类可以作为监听器使用。它在创建使自动查找web-inf下的applicationContext.xml配置文件。;
第一中整合方法:让Spring接管struts的业务控制器(也就是Action),换句话说就是让struts的action纳入spring的管理中。
我们知道Struts2的主要流程:先是请求到达Filter(也就是中央控制器),中央控制器通过解析struts.xml文件获取该请求是到哪一个业务控制器(也就是业务action),再通过反射创建这个业务控制器,我们这种整合就是让action的创建工作不再让struts的中央控制器去创建,而是用spring去创建,struts的中央控制器直接到spring的工厂中取Action即可。下面是具体的实例:
注意:此种方法需要引进spring的插件:struts2-spring-plugin-2.2.1.jar,Spring管理Action时一定要改变Action bean的scope不能将action的bean的scope设置为单例模式,需要改为:prototype 和 request两种。
此方法的缺点:
1,Spring管理Action,必须将每一个需要被管理的Action配置在applicationContext.xml文件中,而Struts的配置文件中也要配置每一个伪Action,配置两边未免冗余。
2,Action的业务逻辑租价接受容器注入,将导致代码的可读性降低。
1,Actin类:
package com.dd.action; import com.dd.service.StrutsSpringLoginService; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class StrutsSpringLogin extends ActionSupport { private String username; private String password; private String tip; private StrutsSpringLoginService sss; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getTip() { return tip; } public void setTip(String tip) { this.tip = tip; } public StrutsSpringLoginService getSss() { return sss; } public void setSss(StrutsSpringLoginService sss) { this.sss = sss; } public String execute() throws Exception { if(sss.validateLogin(getUsername(), getPassword()).equals("success")){ setTip("服务器提示:登录成功"); ActionContext.getContext().getSession().put("username", getUsername()); return SUCCESS; }else{ setTip("服务器提示:登录失败"); return ERROR; } } }
2,service类:
package com.dd.service; public class StrutsSpringLoginService { public String validateLogin(String username,String password){ if(username.equals("chenchaoyang") || password.equals("chenchaoyang")){ return "success"; }else{ return "error"; } } }
3,配置文件strut-spring.xml(注:该文件应该用incluce标签包含到struts.xml文件中去)
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <!-- 配置的package的name不能和主文件struts中的package名称相同 --> <package name="struts-spring" extends="struts-default"> <!-- 注意该Action的class属性值并不是一个具体的类,而是一个伪类,它表示的是spring配置文件中id为strutsSpringLogin的配置bean 这就是struts2与Spring第一种配置的关键配置点 --> <action name="strutsSpringLogin" class="strutsSpringLogin"> <result name="success">/strutsSpringLoginSuccess.jsp</result> <result name="error">/strutsSpringLoginError.jsp</result> </action> </package> </struts>
4,applicationContext.xml配置文件:
<bean id="strutsSpringLogin" class="com.dd.action.StrutsSpringLogin">
<property name="sss" ref="strutsSpringLoginService"></property>
</bean>
<bean id="strutsSpringLoginService"
class="com.dd.service.StrutsSpringLoginService">
</bean>
5,登录页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body><%--struts标签key对应的是国际化资源文件中的key --%> <s:form action="strutsSpringLogin"> <s:textfield name="username" key="user"></s:textfield> <s:textfield name="password" key="pass"></s:textfield> <s:submit key="login"></s:submit> </s:form> </body> </html>
6,登录成功页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> strutsSpring登录成功 <s:property value="tip"/> </body> </html>
7,登录失败页面
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> strutsSpring登录失败 <s:property value="tip"/> </body> </html>
二:struts,spring的第二种整合方法:spring的自动装配。
所谓自动装配就是让spring插件自动将业务逻辑组建注入struts2的Action中,而无需使用ref显示指定以来Bean,spring容器会自动检查xml配置文件内容,为主调bean注入依赖bean,自动装配可以减少配置文件的工作量,但会减低依赖关系的透明性和清晰性。通过使用自动装配,可以让spring插件自动将业务逻辑组建注入struts2的action中。
下面是实例:
1,Action类;
package com.dd.action; import com.dd.service.StrutsSpringAutoWireLoginService; import com.dd.service.StrutsSpringLoginService; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class StrutsSpringAutoWireLogin extends ActionSupport { private String username; private String password; private String tip; private StrutsSpringAutoWireLoginService sss; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getTip() { return tip; } public void setTip(String tip) { this.tip = tip; } public StrutsSpringAutoWireLoginService getSss() { return sss; } public void setSss(StrutsSpringAutoWireLoginService sss) { this.sss = sss; } public String execute() throws Exception { if(sss.validateLogin(getUsername(), getPassword()).equals("success")){ setTip("服务器提示:登录成功"); ActionContext.getContext().getSession().put("username", getUsername()); return SUCCESS; }else{ setTip("服务器提示:登录失败"); return ERROR; } } }
2,service
package com.dd.service; public class StrutsSpringAutoWireLoginService { public String validateLogin(String username,String password){ if(username.equals("chenchaoyang") || password.equals("chenchaoyang")){ return "success"; }else{ return "error"; } } }
3,struts的配置文件
<!-- 配置的package的name不能和主文件struts中的package名称相同 --> <package name="struts-spring" extends="struts-default"> <!-- 注意该Action的class属性值并不是一个具体的类,而是一个伪类,它表示的是spring配置文件中id为strutsSpringLogin的配置bean 这就是struts2与Spring第一种配置的关键配置点 --> <action name="strutsSpringLogin" class="strutsSpringLogin"> <result name="success">/strutsSpringLoginSuccess.jsp</result> <result name="error">/strutsSpringLoginError.jsp</result> </action> <!-- 下面的Action是采用自动装配的struts和spring整合,注意自动装配的方式配置action的class是真实的类,而不是伪类,切这个action依旧是spring来创建的。 --> <action name="strutsSpringAutoWireLogin" class="com.dd.action.StrutsSpringAutoWireLogin"> <result name="success">/strutsSpringAutoWireLoginSuccess.jsp</result> </action> </package>
4,spring的配置文件
<!-- 注意下面的这个bean是采用自动装配至action中的配置方式。它的id必须是action中的属性的名字 --> <bean id="sss" class="com.dd.service.StrutsSpringAutoWireLoginService"></bean>
5,用户入口页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="s" uri="/struts-tags" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body><%--struts标签key对应的是国际化资源文件中的key --%> 这个实例是:struts spring已自动装配的方式整合 <s:form action="strutsSpringAutoWireLogin"> <s:textfield name="username" key="user"></s:textfield> <s:textfield name="password" key="pass"></s:textfield> <s:submit key="login"></s:submit> </s:form> </body> </html>
6,登录成功页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> strutsSpring自动装配登录成功 <s:property value="tip"/> </body> </html>