viewResolver

지환·2024년 1월 4일
0

그룹웨어

목록 보기
8/17

출처| https://nosleep.tistory.com/25

DispatcherServlet

  • Controller에 요청을 전달하고 결과값을 View에 전달한다.

  • 클라이언트의 모든 Request를 받아 제어한다.

HandlerMapping(url 탐색)

  • 요청 URL에 매핑되는 Controller를 찾아 DispatcherServlet에 반환한다.

HandlerAdapter(메소드 탐색)

  • HandlerMapping을 통해 받은 Controller에 맞는 메서드를 탐색한다.

Controller

  • 클라이언트의 요청을 처리한 후, 비지니스 로직과 서비스를 처리하여 View에 전달할 객체를 Model에 저장한다.

View Name

  • Controller의 처리 후, View에 해당하는 View Name을 저장하여 반환한다.

    • redirect:./index.jsp
    • forward:./index.jsp
    • index.jsp

Model

  • Controller에서 처리 후, View에 전달할 객체를 저장하는 곳.

  • 포조에선 req

View Resolver

  • Controller가 반환한 View Name을 기반으로 맞는 View를 찾아 DispatcherServlet에 반환한다.

View

  • DispatcherServlet이 전달한 View를 호출하고, Model객체에서 필요한 객체를 가져와 클라이언트에 응답한다.
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 vs ViewResolver

ModelAndview

login 페이지 만들기

  1. RequestMapping에 로그인 추가

  • WEB-INF/view/login/login.jsp 를 찾는다.
  1. login 폴더 안에 login.jsp 만들기

데이터 보내기

  1. ArticleController 클래스 만들기

  • ModelAndView : 데이터를 전송시킬 수 있는 리턴 타입 (cf. String 타입은 단순하게 페이지만 열어주는 역할을 함)

    • setViewName : 어떤 페이지를 보여줄 것인지

    • addObject : key와 value를 담아 보낼 수 있는 메서드

      • setAttribute를 여러개 썼던 것 처럼, addObject를 여러개 쓸 수 있다.
  • 둘다 설정가능하다는게 큰 메리트

정리

① 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에 설정됨


ViewResolver

  • Controller가 넘긴 view 이름을 통해 알맞은 view를 찾는 역할

① Controller는 ModelAndview 객체에 응답할 view이름을 넣어 리턴

② DispachServlet은 ViewResolver에게 응답할 view를 요청한다

③ ViewResolver는 View 이름을 이용해 알맞은 view 객체를 찾아DispatcherServlet에게 전달

  • ⑵ ViewResovler - Spring 설정 파일에 등록한다.
profile
아는만큼보인다.

0개의 댓글