@RequestParam vs @PathVariable

问题

@RequestParam@PathVariable处理特殊字符时有什么区别?+@RequestParamas空间接受。如果是8965656551,+则被接受为+


#1 热门回答(375 赞)

  • @PathVariable是从URI获取一些占位符(Spring称之为URI模板) - 参见Spring参考章节16.3.2.2 URI模板模式
  • @RequestParam也是从URI获取参数 - 请参阅Spring参考章节16.3.3.3使用@RequestParam将请求参数绑定到方法参数

如果URLhttp://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013在2013年12月5日为用户1234设置了发票,则控制器方法如下所示:

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

此外,请求参数可以是可选的,从Spring 4.3.3路径变量can be optional as well开始。请注意:这可能会更改URL路径层次结构并引入请求映射冲突。例如,will/user/invoices是否为usernull提供了有关ID为"发票"的用户的详细信息?


#2 热门回答(70 赞)

@RequestParamannotation用于从请求中访问查询参数值。查看以下请求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
    @PathVariableidentifies传入请求的URI中使用的模式。我们来看看下面的请求网址:

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

上面的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 360​​061734annotation只有一个用于绑定请求URI模板的属性值。允许在单个方法中使用多个@PathVariableannotation。但是,请确保只有一种方法具有相同的模式。

另外还有一个有趣的注释:@MatrixVariable

http:// localhost:8080 / spring_3_2 / matrixvars / stocks; BT.A = 276.70,10.40,3.91; AZN = 236.00,103.00,3.29; SBRY = 375.50,7.60,2.07

以及它的Controller方法

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

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

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

    return "stocks";
  }

但你必须启用:

<mvc:annotation-driven enableMatrixVariables="true" >

#3 热门回答(0 赞)

它可能是application / x-www-form-urlencoded midia类型转换空间为****,并且接收方将通过将****转换为space来解码数据。检查网址以获取更多信息.http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1