URI 상에서 '{ }' 로 감싸여있는 부분과 동일한 변수명을 사용하는 방법이다.
이때 여러 개의 인자를 정의하는 것도 가능하다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@Controller
public class UserController {
@GetMapping("/user/{age}/{name}")
public String user(@PathVariable String age, @PathVariable String name) {
System.out.println("나이는 " + age);
System.out.println("이름은 " + name);
return "index";
}
}
//'http://localhost:8080/user/30/홍길동' 으로 접속했을 때의 출력 결과
//나이는 30
//이름은 홍길동
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("user/{name}")
public class UserController {
@GetMapping("/{age}")
public String user(
@PathVariable(value = "age") String userAge,
@PathVariable(value = "name") String userName) {
System.out.println("나이는 " + userAge);
System.out.println("이름은 " + userName);
return "index";
}
}
만약 변수가 많아 하나씩 작성하기 힘들다면 Map<String, String> 형식을 이용하여 할당하는 방법도 있다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.Map;
@Controller
@RequestMapping("user/{age}")
public class UserController {
@GetMapping("/{name}")
public String user(@PathVariable Map<String,String> map) {
System.out.println(map);
return "index";
}
}
//'http://localhost:8080/user/30/홍길동' 으로 접속했을 때의 출력 결과
//{name=30, age=홍길동}
모든 URI 상의 접근가능한 변수들이 map 에 추가된 것을 확인할 수 있다.
여기서 주목해야할 부분은 클래스 단계의 @RequestMapping 에 포함된 값도 가져올 수 있다는 것이다.
(이 부분은 사용방법1. 의 방식으로도 가능하다)
정규식 사용
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@Controller
public class UserController {
@GetMapping("/user/{age:\\d+}{name:\\D+}")
public String user(
@PathVariable("age") String age,
@PathVariable("name") String name) {
System.out.println("나이는 " + age);
System.out.println("이름은 " + name);
return "index";
}
}
//'http://localhost:8080/user/30홍길동' 으로 접속했을 때의 출력 결과
//나이는 30
//이름은 홍길동
정규식을 사용한다면 다음과 같은 방식도 사용 가능하다
package study.oc.base;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class UserController {
@GetMapping("/user/{age:\\d+}")
@ResponseBody
public String age(@PathVariable Long age) {
System.out.println("나이는 " + age);
return "age";
}
@GetMapping("/user/{name:\\D+}")
@ResponseBody
public String name(@PathVariable String name) {
System.out.println("이름은 " + name);
return "name";
}
}