대덕공부/Spring
ViewResolver+ Tiles
02O2
2022. 6. 27. 19:37
ViewResolver는 사용자가 요청한 것에 대한 응답 view를 렌더링하는 역할. 간단히 말하자면 view 이름으로부터 사용될 view 객체를 맵핑하는 역할을 한다.
그렇다면 ViewResolver를 생성하지도 Bean으로 등록 하지도 않았는데 사용 할 수 있을까?
개발자가 DispatcherServlet에 별도의 ViewResolver를 등록하지 않는다면 DispatcherServlet에 등록되어있는 InternalResourceViewResolver를 사용한다.
- 페이지 컨트롤러는 클라이언트가 요청한 작업을 실행한 후 그 결과를 출력할 뷰의 이름을 리턴한다.
- 프론트 컨트롤러는 RequestHandler가 리턴한 URL을 ViewResolver에게 전달한다.
- ViewResolver는 자신의 정책에 맞춰서 뷰 URL을 준비한다.
- InternalResourceViewResolver의 경우 RequestHandler가 리턴한 URL 앞, 뒤에 접두사와 접미사를 붙여 JSP를 찾는다.
- 프론트 컨트롤러는 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