天天看點

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,如需轉載請自行聯系原作者