Spring整合Struts的幾種最常見方式

 Spring實例Action的兩種方式:

1、DelegatingActionProxy類整個Action由Spring實例
2、DelegatingRequestProcessor類extends RequestProcessor重寫processActionCreate方法,由Spring創建

web.xml
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath*:applicationContext.xml</param-value>
</context-param>
<listener>
 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


SSH整合第一式:缺點:麻煩一個方法對應一個<bean>如何實現整合的:
重寫了Action類的execute方法,使用Spring容器來實例bean,查找bean的名字是<action path="">的值
①struts-config.xml
<action ……
      path="/doSave"
      type="org.springframework.web.struts.DelegatingActionProxy">
</action>
②applicationContext.xml
<bean name="/doSave" class="com.yourcompany.struts.action.UserinfoAction">
      <property name="manager" ref="userInfoManager"></property>
</bean>
註解:name="/doSave" 取得時<action path="/doSave" />


SSH整合第二式:第一式的延伸,使用MyDelegatingActionProxy類繼承DelegatingActionProxy和DispatchAction類
缺點:實現起來太繁瑣;優點:一個Action類對應一個<bean>
①struts-config.xml
<action ……
      type="com.yourcompany.struts.action.UserinfoAction">
</action>
②applicationContext.xml
<bean name="com.yourcompany.struts.action.UserinfoAction" class="com.yourcompany.struts.action.UserinfoAction">
      <property name="manager" ref="userInfoManager"></property>
</bean>
③Action extends MyDelegatingActionProxy
註解:
1、如果不繼承DispatchAction類的話就會產生死循環調用execute方法的問題。
DelegatingActionProxy類的作用:改變Action類的創建方式,改成由Spring容器創建的
DispatchAction類的作用:把execute方法分解成多個普通方法執行
2、屏蔽死循環問題必須在MyDelegatingActionProxy類重寫execute方法一下是此類的關鍵代碼:
public ActionForward execute(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  Action delegateAction = getDelegateAction(mapping);
  String parameter = getParameter(mapping, form, request, response);
  String name = getMethodName(mapping, form, request, response, parameter);
  return dispatchMethod(mapping, form, request, response, name,
    delegateAction);
 }


SSH整合第三式:使用DelegatingRequestProcessor類
缺點:一個方法一個<bean>
①struts-config.xml
<action ……
      type="com.yourcompany.struts.action.UserinfoAction">
</action>
<controller>
  <set-property property="processorClass" value="org.springframework.web.struts.DelegatingRequestProcessor"/>
</controller>
②applicationContext.xml
<bean name="/doSave" class="com.yourcompany.struts.action.UserinfoAction">
      <property name="manager" ref="userInfoManager"></property>
</bean>
註解:name="/doSave" 取得時<action path="/doSave" />


SSH整合第四式:自定義MyDelegatingRequestProcessor類extends DelegatingRequestProcessor,重寫determineActionBeanName方法,return mapping.getType();
優點:一個Action對應一個<bean>,[推薦,常用]
①struts-config.xml
<action ……
      type="com.yourcompany.struts.action.UserinfoAction">
</action>
<controller>
  <set-property property="processorClass" value="MyDelegatingRequestProcessor類路徑"/>
</controller>
②applicationContext.xml
<bean name="com.yourcompany.struts.action.UserinfoAction" class="com.yourcompany.struts.action.UserinfoAction">
      <property name="manager" ref="userInfoManager"></property>
</bean>

SSH整合第五式:繼承ActionSupport、DispatchActionSupport、MappingDispatchActionSupport
①struts-config.xml
<action ……
      type="com.yourcompany.struts.action.UserinfoAction">
</action>
②applicationContext.xml
<bean name="com.yourcompany.struts.action.UserinfoAction" class="com.yourcompany.struts.action.UserinfoAction" />
<bean id="userinfoManager" class="com.yourcompany.struts.action.UserinfoAction" />
註解:UserInfoAction extends MappingDispatchActionSupport實現onInit方法
manager=(IUserInfoManager) getWebApplicationContext().getBean("userInfoManager");
不需要set方法


問1:這段代碼在什麼時候執行,起什麼作用?
<controller>
    <set-property property="processorClass" value="org.springframework.web.struts.DelegatingActionProxy"/>
</controller>
答:在ActionServlet類的process方法中
RequestProcessor processor = getProcessorForModule(config);讀取返回一個RequestProcessor對象,如果沒有配置的話就會採取默認的,也就是Struts的核心類RequestProcessor


問2:ContextLoaderPlugIn類的作用,如何使用?
答:在struts-config.xml中配置
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
   <set-property property="contextConfigLication" value="/WEB-INF/classes/applicationContext.xml"/>
  </plug-in>
相當於再web.xml中配置
<context-param>
 <param-name>contextConfigLocation</param-name>
 <param-value>classpath*:applicationContext.xml</param-value>
</context-param>
道理是相同的。
一般是配置在web.xml中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章