@RequestParam vs @PathVariable

时间:2012-12-05 03:25:03

标签: java spring spring-mvc

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

<{>} +@RequestParam视为空格。

如果是@PathVariable,则+被接受为+

7 个答案:

答案 0 :(得分:447)

如果网址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开始,路径变量can be optional as well。请注意:这可能会更改URL路径层次结构并引入请求映射冲突。例如,/user/invoices会提供用户null的发票或有关ID“发票”的用户的详细信息吗?

答案 1 :(得分:90)

用于从请求中访问查询参数值的

@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 - 要绑定的参数的名称
  • 必需 - 参数是否为必填项。如果是,则无法发送该参数将失败。
  • - 这是name属性的别名

<强> @PathVariable

@ PathVariable 标识传入请求的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 注释只有一个用于绑定请求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" >

答案 2 :(得分:14)

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

答案 3 :(得分:2)

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

3)如果要求的属性为false,则@RequestParam批注可以使用defaultValue属性指定查询参数不存在或为空的默认值。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

仅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. localhost:7000 / pvar /!@#$%^&*()_ +-= [] {} |;':'',。/ <>?
  2. localhost:7000 / rpvar?param =!@#$%^&*()_ +-= [] {} |;'::,。/ <>?
在两个请求中均收到

!@作为响应

答案 6 :(得分:-1)

x: array([ 16.66912781,   6.88105559])