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.將響應信息給客戶瀏覽器輸出,完成響應處理.