受命研發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。

arrow
arrow
    全站熱搜

    Jemmy 發表在 痞客邦 留言(0) 人氣()