创建处理多个请求的控制器
根据"每个请求一个控制器"的方法,给应用程序添加请求意味着必须在应用程序上下文中增加控制器。为了使配置更加简单,你想要将Spring MVC应用程序的控制器数量减到最少。Spring MVC提供的MultiActionController类允许你将多个相关的动作分组到一个控制器中。控制器可以扩展MultiActionController,并包含多个处理程序方法来处理多个动作。在多动作控制器中,可以用下面的形式,定义一个或者多个处理程序方法。
public (ModelAndView | Map | String | void) actionName(
HttpServletRequest,HttpServletResponse[,HttpSession][,CommandObject]);
处理程序方法的返回类型可以是ModelAndView(模型及视图名称,或者视图对象)、Map(只有模型)、String
(只有视图名称)或者void(方法本身直接处理HTTP响应)。
当请求通过处理程序映射被映射到多动作控制器时,它必须由该控制器内的某个特定的处理程序方法来处理。MultiActionController允许你用MethodNameResolver对象来配置方法映射。
HttpSession 必须在CommandObject之前。
扩展MultiActionController类,然后就可以在这个控制器内部声明多个处理程序方法了。
- <span>package com.wy.controller;
- import java.util.List;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
- import com.wy.pojo.User;
- import com.wy.service.IUserService;
- /**
- * 在同一控制器类中处理多个请求
- *
- * @author Administrator
- * @version 2011-10-7
- */
- public class UserMultiActionControllerextends MultiActionController {
- private IUserService userService;
- public void setUserService(IUserService userService){
- this.userService = userService;
- }
- /**
- * 查询所有的人员
- *
- * @param request
- * @param response
- * @return ModelAndView
- */
- public ModelAndView list(HttpServletRequest request,
- HttpServletResponse response) {
- ModelAndView mav = new ModelAndView("list");
- List<User> userList = userService.getAlUsers();
- mav.addObject("userList", userList);
- request.setAttribute("userList", userList);
- request.setAttribute("methodName","list");
- return mav;
- }
- /**
- * 添加人员
- *
- * @param request
- * @param response
- * @return ModelAndView
- */
- public ModelAndView add(HttpServletRequest request,
- HttpServletResponse response, HttpSession httpSession, User user) {
- ModelAndView mav = new ModelAndView("add");
- userService.add(user);
- return mav;
- }
- /**
- * 修改人员信息
- *
- * @param request
- * @param response
- * @return ModelAndView
- */
- public ModelAndView edit(HttpServletRequest request,
- HttpServletResponse response) {
- ModelAndView mav = new ModelAndView("edit");//redirect:edit.jsp 重定向
- return mav;
- }
- }
- </span>
package com.wy.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
import com.wy.pojo.User;
import com.wy.service.IUserService;
/**
* 在同一控制器类中处理多个请求
*
* @author Administrator
* @version 2011-10-7
*/
public class UserMultiActionController extends MultiActionController {
private IUserService userService;
public void setUserService(IUserService userService){
this.userService = userService;
}
/**
* 查询所有的人员
*
* @param request
* @param response
* @return ModelAndView
*/
public ModelAndView list(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mav = new ModelAndView("list");
List<User> userList = userService.getAlUsers();
mav.addObject("userList", userList);
request.setAttribute("userList", userList);
request.setAttribute("methodName", "list");
return mav;
}
/**
* 添加人员
*
* @param request
* @param response
* @return ModelAndView
*/
public ModelAndView add(HttpServletRequest request,
HttpServletResponse response, HttpSession httpSession, User user) {
ModelAndView mav = new ModelAndView("add");
userService.add(user);
return mav;
}
/**
* 修改人员信息
*
* @param request
* @param response
* @return ModelAndView
*/
public ModelAndView edit(HttpServletRequest request,
HttpServletResponse response) {
ModelAndView mav = new ModelAndView("edit");//redirect:edit.jsp 重定向
return mav;
}
}
对于add()处理程序方法,控制器将请求参数绑定到类型为User的命令对象中,因此声明将第四个方法参数声明为User类型。对于edit()和list()处理程序方法,则只要声明请求和响应参数就可以了。当edit()方法完成时,要将用户再次重定向到人员信息编辑页面。
- <span><?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <!-- 映射处理器 -->
- <bean id="simpleUrlHandlerMapping"
- class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <propertyname="mappings">
- <props>
- <propkey="/list_Param.do">userMultiActionController_Param</prop>
- <propkey="/*.do">userMultiActionController_Param</prop>
- <propkey="/*_Proper.do">userMultiActionController_Proper</prop>
- <propkey="/list.do">userMultiActionController_Internal</prop>
- <propkey="/add.do">userMultiActionController_Internal</prop>
- <propkey="/edit.do">userMultiActionController_Internal</prop>
- </props>
- </property>
- </bean>
- <!-- 具体调用的方法通过MethodNameResolver决定 -->
- <!-- (1) InternalPathMethodNameResolver 从请求路径中获取文件名,并将其与Controller中方法名匹配 -->
- <bean id="internalPathMethodNameResolver"
- class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
- </bean>
- <bean id="userMultiActionController_Internal"
- class="com.wy.controller.UserMultiActionController">
- <propertyname="methodNameResolver"
- ref="internalPathMethodNameResolver">
- </property>
- <propertyname="userService"ref="userService"></property>
- </bean>
- <!-- (2) PropertiesMethodNameResolver 使用用户自定义的属性(Properties)对象,将请求的URL映射到方法名 -->
- <bean id="propertiesMethodNameResolver"
- class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
- <propertyname="mappings">
- <props>
- <propkey="/list_Proper.do">list</prop>
- <propkey="/add_Proper.do">add</prop>
- <propkey="/edit_Proper.do">edit</prop>
- </props>
- </property>
- </bean>
- <bean id="userMultiActionController_Proper"
- class="com.wy.controller.UserMultiActionController">
- <propertyname="methodNameResolver"
- ref="propertiesMethodNameResolver">
- </property>
- <propertyname="userService"ref="userService"></property>
- </bean>
- <!-- (3) ParameterMethodNameResolver 解析请求参数,并将它匹配Controller中的方法名 -->
- <bean id="parameterMethodNameResolver"
- class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
- <propertyname="paramName"value="action"/>
- </bean>
- <bean id="userMultiActionController_Param"
- class="com.wy.controller.UserMultiActionController">
- <propertyname="methodNameResolver"
- ref="parameterMethodNameResolver">
- </property>
- <propertyname="userService"ref="userService"></property>
- </bean>
- <!-- 视图解析策略和视图解析器 -->
- <bean id="viewResolver"
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <propertyname="prefix"value="/WEB-INF/page/"/>
- <propertyname="suffix"value=".jsp"/>
- </bean>
- </beans>
- </span>
将URL映射到处理器方法
默认情况下,MultiActionController利用InternalPathMethodNameResolver按名称将URL映射到处理程序方法上。然而,如果想要给被映射的方法名称添加前缀或者后缀,就必须显式地配置这个解析器。
- <span><bean id="userController"
- class="com.apress.springrecipes.court.web.MemberController">
- ...
- <property name="methodNameResolver">
- <bean class="org.springframework.web.servlet.mvc.multiaction
- .InternalPathMethodNameResolver">
- <propery name="suffix" value="User"/>
- </bean>
- </property>
- </bean></span>
<bean id="userController"
class="com.apress.springrecipes.court.web.MemberController">
...
<property name="methodNameResolver">
<bean class="org.springframework.web.servlet.mvc.multiaction
.InternalPathMethodNameResolver">
<propery name="suffix" value="User"/>
</bean>
</property>
</bean>
然后,URL中扩展名前的最后部分路径将被映射到添加了User后缀的处理程序方法上。
- <span>/add.do --> addUser()
- /edit.do--> editUser()
- /list.do --> listUser()</span>
/add.do --> addUser()
/edit.do--> editUser()
/list.do --> listUser()
你必须改变UserController中的方法名称,来测试这个解析器:
- <span>package com.apress.springrecipes.court.web;
- ...
- public class UserControllerextends MultiActionController{
- ...
- public ModelAndView addUser(HttpServletRequest request,
- HttpServletResponse response,Member member)throws Exception{
- ...
- }
- public ModelAndView editUser(HttpServletRequest request,
- HttpServletResponse response)throws Exception{
- ...
- }
- public ModelAndView listUser(HttpServletRequest request,
- HttpServletResponse response)throws Exception{
- ...
- }
- }</span>
package com.apress.springrecipes.court.web;
...
public class UserController extends MultiActionController{
...
public ModelAndView addUser(HttpServletRequest request,
HttpServletResponse response,Member member)throws Exception{
...
}
public ModelAndView editUser(HttpServletRequest request,
HttpServletResponse response)throws Exception{
...
}
public ModelAndView listUser(HttpServletRequest request,
HttpServletResponse response)throws Exception{
...
}
}
此外,你也可以配置PropertiesMethodNameResolver,通过显式地指定映射定义,将URL映射到处理程序方法上。
具体配置参看上面的XML配置。
随后,根据映射定义中指定的名称,进行URL到处理程序方法的映射。
- <span>/add.do --> addUser()
- /edit.do--> editUser()
- /list.do --> listUser()
- </span>
/add.do --> addUser()
/edit.do--> editUser()
/list.do --> listUser()
最后,可以配置ParameterMethodNameResolver,根据请求参数将URL映射到处理程序方法上,参数名称可以用paramName属性来定制。例如,如果将它设置为method,URL就会被映射到名称与请求参数method的值相同的处理程序方法。请注意,以下URL中的通配符可以与任何字符串相匹配。
- <span>/*.do?action=list ------ > list()
- /*.do?action=add ------ > add()
- /*.do?action=edit ------->edit()</span>