繁体   English   中英

将值传递给Spring MVC中的控制器,有什么区别?

[英]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要求提供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) {

...而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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM