MultiActionController有什么意义?

时间:2013-03-15 18:27:25

标签: java spring spring-mvc

今天我遇到了MultiActionController,我不确定我在春天documentation了解它的用途......它说

  

允许多个请求类型由同一个类处理的控制器实现。此类的子类可以使用

形式的方法处理几种不同类型的请求

在另一个site,他们说

  

它将多个请求处理方法聚合到单个控制器中,因此可以轻松地将相关功能保存在一起。

我仍然不明白如何扩展MultiActionController比以下更好或不同?或者MultiActionController更多是旧版Spring的遗产?我觉得我有一些基本的误解......

@Controller
public class MyController {

    @RequestMapping("/SomePage.html")
    public ModelAndView epdReview(
        @RequestParam(value="sessionID", required=true) String sessionId,
        MyFormData form,
        HttpSession session,
            HttpServletRequest request){
        //....
    }

    @RequestMapping(value = "/newData.json", method = RequestMethod.POST)
    public @ResponseBody ValidationResponse process(Model model,
        @Valid SomeData formData, BindingResult result,
        HttpSession session) {
        //....
    }
}

5 个答案:

答案 0 :(得分:3)

是的,这是来自Spring 2.0 MVC API,就像实现旧Controller Interface的任何东西一样。我在Spring开发人员的网站上找不到任何关于为什么在所有堂兄弟都没有弃用这个内容的时候。

我可以提供100%纯粹的猜测,因为人们可能拥有MethodNameResolver的完全有效的自定义实现,这些实现无法用DefaultAnnotationMethodHandlerAdapter的行为取代。因此,基于注释的配置不提供100%替代此类的每个合法用途。

答案 1 :(得分:1)

Spring提供了一个多动作控制器,通过它可以将多个动作聚合到一个控制器中,将功能组合在一起。多操作控制器能够将请求映射到方法名称,然后调用正确的方法名称。当您在一个控制器中有许多常用功能但希望有多个入口点到控制器时,使用多动作控制器尤其方便

答案 2 :(得分:0)

使用带注释的控制器的漏洞 - 就像后面的示例一样 - 支持请求处理,而不依赖于继承或框架特定的类(如第一个例子中的四个)。在Spring Documentation中,您可以找到:

  

Spring 2.5为MVC引入了基于注释的编程模型   控制器,使用@RequestMapping,@ RequestParam等注释,   @ModelAttribute等。这两个注释支持都可用   Servlet MVC和Portlet MVC。以这种方式实现的控制器可以   不必扩展特定的基类或实现特定的   接口

因此,如果您已经在使用带注释的控制器,那么扩展像MultiActionController这样的Spring内置控制器是没有意义的。

答案 3 :(得分:0)

Spring MultiActionController用于将类似的操作映射到单个控制器。因此,如果使用MultiActionController类,则无需为每个操作创建新的控制器类。

例如:当我们登录网上银行时,可以选择添加和删除收款人。因此我们可以使用单个PayeeController来执行类似的操作,例如添加和删除。

答案 4 :(得分:-1)

引自mkyong.com

在Spring MVC应用程序中,MultiActionController用于将相关操作分组到单个控制器中,方法处理程序必须遵循以下签名:

public (ModelAndView | Map | String | void) actionName(
    HttpServletRequest, HttpServletResponse [,HttpSession] [,CommandObject]);

例如

package com.vitthal.common.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class CustomerController extends MultiActionController{

    public ModelAndView add(HttpServletRequest request,
        HttpServletResponse response) throws Exception {

        return new ModelAndView("CustomerPage", "msg","add() method");

    }

    public ModelAndView delete(HttpServletRequest request,
        HttpServletResponse response) throws Exception {

        return new ModelAndView("CustomerPage", "msg","delete() method");

    }

    public ModelAndView update(HttpServletRequest request,
        HttpServletResponse response) throws Exception {

        return new ModelAndView("CustomerPage", "msg","update() method");

    }

    public ModelAndView list(HttpServletRequest request,
        HttpServletResponse response) throws Exception {

        return new ModelAndView("CustomerPage", "msg","list() method");

    }

}

配置ControllerClassNameHandlerMapping。

<beans ...>

 <bean 
  class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

  <bean class="com.mkyong.common.controller.CustomerController" />

</beans>

映射示例 现在,请求的URL将以下列模式映射到方法名称:

CustomerController –> /customer/*
/customer/add.htm –> add()
/customer/delete.htm –> delete()
/customer/update.htm –> update()
/customer/list.htm –> list()

InternalPathMethodNameResolver InternalPathMethodNameResolver是将URL映射到方法名称的默认MultiActionController实现。但是,您仍然允许在方法名称中添加前缀或后缀:

<beans ...>
 <bean 
  class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

  <bean class="com.vitthal.common.controller.CustomerController">
     <property name="methodNameResolver">
    <bean class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
       <property name="prefix" value="test" />
       <property name="suffix" value="Customer" />
    </bean>
     </property>
   </bean>
</beans>

现在,URL将以下列模式映射到方法名称:

CustomerController –> /customer/*
/customer/add.htm –> testaddCustomer()
/customer/delete.htm –> testdeleteCustomer()
/customer/update.htm –> testupdateCustomer()
/customer/list.htm –> testlistCustomer()

请注意 通过注释,MultiActionController更易于配置