ITEEDU

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()方法。