@RequestParam 및 @PathVariable


353

특수 문자를 처리 할 때 @RequestParam@PathVariable처리 할 때의 차이점은 무엇입니까 ?

+@RequestParam공간 으로 받아 들여졌습니다 .

의 경우 @PathVariable, +로 받아 들여졌다 +.

답변:


497

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가 "인보이스"인 사용자에 대한 세부 정보 를 제공 하시겠습니까?


11
@PathVariable모든 RequestMethod
Kurai Bankusu

1
@ AlexO : 이것은 java8과 관련이 없으며 java 5 및 Spring3.0에서도 작동합니다. 요점은 코드가 디버깅이 활성화 된 상태에서 컴파일된다는 것입니다.
Ralph

2
@Ralph 맞습니다. 이것은 Java 8 이전의 디버깅에서 작동합니다. Java 8부터는 "-parameters"를 대신 사용하여 디버깅 없이도 작동합니다. docs.spring.io/spring/docs/current/spring-framework-reference/… docs.oracle .com / javase / tutorial / reflect / member /…
AlexO

1
@ user3705478 : 스프링은 이것이 요청 핸들러 메소드라는 것을 알아야하기 때문에 그렇게 생각하지 않습니다. (물론 @PathParam URI 템플릿에 자리 표시자가있는 경우에만 작동)
Ralph

2
@ user3705478 : @PathParam은 javax.ws.rs 주석입니다. docs.oracle.com/javaee/7/api/javax/ws/rs/PathParam.html
Ralph

112

요청에서 쿼리 매개 변수 값에 액세스하는 데 사용되는 @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 – 바인딩 할 매개 변수 이름
  • 필수 – 매개 변수가 필수인지 아닌지. 참이면 해당 매개 변수를 보내지 않으면 실패합니다.
  • value – 이름 속성의 별명입니다.

@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

1
.. 그리고 여기에 원래의 게시물은 다음과 같습니다 - javabeat.net/spring-mvc-requestparam-pathvariable
Mehraj 말리크

@PathParam@RequestParam사용하지 않고 선언@RequestMapping
sofs1

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데이터가 대부분 쿼리 매개 변수로 전달되는 기존 웹 응용 프로그램에서 더 유용하지만 @PathVariableURL에 값이 포함 된 RESTful 웹 서비스에 더 적합합니다.

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에 의해 허용됩니다.

동작을 확인하고 확인하기 위해 컨트롤러가 하나만 포함 된 스프링 부트 응용 프로그램을 만들었습니다.

 @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 =! @ # $ % ^ & * () _ +-= [] {} |; ': ",. / <>?

! @는 두 요청 모두에 대한 응답으로 수신되었습니다


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.