您 也可以将所有相对应的方法专门组织在一个委托(delegate)物件中,而不是撰写在 Controller 类别中,当请求来到时,将委托给这个物件来执 行指定的方法,您只要设定 MultiActionController 的"delegate"属性参考至委托物件即可,例如委托物件可以设计如下:
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 的实例:
<?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()方法。