Spring MVC - Controllers

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


Controllers

org.springframework.web.servlet.mvc.Controller
 ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse response) throws Exception;

- AbstractController, WebContentGenerator
기본적인 기능을 제공하기 위해서 Spring 에서 제공하는 다양한 Controller 는 AbstractController 를 상속한다.

Features offered by AbstractController
. supportedMethods : Controller 가 처리할 Http method 타입을 설정한다. ex> GET, POST ...
. requireSession : 요청을 처리하는데 Http Session 이 필요한지를 설정한다.
. synchronizeOnSession : Http Session 을 동기화할 필요가 있을때 사용한다.
. cacheSeconds : Http Response 를 캐쉬할 시간(초)를 설정한다. -1 은 설정하지 않음
. useExpiresHeader : Http 1.0 과 호환되는 Expires 헤더를 응답에 포함시킨다. 기본값은 true 이다.
. useCacheHeader : Http 1.1 과 호환되는 Cache-Control 헤더를 응답에 포함시킨다. 기본값은 true 이다.

AbstractController 를 상속하는 Controller 를 만들때는 handleRequestInternal(HttpServletRequest, HttpServletResponse) 메소드를 오버라이드 하면 된다.

package samples;

public class SampleController extends AbstractController {

    public ModelAndView handleRequestInternal(
        HttpServletRequest request,
        HttpServletResponse response) throws Exception {

        ModelAndView mav = new ModelAndView("hello");
        mav.addObject("message", "Hello World!");
        return mav;        
    }
}

<bean id="sampleController" class="samples.SampleController">
    <property name="cacheSeconds" value="120"/>
</bean>

- MultiActionController
org.springframework.web.servlet.mvc.multiaction.MultiActionController
Spring 은 하나의 Controller 에서 다양한 request 를 처리할 수 있도록 MultiActionController 를 제공한다. Struts 의 DispatchAction 과 비슷하다.

MultiActionController 에서 요청을 처리하기 위한 method 의 signatrue 는 아래와 같아야 한다.
public [ModelAndView | Map | void] anyMeaningfulName(HttpServletRequest, HttpServletResponse [,HttpSession] [,AnyObject])

ex> 예제
public ModelAndView displayCatalog(HttpServletRequest, HttpServletResponse)
public ModelAndView login(HttpServletRequest, HttpServletResponse, Login)
public ModelAndView viewCart(HttpServletRequest, HttpServletResponse, HttpSession)
public ModelAndView updateCart(HttpServletRequest, HttpServletResponse, HttpSession, Product)
public void home(HttpServletRequest, HttpServletResponse)
public Map list(HttpServletRequest, HttpServletResponse)

MethodNameResolver 는 request 를 처리할 MultiActionController 의 메소드를 결정하는데 사용된다.
Spring 에서는 다수의 MethodNameResolver 를 제공한다. 만약에 MethodNameResolver 를 선택하지 않았다면 기본으로 InternalPathMethodNameResolver 가 사용된다.

InternalPathMethodNameResolver 는 request url 의 마지막 filename 으로 request 를 처리할 method 를 결정한다.
ex> http://www.sf.net/test.view 요청이 들어왔을때 test(HttpServletRequest, HttpServletResponse) 메소드를 호출한다.

ParameterMethodNameResolver 는 parameter 에 설정된 method 를 request 를 처리할 method 를 결정한다.
ex> http://www.sf.net/index.view?method=testIt 요청이 들어오면 testIt(HttpServletRequest, HttpServletResponse) 메소드를 호출한다.

PropertiesMethodNameResolver 는 properties 에 설정한 request=method 맵핑 값으로 request 를 처리할 method 를 결정한다.
ex> /index/welcome.html=doIt 이 설정되어 있을 때 /index/welcome.html request 가 들어오면 doIt(HttpServletRequest, HttpServletResponse) 이 호출된다.

MultiActionController 의 설정 예제 1

<bean id="paramMultiController"
      class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">

    <property name="methodNameResolver">
        <bean class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
            <property name="paramName" value="method"/>
        </bean>
    </property>

    <property name="delegate">
        <bean class="samples.SampleDelegate"/>
    </property>

</bean>

public class SampleDelegate {

    public ModelAndView retrieveIndex(HttpServletRequest req, HttpServletResponse resp) {
        return new ModelAndView("index", "date", new Long(System.currentTimeMillis()));
    }
}

위에 정의한 SampleDelegate 객체가 MultiActionController 의 역할을 수행할 객체가 된다. Bean 설정을 보면 MethodNameResolver 로 ParameterMethodNameResolver 가 사용됬다. 또 ParameterMethodNameResolver 의 paramName 에 method 가 설정됬다. 따라서 request 가 method=retrieveIndex parameter 를 포함하게 되면 SampleDelegate 의 retriveIndex(HttpServletRequest, HttpServletResponse) 메소드가 호출된다.

MultiActionController 의 설정 예제 2

<bean id="propsResolver"
      class="org....mvc.multiaction.PropertiesMethodNameResolver">
    <property name="mappings">
        <value>
/index/welcome.html=retrieveIndex
/**/notwelcome.html=retrieveIndex
/*/user?.html=retrieveIndex
        </value>
    </property>
</bean>

<bean id="paramMultiController" class="org....mvc.multiaction.MultiActionController">

    <property name="methodNameResolver" ref="propsResolver"/>
    <property name="delegate">
        <bean class="samples.SampleDelegate"/>
    </property>
</bean>

이번에는 MethodNameResolver 로 PropertiesMethodNameResolver 가 설정됬다. 따라서 request 가 /index/welcome.html, /**/notwelcome.html,/*/user?.html 일때 SampleDelegate 의 retriveIndex(HttpServletRequest, HttpServletResponse) 메소드가 호출된다.

- Command controllers
Spring 의 Command controller 는 Spring Web MVC 의 근간을 이루며 data objects 를 다를 수 있는 방법을 제공한다.
Struts 의 ActionForm 과 비슷하다.

AbstractCommandController : command controller 를 생성하기 위한 기본적인 기능을 제공하는 추상 객체이다.
request parameter 를 data object 에 binding 할 수 있다. form 처리기능은 제공하지 않는다. 하지만 validation feature 는 제공한다.

AbstractFormController : form 처리에 대한 기능을 가진 추상 객체, invalid form submission, validation, normal form workflow 기능을 제공한다.

SimpleFormController :
AbstractWizardFormController :

'프로그래밍 > 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 - Handler Mapping  (0) 2009.12.22
: