MultiActionController 與 PropertiesMethodNameResolver


您 也可以將所有相對應的方法專門組織在一個委託(delegate)物件中,而不是撰寫在Controller類別中,當請求來到時,將委託給這個物件來執 行指定的方法,您只要設定MultiActionController的"delegate"屬性參考至委託物件即可,例如委託物件可以設計如下:
  • BookDelegate.java
package onlyfun.caterpillar; 

import javax.servlet.http.*;
import org.springframework.web.servlet.ModelAndView;

public class BookDelegate {
private String testPage;

public ModelAndView list(HttpServletRequest req,
HttpServletResponse res) {
return new ModelAndView(
this.getTestPage(),"executed", "list");
}

public ModelAndView add(HttpServletRequest req,
HttpServletResponse res) {
return new ModelAndView(
this.getTestPage(),"executed", "add");
}

public ModelAndView delete(HttpServletRequest req,
HttpServletResponse res) {
return new ModelAndView(
this.getTestPage(),"executed", "delete");
}

public String getTestPage() {
return testPage;
}

public void setTestPage(String testPage) {
this.testPage = testPage;
}
}

現在不用繼承MultiActionController類別來定義您的Controller類別了,而是在定義檔中直接定義一個MultiActionController的實例:
  • mvc-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
"-//SPRING/DTD BEAN/EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="urlMapping"
class="org.springframework.web.servlet.
→ handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/book.do">bookController</prop>
</props>
</property>
</bean>

<bean id="viewResolver"
class="org.springframework.web.servlet.
→ view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>

<bean id="paraMethodResolver"
class="org.springframework.web.servlet.mvc.
→ multiaction.ParameterMethodNameResolver">
<property name="paramName">
<value>action</value>
</property>
<property name="defaultMethodName">
<value>list</value>
</property>
</bean>

<bean id="bookDelegate"
class="onlyfun.caterpillar.BookDelegate">
<property name="testPage">
<value>test</value>
</property>
</bean>

<bean id="bookController"
class="org.springframework.web.servlet.mvc.
→ multiaction.MultiActionController">
<property name="methodNameResolver">
<ref bean="paraMethodResolver"/>
</property>
<property name="delegate">
<ref bean="bookDelegate"/>
</property>
</bean>
</beans>

您可以使用 MultiActionController 與 ParameterMethodNameResolver 中的test.jsp網頁來呈現結果,這個程式的執行結果與 MultiActionController 與 ParameterMethodNameResolver 是相同的。

上面的程式,您也可以改使用PropertiesMethodNameResolver,例如將Bean定義檔的內容改寫為以下的內容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC
 "-//SPRING/DTD BEAN/EN"
 "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>  
    <bean id="urlMapping"
          class="org.springframework.web.servlet.
                   → handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="/*book.do">bookController</prop>
            </props>
        </property>
    </bean>
   
    <bean id="viewResolver"
          class="org.springframework.web.servlet.
                   → view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/jsp/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
    </bean>

    <bean id="propMethodResolver"
        class="org.springframework.web.servlet.mvc.
                   → multiaction.PropertiesMethodNameResolver">
        <property name="mappings">
            <props>
                <prop key="/listbook.do">list</prop>
                <prop key="/addbook.do">add</prop>
                <prop key="/deletebook.do">delete</prop>
            </props>
        </property>
    </bean>

    <bean id="bookDelegate"
          class="onlyfun.caterpillar.BookDelegate">
        <property name="testPage">
            <value>test</value>
        </property>
    </bean>
           
    <bean id="bookController"
          class="org.springframework.web.servlet.mvc.
                   → multiaction.MultiActionController">
        <property name="methodNameResolver">
            <ref bean="propMethodResolver"/>
        </property>
        <property name="delegate">
            <ref bean="bookDelegate"/>
        </property>
    </bean>
</beans>

根據以上的設定,所有以book.do為結尾的請求都會交給bookController來處理,而當請求/listbook.do時,會執行 bookDelegate的list()方法,依同樣的道理,您可以分別使用/addbook.do或/deletebook.do來執行add()或 list()方法。