【问题标题】:Pass value to controller in Spring MVC, what is the difference?在 Spring MVC 中将值传递给控制器​​,有什么区别?
【发布时间】:2017-06-10 04:45:45
【问题描述】:

当我在一个旧项目中阅读一些用 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。

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

【问题讨论】:

  • 听起来你已经有了答案!

标签: java spring spring-mvc web


【解决方案1】:

这听起来基本上就像你在问“什么是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")

【讨论】:

    【解决方案2】:

    如果请求参数的名称方法参数的名称相等,那么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) {
        ...
    }
    

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

    【讨论】:

      猜你喜欢
      • 2013-03-19
      • 2014-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多