@RequestParam
和@PathVariable
处理特殊字符有什么区别? +
被@RequestParam
接受为空格。 对于
@PathVariable
,+
被接受为+
。#1 楼
@PathVariable
是要从URI中获得一些占位符(Spring称为URI模板)。—请参见Spring Reference第16.3.2.2章URI模板模式
@RequestParam
也将从URI中获取参数-请参见Spring Reference第16.3.3.3章,使用@RequestParam 将请求参数绑定到方法参数上。如果用户是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路径层次结构并引入请求映射冲突。例如,
http://localhost:8080/MyApp/user/1234/invoices?date=12-05-2013
是否提供用户/user/invoices
的发票或有关ID为“发票”的用户的详细信息?#2 楼
@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批注支持的参数列表:
defaultValue –这是作为回退机制的默认值如果请求没有值或为空。
名称–要绑定的参数的名称
必需–参数是否为必需。如果为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
及其控制器方法
@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-10-24在9:16
..这是原始帖子:-javabeat.net/spring-mvc-requestparam-pathvariable
– Mehraj Malik
17-4-28在4:39
可以在不使用@RequestMapping的情况下声明@PathParam和@RequestParam
–sofs1
18年3月31日在8:26
#3 楼
@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;
}
#4 楼
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)
@RequestParam
如果查询参数不存在或为空,则注释可以使用defaultValue
属性指定默认值,前提是必需的属性为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";
}
}
#5 楼
@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) {
}
#6 楼
两个注释的行为方式完全相同。只有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;
}
}
遇到以下请求,我得到了相同的响应:
localhost:7000 / pvar /!@#$%^&*()_ +-= [] {} |;':“,。/ <>?
localhost:7000 / rpvar?param =!@#$%^&*()_ +-= [] {} |;':” ,。/ <>?
!@在两个请求中均作为响应
评论
@PathVariable可以在任何RequestMethod中使用
–库莱班库苏(Kurai Bankusu)
15年7月1日在13:42
@AlexO:这与java8无关,甚至对于Java 5和Spring3.0也有效:关键是代码是在启用调试的情况下编译的。
–拉尔夫
16-10-23在8:18
@Ralph正确,这可以在Java 8之前进行调试。由于Java 8也可以在不进行调试的情况下工作,而是使用“ -parameters”:docs.spring.io/spring/docs/current/spring-framework-reference/…docs.oracle .com / javase / tutorial / reflect / member / ...
– AlexO
16-10-27在22:40
@ user3705478:我不这么认为,因为spring需要知道这是一个请求处理程序方法。 (当然:@PathParam仅在uri模板中有占位符时有效)
–拉尔夫
18年4月1日在18:58
@ user3705478:@PathParam是javax.ws.rs批注。 docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
–拉尔夫
18年4月5日在19:06