Handler Mapping :
어떤 방식(GET, METHOD)의 어떤 비지니스 로직(수행 메소드)을 선택해야하는지 저장되어있음
디스패쳐 서블릿은 리턴받은 값을 Controller에서 찾아서 수행 요청
Controller :
디스패쳐 서블릿에서 호출하는 메소드
Service :
Cotroller에서 호출한 메소드의 실질적인 코드 작성
View Resolver :
디스패쳐 서블릿에 리턴된 값을 받아
보여줄 화면 작성
gitignoer.io : Git에서 무시하고싶은 설정 파일들 확인할 수 있음
@Controller :
빈으로 등록해서 사용한다
컴포넌트 스캔용
@RequestMapping :
요청과 매핑을 시켜준다
-작성법
@RequestMapping("/") 괄호 안에 작성된 경로를 연결
"/"는 기본 요청 -> bean에 설정되어있는 기본 연결(Wepapp/main.jsp)로 포워딩
-> 해당 경로에 요청에 응답할 파일 작성
DispatcherServlet은 웹 요청을 받으면 @Controller가 달린
컨트롤러 클래스에 처리를 위임한다.
그 과정은 컨트롤러 클래스의 핸들러 메소드에 선언된 다양한 @RequestMapping 설정 내용에 따른다.
Model 변수 :
최종적으로 포워딩할 화면을 만들 때 동적인 데이터들을 담아서 가져간다.
-작성법
model.addAttribute("message", " 메뉴 등록용 핸들러 메소드 호출함");
@RequestMapping 설정에 method 방식을 지정하지 않으면 get/post 요청을 둘 다 처리한다.
요청 방식지정:
@RequstMapping(value="/menu/modify", method=RequestMethod.GET)
*POST 방식으로 정의된 메소드가 없는데 호출하는 경우에는 405 - 허용하지 않는 메소드라는 오류가 발생
요청 메소드별 전용 어노테이션 :
핸들러 메소드보다 간결하게 작성할 수 있다.
요청 메소드 어노테이션
GET @GetMapping
POST @PostMapping
-작성법
@GetMapping("/menu/delete")
@PostMapping("/menu/delete")
클래스 레벨에 @RequestMapping 어노테이션 사용이 가능하다
클래스 레벨에 URL공통 부분을 이용해서 설정하면 매번 핸들로 메소드 URL에 중복 되는 내용을 작성하지않아도된다.
여러개의 패턴을 매핑할 수도 있다.
PathVariable로 전달되는 값은 반드시 매개변수와 이름이 동일해야하며 동일하지 않은 경우 @PathVariable("이름")을 설정해주어야한다.
핸들러 메소드에서 요청 객체를 들춰서 전달된 값을 꺼내볼 필요없이 url경로에 위치한 값을 value로 인식하는 방식으로 REST형 웹 서비스를 설계할 떄 유용하다.
/detail/{변수명}
detail뒤에 오는 값을 중괄호 안에 변수명으로 만듦
*parisng이 불가능한 PathVariable이 전달되면 400- 잘못된 요청 에러가 발생한다.
405, 400오류 : 디스패쳐 오류
@RequstMapping 뒤에 아무것도 적지 않으면
클래스에 설정된 매핑 설정과 일치하면서 다른 요청처리에 대한 핸들러 메소드가 준비되지 않았다면 해당 메소드를 요청한다.
메소드의 return 타입을 void로 하는 경우 viewResolver는 요청 주소 자체를 view name으로 해석하게된다.
EX)
@RequestMapping("/main") 일경우 main을 view name으로 해석하여 연결
1. HttpServletRequest로 요청 파라미터 전달받기 :
HttpServletRequest를 매개변수로 만들고
Model객체에 넣어준다.
전달받은 변수들의 값을 넣어준다.
(request.getParameter("name")
속성을 전달할 페이지의 속성값을 사용
위 방법보다 더 개선된 방법 사용
(반복된 코드 등 문제)
2. @RequestParam 이용하여 요청 파라미터 전달받기 :
1번에서 한 가공 작업을 서블릿이 다 처리해줌
요청 파라미터를 매핑하여 호출 시 값을 넣어주는 어노테이션으로 @Pathvariable처럼 변수 옆에 작성한다.
form name 속성값과 매개 변수의 이름이 다른 경우 @RequestParam("name")을 설정하면된다.
또한 어노테이션은 생략 가능하지만 명시적으로 작성하는 것이 의미 파악에 쉬우며 그 외의 설정을 작성할 경우에도 어노테이션이 필요하다.
-작성법
+RequestParam 이용하여 요청 파라미터 전달받기 사진
*전달하는 form의 name 속성이 일치하는 것이 없는경우 400 - 잘못된 요청 에러가 발생하는데
required 속성을 false로 설정하면 해당 name값이 존재하지 않아도 null로 처리하며 에러가 발생하지 않는다.
(기본값이 true이기 떄문에 설정하지 않으면 에러가 발생한다)
파라미터가 여러개인 경우 Map으로 한번에 처리할수도 있다
이때 Map의 key는 form의 name속성이된다.
3. @ModelAttribute 이용하여 파라미터 전달받기 :
DTO와 같은 모델을 커멘드 객체로 전달 받을 수 있다.
매개변수부에 @ModelAttribute(데이터 타입 변수)를 직접 선언
EX.@ModelAttribute(MenuDTO menu)
*DTO 클래스를 작성할 때 커멘드 객체(핸들러 메소드의 파라미터로 전달 받는 객체)로 이용하기 위해서는 form의 name값과 필드명이 일치해야한다.
커멘드 객체란?
디스패쳐 서블릿에서 만들어서 컨트롤러의 핸들러 메소드쪽에 매개변수로 전달해주는 객체
4-1,4-2 HttpSession 이용하기 :
*HttpSession 매개변수 선언
핸들러 메소드 호출 시 세션 객체를 넣어서 호출한다.
로그아웃 관리
@SessionAttributes 사용하기
SessionAttributes를 이용하여 session에 값 담기
로그아웃 관리
*sessionAttributes로 등록된 값은 session의 상태를 관리하는 SessionStatus의 setComplete 메소드를 호출해야 사용이 만료된다.
@RequestBody를 이용하여 파라미터 전달받기 :
*Http요청 본문 자체를 모델로 변환 시켜주는 어노테이션으로
출력해보면 쿼리 스트링 형태의 문자열에 전송된다.
*JSON으로 전달하는 경우 Jackson컨버터로 자동 파싱하여 사용할 수 있어 주로 Rest API 구현 시 많이 사용한다.
(JavaScript Object notation)
@ReqeustHeader
content-type의 내용을 가져오겠다
@CookieValue
세션 아이디 고유값을 받아옴
1.문자열로 뷰 이름 반환하기 :
문자열로 redirect하기 :
*접두사로 redirect: 을하면 redirect 처리가되며
EX. redirect:main
main을 다시 요청하도록한다.
2.redirect에 model을 이용한 데이터 추가
ㄴ URL의 한글값은 깨져서 나온다
보이게하고싶다면 encoding 코드를 추가한다.
encoding한 후 나오는 값을 decoding하면 원하는 한글 값을 얻을 수 있다.
3.문자열로 redirect하면서 flashAttribute 추가하기 :
4.ModelAndView로 뷰 이름 지정해서 반환하기 :
5. ModelAndView로 redirect하기
6. ModelAndView로 redirect하면서 flashAttribute 추가하기