当我在旧项目中读取一些用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。
那么它们之间的主要区别是什么?哪一个更好,为什么?
答案 0 :(得分:4)
这对我来说基本上听起来像你要问的是什么是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")
答案 1 :(得分:1)
如果请求参数的名称和方法参数的名称相等,那么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) {
...
}
因此,当请求参数名称和方法名称不同时,@RequestParam
需要帮助Spring正确地进行绑定。
实际上,即使名称相同,许多开发人员也总是使用@RequestParam
。例如,空@RequestParam
:
@RequestMapping(value="/print")
public String PrintInfo(@RequestParam() String name, @RequestParam() int age) {
...
}
因为此注释显示参数来自请求并使您的代码更清晰易读。