[Spring] view-resolver

내용
viewResolver
string
redirect:
RedirectAttributes
ModelAndView
진행일시
2021/03/24
속성

1. ViewResolver

핸들러 메소드가 요청을 처리하고 논리 뷰 이름을 반환하면 DispatcherSerlvet은 화면에서 데이터를 표시하도록 뷰 템플릿에게 제어권을 남긴다
스프링 MVC에서는 다양한 전략에 맞게 뷰를 해석할 수 있는 ViewResolver 구현체를 몇가지 제공한다.
그 중 MVC 기본 설정에는 템플릿 명과 위치에 따른 뷰를 해서하는 InternalResourceResolver를 기본 사용하고 있다.
prefix/suffix를 이용해 뷰 이름을 특정 어플리케이션 디렉터리를 대응시킨다.
InternalResourceViewResolver는 사용이 간단해서 좋기는 하지만 RequestDispactcher가 forward할 수 있는 내부 리소스(jsp 또는 서블릿)만 해석이 가능하기 때문에, 다른 뷰 템플릿을 사용하는 경우에는 다른 viewResolver를 사용해야한다.
ViewResolver는 Controller가 넘긴 View이름을 통해 알맞ViewResolver는 Controller가 넘긴 View이름을 통해 알맞은 view를 찾는 역할을 합니다. Controller는 ModelAndView객체에 응답할 view이름을 넣어 넘기면 DispatchServlet은 ViewResolver에게 응답한 view를 요청한다 ViewResolver는 View이름을 이용해 알맞은 viwe객체를 찾아서 DispatchResolver에게 전달한다.

1. 문자열로 뷰 이름반환

1.
GetMapping에 'string'이라는 문자열 요청이 들어오면 처리할수있는 핸들러메소드를 만든다.
2.
sessionAttribute를 지정하지않으면 기본적으로 모든 Model에 담겨진 값들은 request영역에 담아서 forward해준다
3.
반환타입이 void면 요청한 문자열이 jsp이름이되지만 void 이외에는 return뒤에 문자열을 입력하면 그 문자열과 동일한 .jsp로 화면을 보여준다.
4.
이 경로를 가지고 DispatcherServlet은 RequestServlet을 생성하고 그리고 그걸 이용해서 forward설정해 뷰를 보여준다.
5.
foward할 시 값을 전달할때 내가 값을 대신처리해줄게 너는 여기다가 담아(Model model)라고 해주는 객체가 model이다.
6.
만약 매개변수로 Model model이 아닌 HttpServletRequest로 담으면 이 메소드는 servletRequest에 종속적인 역할이되므로 다른쪽에서는 사용이 불가능하다. 그래서 HttprServletRequest로 매개변수를 담는건 권장하지않는다.

2.문자열로 Redirect하기

1.
model로 보낸값은 url에 parameter로 전달된다. 그래서 그 값을 꺼내기 위해서는 jsp쪽에 '${param.message}'를 이용해야한다.
2.
하지만 여기서 문자열은 인코딩문제로 제대로 출력이되지앟는다
3.
그러기위해서는 model에 addAttribute로 값을 담을때 URLEncoder를 이용해 Encoding을 해주며 기본적으로 띄어쓰기는 "+"로 나오기때문에 "+"를 띄어쓰기 " " 로바꿔주기위해서 .replaceAll로 적용한다
4.
jsp쪽에서 encoding한 값을 꺼내기위해서는 decodeURIComponent로 decode해주어야한다.
5.
리다이렉트하는방법은 return 값에 "redirect : main(보여주고싶은 view페이지)"라고 작성하면된다.
6.
참고로 forward과 redirect방식은 url값에 parameter값이 그대로넘어가느냐 바뀌어서 넘어가느냐로 구분하면된다
7.
바뀌어서넘어가면 redirect 그대로넘어가면 forward라고 생각하자.

3.문자열 뷰 이름 반환하면서 flashAttribute 추가하기

1.
flashAttribute는 기본작성시 alert창을 띄우고 url창에 message내역을 param값으로 전달하지않고 1회성으로 끝나는걸 의미한다.
2.
1회성만 사용한다는걸 적용하기위해서는 매개변수로 RedirectAttributes rttr로 사용하며 메소드는 addFlashAttribute를 이용한다
3.
자동으로 모델에 추가되기때무에 requestScope를 이용해 값을꺼낸다.
4.
주의할점은 세션이 임시로 값을 담고 소멸하는 방식이기 떄문에 session에 동일한 키 값이 존재하면 같이 소멸시키므로 이 점을 주의하자!

4. ModelAndView로 뷰이름 지정해서 반환하기

1.
model과 view를 합쳐서사용하는방법이다, 매겨변수로 요청해야한다.
2.
return값으로 ModelAndView를 리턴해주면됨
3.
값을담을때 .addObject(key,value)로 해주면된다.
4.
setViewName을 통해 문자열로 view페이지 이름을 기입하면된다.

5. ModelAndView로 redirect하기

1.
위에나와있는 redirect방법과 동일하다.

6. ModelAndView로 뷰 이름 반환하면서 flashAttribute 추가하기

1.
flashAttribute는 기본작성시 alert창을 띄우고 url창에 message내역을 param값으로 전달하지않고 1회성으로 끝나는걸 의미한다.
2.
1회성만 사용한다는걸 적용하기위해서는 매개변수로 RedirectAttributes rttr로 사용하며 메소드는 addFlashAttribute를 이용한다.
3.
mv에는 setViewName을 이용하여 view페이지이름을 담아준다
4.
자동으로 모델에 추가되기때무에 requestScope를 이용해 값을꺼낸다.
5.
주의할점은 세션이 임시로 값을 담고 소멸하는 방식이기 떄문에 session에 동일한 키 값이 존재하면 같이 소멸시키므로 이 점을 주의하자!