@RequestParam与@PathVariable


353

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

+@RequestParam空间接受。

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

Answers:


497

如果该网址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为“发票”的用户详细信息吗?


11
@PathVariable可以在任何RequestMethod中使用
Kurai Bankusu

1
@AlexO:这与java8无关,即使在Java 5和Spring3.0中也可以使用:关键是代码是在启用调试的情况下编译的。
拉尔夫

2
@Ralph正确的,这作品与Java 8调试之前由于Java 8还工作没有调试,而不是使用“α参数”:docs.spring.io/spring/docs/current/spring-framework-reference/... docs.oracle .com / javase / tutorial / reflect / member /…
AlexO

1
@ user3705478:我不这么认为,因为spring需要知道这是一个请求处理程序方法。(当然:@PathParam 仅当uri模板中有占位符时才有效)
拉尔夫(Ralph

2
@ user3705478:@PathParam是javax.ws.rs批注。docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
拉尔夫

112

@RequestParam批注用于访问请求中的查询参数值。查看以下请求URL:

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

在上述网址请求中,可以按以下方式访问param1和param2的值:

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

以下是@RequestParam批注支持的参数列表:

  • defaultValue –这是默认值,作为后备机制,如果请求没有该值或该值为空。
  • name –要绑定的参数的名称
  • 必需 –该参数是否为必需。如果为true,则无法发送该参数将失败。
  • –这是名称属性的别名

@PathVariable

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

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批注仅具有一个用于绑定请求URI模板的属性值。允许在单个方法中使用多个@ PathVariable批注。但是,请确保不止一种方法具有相同的模式。

另外还有一个有趣的注释: @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" >

诸如这样的字符串userName是否具有类型参数?我倾向于使其成为变量,但它也可能是一个参数。
cst1992 '16


可以@PathParam并且@RequestParam不用声明就可以宣布@RequestMapping
sofs1 '18

29

@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;
}

简单明了的@alok
anand krish

12

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);
}

while @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应用程序上更有用,在传统的Web应用程序中,数据大多在查询参数中传递,而@PathVariable更适合URL包含值的RESTful Web服务。

3)如果属性不存在,则@RequestParam注释可以使用属性指定默认值(如果查询参数不存在或为空defaultValuefalse

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

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

}

1
@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) {

}

1

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

仅2个特殊字符“!” 注释@PathVariable和@RequestParam接受“和”。

为了检查并确认行为,我创建了一个仅包含1个控制器的spring boot应用程序。

 @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. 本地主机:7000 / pvar /!@#$%^&*()_ +-= [] {} |;'::,。/ <>?
  2. 本地主机:7000 / rpvar?param =!@#$%^&*()_ +-= [] {} |;'::,。/ <>?

在两个请求中均收到!@作为答复


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.