您 也可以將所有相對應的方法專門組織在一個委託(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>
<!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()方法。