Java 在SpringMVC中将值传递给控制器,有什么区别?

Java 在SpringMVC中将值传递给控制器,有什么区别?,java,spring,spring-mvc,web,Java,Spring,Spring Mvc,Web,当我在一个旧项目中阅读一些用Spring MVC编写的代码时,我注意到作者使用两种类似的方法将值传递给控制器,如下所示: @RequestMapping(value="/print") public String PrintInfo(@RequestParam("name") String name,@RequestParam("age") int age) { ....... } 或 它们都很好用。 区别在于它是否使用@RequestParam 那么他们之间的主要区别是什么?

当我在一个旧项目中阅读一些用Spring MVC编写的代码时,我注意到作者使用两种类似的方法将值传递给控制器,如下所示:

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

它们都很好用。 区别在于它是否使用@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) {
…而且你永远不会处理空名称

最后,使用它还可以进行一些神奇的类型转换,例如自动使用
整数
类型。在您的示例中,您可以使用:

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) {
    ...
}
@RequestMapping(value="/print")
public String PrintInfo(@RequestParam("user_name") String userName, @RequestParam("user_age")int userAge) {
    ...
}
在这种情况下,不需要为参数指定
@RequestParam
注释。因为请求中的名称和方法args的名称相等


但是当名称不相等时,则需要显式地指定名称与
@RequestParam
的对应关系。例如:

http://localhost:8080/print?user_name=somename&user_age=30
和控制器方法:

@RequestMapping(value="/print")
public String PrintInfo(String name,int age) {
    ...
}
@RequestMapping(value="/print")
public String PrintInfo(@RequestParam("user_name") String userName, @RequestParam("user_age")int userAge) {
    ...
}
因此,当请求参数名称和方法参数名称不同时,需要
@RequestParam
来帮助Spring正确地进行绑定


实际上,许多开发人员总是使用
@RequestParam
,即使名称相等。例如,empty
@RequestParam

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

因为此注释显示参数来自请求,使代码更清晰易读。

听起来您已经有了答案!