Pass value to controller in Spring MVC, what is the difference?
当我在一个旧项目中读到一些用SpringMVC编写的代码时,我注意到作者使用两种类似的方法将值传递给控制器,如下所示:
1 2 3 4
| @RequestMapping (value ="/print")
public String PrintInfo (@RequestParam ("name") String name,@RequestParam ("age") int age ) {
.......
} |
或
1 2 3 4
| @RequestMapping (value ="/print")
public String PrintInfo (String name, int age ) {
.......
} |
他们两个都工作得很好。区别在于它是否使用@requestparam。
那么它们之间的主要区别是什么呢?哪一个更好,为什么?
在我看来,这基本上就像你在问"什么是RequestParam,我为什么要使用它?"
RequestParam允许您将方法参数参数参数绑定到Web请求参数。在没有任何其他属性的情况下,您的示例告诉Spring需要一个name和age参数,Spring将知道将这两个参数与传入请求关联起来。您可以选择将required设置为false,使参数可选:
1 2
| public String PrintInfo (@RequestParam ("name", required = false) String name,
@RequestParam ("age") int age ) { |
作为一个非常有用的特性,您还可以提供一个defaultValue,以防您从请求中收到空值。所以你可以这样做:
1 2
| public String PrintInfo (@RequestParam ("name", defaultValue ="John Doe") String name,
@RequestParam ("age") int age ) { |
…你永远不会处理空名字。
最后,使用它还可以进行一些神奇的类型转换,例如自动使用Integer类型。在您的示例中,您可以使用:
…如果你不做任何额外的工作,Spring会自动装箱。
删除RequestParam注释并没有什么本质上的错误,但是您本质上说不应该像在第二个例子中那样启用这些特性。
旁白:
@RequestMapping(value="/print")可以简单地写为@RequestMapping("/print")。
如果请求参数的名称和方法参数的名称相等,那么Spring将按名称自动绑定参数。例如,您有传入的GET请求:
1
| http://localhost:8080/print?name=somename&age=30 |
和控制器方法:
1 2 3 4
| @RequestMapping (value ="/print")
public String PrintInfo (String name, int age ) {
...
} |
在这种情况下,不需要为参数指定@RequestParam注释。因为请求中的名称和方法参数的名称是相等的。
但当名称不相等时,则需要明确指定名称与@RequestParam的对应关系。例如:
1
| http://localhost:8080/print?user_name=somename&user_age=30 |
和控制器方法:
1 2 3 4
| @RequestMapping (value ="/print")
public String PrintInfo (@RequestParam ("user_name") String userName, @RequestParam ("user_age")int userAge ) {
...
} |
因此,当请求参数名和方法参数名不同时,@RequestParam需要帮助Spring正确地进行绑定。
准确地说,即使名称相同,许多开发人员也总是使用@RequestParam。例如空的@RequestParam:
1 2 3 4
| @RequestMapping (value ="/print")
public String PrintInfo (@RequestParam () String name, @RequestParam () int age ) {
...
} |
因为这个注释显示参数来自请求,使代码更清晰和可读。