스프링 웹 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"))
        ;
    }





© 2019. by jaeuk