在Spring MVC中向控制器传递值,有何区别?

3

当我阅读旧项目中使用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。

那么它们之间的主要区别是什么?哪一个更好,为什么呢?


听起来你已经有答案了! - Shivam Aggarwal
2个回答

4

我觉得你的问题基本上是在问"RequestParam是什么,为什么要使用它?"

RequestParam允许你将方法参数绑定到web请求参数。在没有其他属性的情况下,你的示例告诉Spring需要一个nameage参数,并且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) {

如果你没有加上RequestParam注解,Spring也会自动帮你封装参数,无需额外的工作。

不加注解本身并没有问题,但是实际上你在第二种情况下拒绝了Spring的这些特性。

另外:

@RequestMapping(value="/print")可以简写为@RequestMapping("/print")


1
如果请求参数的名称方法参数的名称相同,则Spring将自动按名称绑定参数。例如,您有一个传入的GET请求:
http://localhost:8080/print?name=somename&age=30

并且控制器方法:

@RequestMapping(value="/print")
public String PrintInfo(String name,int age) {
    ...
}

在这种情况下,您不需要为参数指定@RequestParam注释。因为请求中的名称和方法参数的名称相同。

但是当名称不相同时,您需要使用@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) {
    ...
}

因为这个注解表明参数来自请求,使您的代码更清晰易读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接