본문 바로가기

Spring

[Spring] ViewResolver




ViewResolver설정


View 영역 구현

컨트롤러는 최종적으로 결과를 출력할 View와 View에 전달할 객체를 담고 있는 ModelAndView 객체를 리턴한다.

DispatcherServlet은 ViewResolver를 사용하여 결과를 출력할 View 객체를 구하고, 구한 View객체를 이용하여 내용을 생성한다.


1.컨트롤러 구현 및 설정 추가

컨트롤러를 구현하려면 먼저 @Controller어노테이션을 클래스에 적용한다. 그리고, @RequestMapping 어노테이션을 이용해서 클라이언트의 요청을 처리할 메서드를 지정한다.


//@Controller  어노테이션은 해당 클래스가 스프링 MVC의 컨트롤러 를 구현한 클래스라는 것을 지정한다.

@Controller

@RequestMapping(value = {"/sample", "/m/sample"} )

@Slf4j

public class SampleController extends CommonController{

@Autowired

SampleDAO dao;

@Autowired

SampleService service;


//@RequestMapping 어노테이션은 값으로 지정한 요청 경로를 처리한 메서드를 설정한다.

//이 경우 http://host:ort[/컨텍스트경로]/sample.do 요청을 SampleController 클래스의 sample()메서드가 처리하게 된다.

@RequestMapping("/sample.do")

public ModelAndView sample() {

//ModelAndView는 컨트롤러의 처리 결과를 보여줄 View와 View에서 출력할 모델을 지정할 때 사용 된다.

ModelAndView mav = new ModelAndView();

//컨트롤러의 처리 결과를 보여줄 View이름을 'sample'로 지정한다.

mav.setViewNmae("sample");

//Model에 'sample'이라는 이름으로 String타입의 값을 추가 하였다.

mav.addObject("sample",getSample());


return mav;

}

//스프링은 ModelAndView 뿐만 아니라 String 이나 modelMap 또는 Map과 같은 타입을 이용해서 뷰 이름과 모델 정보를 설정할 수 있도록 하고있다.


DispatcherServlet은 스프링 컨테이너에서 컨트롤러 객체를 검색하기 때문에 스프링 설정파일에 컨트롤러를 빈으로 등록해 주어야 한다.


    <bean id="liteDeviceDelegatingViewResolver" class="org.springframework.mobile.device.view.LiteDeviceDelegatingViewResolver">

            <bean id="sampleController" class="net.fe.sample.sample.controller.SampleController">

            <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

                <property name="prefix" value="/WEB-INF/pages/" />

                <property name="suffix" value=".jsp" />

                <property name="contentType" value="text/html; charset=UTF-8" />

            </bean>

    </bean>



2. 설정 파일에 ViewResolver 설정 추가

컨트롤러 클래스는 직접 또는 간접적으로 ModelAndView 객체를 생성하게 된다.

ex) 앞서 작성한 SampleController 클래스는 다음과 같이 ModelAndView 객체를 생성하여 리턴 하였다.


public ModelAndView sample() {

ModelAndView mav = new ModelAndView(); 

mav.setViewNmae("sample"); //뷰이름 setViewName() 메서드를 이용해 뷰 이름을 지정한 모습

mav.addObject("sample",getSample());


return mav;

}


컨트롤러의 처리 결과를 보여줄 뷰의 이름을 'sample'로 지정하였는데, DispatcherServlet은 이 뷰 이름과 매칭되는 뷰 구현체를 찾기 위해 ViewResolver를 사용한다.


JSP를 뷰 기술로 사용할 경우 다음과 같이 InternalResourceViewResolver 구현체를 빈으로 등록하면 된다.

            <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">

                <property name="prefix" value="/WEB-INF/pages/" />

                <property name="suffix" value=".jsp" />

//이는 ViewResolver가 "/WEB-INF/pages/viewName.jsp"를 뷰 JSP로 사용한다는 것을 의미한다.

// 즉 , 앞의 예에서 SampleController는 뷰 이름으로 "sample"을 리턴하므로, 실제로 사용되는 뷰 파일은 "/WEB-INF/pages/view.jsp"파일이 된다.

   </bean>

InternalResourceViewResolver 는 컨트롤러가 지정한 뷰 이름으로부터 실제로 사용될 뷰를 선택하는데, 이 때 컨트롤러가 지정한 뷰 이름 앞뒤로 prefix, suffix프로퍼티를 추가한 값이 실제로 사용될 자원의 경로가 된다.


3. ViewResolver 인터페이스


public interface ViewResolver{

View resolveViewName(String viewName, Locale locale) throws Exception;

}

ViewResolver는 뷰 이름과 지역화를 위한 Locale을 파라미터로 전달받으며 , 매핑되는 View 객체를 리턴한다. 매핑되는 View객체가 없다면 NULL을 리턴한다.


4. View객체


ViewResolver는 응답 결과를 생성할 뷰 객체를 리턴한다. 모든 뷰 클래스는 View인터페이스를 구현하고 있으며, View인터페이스는 다음과 같이 정의 되어있다.

public interface View{

String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";

String getContentType();

void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;

}

getContentType() 메서드는 "text/html"같은 응답 결과의 컨텐츠 타입을 리턴한다. render()메서드는 실제로 응답 결과를 생성한다. 

render()메서드에 첫 번째 파라미터인 model에는 컨트롤러가 리턴한 ModelAndView 객체의 모델 데이터가 전달된다.

각 각의 View객체는 이 모델 데이터로 부터 응답 결과를 생성하는데 필요한 정보를 구한다.


출처 : http://devbox.tistory.com/entry/Spring-ViewResolver-%EC%84%A4%EC%A0%95?category=574587



'Spring' 카테고리의 다른 글

[Spring] 기본2  (0) 2018.11.27
[Spring] 요청 URI 매칭  (0) 2018.11.27
[Spring] @RequestBody / @ResponseBody  (0) 2018.11.27
[Spring] 기본  (0) 2018.11.27
[Spring] @Autowired / @Service  (0) 2018.06.27