@RequestParam vs @PathVariable

在处理特殊字符时,@RequestParam'和@PathVariable'之间有什么区别?

+@RequestParam接受为空格。

@PathVariable的情况下,+被接受为+

如果URLhttp://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013获得用户1234在2013年12月5日的发票,控制器方法将看起来像。

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}

另外,请求参数可以是可选的,从Spring 4.3.3开始,路径变量也可以是可选的。但要注意,这可能会改变URL路径的层次结构,并引入请求映射冲突。例如,/user/invoices会提供用户null的发票,还是提供ID为"invoices"的用户的详细信息?

评论(14)

@RequestParam注解,用于访问请求中的查询参数值。看看下面这个请求的URL。

http://localhost:8080/springmvc/hello/101?param1=10&param2=20

在上述URL请求中,param1和param2的值可以被访问,如下所示。

public String getDetails(
    @RequestParam(value="param1", required=true) String param1,
        @RequestParam(value="param2", required=false) String param2){
...
}

以下是@RequestParam注解所支持的参数列表。

  • defaultValue - 这是默认值,作为请求没有该值或该值为空时的一种回退机制。
  • name - 要绑定的参数的名称
  • required - 该参数是否是强制性的。如果它是真的,发送该参数将失败。
  • value - 这是name属性的一个别名。

@PathVariable

@PathVariable标识了传入请求的URI中使用的模式。让我们看一下下面的请求URL。

上述URL请求可以在你的Spring MVC中写成如下。

@RequestMapping("/hello/{id}")    public String getDetails(@PathVariable(value="id") String id,
    @RequestParam(value="param1", required=true) String param1,
    @RequestParam(value="param2", required=false) String param2){
.......
}

@*PathVariable注解只有一个属性值用于绑定请求URI模板。允许在单个方法中使用多个@PathVariable注解。但是,要确保不超过一个方法有相同的模式。

此外,还有一个有趣的注解。 @MatrixVariable

以及对它的控制器方法

 @RequestMapping(value = "/{stocks}", method = RequestMethod.GET)
  public String showPortfolioValues(@MatrixVariable Map matrixVars, Model model) {

    logger.info("Storing {} Values which are: {}", new Object[] { matrixVars.size(), matrixVars });

    List outlist = map2List(matrixVars);
    model.addAttribute("stocks", outlist);

    return "stocks";
  }

但你必须启用。

评论(3)

可能是application/x-www-form-urlencoded midia类型将空格转换为+,而接收者会通过将+转换为空格来解码数据。查看网址以获得更多信息。http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

评论(0)