天天看点

spring对struts的集成

   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,如需转载请自行联系原作者