我看到带有各种参数的Spring MVC控制器处理程序方法 . 如:
XXX()
XXX(模特模特儿)
XXX(HttpServletRequest请求,模型模型)
XXX(HttpServletRequest请求,HttpServletResponse响应)
所以,
什么决定参数列表?
为什么Spring控制器处理程序方法没有固定的签名?
Spring如何处理这些变化的参数列表?
我可以输入任意类型的参数吗?
Spring控制器方法签名非常灵活,支持多个参数 . 它们列在documentation中 .
关于你的第二个问题,在编写控制器方法时提供灵活性的原因并没有确切的签名 .
使用HandlerMethodArgumentResolver接口的实现来解析各个参数 . 例如,如果您使用 @PathVariable 参数注释参数,则其值将由 PathVariableMethodArgumentResolver 解析 .
@PathVariable
PathVariableMethodArgumentResolver
您甚至可以创建自己的 HandlerMethodArgumentResolver 实现,以允许控制器方法签名中的某些自定义参数类型 .
HandlerMethodArgumentResolver
从历史上看,Spring曾经有过固定签名的控制器 . 例如,他们将实现AbstractCommandController接口 . 这样的控制器将实现以下方法:
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors)
然而,Spring从那时起逐渐发展,并且这种方法在Spring 3中被弃用,转而使用基于注释的控制器 .
请参见spring参考章节:21.3.3 Defining @RequestMapping handler methods,它列出了所有支持的参数 .
它没有固定的签名,因为人们经常要实现这么多不同的控制器,所有控制器都需要不同的信息 . 当然,您可以自己完成从HttpServletRequest对象中提取所有信息,但这不是Spring方式:Spring-Way更多的是您使用高级抽象来实现业务逻辑,让Spring执行低级技术的东西 .
但是,对于基于接口或继承的方法使用灵活的注释基础方法最重要的一点是,您可以在一个控制器类中拥有多个请求处理程序方法 . (使用接口时,每个处理程序几乎需要一个类 . )
您将获得支持的类型列表Supported method argument types,它们作为处理程序方法的参数 .
使用java反射,Spring将解析控制器方法的参数 . 因此,在您的情况下,Locale和模型将自动传递给您 . 如果您包含另一个参数,例如HttpSession,将传递给您 .
3 回答
Spring控制器方法签名非常灵活,支持多个参数 . 它们列在documentation中 .
关于你的第二个问题,在编写控制器方法时提供灵活性的原因并没有确切的签名 .
使用HandlerMethodArgumentResolver接口的实现来解析各个参数 . 例如,如果您使用
@PathVariable
参数注释参数,则其值将由PathVariableMethodArgumentResolver
解析 .您甚至可以创建自己的
HandlerMethodArgumentResolver
实现,以允许控制器方法签名中的某些自定义参数类型 .从历史上看,Spring曾经有过固定签名的控制器 . 例如,他们将实现AbstractCommandController接口 . 这样的控制器将实现以下方法:
然而,Spring从那时起逐渐发展,并且这种方法在Spring 3中被弃用,转而使用基于注释的控制器 .
请参见spring参考章节:21.3.3 Defining @RequestMapping handler methods,它列出了所有支持的参数 .
它没有固定的签名,因为人们经常要实现这么多不同的控制器,所有控制器都需要不同的信息 . 当然,您可以自己完成从HttpServletRequest对象中提取所有信息,但这不是Spring方式:Spring-Way更多的是您使用高级抽象来实现业务逻辑,让Spring执行低级技术的东西 .
但是,对于基于接口或继承的方法使用灵活的注释基础方法最重要的一点是,您可以在一个控制器类中拥有多个请求处理程序方法 . (使用接口时,每个处理程序几乎需要一个类 . )
您将获得支持的类型列表Supported method argument types,它们作为处理程序方法的参数 .
使用java反射,Spring将解析控制器方法的参数 . 因此,在您的情况下,Locale和模型将自动传递给您 . 如果您包含另一个参数,例如HttpSession,将传递给您 .