대덕공부/Spring

ViewResolver+ Tiles

02O2 2022. 6. 27. 19:37

ViewResolver는 사용자가 요청한 것에 대한 응답 view를 렌더링하는 역할. 간단히 말하자면 view 이름으로부터 사용될 view 객체를 맵핑하는 역할을 한다.

그렇다면 ViewResolver를 생성하지도 Bean으로 등록 하지도 않았는데 사용 할 수 있을까?

개발자가 DispatcherServlet에 별도의 ViewResolver를 등록하지 않는다면 DispatcherServlet에 등록되어있는 InternalResourceViewResolver를 사용한다.

 


  1. 페이지 컨트롤러는 클라이언트가 요청한 작업을 실행한 후 그 결과를 출력할 뷰의 이름을 리턴한다.
  2. 프론트 컨트롤러는 RequestHandler가 리턴한 URL을 ViewResolver에게 전달한다.
  3. ViewResolver는 자신의 정책에 맞춰서 뷰 URL을 준비한다.
  4. InternalResourceViewResolver의 경우 RequestHandler가 리턴한 URL 앞, 뒤에 접두사와 접미사를 붙여 JSP를 찾는다.
  5. 프론트 컨트롤러는 ViewResolver가 준비한 URL을 가지고 View 객체를 통해 해당 URL의 자원을 실행한다.

  • 🗸 MVC 모델에서는 JSP는 뷰 콤포넌트로서 출력이라는 역할을 담당한다.
  • 🗸 출력할 데이터를 준비하는 일은 페이지 컨트롤러가 담당한다.
  • 🗸 JSP를 실행할 때는 항상 페이지 컨트롤러를 통해 실행해야 한다.
  • 🗸 페이지 컨트롤러가 하는 일이 없어도 프로그래밍의 일관성을 위해 접 JSP을 요청하지 않고, 페이지 컨트롤러를 통해 요청해야 한다.
  • 🗸 JSP 파일을 /WEB-INF 폴더 아래에 두는 것을 권장한다.

 

Interface ViewResolver

public interface ViewResolver {
	public boolean supported(String viewName);
	public void viewResolve(String viewName, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException;
}

supported : viewName true false 반환

viewResolver : viewName 가지고 요청 반응 함 

 

이 인터페이스를 각각 delegatingViewResolver,  InternalResourceViewResolver, TilesViewResolver가 상속한다. 

 

DelegatingViewResolver 

package kr.or.ddit.mvc;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DelegatingViewResolver implements ViewResolver{
	private ViewResolver defaultResolver; //디폴트리졸버
	private ViewResolver[] resolvers; //뷰리졸버 배열형태로 전역변수

	public DelegatingViewResolver() {
		this( new TilesViewResolver()); //여기서 타일즈뷰리졸버객체를생성한다.
	}

	public DelegatingViewResolver(ViewResolver...resolvers) {
		super();
		this.resolvers = resolvers; //전역변수에서 선언된 resolver를 선언 
		this.defaultResolver = new InternalResourceViewResolver(); // 위와 동일 
		((InternalResourceViewResolver)defaultResolver).setPrefix("/WEB-INF/views/");
       ((InternalResourceViewResolver)defaultResolver).setSuffix(".jsp");
        
	}
	
	@Override
	public boolean supported(String viewName) {
		return true;
	}
	
	private ViewResolver findViewResolver(String viewName) {
		ViewResolver findedResolver = defaultResolver;
		for(ViewResolver tmp :resolvers) {
        //tmp가 뷰리절버의 resolvers 객체에 하나하나씩 담김
        //예: resolvers =[타일즈리졸버, 인터널리졸버, ...] 이런식으로 담겨서 
        //if문에 적절한 viewName을 찾아 반환하는것이다. 
			if(tmp.supported(viewName)) {//그리드템플릿 두리절브가 동작해야함
				findedResolver = tmp;
			}
		}
		return findedResolver;
	}
	
	@Override
	public void viewResolve(String viewName, HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		if(viewName.startsWith("redirect:")) {
			viewName = viewName.substring("redirect:".length());
			response.sendRedirect(request.getContextPath()+viewName);
		}else {
			//forward에서사용.
			ViewResolver finded = findViewResolver(viewName);
			finded.viewResolve(viewName, request, response);
		}
		
	}


}

 

 

InternalResourceViewResolver

package kr.or.ddit.mvc;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 하나의 JSP 로 응답 페이지를 구성하기 위한 전략 객체
 *
 */
public class InternalResourceViewResolver implements ViewResolver {

	private String prefix;
	private String suffix;

	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}

	public void setSuffix(String suffix) {
		this.suffix = suffix;
	}

	@Override
	public boolean supported(String viewName) {

		return true;
	}

	@Override
	public void viewResolve(String viewName, HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String resolveName = prefix + viewName + suffix;
		request.getRequestDispatcher(resolveName).forward(request, response);

	}

}

TilesViewResolver

package kr.or.ddit.mvc;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TilesViewResolver implements ViewResolver {
	public static final String TILESSUFFIX = ".tiles";
	@Override
		public boolean supported(String viewName) {
			return viewName.endsWith(TILESSUFFIX);
		}

	@Override
	public void viewResolve(String viewName, HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.getRequestDispatcher(viewName).forward(request, response);
	}

}

 

 

 

 타일즈 정리본 >>  https://divetothewave.tistory.com/36