Spring - Spring의 Controller들. 2.SimpleFormController

Published on: 2009. 9. 13. 16:52 by louis.dev

<역할>
Controller의 이름에서도 알수 있다 시피 SimpleFormController는 입력받는 Form을 간단하게 만들어 줄수 있는 Controller 이다.
즉 입력과 수정창, 예를 들면 게시판의 글쓰기와 글 수정 창을 따로따로 만들 필요 없이 http get 으로 들어오면 글쓰기 창을 보여주고 글 정보를 쓸때(글쓰기,글 수정) http post 방식으로 들어올때는 글을 디비에 입력하는 이런 따로따로인 기능을 하나의 클래스로 구현하는 것이다.
그렇기 때문에 수정form과 입력form을 두가지 따로따로 만들 필요가 없는 것이다.

<사용방법>
SimpleFormController를 사용하기 위해서는 이 클래스를 상속 받아서 써야 한다. SimpleFormController를 사용하게 되면 formBackingObject() method와 onSubmit() 메소드를 overriding 해서 사용할 수 있다.

게시판에서 예를 들어 보면
게시판에 글을 쓰는 폼을 보여주거나, 게시판의 글을 수정하는 폼을 보여주는 것을 simpleFormController로 구현한다고 하자.
글쓰기나 수정 둘다 form을 요청할때는 get 방식을 사용할 것이다.(왜냐 하면 URL을 통해 form에 접근하기 때문이다)
그리고 사용자로 부터 글을 쓴 정보, 혹은 수정한 정보들은 post 방식으로 컨트롤러에 접근할 것이다.
이때 formBackingObject() method 는 get방식으로 접근할때 실행 되고 onSubmit() method는 post방식으로 데이터가 넘어올때 실행이 된다.
그림으로 보면



다음과 같은 실행 루틴을 거친다.

1. 사용할 클래스에 SimpleFormController를 상속 받아 formBackingObject() 와 onSubmit()를 override 한다.
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.validation.BindException;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;

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

   
   
    @Override
    protected Object formBackingObject(HttpServletRequest request)
                                       throws Exception {
        int seq = ServletRequestUtils.getIntParameter(request, "seq", 0);
        BoardDTO boardDto = null;
        if(seq == 0){
            boardDto = new BoardDTO();
        }else if(seq > 0){
            boardDto = this.boardService.boardRead(seq);
        }
        return boardDto;
    }



    @Override
    protected ModelAndView onSubmit(HttpServletRequest request,
                                    HttpServletResponse response,
                                    Object command, BindException errors)
                                    throws Exception {
        ModelAndView mnv = new ModelAndView();
        BoardDTO dto = (BoardDTO)command;
        if(dto.getSeq() == 0){
            boardService.boardInsert(dto);
        }else{
            boardService.boardUpdate(dto);
           
        }
        mnv.setViewName(getSuccessView());
       
        return mnv;
    }
   
}


2. DI설정부분에서 formView,successView,commandClass,commandName을 property로 설정한다.
<bean id="writeSimpleFormController" class="kr.co.springboard.controllers.WriteSimpleFormController">
        <property name="commandClass" value="kr.co.springboard.dto.BoardDTO"/>
        <property name="commandName" value="boardDto"/>
        <property name="formView" value="writeForm"/>
        <property name="successView" value="writeSuccess"/>
        <property name="boardService" ref="boardService"/>
</bean>

기본적으로 onSubmit()을 실행할때는 AbstractCommandController에서 command 객체를 통해 입력된 정보를 받아오는데 SimpleFormController의 onSubmit()도 이와 같은 방식을 채택하고 있다.
그렇기 때문에 commandClass와commandName을 통해 command객체를 생성해 준다.
또하나 아주 중요한 역할은 formBackingObject에서 boardDto를 리턴해 주는데 commandName에 설정한 이름으로 request 객체에 담기기 때문에 commandName을 세팅해 주지 않으면 절대로 form 페이지에서 정보를 받을 수가 없다
그리고 formView는 formBackingObject를 실행되었을때 자동적으로 ModelAndView 객체에 세팅이 됨으로 따로 세팅해주어야 할 필요는 없다.
successView는 성공하고 보여질 페이지를 세팅한다. SimpleFormController 안에 있는 getSuccessView method를 통해 값을 가져 올 수 있다.