SSH框架項目配置和啟動的加載順序及請求的執行順序


1:======配置和啟動======

(1)配置web.xml

配置<context-param>,其中內容為Spring的配置文件applicationContext.xml。注意<param-name>的內容,必須為"contextConfigLocation";
配置<listener>,使用Spring提供的ContextLoaderListener。
配置范例:

1 <context-param>
2     <param-name>contextConfigLocation</param-name>
3     <param-value>classpath:applicationContext-*.xml</param-value>
4 </context-param>
5 <listener>
6     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
7 </listener>

解析:
當Web應用啟動時,將執行以下操作:
①由Tomcat創建一個ServletContext,並自動載入<context-param>中的屬性;
②ContextLoaderListener檢測到ServletContext的創建,運行Spring的相關程序;
③Spring根據<context-param>中contextConfigLocation的指向,加載對應applicationContext.xml;
④Spring根據applicationContext.xml的內容創建一個BeanFactory實例,並放入ServletContext中。
簡而言之,該配置的作用是:當Web應用啟動時,Spring將自動創建一個BeanFactory實例,並放入ServletContext中。

(2)配置Struts-config.xml

struts-config.xml文件中,注意其<action>標簽的type屬性,設置為Spring的代理Action類。由此真正的action創建交給Spring完成。
若不使用Spring,type設置為com.project.LoginAction等自定義類;使用Spring,type設置為"org.springframework.web.struts.DelegatingActionProxy"。
但"仍需構建具體Action",並編寫Action的具體方法。該Action"在Spring的配置中引用",詳見"(4)配置Spring"。
相當於將Struts配置轉移到了Spring配置中,此處即Struts與Spring框架結合的關鍵結合點。
配置范例:

 1 <struts-config>
 2     <form-beans>
 3         <form-bean name="loginForm" type="com.project.usermgr.web.forms.LoginActionForm"/>
 4     </form-beans>
 5     <action-mappings>
 6         <action path="/login"
 7                 type="org.springframework.web.struts.DelegatingActionProxy"
 8                 name="loginForm"
 9                 scope="request"
10         >
11             <forward name="success" path="/login_success.jsp"/>
12         </action>
13     </action-mappings>
14     <message-resources parameter="MessageResources" />
15 </struts-config>

(3)配置application.xml中的Spring-bean信息
由Spring來創建和管理Action,並向Action注入Model層Service對象。
設置scope="prototype"后可使每個線程都有一個新的Action,從而解決Struts1.x的Action線程安全問題。
注意:
①必須使用name屬性,且name屬性的值必須和struts-config.xml文件中<action>標簽的path屬性值一致
②必須配置Model層Service對象,如userManager等。
配置范例:

1 <bean name="/login" class="com.project.usermgr.web.actions.LoginAction" scope="prototype">
2         <property name="userManager" ref="userManager"/>
3     </bean>

(4)構建Action
Model層Service對象由Spring"自動注入",因此無需手動構建該對象,也無需獲取BeanFactory。通過"自動注入"的方式獲取對象,即"依賴注入"。
注意,相關對象須提供set方法,以方便Spring注入。

 1 public class LoginAction extends Action {
 2     private UserManager userManager;
 3     @Override
 4     public ActionForward execute(ActionMapping mapping, ActionForm form,
 5             HttpServletRequest request, HttpServletResponse response)
 6             throws Exception {
 7         LoginActionForm laf = (LoginActionForm)form;
 8         String username = laf.getUsername();
 9         String password = laf.getPassword();
10         userManager.login(username, password);
11         return mapping.findForward("success");
12     }
13     //須提供set方法,以方便Spring注入。
14     public void setUserManager(UserManager userManager) {
15         this.userManager = userManager;
16     }
17 }

 

2:=======請求的執行=======

--------------請求的過程:-------------

1.服務器啟動,創建Struts2的Filter控制器,創建Spring容器對象.

   實例化Struts2控制器時,加載struts.xml,struts-default.xml,default.properties,struts-plugin.xml等Struts相關配置

   實例化Spring容器時,加載applicationContext.xml

2.客戶瀏覽器發送請求,請求到達Struts2的Filter控制器

3.如果是Action請求,Struts2控制器根據struts.xml的<action>配置,

   要調用一個Action對象處理.

4.Struts2控制器調用struts-spring-plugin.jar提供的ObjectFactory

   獲取一個Action對象.

   方法一:ObjectFactory利用<action>元素的class屬性去Spring容器尋找id=class的Bean對象.

   *方法二:如果按上述方法找不到,ObjectFactory會利用class指定值創建一個對象.然后將Spring容器的DAO,Service按名稱匹配規則給Action注入.

 5.Struts2控制器調用Action執行業務處理,處理完畢,返回一個String標識

 6.Struts2控制器根據String標識調用Result組件,生成響應信息

 7.將響應信息給客戶瀏覽器輸出,完成響應處理.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM