[英]Pass value to controller in Spring MVC, what is the difference?
当我在一个旧项目中阅读一些用Spring MVC编写的代码时,我注意到作者使用两种类似的方法将值传递给控制器,如下所示:
@RequestMapping(value="/print")
public String PrintInfo(@RequestParam("name") String name,@RequestParam("age") int age) {
.......
}
要么
@RequestMapping(value="/print")
public String PrintInfo(String name,int age) {
.......
}
他们俩都运作良好。 区别在于是否使用@RequestParam。
那么它们之间的主要区别是什么? 哪一个更好,为什么?
基本上,这听起来像是您在问“什么是RequestParam
,为什么要使用它?”
RequestParam允许您将方法参数参数绑定到Web请求参数。 如果没有其他任何属性,您的示例将告诉Spring要求提供name
和age
参数,并且Spring将知道将这两个参数与传入的请求相关联。 您可以选择将required
设置为false
以使参数成为可选参数:
public String PrintInfo(@RequestParam("name", required = false) String name,
@RequestParam("age") int age) {
作为一项非常有用的功能,如果您从请求中收到一个空值,还可以提供defaultValue
。 因此,您可以执行以下操作:
public String PrintInfo(@RequestParam("name", defaultValue="John Doe") String name,
@RequestParam("age") int age) {
...而且您将永远不会使用空名称。
最后,使用它还会执行一些魔术类型转换,例如自动使用Integer
类型。 在您的示例中,您可能使用了:
public String PrintInfo(@RequestParam("name") String name,
@RequestParam("age") Integer age) {
...而Spring会自动将其装箱,无需您进行任何额外的工作。
放弃RequestParam
批注并没有本质上的错误,但是实际上,您拒绝对Spring启用这些功能(就像在第二种情况下一样)表示不接受。
在旁边:
@RequestMapping(value="/print")
可以更简单地写为@RequestMapping("/print")
如果请求参数的名称和方法参数的名称相等,则Spring将按名称自动绑定参数。 例如,您有传入的GET
请求:
http://localhost:8080/print?name=somename&age=30
和控制器方法:
@RequestMapping(value="/print")
public String PrintInfo(String name,int age) {
...
}
在这种情况下,您不需要为参数指定@RequestParam
批注。 因为请求中的名称与方法args的名称相等。
但是,当名称不相等时,则需要使用@RequestParam
显式指定名称的对应关系。 例如:
http://localhost:8080/print?user_name=somename&user_age=30
和控制器方法:
@RequestMapping(value="/print")
public String PrintInfo(@RequestParam("user_name") String userName, @RequestParam("user_age")int userAge) {
...
}
因此,当请求参数名称和方法args名称不同时,@ @RequestParam
需要帮助Spring正确进行绑定。
因此,即使名称相同,许多开发人员也始终使用@RequestParam
。 例如空的@RequestParam
:
@RequestMapping(value="/print")
public String PrintInfo(@RequestParam() String name, @RequestParam() int age) {
...
}
因为此批注显示参数来自请求,并使您的代码更清晰易读。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.