spring MVC之将多个动作分组到一个控制器(一)
----------
创建多动作控制器
根据"每个动作一个控制器"的方法,给应用程序添加动作意味着必须在应用程序上下文中增加控制器。为了使配置更加简单,你想要将Spring MVC应用程序的控制器数量减到最少。Spring MVC提供的MultiActionController类允许你将多个相关的动作分组到一个控制器中。控制器可以扩展MultiActionController,并包含多个处理程序方法来处理多个动作。在多动作控制器中,可以用下面的形式,定义一个或者多个处理程序方法。
public (ModelAndView | Map | String | void) actionName(
HttpServletRequest,HttpServletResponse[,HttpSession][,CommandObject]);
处理程序方法的返回类型可以是ModelAndView(模型及视图名称,或者视图对象)、Map(只有模型)、String
(只有视图名称)或者void(方法本身直接处理HTTP响应)。
当请求通过处理程序映射被映射到多动作控制器时,它必须由该控制器内的某个特定的处理程序方法来处理。MultiActionController允许你用MethodNameResolver对象来配置方法映射。
创建多动作控制器
扩展MultiActionController类,然后就可以在这个控制器内部声明多个处理程序方法了。
- package com.apress.springrecipes.court.web;
- ...
- import org.springframework.web.bind.ServletRequestUtils;
- import org.springframework.web.servlet.ModelAndView;
- import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
- public class MemberController extends MultiActionController{
- private MemberService memberService;
- public void setMemberService(MemberService memberService){
- this.memberService = memberService;
- }
- public ModelAndView add(HttpServletRequest request,
- HttpServletResponse response,Member member)throws Exception{
- memberService.add(member);
- return new ModelAndView("redirect:list.htm");
- }
- public ModelAndView remove(HttpServletRequest request,
- HttpServletResponse response)throws Exception{
- String memberName = ServletRequestUtils.getRequiredStringParameter(
- request,"memberName");
- memberService.remove(memberName);
- return new ModelAndView("redirect:list.htm");
- }
- public ModelAndView list(HttpServletRequest request,
- HttpServletResponse response)throws Exception{
- List<Member> members = memberService.list();
- return new ModelAndView("memberList","members",members);
- }
- }
对于add()处理程序方法,控制器将请求参数绑定到类型为Member的命令对象中,因此声明将第三个方法参数声明为Member类型。对于remove()和list()处理程序方法,则只要声明请求和响应参数就可以了。当add()或者remove()方法完成时,要将用户再次重定向到列表页面显示会员。
在声明这个控制器时,为了维护会员列表,需要有一个指向服务层中memberService Bean的引用。
- <bean id="memberController"
- class="com.apress.springrecipes.court.web.MemberController">
- <property name="memberService" ref="memberService"/>
- </bean>
由于在web应用程序上下文中配置了ControllerClassNameHandlerMapping,它会注意到这个控制器的类型为
NultiActionController,然后为它生成下面的映射。
- MemberController --> /member/*
默认情况下,MultiActionController会根据方法名称将URL映射到处理程序方法上。对于这个控制器,URL会进行如下映射。
- /member/add.htm --> add()
- /member/remove.htm --> remove()
- /member/list.htm --> list()