如何确定Spring Controller方法的参数?

时间:2015-11-02 09:01:39

标签: spring spring-mvc

我看到Spring MVC控制器处理程序方法有各种参数。如:

  • XXX()
  • XXX(型号型号)
  • XXX(HttpServletRequest请求,模型模型)
  • XXX(HttpServletRequest请求,HttpServletResponse响应)

所以,

  • 决定参数列表的是什么?
  • 为什么Spring控制器处理程序方法没有固定的签名?
  • Spring如何处理这些变化的参数列表?
  • 我可以输入任意类型的参数吗?

3 个答案:

答案 0 :(得分:1)

参见spring参考章节:21.3.3 Defining @RequestMapping handler methods,列出所有支持的参数。

它没有固定的签名,因为人们经常要实现这么多不同的控制器,所有这些都需要不同的信息。当然,您可以自己完成从HttpServletRequest对象中提取所有信息,但这不是Spring方式:Spring-Way更多的是您使用高级抽象来实现业务逻辑,让Spring执行低级技术人员。

但是,对于基于接口或继承的方法使用灵活的注释基础方法最重要的一点是,您可以在一个控制器类中拥有多个请求处理程序方法。 (使用接口时,每个处理程序几乎需要一个类。)

答案 1 :(得分:1)

Spring控制器方法签名非常灵活,支持多个参数。它们列在documentation

关于你的第二个问题,在编写控制器方法时提供灵活性的原因并没有确切的签名。

使用HandlerMethodArgumentResolver接口的实现来解析各个参数。例如,如果您使用@PathVariable参数注释参数,则其值将由PathVariableMethodArgumentResolver解析。

您甚至可以创建自己的HandlerMethodArgumentResolver实现,以允许控制器方法签名中的某些自定义参数类型。

历史上,Spring曾经有过固定签名的控制器。例如,他们将实现AbstractCommandController接口。这样的控制器将实现以下方法:

ModelAndView handle(HttpServletRequest request, HttpServletResponse response,
        Object command, BindException errors)

然而,Spring从那时起逐渐发展,并且这种方法在Spring 3中被弃用,转而采用基于注释的控制器。

答案 2 :(得分:0)

您将获得支持的类型列表Supported method argument types,它们作为处理程序方法的参数。

使用java反射,Spring将解析控制器方法的参数。因此,在您的情况下,Locale和模型将自动传递给您。如果你包含了另一个参数,比如HttpSession,那么它将被传递给你。