스프링 웹 MVC-17.URI 패턴, 요청 매개변수(단순타입), 폼서브밋(타임리프)(핸들러 메소드)
핸들러 메소드 2부: URI 패턴
@PathVariable
- 요청 URI 패턴의 일부를 핸들러 메소드 아규먼트로 받는 방법.
- 타입 변환 지원.
- (기본)값이 반드시 있어야 한다.
- Optional 지원.
@MatrixVariable
- 요청 URI 패턴에서 키/값 쌍의 데이터를 메소드 아규먼트로 받는 방법
- 타입 변환 지원.
- (기본)값이 반드시 있어야 한다.
- Optional 지원.
- 이 기능은 기본적으로 비활성화 되어 있음. 활성화 하려면 다음과 같이 설정해야 함.
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configurePathMatch(PathMatchConfigurer configurer) { UrlPathHelper urlPathHelper = new UrlPathHelper(); urlPathHelper.setRemoveSemicolonContent(false); configurer.setUrlPathHelper(urlPathHelper); } }참고
https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-typeconversion https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-matrix-variables
@GetMapping(value = "/events/{id}")
@ResponseBody // HTTP 메세지 컨버터 활용해서 응답 본문을 json으로 변환
public Event hello3(@PathVariable Integer id, @MatrixVariable String name) {
Event event = new Event();
event.setId(id);
event.setName(name);
System.out.println(event);
return event;
}
@Test // 성공
public void helloTest() throws Exception {
mockMvc.perform(get("/events/1;name=jaeuk"))
.andDo(print())
.andExpect(status().isOk())
;
}
Body = {"id":1,"name":"jaeuk"}
더 자세한 사항은 문서 참고.
@PostMapping("/owners/{ownerId}/pets/{petId}/edit")
public String processSubmit(@ModelAttribute Pet pet) { }
Bind an instance of Pet.
등..
다양한 기능 제공.
핸들러 메소드 3부: @RequestMapping
@RequestParam
- 요청 매개변수에 들어있는 단순 타입 데이터를 메소드 아규먼트로 받아올 수 있다.
- 값이 반드시 있어야 한다.
- required=false 또는 Optional을 사용해서 부가적인 값으로 설정할 수도 있다.
- String이 아닌 값들은 타입 컨버전을 지원한다.
- Map<String, String> 또는 MultiValueMap<String, String>에 사용해서 모든 요청 매개변수를 받아 올 수도 있다.
- 이 애노테이션은 생략 할 수 잇다.
요청 매개변수란?
- 쿼리 매개변수 (?name=jaeuk&age=33)
- 폼 데이터
둘 다 동일.
참고
- https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-requestparam
실습
@PostMapping(value = "/events")
@ResponseBody
public Event hello3(@RequestParam(required = false, defaultValue = "default jaeuk") // 값이 없어도 된다면 false, 디폴트는 jaeuk 설정
String name) {
Event event = new Event();
//event.setId(id);
event.setName(name);
System.out.println(event);
return event;
}
@RequestParam 를 생략해도 되나, 명시적으로 선언해주는 것을 추천.
또 Map으로 받아도 됨. 안에 key, value로 들어있음.
@Test
public void helloTest() throws Exception {
mockMvc.perform(post("/events")
.param("name", "jaeuk"))
.andDo(print())
.andExpect(status().isOk())
;
}
핸들러 메소드 4부: 폼 서브밋 (타임리프)
폼을 보여줄 요청 처리
- GET /events/form
- 뷰: events/form.html
- 모델: “event”, new Event()
타임리프
- @{}: URL 표현식
- ${}: variable 표현식
- *{}: selection 표현식
참고
- https://www.thymeleaf.org/doc/articles/standarddialect5minutes.html
- https://www.getpostman.com/downloads/
실습
@GetMapping("/events/form")
public String eventsForm(Model model){
Event event = new Event();
event.setName("jaeuk");
model.addAttribute("event", event);
return "events/form";
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Create new event</title>
</head>
<body>
<form action="#" th:action="@{/events}" th:object="${event}">
<input type="text" title="name" th:field="*{name}"/>
<input type="text" title="age" th:field="*{age}"/>
<input type="submit" value="create">
</form>
</form>
</body>
</html>
@Test
public void eventForm() throws Exception {
mockMvc.perform(get("/events/form"))
.andDo(print())
.andExpect(view().name("events/form"))
.andExpect(model().attributeExists("event"))
;
}
