spring 整合struts

 一、spring容器的創建方式
    1.直接在web.xml中配置創建spring容器
        1.1 用ServletContextListener方式實現
                <listener>
                    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
                </listener>
              如果有多個配置文件需要載入,使用<context-param>元素,ContextLoaderListener加載時,會查找名爲contextConfigLocation的參數,所以,有下面:
                <context-param>
                        <param-name>contextConfigLocation</param-name>
                        <param-value>/WEB-INF/daoContext.xml,/WEB-INF/applicationContext.xml</param-value>
                </context-param>
        1.2 用load-on-startup Servlet方式實現
                <servlet>
                    <servlet-name>context</servlet-name>
                    <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
                    <load-on-startup>1</load-on-startup>
                </servlet>
    2.用struts plugin創建spring容器
        在struts-config.xml中加入
        <plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
            <set-property property="contextConfigLocation" value="/WEB-INF/action-servlet.xml(用於配置表示層上下文),/WEB-INF/applicationContext.xml"/>
        </plug-in>


二.問題
    如何讓控制器訪問到spring容器中的業務邏輯組件?有兩種方式2.1,2.2
        2.1 spring管理控制器,並利用IOC爲控制器注入邏輯組件
            2.1.1 使用spring的DelegatingRequestProcessor
                        在struts-config.xml中加入
                            <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
                     而後,struts會接取用戶請求轉發到spring context下的bean,根據bean的name來匹配,因此在struts的action中配置type是沒用的!
                如下: 
                        <action path="/login" name="loginForm" scope="requerst" validate="true" input="/login.jsp">
                            <forward name="input" path="/login.jsp"/>
                            <forward name="welcom" path="/welcom.jsp"/>
                        </action>
           然後在web.xml中配置:
            <filter>
                    <filter-name>requestContextFilter</filter-name>
                    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
            </filter>
            <filter-mapping>
                   <filter-name>requestContextFilter</filter-name>
                    <url-pattern>/*</url-pattern>
            </filter-mapping>


           2.1.2   使用DelegatingActionProxy(爲了避免應用程序本身就擴展了RequetstProcessor,DelegatingRequestProcessor就用不成了)
                DelegatingActionProxy被配置成struts的Action(即所有請求先被ActionServlet得到),轉發到相應的Action,而Action的實現全都是DelegatingActionProxy,DelegatingActionProxy再把請求轉發給spring容器的Action.
                DelegatingActionProxy不需要在struts-config.xml中配置<controller>元素,只需將action type進行如下配置:
                <action path="/login" name="loginForm" scope="requerst" validate="true" input="/login.jsp" type="org.springframework.web.struts.DelegatingActionProxy">
                            <forward name="input" path="/login.jsp"/>
                            <forward name="welcom" path="/welcom.jsp"/>
                        </action>

      2.2  使用srping的ActionSupport代替struts 的Action
            這種方式下,struts的Action不受spring Ioc容器管理,Action代碼與spring API部分耦合(造成代碼污染),但其增強了代碼的可讀性,Action代碼中顯示調用業務邏輯組件,無需等容器注入。
            例如:
            public class LoginAction extends ActionSupport {   //繼承spring的ActionSupport         
                   public LoginAction()
                    {
                        //不可在構造方法中調用getWebApplicationContext()
                      } 
                    private LoginService loginService;     //將業務邏輯組件對象作爲成員變量
                    public LoginService getLoginService()
                    {
                        return (LoginService)getWebApplicationContext().getBean("loginService");
                    }
                    //重寫execute()方法
                }
            struts-config.xml中<action>元素正常配置

發佈了26 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章