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

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

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

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

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

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

[code]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);
 }
}[/code]


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

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

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

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

다음으로 bean 설정이다.

[code] <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>[/code]


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

' > Spring' 카테고리의 다른 글

Spring 에서 JUnit 로 테스트하기  (733) 2007.06.10
이거 이해가 안된다.  (64) 2007.06.09
Spring 에서 properties 파일 다루기.  (33) 2007.06.01
Spring jsp 예외처리 전략  (20) 2007.05.30
Spring 의 exception 처리 전략  (26) 2007.05.29
by cranix 2007. 6. 3. 14:52