在spring和struts整合之前,需要导入spring和struts的jar包
原理:
1、用spring来管理struts的action:
在spring的配置文件中配置action和action所依赖的业务逻辑对象。
2、因为Action要调用业务逻辑对象,将业务逻辑对象注入到Action中,从而避免在Action类中直接进行代码查找:
因此Action中要有业务逻辑对象的声明和此对象的set方法
在spring的配置文件中配置他们之间的依赖关系
3、在struts的配置文件里把action的type改成spring的一个代理类:
org.springframework.web.struts.DelegatingActionProxy
此代理类功能:创建BeanFactory、到IoC容器里查找用户请求的Action。
根据<action>中的path属性值到IoC容器中取得本次请求对应的Action。
4、在spring的配置文件中定义struts的action.注意:必须使用name属性
将Action的 scope设置为prototype多粒模式
必须注入业务逻辑对象
部署描述符 web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="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"> <!-- 定义spring的配置文件,此文件会被spring的监听器获得 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <!-- ContextLoaderListener默认监听spring的applicationContext.xml配置文件 --> <!-- 当spring的配置文件改名了,就需要有上面的<context-param>配置 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- 配置Struts ActionServlet --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <!-- 配置Struts ActionServlet 的请求路径--> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- 欢迎页面 --> <welcome-file-list> <welcome-file>login.jsp</welcome-file> </welcome-file-list> </web-app>
spring的配置文件 applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="uManage" class="com.cos.manager.UserManager"/> <!-- 把userManage注入进来、一定要用name不要用id、多粒模式 --> <bean name="/login" class="com.cos.action.LoginAction" scope="prototype"> <property name="userManager" ref="uManage"/> </bean> </beans>
struts的配置文件 struts-config.xml:
<?xml version="1.0" encoding="gb2312"?> <!DOCTYPE struts-config SYSTEM "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="userForm" type="com.cos.form.UserForm"></form-bean> </form-beans> <action-mappings> <!-- 当一个.do请求过来,先进入struts的配置文件,将此action代理给spring的action管理 --> <!-- DelegatingActionProxy类使用映射名称path查找Spring环境中的动作名称name --> <!-- path的值要和spring action中的name值相同 --> <!-- type的值是spring的代理action: DelegatingActionProxy --> <!-- 此代理类完成了BeanFactory的创建、根据path值到IoC容器里的查找本次请求对应的Action --> <action path="/login" type="org.springframework.web.struts.DelegatingActionProxy" scope="request" name="userForm"> <forward name="success" path="/success.jsp" /> </action> </action-mappings> </struts-config>
此处一定要把type值配置成DelegatingActionProxy:
把用户的请求提交给spring的action,spring的action创建BeanFactory,再由spring的action调用struts的action。
登录页面 login.jsp:
<%@ page language="java" pageEncoding="gb2312"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> <form action="login.do" method="post"> <table> <tr> <td>用户名:</td><td><input type="text" name="username"></td> </tr> <tr> <td>密 码:</td><td><input type="password" name="password"></td> </tr> <tr> <td><input type="submit" value="提交"></td> <td><input type="reset" value="重置"></td> </tr> </table> </form> </body> </html>
LoginAction.java:
package com.cos.action; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import com.cos.form.UserForm; import com.cos.manager.UserManager; public class LoginAction extends Action { //把此对象注入进来,用set()方法 private UserManager userManager; public ActionForward execute(ActionMapping mapping, ActionForm actionfrom, HttpServletRequest request, HttpServletResponse response) { UserForm loginForm = (UserForm)actionfrom; userManager.createUser(loginForm.getUsername(), loginForm.getPassword()); return mapping.findForward("success"); } //set()方法 public void setUserManager(UserManager userManager) { this.userManager = userManager; } }
struts的FormBean: UserForm.java
package com.cos.form; import org.apache.struts.action.ActionForm; public class UserForm extends ActionForm { private static final long serialVersionUID = 1L; private String username; private String password; 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; } }
业务处理类 UserManager.java:
package com.cos.manager; //业务逻辑处理 public class UserManager { public void createUser(String username, String password) { System.out.println("业务逻辑处理:用户名:" + username + ",密码:" + password); } }
成功页面 success.jsp:
<%@ page language="java" pageEncoding="gb2312"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <body> 登录成功。<a href="login.jsp">返回</a> </body> </html>
运行结果:跳转到成功页面success.jsp、控制台打印出 "业务逻辑处理:用户名:xxx,密码:xxx"
优点:
在LoginAction中没有和业务逻辑对象UserManager耦合,即:没有 new UserManager();
注:
如果spring没有使用默认的配置文件名称:applicationContext.xml,那么一定要在web.xml文件中配置:
<!-- 定义spring的配置文件,此文件会被spring的监听器获得 --> <context-param> <param-name>contextConfigLocation</param-name> <!-- <param-value>classpath:applicationContext-*.xml</param-value> --> <param-value>/WEB-INF/applicationContext-*.xml</param-value> </context-param>
如果使用了默认名称,则可以不添加<context-param>这段代码。