@RequestParam vs @PathVariable

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

+@RequestParam接受为空格。

对于@PathVariable+被接受为+

517326 次浏览

如果URL http://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开始,路径变量也可以是可选的吗。但是要注意,这可能会改变URL路径层次结构并引入请求映射冲突。例如,/user/invoices是否会提供用户null的发票或ID为“发票”的用户的详细信息?

可能是application/x-www-form-urlencoded midia类型将空格转换为+,接收方将通过将+转换为空格来解码数据。查看url获取更多信息

@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 -如果请求没有该值或为空,这是作为回退机制的默认值。
  • 的名字 -要绑定的参数的名称
  • 要求 -参数是否必选。如果为true,则发送该参数失败。
  • 价值 -这是name属性的别名

@PathVariable

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

http://localhost:8080/springmvc/hello/101?param1=10¶m2=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注释只有一个用于绑定请求URI模板的属性值。允许在单个方法中使用多个@PathVariable注释。但是,确保不超过一个方法具有相同的模式。

还有一个更有趣的注释: @MatrixVariable < / >强

< a href = " http://localhost: 8080 / spring_3_2 / matrixvars /股票;股价= 276.70 + 10.40 + 3.91,下跌= 236.00 + 103.00 + 3.29;SBRY = 375.50 + 7.60 + 2.07”rel = " noreferrer " > http://localhost: 8080 / spring_3_2 matrixvars /股票;股价= 276.70 + 10.40 + 3.91,下跌= 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" >
@PathVariable - must be placed in the endpoint uri and access the query parameter value from the request
@RequestParam - must be passed as method parameter (optional based on the required property)
http://localhost:8080/employee/call/7865467


@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
public List<Calls> getAgentCallById(
@PathVariable(“callId") int callId,
@RequestParam(value = “status", required = false) String callStatus) {


}


http://localhost:8080/app/call/7865467?status=Cancelled


@RequestMapping(value=“/call/{callId}", method = RequestMethod.GET)
public List<Calls> getAgentCallById(
@PathVariable(“callId") int callId,
@RequestParam(value = “status", required = true) String callStatus) {


}

@RequestParam用于查询参数(静态值),如:http://localhost:8080/calculation/pow?base=2&ext=4

@PathVariable用于动态值,如:http://localhost:8080/calculation/sqrt/8

@RequestMapping(value="/pow", method=RequestMethod.GET)
public int pow(@RequestParam(value="base") int base1, @RequestParam(value="ext") int ext1){
int pow = (int) Math.pow(base1, ext1);
return pow;
}


@RequestMapping("/sqrt/{num}")
public double sqrt(@PathVariable(value="num") int num1){
double sqrtnum=Math.sqrt(num1);
return sqrtnum;
}

1) @RequestParam用于提取查询参数

http://localhost:3000/api/group/test?id=4


@GetMapping("/group/test")
public ResponseEntity<?> test(@RequestParam Long id) {
System.out.println("This is test");
return ResponseEntity.ok().body(id);
}

@PathVariable用于从URI中提取数据:

http://localhost:3000/api/group/test/4


@GetMapping("/group/test/{id}")
public ResponseEntity<?> test(@PathVariable Long id) {
System.out.println("This is test");
return ResponseEntity.ok().body(id);
}

2) @RequestParam在传统的web应用程序中更有用,其中数据主要通过查询参数传递,而@PathVariable更适合URL包含值的rest式web服务。

3)如果查询参数不存在或使用defaultValue属性为空,则@RequestParam注释可以指定默认值,前提是所需的属性是false:

@RestController
@RequestMapping("/home")
public class IndexController {


@RequestMapping(value = "/name")
String getName(@RequestParam(value = "person", defaultValue = "John") String personName) {
return "Required element of request param";
}


}

这两个注释的行为完全相同。

只有2个特殊字符!'和'@'被注释@ pathvariable和@ requestparam接受。

为了检查和确认行为,我创建了一个只包含1个控制器的spring引导应用程序。

 @RestController
public class Controller
{
@GetMapping("/pvar/{pdata}")
public @ResponseBody String testPathVariable(@PathVariable(name="pdata") String pathdata)
{
return pathdata;
}


@GetMapping("/rpvar")
public @ResponseBody String testRequestParam(@RequestParam("param") String paramdata)
{
return paramdata;
}
}

点击以下请求,我得到了相同的响应:

  1. localhost: 7000 / pvar ! @ # $ % ^和 ;*()_+-=[]{}|;':",./& lt; > ?
  2. localhost: 7000 / rpvar ?参数= ! @ # $ % ^和 ;*()_+-=[]{}|;':",./& lt; > ?

在两个请求中都收到了!@作为响应

@RequestParam:我们可以说它是一个类似键值对的查询参数 @PathVariable:-它来自URI