출처| https://nosleep.tistory.com/25
Controller에 요청을 전달하고 결과값을 View에 전달한다.
클라이언트의 모든 Request를 받아 제어한다.
메서드
를 탐색한다.Controller의 처리 후, View에 해당하는 View Name을 저장하여 반환한다.
Controller에서 처리 후, View에 전달할 객체를 저장하는 곳.
포조에선 req
package com.example.demo.mvc;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
public class ViewResolver {
Logger logger = Logger.getLogger(ViewResolver.class);
public ViewResolver() {}
public ViewResolver(String[] pageMove) {}
public ViewResolver(HttpServletRequest req, HttpServletResponse res, String[] pageMove)
throws ServletException, IOException
{
String path = pageMove[1];
if("redirect".equals(pageMove[0])) {
res.sendRedirect(path);
}else if("forward".equals(pageMove[0])) {
RequestDispatcher view = req.getRequestDispatcher("/"+path+".jsp");
view.forward(req, res);
}else {
logger.info("else");
path = pageMove[0]+"/"+pageMove[1];
RequestDispatcher view = req.getRequestDispatcher("/WEB-INF/views/"+path+".jsp");
view.forward(req, res);
}
}
}
@RestController : @Controller + @ResponseBody
왜 스프링은 InternalResourceViewResolver.java 클래스를 추가했나?
ViewResolver가 하는 역할은 application.yml 파일에서
[ application.yml]
mvc:
view:
prefix: /WEB-INF/views/
suffix: .jsp
이 부분이다
ex: index.jsp
[InternalResourceViewResolver]
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
//implementation 'org.springframework.boot:spring-boot-starter-web' - 스타터
InternalResourceViewResolver bean = new InternalResourceViewResolver();
//bean.setViewClass(JstlView.class);
bean.setPrefix("/WEB-INF/jsp/");///WEB-INF/jsp/home/index
bean.setSuffix(".jsp");///WEB-INF/jsp/home/index.jsp
registry.viewResolver(bean);
이 말은 WEBINF에서 FRONT 쪽을 찾을 때 사용한다.
[webapp]
redirect + forward를 붙이게 된다면, webapp쪽에서 사용한다.
redirect:./index.jsp
forward:./index.jsp
출처| https://ande226.tistory.com/101
ModelAndView : 데이터를 전송시킬 수 있는 리턴 타입 (cf. String 타입은 단순하게 페이지만 열어주는 역할을 함)
setViewName : 어떤 페이지를 보여줄 것인지
addObject : key와 value를 담아 보낼 수 있는 메서드
둘다 설정가능하다는게 큰 메리트
① Controller 처리 결과 후 응답할 view와 view에 전달할 값을 저장
② 생성자
ModelAndView(String viewName) : 응답할 view 설정
ModelAndView(String viewName, Map values) : 응답할 view와 view로 전달할값들을 저장 한 Map 객체
ModelAndView(String viewName, String name, Object value) : 응답할 view이름,view로 넘길 객체의 name-value
③ 주요 메소드
setViewName(String view) : 응답할 view이름을 설정
addObject(String name, Object value) : view에 전달할 값을 설정· requestScope에 설정됨
addAllObject(Map values) : view에 전달할 값을 Map에 name-value로 저장하여한번에 설정· requestScope에 설정됨
① Controller는 ModelAndview 객체에 응답할 view이름을 넣어 리턴
② DispachServlet은 ViewResolver에게 응답할 view를 요청한다
③ ViewResolver는 View 이름을 이용해 알맞은 view 객체를 찾아DispatcherServlet에게 전달