Tag Archives: 프레임워크

[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

[SpringIDE] 다중 컨텍스트 XML 관리시 다른 파일의 참조 문제점

 

SpringIDE를 설치한 상태에서 프로젝트를 진행 하다 보면 별 문제도 없는데 자꾸 경고가 뜨곤 한다. 그당시에는 무시를 하였지만 나의 결벽증 개발자 무의식이 나타나 이것을 잡기로 하였다.

그 경우는 바로 다음과 같은 경우이다.

datasource-context.xml

<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
  <property name="dataSource" ref="dataSource"/>
</bean>

dao-context.xml

<bean id="userWidgetDao" class="com.twinkr.widget.dao.UserWidgetDataDaoImpl" >
  <property name="sqlMapClient" ref="sqlMapClient" />
</bean>

이경우 dao-context.xml의 두번째 줄에는 다음과 같은 경고가 발생한다.

“Referenced bean ‘sqlMapClient’ not found”

하지만 실행해보면 전혀 문제없음을 알 수 있다. 어차피 xml들은 모두 통합 관리되는건데 어쩌란 말인가?
SpringIDE만 꺼보면 바로 에러가 사라진다. SpringIDE가 문제라고 치부한다는것인데…

Project → Properties → Spring → Bean Support → Config Sets

에 들어가서 묶을 필요가 있는 xml파일들을 한데 묶어 Config Set으로 지정해 주자. 묶인 파일들 사이에는 어떠한 공유도 가능하다는 암묵적인 약속이 체결된다. 물론 SpringIDE맘데로; 그리고 서로 마음껏 끌어다 써도 에러는 발생하지 않는다.