[Spring] SimpleFormController – Spring Form Tags 활용

스프링 프레임워크는 정말 뛰어난 프레임워크지만 개발자가 부족한 시점에서는 애물단지가 되는 프레임워크 인것 같습니다.

하나의 페이지를 만들기 위해 XML수정부터 Controller, View, Service, Dao, 각종 Bean들 까지 만들고 있다 보면 내가 이 간단한것을 하기 위해 무엇을 하고 있는것인가 생각이 들곤 합니다.

그래서 간단하게 SimpleFormController를 사용할 수 있는 방법을 찾아보았습니다. 무의식중에 이렇게 개발하고 있었는데 외국의 사이트에서도 같은 형식으로 개발하는것을 많이 찾아볼 수 있더군요.

잘못된 방법은 아닌거 같습니다.

SimpleFormController
[code]public class SpringFormTestController extends SimpleFormController
{
  private MemoService memoService;

  public void setMemoService(MemoService memoService)
  {
    this.memoService = memoService;
  }

  public SpringFormTestController()
  {
    setCommandName(“testForm”);
    setCommandClass(TestForm.class);
    setFormView(“form”);
    setSuccessView(“result”);
  }

  @Override
  protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception
  {

    TestForm testForm = (TestForm) command;

    MemoData memoData = new MemoData();

    memoData.setName(testForm.getName());
    memoData.setEmail(testForm.getEmail());
    memoData.setMemo(testForm.getMemo());

    SimpleDateFormat formatter = new SimpleDateFormat(“yy년MM월dd일 HH시mm분ss초”);
    String date = formatter.format(new Date());

    memoData.setDate(date);

    memoService.insertMemo(memoData);

    return new ModelAndView(getSuccessView()).addObject(“memoData”, memoData);
  }

  @Override
  protected Object formBackingObject(HttpServletRequest request) throws Exception
  {
    // 빈 객체를 생성하여 넘겨준다.
    // 폼안에 내용이 필요할 경우 값을 이 메서드에서 추가하여 넘겨주면 된다.
    return new TestForm();
  }

}[/code]

JSP
[code]<%@ page language=”java” contentType=”text/html; charset=UTF-8″ pageEncoding=”UTF-8″%>
<%@ taglib prefix=”form” uri=”http://www.springframework.org/tags/form”%>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.1//EN” “http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd“>
<html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”ko”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″ />
<title>Spring Form Controller Test</title>
</head>
<body>
<!–
 컨트롤러의 setCommandName와 아래 form의 commandName이 일치하여야 함
 form:input 의 path명은 setCommandClass에서 지정한 POJO빈 클래스의 맴버 변수명과 일치해야 함
 –>
<form:form commandName=”testForm” method=”post”>
<span>이름 : <form:input path=”name”/></span>
<span>이메일 : <form:input path=”email”/></span>
<span>메모 :  <form:input path=”memo”/></span>
<span><input type=”submit” value=”확인”/></span>
</form:form>
</body>
</html>[/code]

여기서 중요한점은 Controller와 Form태그의 데이터들이 완벽하게 1:1로 매핑 된다는것입니다.

formBackingObject 메서드를 이용해, 페이지가 처음으로 로드될때도 빈데이터를 매핑시켜야 합니다. 없을 경우 에러가 뜹니다.

만약에 데이터 수정창이었다면 데이터를 읽어와서 그 데이터를 리턴하면 됩니다. 바로 값이 뜨게 됩니다.

또한 Controller의 commandName과 Form태그의 commandName이 같아야 합니다. Controller에서는 setCommandName으로 설정하고 있습니다.

commandClass의 내부 변수명과 Form태그의 path명은 일치하여야 합니다.

commandClass에는 validate등의 기능을 구현할 수 있습니다.

1262697483.war