Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MultiActionController的作用是什么?_Java_Spring_Spring Mvc - Fatal编程技术网

Java MultiActionController的作用是什么?

Java MultiActionController的作用是什么?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我今天遇到了MultiActionController,我不确定我是否理解它的用途。。。在春天,它说 允许同一类处理多个请求类型的控制器实现。此类的子类可以使用以下形式的方法处理几种不同类型的请求 另一方面,他们说 它将多个请求处理方法聚合到单个控制器中,因此相关功能可以很容易地保持在一起 我仍然不明白扩展MultiActionController与下面的相比是更好还是不同?或者,MultiActionController更像是旧版本Spring的遗留产品?我觉得我有一些基本的误解 @Contr

我今天遇到了
MultiActionController
,我不确定我是否理解它的用途。。。在春天,它说

允许同一类处理多个请求类型的控制器实现。此类的子类可以使用以下形式的方法处理几种不同类型的请求

另一方面,他们说

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

我仍然不明白扩展
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) {
        //....
    }
}
引自:

在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>
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>

通过注释,MultiActionController更容易配置,这是来自Spring2.0MVCAPI的,实现旧版本的任何东西都是如此。我在网上找不到任何关于Spring开发人员关于为什么这一个没有被弃用,而它的所有同类都被弃用的信息


我可以提供100%的纯推测,这可能是因为人们可以拥有完全有效的自定义实现,而这些实现是无法用DefaultAnnotationMethodHandlerAdapter的行为替代的。因此,基于注释的配置并不能为此类的所有合法使用提供100%的替代方案。

使用带注释的控制器(如后面的示例)的关键在于支持请求处理,而不依赖于继承或特定于框架的类(如前四个示例)。在中,您可以找到:

Spring2.5为MVC引入了一个基于注释的编程模型 控制器,使用诸如@RequestMapping、@RequestParam、, @ModelAttribute等。此注释支持可用于 Servlet MVC和Portlet MVC。以这种样式实现的控制器不会 不必扩展特定的基类或实现特定的 接口


因此,如果您已经在使用带注释的控制器,那么扩展Spring内置控制器(如
MultiActionController

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

Spring MultiAction controller用于将类似动作映射到单个控制器。所以,如果使用MultiActionController类,则不需要为每个动作创建新的控制器类


例如:当我们登录到网上银行时,有一个添加和删除收款人的选项。因此,我们可以使用single PayeControl执行类似的操作,如添加和删除。

有一个使用示例,它实现了创建、读取、更新和删除方法。这些操作是相关的,因为它们都在客户对象上运行。哦,我明白了,看起来
MultiActionController
是一种较旧的用法。。。我从您提供的页面中找到另一个页面,上面说
@RequestMapping
是基于注释的
MultiActionController
是的,这很有意义。ASP.NET MVC使用与此类似的属性,并且从来没有多动作控制器。我在internet上看到了许多示例,现在您在这里提供了另一个示例。我不清楚(OP也不清楚)的是,你为什么不使用普通的控制器呢?@Vitthal谢谢,我自己可以在mkyong网站上阅读这个例子;)通常,我们在xml文件中有映射,用于DispatcherServlet根据URL映射决定使用哪个控制器,但如果我们必须根据请求参数做出决定,则可以使用MultiActionController。Spring提供了一个多动作控制器,通过它可以将多个动作聚合到一个控制器中,将功能分组在一起。多动作控制器能够将请求映射到方法名称,然后调用正确的方法名称。当您在一个控制器中有许多常用功能,但希望控制器有多个入口点时,使用多动作控制器尤其方便。并且希望严重混淆实习生…:)感谢Affe,你的评论帮助我澄清了一个困惑,我在读了一篇关于diff older的文章后发现,“所有”控制器都不推荐使用(这没有意义,所以现在我至少知道这么多)。BaseCommandController和“down”都不推荐使用,几乎涵盖了所有内容,但正如我们看到的,不完全是这样!也许他们只是想给那些构建了自己的控制器接口基础实现的人留下一些保证,即dispatcher servlet将请求传递给代码的基本功能没有被删除的危险。之所以不反对这种做法,是因为注释创建了I/O到控制器接口的绑定控制器,其中I/O数据不能与架构组件共享,从而在考虑API时产生架构横切问题。这样的类允许抽象通信,因此控制器是一个单一关注点,次要关注点可以分离并与架构组件共享。谢谢Carlos。我在版本3中开始阅读/做Spring,所以我
<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>
CustomerController –> /customer/*
/customer/add.htm –> testaddCustomer()
/customer/delete.htm –> testdeleteCustomer()
/customer/update.htm –> testupdateCustomer()
/customer/list.htm –> testlistCustomer()