Spring MVC - Handler Mapping

프로그래밍/Spring MVC 2009. 12. 22. 00:23


Hadler mappings

request 를 처리할 handler 를 결정할 때 handler mapping 을 사용하다.
DispatcherServlet 으로  request 가 들어오게 되면 request 를 조사하고 HandlerExucutionChaing 을 구성하기 위해 handler mapping 에 넘겨진다.

- AbstractHandlerMapping
. interceptors : interceptor 의 list
. defaultHandler : default handler
. order :
. alwaysUseFullPath : handler 를 찾는데  servlet 에 mapping 된 url 을 상대경로로 사용할 것인지를 결정한다. true 로 설정하게 되면 handler 를 찾는데 full path 를 사용하게 된다. servlet 이 /testing/* 에 mapping 되어 있고 alwaysUserFullPath 가 true 이면 /testing/viewPage.html 이 사용되며, false 일 경우에는 /viewPage.html 이 사용된다.
. urlDecode : spring 2.5 에서 기본값은 true
. lazyInitHandler : lazy initialization 되는 singleton handler 를 허용한다. 기본값은 false 이다.

- BeanNameUrlHandlerMapping
request 를 처리할 controller 를 결정하는데 request url 과 bean name 을 사용한다.
http://samples.com/editaccount.form request 는 /editaccount.form bean 에서 처리한다.
handler mapping 으로 설정된 bean 이 없을때는 기본으로 BeanNameUrlHandlerMapping 이 사용된다.

<beans>
  <bean id="handlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

  <bean name="/editaccount.form" class="org.springframework.web.servlet.mvc.SimpleFormController">
    <property name="formView" value="account"/>
    <property name="successView" value="account-created"/>
    <property name="commandName" value="account"/>
    <property name="commandClass" value="samples.Account"/>
  </bean>
<beans>

- SimpleUrlHandlerMapping
Properties 에 설정된 mapping 정보에 따라 request 를 처리할 handler 를 결정한다.

<beans>
    <!-- no 'id' required, HandlerMapping beans are automatically detected by the DispatcherServlet -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <value>
                /*/account.form=editAccountFormController
                /*/editaccount.form=editAccountFormController
                /ex/view*.html=helpController
                /**/help.html=helpController
            </value>
        </property>
    </bean>

    <bean id="helpController"
          class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>

    <bean id="editAccountFormController"
          class="org.springframework.web.servlet.mvc.SimpleFormController">
        <property name="formView" value="account"/>
        <property name="successView" value="account-created"/>
        <property name="commandName" value="Account"/>
        <property name="commandClass" value="samples.Account"/>
    </bean>
<beans>

- Intercepting request - the HandlerInterceptor interface
handler mapping 에 추가될 Interceptor 는 org.springframework.web.servlet.HandlerInterceptor 인터페이스를 구현해야 한다.
public boolean preHandle(HttpServletRequest, HttpServletResponse, Object) throws Exception
위 메소드는 리턴되는 boolean 값에 의해 요청에 대한 처리를 진행할 것인지 아닌진를 결정한다.

ex> 정해진 시간내에서만 해당 요청을 처리하는 예제

<beans>
    <bean id="handlerMapping"
          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="officeHoursInterceptor"/>
            </list>
        </property>
        <property name="mappings">
            <value>
                /*.form=editAccountFormController
                /*.view=editAccountFormController
            </value>
        </property>
    </bean>

    <bean id="officeHoursInterceptor"
          class="samples.TimeBasedAccessInterceptor">
        <property name="openingTime" value="9"/>
        <property name="closingTime" value="18"/>
    </bean>
<beans>

package samples;

public class TimeBasedAccessInterceptor extends HandlerInterceptorAdapter {

    private int openingTime;
    private int closingTime;

    public void setOpeningTime(int openingTime) {
        this.openingTime = openingTime;
    }

    public void setClosingTime(int closingTime) {
        this.closingTime = closingTime;
    }

    public boolean preHandle(
            HttpServletRequest request,
            HttpServletResponse response,
            Object handler) throws Exception {

        Calendar cal = Calendar.getInstance();
        int hour = cal.get(HOUR_OF_DAY);
        if (openingTime <= hour < closingTime) {
            return true;
        } else {
            response.sendRedirect("http://host.com/outsideOfficeHours.html");
            return false;
        }
    }
}

'프로그래밍 > Spring MVC' 카테고리의 다른 글

Spring MVC - fileupload  (0) 2009.12.24
Spring MVC - Themes  (0) 2009.12.23
Spring MVC - Locale  (0) 2009.12.23
Spring MVC - Views  (0) 2009.12.23
Spring MVC - Controllers  (0) 2009.12.22
: