受命研發Framework時,是跳過Struts 1直接整合Struts 2和Spring 2。現在得補上Struts 1被Spring管理的技巧:
1. web.xml delegate to struts-config.xml (Struts 1) and applicationContext.xml (Spring)
(1) Configuration about spring
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:spring/applicationContext.xml
</param-value>
</context-param>
<!-- Listener設給Spring便將Struts的Action交給Spring托管 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.util.IntrospectorCleanupListener
</listener-class>
</listener>
(2) Configuration abount struts
<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>3</param-value>
</init-param>
<init-param>
<param-name>detail</param-name>
<param-value>3</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2. struts-config.xml delegate to applicationContext.xml
<!-- set controller to spring -->
<controller>
<set-property property="processorClass"
value="org.springframework.web.struts.DelegatingRequestProcessor" />
</controller>
<!--Using zoo action as sample-->
<action-mappings>
<action path="/zoo"
type="com.zoo.ZooCtrl"
scope="request" validate="false" parameter="zooMethod">
</action>
</action-mappings>
3. applicationContext.xml manager action of struts-config.xml
<bean name="/zoo" lazy-init="false" class="com.zoo.ZooCtrl">
<property name="animal"><value>Dog</value></property> <!-- Dependence Injection -->
</bean>
這裡要注意的是bean是使用name property而非id去識別,好像使用id無法識別/的緣故。亦即:
Struts 1 | Spring 2 | |
configuration file | struts-config.xml | applicationContext.xml |
main tag | action | bean |
id attribute (/zoo) | path | name |
class attribute (com.zoo.ZooCtrol) | type | class |
後來想測試類似Struts2的action被Spring管理的機制,就做以下的實驗:
1.把type改為bean id或bean name值,結果報錯,無法create path的instance。
2.這時才知我可以把type省略,結果可以work 。
3.下個實驗:type值改為不同類別,結果優先抓到bean指定的類別;後來我把bean拿掉,才抓到type所指的類別。
Struts的Action受Spring管理的好處是可以Dependence Injection。