ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링4.0 - MVC : 뷰 구현
    웹프로그래밍/spring 2018. 7. 21. 15:49
    • 컨트롤러의 처리 결과가 뷰로 전달되는 과정

    @Controller 클래스 포함한 모든 웹 요청을 처리하는 객체를 '핸들러'라고 한다. 

    HandlerAdapter는 핸들러의 실행 결과를 DispatcherServlet이 요구하는 ModelAndView로 변환해준다.(ex. 컨트롤러 메서드가 String을 리턴하는 경우)

    DispatcherServlet은 ViewResolver를 사용하여 출력할 View 객체를 구한 후 내용을 생성한다.


    • ViewResolver

    컨트롤러가 지정한 뷰 이름으로 View 객체를 구한다.

    View 객체에는 컨텐트 타입(text/html)을 리턴하는 getContenType() 메서드와

    파라미터로 모델과 요청/응답 객체를 갖는 render()메서드가 있다.


    -ViewResolver 구현 클래스

    InternalResourceViewResolver - 뷰 이름으로 JSP나 Tiles 연동을 위한 View 객체를 리턴한다.

    BeanNameViewResolver - 뷰 이름과 동일한 이름의 빈 객체를 View 객체로 사용한다.

    VelocityViewResolver

    VeloctiyLayoutViewResolver


    • InternalResourceViewResolver

    이 클래스는 InternalResourceView 타입의 뷰 객체를 리턴한다.

    JSP, HTML과 같은 웹 어플리케이션의 내부 자원을 이용해서 응답 결과를 생성한다.

    JSTL이 존재할 경우 하위 타입은 JstrlView 객체를 리턴한다.


    ※ /WEB-INF 하위에 JSP 파일을 위치시키는 이유는 클라이언트가 직접 접근하는 것을 막기 위함이다.

    웹 컨테이너가 /WEB-INF 하위 경로에 접근하는 것을 제한한다.


    -설정법

    <bean id="viewResolver"

    class="org.springframework.web.servlet.view.InternalResourceViewResolver">

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

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

    </bean>



    • BeanNameViewResolver

    뷰 이름과 동일한 이름을 갖는 빈 객체를 뷰로 사용한다.

    주로 파일 다운로드 기능을 위한 커스텀 View클래스로 사용된다.


    -설정법

    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">

    </bean>


    <bean id="download" class="net.madvirus.spring4.chap08.file.DownloadView">

    </bean>


    아래 메서드에서 ModelAndView 객체로 뷰 이름(빈 객체 이름)을 리턴한다.

    @RequestMapping("/file/{fileId}")

    public ModelAndView download(@PathVariable String fileId, HttpServletResponse response) throws IOException {

    File downloadFile = getFile(fileId);

    if (downloadFile == null) {

    response.sendError(HttpServletResponse.SC_NOT_FOUND);

    return null;

    }

    return new ModelAndView("download", "downloadFile", downloadFile);

    }



    • 다수의 ViewResolver 설정하기

    하나의 DispatcherServlet에서 2개 이상의 ViewResolver를 가질 수 있다.

    order 값이 작은 순서데로 ViewResolver에게 뷰 이름에 해당하는 View 객체를 요청한다.

    우선순위가 높은 ViewResolver가 null을 리턴하면 그 다음 순위에게 요청한다.

    InternalResourceViewResolver는 null 리턴하지 않으므로 가장 낮은 순위로 지정해야 한다.


    <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0"/>

    <bean id="viewResolver"

    class="org.springframework.web.servlet.view.InternalResourceViewResolver"

    p:prefix="/WEB-INF/view/" p:suffix=".jsp" p:order="0"/>