Spring - Spring의 Controller들. 3.MultiActionController

Published on: 2009. 9. 13. 17:15 by louis.dev
<역할>
MultiActionController는 하나의 Controller클래스에서 여러가지 기능을 하는 method를 구현해 놓고 파라미터 값으로 넘어오는 어떠한 값과 MultiActionController에 구현한 method와의 이름을 비교해서 실행을 시킨다.
이 MultiActionContorller는 주로 비슷한 기능을 가진 method끼리 모아 쓸데 없이 클래스를 많이 생성해서 생길수 있는 class overhead를 줄여주는 방법이다.

<적용방법>
1. 일단 구현할 클래스를 MultiActionController를 확장해서 구현한다. method는 overriding을 할 필요 없고 사용자가 원하는 이름으로 구현하면 된다.
보통 리턴값은 ModelAndView로 리턴값을 정하지만 다른 Map,String,void를 선택적으로 사용할 수 있다. 그리고 전달 parameter들은 HttpServletRequest,HttpServletResponse를 사용한다.
예)protected ModelAndView read(HttpServletRequest request,HttpServletResponse response);
package kr.co.springboard.controllers;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.co.springboard.dto.BoardDTO;
import kr.co.springboard.service.BoardService;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

public class ReadDeleteMultiActionController extends MultiActionController{
    private BoardService boardService;
    public void setBoardService(BoardService boardService) {
        this.boardService = boardService;
    }

    public ModelAndView boardRead(HttpServletRequest request,
                                  HttpServletResponse response){
        ModelAndView mnv = new ModelAndView();
        int seq = Integer.valueOf(request.getParameter("seq"));
        this.boardService.boardUpdateReadCount(seq);
        BoardDTO boardDto = this.boardService.boardRead(seq);
        mnv.addObject("boardDto",boardDto);
        mnv.setViewName("boardRead");
        return mnv;
       
    }
   
    public ModelAndView boardDelete(HttpServletRequest request,
                                    HttpServletResponse response){
        ModelAndView mnv = new ModelAndView();
        int seq = Integer.valueOf(request.getParameter("seq"));
        this.boardService.boardDelete(seq);
        mnv.setViewName("boardDeleteSuccess");
        return mnv;
    }
}
2.DI를 구현한 부분에 ParameterMethodNameResolver 를 구현하고 이것을 통해서 DI를 설정한다.
<bean id="readDeleteMultiActionController"
          class="kr.co.springboard.controllers.ReadDeleteMultiActionController"
          p:boardService-ref="boardService"
          p:methodNameResolver-ref="boardReadDeleteNameResolver"/>
    

<bean id="boardReadDeleteNameResolver"
          class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
     <property name="paramName" value="mode"/>
</bean>

이렇게 세팅해 주면 된다.
이렇게 세팅하면 주소창에
http://localhost/springboard/board.do?mode=
이렇게 입력한 뒤에 mode뒤에 자기가 실행하고 싶은 method를 입력하면 된다. 클래스의 boardRead ()를 실행하고 싶으면 mode=boardRead, boardDelete를 실행하고 싶으면 mode=boardDelete를 실행 하면 된다.
mode는 ParameterMethodNameResolver에서 property로 선언한 paramName에서 세팅한 것과 동일 한 것이어야 한다.