后端控制器之MultiActionController

创建处理多个请求的控制器

根据"每个请求一个控制器"的方法,给应用程序添加请求意味着必须在应用程序上下文中增加控制器。为了使配置更加简单,你想要将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类,然后就可以在这个控制器内部声明多个处理程序方法了。

  1. <span>package com.wy.controller; 
  2.  
  3. import java.util.List; 
  4.  
  5. import javax.servlet.http.HttpServletRequest; 
  6. import javax.servlet.http.HttpServletResponse; 
  7. import javax.servlet.http.HttpSession; 
  8.  
  9. import org.springframework.web.servlet.ModelAndView; 
  10. import org.springframework.web.servlet.mvc.multiaction.MultiActionController; 
  11.  
  12. import com.wy.pojo.User; 
  13. import com.wy.service.IUserService; 
  14.  
  15. /**
  16. * 在同一控制器类中处理多个请求
  17. *
  18. * @author Administrator
  19. * @version 2011-10-7
  20. */ 
  21.  
  22. public class UserMultiActionControllerextends MultiActionController { 
  23.     private IUserService userService; 
  24.      
  25.     public void setUserService(IUserService userService){ 
  26.         this.userService = userService; 
  27.     } 
  28.  
  29.  
  30.     /**
  31.      * 查询所有的人员
  32.      *
  33.      * @param request
  34.      * @param response
  35.      * @return ModelAndView
  36.      */ 
  37.     public ModelAndView list(HttpServletRequest request, 
  38.             HttpServletResponse response) { 
  39.         ModelAndView mav = new ModelAndView("list"); 
  40.         List<User> userList = userService.getAlUsers(); 
  41.         mav.addObject("userList", userList); 
  42.         request.setAttribute("userList", userList); 
  43.         request.setAttribute("methodName","list"); 
  44.         return mav; 
  45.     } 
  46.  
  47.     /**
  48.      * 添加人员
  49.      *
  50.      * @param request
  51.      * @param response
  52.      * @return ModelAndView
  53.      */ 
  54.     public ModelAndView add(HttpServletRequest request, 
  55.             HttpServletResponse response, HttpSession httpSession, User user) { 
  56.         ModelAndView mav = new ModelAndView("add"); 
  57.         userService.add(user); 
  58.         return mav; 
  59.     } 
  60.  
  61.     /**
  62.      * 修改人员信息
  63.      *
  64.      * @param request
  65.      * @param response
  66.      * @return ModelAndView
  67.      */ 
  68.     public ModelAndView edit(HttpServletRequest request, 
  69.             HttpServletResponse response) { 
  70.         ModelAndView mav = new ModelAndView("edit");//redirect:edit.jsp 重定向 
  71.         return mav; 
  72.     } 
  73.  
  74. </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()方法完成时,要将用户再次重定向到人员信息编辑页面。

  1. <span><?xmlversion="1.0"encoding="UTF-8"?> 
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> 
  3. <beans> 
  4.  
  5.     <!-- 映射处理器 --> 
  6.     <bean id="simpleUrlHandlerMapping" 
  7.         class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
  8.         <propertyname="mappings"> 
  9.             <props> 
  10.                 <propkey="/list_Param.do">userMultiActionController_Param</prop> 
  11.                 <propkey="/*.do">userMultiActionController_Param</prop> 
  12.                  
  13.                 <propkey="/*_Proper.do">userMultiActionController_Proper</prop> 
  14.                  
  15.                 <propkey="/list.do">userMultiActionController_Internal</prop> 
  16.                 <propkey="/add.do">userMultiActionController_Internal</prop> 
  17.                 <propkey="/edit.do">userMultiActionController_Internal</prop> 
  18.             </props> 
  19.         </property> 
  20.     </bean> 
  21.      
  22.     <!-- 具体调用的方法通过MethodNameResolver决定  --> 
  23.     <!-- (1) InternalPathMethodNameResolver 从请求路径中获取文件名,并将其与Controller中方法名匹配  --> 
  24.     <bean id="internalPathMethodNameResolver"  
  25.         class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver"> 
  26.          
  27.     </bean> 
  28.     <bean id="userMultiActionController_Internal" 
  29.         class="com.wy.controller.UserMultiActionController"> 
  30.         <propertyname="methodNameResolver" 
  31.             ref="internalPathMethodNameResolver"> 
  32.         </property> 
  33.         <propertyname="userService"ref="userService"></property> 
  34.     </bean> 
  35.      
  36.     <!-- (2) PropertiesMethodNameResolver 使用用户自定义的属性(Properties)对象,将请求的URL映射到方法名 --> 
  37.     <bean id="propertiesMethodNameResolver" 
  38.         class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver"> 
  39.         <propertyname="mappings"> 
  40.             <props> 
  41.                 <propkey="/list_Proper.do">list</prop> 
  42.                 <propkey="/add_Proper.do">add</prop> 
  43.                 <propkey="/edit_Proper.do">edit</prop> 
  44.             </props> 
  45.         </property> 
  46.     </bean> 
  47.     <bean id="userMultiActionController_Proper" 
  48.         class="com.wy.controller.UserMultiActionController"> 
  49.         <propertyname="methodNameResolver" 
  50.             ref="propertiesMethodNameResolver"> 
  51.         </property> 
  52.         <propertyname="userService"ref="userService"></property> 
  53.     </bean> 
  54.  
  55.     <!-- (3) ParameterMethodNameResolver 解析请求参数,并将它匹配Controller中的方法名 --> 
  56.     <bean id="parameterMethodNameResolver" 
  57.         class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver"> 
  58.         <propertyname="paramName"value="action"/> 
  59.     </bean> 
  60.     <bean id="userMultiActionController_Param" 
  61.         class="com.wy.controller.UserMultiActionController"> 
  62.         <propertyname="methodNameResolver" 
  63.             ref="parameterMethodNameResolver"> 
  64.         </property> 
  65.         <propertyname="userService"ref="userService"></property> 
  66.     </bean> 
  67.  
  68.     <!-- 视图解析策略和视图解析器 --> 
  69.     <bean id="viewResolver" 
  70.         class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
  71.         <propertyname="prefix"value="/WEB-INF/page/"/> 
  72.         <propertyname="suffix"value=".jsp"/> 
  73.     </bean> 
  74.  
  75. </beans> 
  76. </span> 

将URL映射到处理器方法

默认情况下,MultiActionController利用InternalPathMethodNameResolver按名称将URL映射到处理程序方法上。然而,如果想要给被映射的方法名称添加前缀或者后缀,就必须显式地配置这个解析器。

  1. <span><bean id="userController" 
  2.     class="com.apress.springrecipes.court.web.MemberController"
  3.     ... 
  4.     <property name="methodNameResolver"
  5.         <bean class="org.springframework.web.servlet.mvc.multiaction 
  6.             .InternalPathMethodNameResolver"> 
  7.             <propery name="suffix" value="User"/> 
  8.         </bean> 
  9.     </property> 
  10. </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后缀的处理程序方法上。

  1. <span>/add.do --> addUser() 
  2. /edit.do--> editUser() 
  3. /list.do --> listUser()</span> 
/add.do --> addUser()
/edit.do--> editUser()
/list.do --> listUser()

你必须改变UserController中的方法名称,来测试这个解析器:

  1. <span>package com.apress.springrecipes.court.web; 
  2. ... 
  3. public class UserControllerextends MultiActionController{ 
  4.     ... 
  5.     public ModelAndView addUser(HttpServletRequest request, 
  6.         HttpServletResponse response,Member member)throws Exception{ 
  7.         ... 
  8.     } 
  9.     public ModelAndView editUser(HttpServletRequest request, 
  10.         HttpServletResponse response)throws Exception{ 
  11.         ... 
  12.     } 
  13.     public ModelAndView listUser(HttpServletRequest request, 
  14.         HttpServletResponse response)throws Exception{ 
  15.         ... 
  16.     } 
  17. }</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到处理程序方法的映射。

  1. <span>/add.do --> addUser() 
  2. /edit.do--> editUser() 
  3. /list.do --> listUser() 
  4. </span> 
/add.do --> addUser()
/edit.do--> editUser()
/list.do --> listUser()

最后,可以配置ParameterMethodNameResolver,根据请求参数将URL映射到处理程序方法上,参数名称可以用paramName属性来定制。例如,如果将它设置为method,URL就会被映射到名称与请求参数method的值相同的处理程序方法。请注意,以下URL中的通配符可以与任何字符串相匹配。

  1. <span>/*.do?action=list   ------ > list() 
  2. /*.do?action=add ------ > add() 
  3. /*.do?action=edit ------->edit()</span> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值