spring对struts的集成主要是把它的依赖注入(Ioc)功能服务于struts数量众多的Action类,来为Action注入业务类对象。
我们知道,对于普通的Java类,由Ioc来创建和管理对象,给我们提供了极大的方便;但是,我们在使用struts时,Action类的对象是由struts帮我们创建和管理的,这就产生了尖锐的冲突。spring通过提供代理类DelegatingActionProxy,配置在struts-config.xml中<action>标签的type属性,当struts再需要action对象时,它在type里找到的不是相应的Action类,而是Action的代理DelegatingActionProxy,这个代理会到spring配置文件中找name属性等于struts-config.xml的<action>标签path指定的路径的<bean>, 然后到Ioc容器中找到相应的action对象给struts,当然,由spring给提供的action自然可以轻松完成业务对象的注入,只不过要求我们在写Action类时给它声明一个没有初始化的业务类实例及其setter方法。就这样,“狡猾的”spring在不“得罪”struts的情况下,巧妙的“攫取”了对Action对象的创建和管理权限。
一个登陆小程序。
1.登陆页面:
login.jsp
</html>
<body>
<form action="login.do" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
2.FormBean类:
LoginActionForm.java
public class LoginActionForm extends ActionForm {
private static final long serialVersionUID = -367009923055443789L;
private String username;
private String password;
//一系列的setter/getter方法
}
3.Action类:
LoginAction.java
public class LoginAction extends Action {
private UserManager um;
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
LoginActionForm laf = (LoginActionForm) form;// 用request也能取得数据,但是ActionForm会帮我们进行数据类型的转化,所以struts一般还是使用ActionForm
um.login(laf.getUsername(), laf.getPassword());
return mapping.findForward("success");
}
public void setUm(UserManager um) {
this.um = um;
4. 业务类:
UserManagerImpl.java
public class UserManagerImpl implements UserManager {
public void login(String username, String password) {
//这里只是简单打印一下参数代替业务处理
System.out.println("UserManagerImpl.login:username="+username+",password="+password);
5.struts配置文件
struts-config.xml
<struts-config>
<form-beans>
<form-bean name="loginForm" type="com.sxt.spring.struts.usermgr.forms.LoginActionForm"></form-bean>
</form-beans>
<action-mappings>
<action path="/login"
type="org.springframework.web.struts.DelegatingActionProxy"
name="loginForm"
scope="request"
>
<forward name="success" path="/success.jsp"></forward>
</action>
</action-mappings>
<message-resources parameter="MessageResources" />
</struts-config>
6.pring 的配置文件:
applicationContext-actions.xml
<bean name="/login" class="com.sxt.spring.struts.usermgr.actions.LoginAction" scope="prototype">
<!-- 推荐scope设置成prototype,这样每次在使用action时都会新建一个实例,性能上损失并不多,
但是这就完全避免了线程安全问题了,可以随心所欲的在action中使用成员变量
-->
<property name="um" ref="userManager"></property>
</bean>
applicationContext-beans.xml
<bean id="userManager" class="com.sxt.spring.struts.usermgr.manager.UserManagerImpl"></bean>
7.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<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>
<param-name>detail</param-name>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
<!-- 默认找/WEB-INF/applicationContext.xml -->
classpath*:applicationContext-*.xml,/WEB-INF/applicationContext-*.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
本文转自NightWolves 51CTO博客,原文链接:http://blog.51cto.com/yangfei520/285772,如需转载请自行联系原作者