spring和struts整合方式
1、 最简单方式
①struts来装载spring的应用环境。就是在 struts 中加入一个插件。
struts-config.xml中
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>
</plug-in>
②几乎与struts无关了,相当于为整合项目加入spring支持,将①的配置放在web.xml中了
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/applicationContext-datasource.xml
/WEB-INF/config/applicationContext-system.xml
</param-value>
</context-param>
再加上对spring监听
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
代码演示
Spring 的ActionSupport 继承至 org.apache.struts.action.Action ActionSupport的子类可以或得 WebApplicationContext类型的全局变量。通过getWebApplicationContext()可以获得这个变量。 这是一个 servlet 的代码: public class LoginAction extends org.springframework.web.struts.ActionSupport { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub //获得 WebApplicationContext 对象 WebApplicationContext ctx = this.getWebApplicationContext(); LoginDao dao = (LoginDao) ctx.getBean("loginDao"); User u = new User(); u.setName(loginForm.getName()); u.setPwd(loginForm.getPwd()); if(dao.checkLogin(u)){ return mapping.findForward("success"); }else{ return mapping.findForward("error"); } } } applicationContext.xml 中的配置 <beans> <bean id="loginDao" class="com.cao.dao.LoginDao"/> </beans> |
2、第二种是基于1配置的基础之上(①和②配置任选一个),因为都需要装在spring的应用环境容器
DelegatingRequestProcessor 继承自 org.apache.struts.action.RequestProcessor 并覆盖了里面的方法。 备注:添加controller在 </action- mappings>的后面,这样就不用不用写type属性 <controller> <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor" /> </controller> 在sturts-config.xml 中添加 <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>通过 <controller >来替代 org.apache.struts.action.RequestProcessor 的请求处理。 public class LoginAction extends Action {//与之前的ActionSupport不一样 //利用spring来注入这个对象。spring注入,需要生成setter方法,getter方法不需要 private LoginDao dao ; public void setDao(LoginDao dao) { System.out.println("执行注入"); this.dao = dao; } public LoginDao getDao() { return dao; } public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub //这样一改这行代码似乎没有必要了。 //WebApplicationContext ctx = this.getWebApplicationContext(); //LoginDao dao = (LoginDao) ctx.getBean("loginDao"); User u = new User(); u.setName(loginForm.getName()); u.setPwd(loginForm.getPwd()); //直接用dao来调用spring会将这个对象实例化。 if(dao.checkLogin(u)){ return mapping.findForward("success"); }else{ return mapping.findForward("error"); } } } 这里的。 LoginAction extends Action 说明 struts 每有和spring 耦合。 看一下 applicationContext.xml 中的配置。 <beans> <bean id="loginDao" class="com.cao.dao.LoginDao"/> <bean name="/login" class="com.cao.struts.action.LoginAction"> <property name="dao"> <ref local="loginDao"/> </property> </bean> </beans> 这里 name="/login" 与struts 中的path匹配 class="com.cao.struts.action.LoginAction" 与struts 中的type匹配 需要说明的是,struts的action里的type其实是个摆设,可以省略,完全可以使用 <action path="/login"/>,写上是为了解决我们上面提到的“不够直观的”的问题 还要为LoginAction 提供必要的setXXX方法。获得ApplicationCotext和依赖注入的工作都在DelegatingRequestProcessor中完成。 需要说明的是,由于spring dtd规定id不能有"/",所以我们用name定义path,并且,spring bean的name要和struts-config.xml中的path一致 |
3第三种也是基于1配置的基础之上(①和②配置任选一个),因为都需要装在spring的应用环境容器
Action 的创建和对象的依赖注入全部由IOC容器来完成。使用Spring的DelegatingAcionProxy来帮助实现代理的工作 org.springframework.web.struts.DelegatingActiongProxy继承于org.apache.struts.action.Action . 全权委托的配置方式同方式 2 类似 (applcationContext.xml文件的配置和 Action类的实现方式相同)。 <struts-config> <data-sources /> <form-beans > <form-bean name="loginForm" type="com.cao.struts.form.LoginForm" /> </form-beans> <global-exceptions /> <global-forwards /> <action-mappings > <!-- type指向的是spring 的代理类 --> <action attribute="loginForm" input="login.jsp" name="loginForm" path="/login" scope="request" type="org.springframework.web.struts.DelegatingActionProxy" > <forward name="success" path="/ok.jsp" /> <forward name="error" path="/error.jsp" /> </action> </action-mappings> <message-resources parameter="com.cao.struts.ApplicationResources" /> <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"> <set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/> </plug-in>,可以换成在web.xml配置spring容器 </struts-config> spring中的配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- 与struts的整合 --> <bean name="/student" class="com.ssh.action.StudentAction"> <property name="studentDao" ref="studentDao" /> <property name="gradeDao" ref="gradeDaoProxy" /> </bean> <bean name="/grade" class="com.ssh.action.GradeAction"> <property name="gradeDao" ref="gradeDao" /> </bean> </beans> 不同之处 1, <action>中 type指向的是spring 的代理类 2,去掉struts-config.xml中 <controller > |