Spring 에서 MultiActionController 사용하기

Controller 만 상속해서 사용하려니 Controller 가 너무 많아지는 경항이 있다..

이렇게되면 bean 설정도 많아지고 또 복잡해 지게된다.

이런걸 해결하기위해 MultiActionController 가 나왔다.

로직이 비교적간단한 것들을 모두 하나의 Controller 로 만드는건 귀찮은 작업이 아닐수 없다.

이럴땐 하나의 Controller 를 만들어서 MultiActionController 를 상속한다음 메소드별로 기능을 부여할수가 있다.

먼저 Controller 파일은 아래와같이 만든다.

package dic.controllers;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public abstract class DicSuperMultiActionController extends MultiActionController{
 public ModelAndView others(HttpServletRequest request, HttpServletResponse response) throws Exception {
  String contextPath = request.getContextPath();
  String uri = request.getRequestURI();
  String viewName = uri.substring(contextPath.length()+1,uri.lastIndexOf("."));
  return new ModelAndView(viewName);
 }
}

MultiActionController 는 abstract 메소드가 없기때문에 구현해야할 메소드가 없다.

대신 bean 설정에서 methodNameResolver 를 셋팅 해줘야 한다.

MultiActionController 의 최상위 클래스로 others 메소드만 구현하고 있다.

이 메소드는 MultiActionController 로 넘어왔는데 해당 메소드가 없으면 이쪽으로 맵핑되도록 한것이다.

다음으로 bean 설정이다.

 <bean id="dicSuperMultiActionController" class="dic.controllers.DicSuperMultiActionController" abstract="true"/>
 
 <bean id="adminAuthMultiActionController" class="dic.controllers.AdminAuthMultiActionController" parent="dicSuperMultiActionController">
  <property name="authDao" ref="authDao" />
  <property name="methodNameResolver">
   <ref local="adminAuthMultiActionControllerMethodNameResolver"/>
  </property>
 </bean>
 
 <bean id="adminAuthMultiActionControllerMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
  <property name="mappings">
   <props>
    <prop key="/**/*.do">others</prop>
    <prop key="/admin/auth/list.do">list</prop>
    <prop key="/admin/auth/modify.do">view</prop>
    <prop key="/admin/auth/modify_action.do">modify</prop>
    <prop key="/admin/auth/insert_action.do">insert</prop>
    <prop key="/admin/auth/delete_action.do">delete</prop>
   </props>
  </property>
 </bean>
 
 <bean id="urlMapping"
  class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
  <property name="mappings">
   <props>
    <prop key="/**/*.do">defaultController</prop>
    <prop key="/admin/login.do">adminLoginController</prop>
    <prop key="/admin/logout.do">adminLogoutController</prop>
    <prop key="/admin/auth/*.do">adminAuthMultiActionController</prop>
   </props>
  </property>
 </bean>

위와같이 Controller 자체에 PropertiesMethodNameResolver 를 셋팅해서 넘어오는 값에따라 메소드로 분기를 시켜줄수 있다.
오버로딩된 others 메소드를 위에서처럼 이용하면 Controller 가 지정되어있지 않은 요청은 알아서 others 로 가게 된다.

2007/06/03 14:52 2007/06/03 14:52

trackback url :: http://cranix.net/tt/trackback/190

댓글을 달아 주세요

write a comment