在处理特殊字符时,@RequestParam'和
@PathVariable'之间有什么区别?
+
被@RequestParam
接受为空格。
在@PathVariable
的情况下,+
被接受为+
。
@PathVariable
是为了从URI中获取一些占位符(Spring称其为URI模板)@RequestParam
也是从URI中获取一个参数--参见Spring参考章节16.3.3.3 用@RequestParam将请求参数绑定到方法参数如果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<Invoice> listUsersInvoices(
@PathVariable("userId") int user,
@RequestParam(value = "date", required = false) Date dateOrNull) {
...
}
另外,请求参数可以是可选的,从Spring 4.3.3开始,路径变量也可以是可选的。但要注意,这可能会改变URL路径的层次结构,并引入请求映射冲突。例如,/user/invoices
会提供用户null
的发票,还是提供ID为"invoices"的用户的详细信息?
@RequestParam注解,用于访问请求中的查询参数值。看看下面这个请求的URL。
http://localhost:8080/springmvc/hello/101?param1=10¶m2=20
在上述URL请求中,param1和param2的值可以被访问,如下所示。
public String getDetails(
@RequestParam(value="param1", required=true) String param1,
@RequestParam(value="param2", required=false) String param2){
...
}
以下是@RequestParam注解所支持的参数列表。
@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<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" >