스프링프레임워크의 JSP 기술중에 form taglib 가 있습니다. form 태그라이브러리를 사용하면 HTML 폼에 데이터를 바인딩하거나 에러메세지 처리등을 간편하게 할 수 있습니다.
스프링프레임워크 form 태그라이브러리를 사용하기 위해서는 먼저 다음 taglib 설정을 페이지 상단에 추가합니다.
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
1. 옵션 없이 사용했을 경우 기본값
호출 URL이 /offbyone/boardForm.do 라고 가정하고, 옵션 없이 사용한 경우
form 태그:
<form:form></form:form>
결과 HTML:
<form id="command" action="/offbyone/boardForm.do" method="post"></form>
- id 속성은 "command" 가 기본값입니다.
- action 속성은 자기 페이지의 URL 입니다.
- method는 POST가 기본입니다
2. commandName과 modelAttribute 옵션
commandName 과 modelAttribute 옵션은 폼에 있는 요소들의 값을 채우기 위해서 사용될 객체를 request 로부터 찾을때 사용할 이름을 지정합니다. 두 옵션은 동일한 기능을 합니다.
스프링프레임워크 4버전에서는 commandName을 잘 사용을 했었는데, 5버전에서는 다음과 같은 에러가 발생합니다.
Unable to find setter method for attribute: [commandName]
이때에는 commandName 대신에 modelAttribute 옵션을 사용해야 합니다.
form 태그:
<form:form commandName="boardVO"></form:form>
또는
<form:form modelAttribute="boardVO"></form:form>
결과 HTML:
<form id="boardVO" action="/offbyone/boardForm.do" method="post"></form>
일반적으로 폼에 사용되어지는 id와 name 속성은 modelAttribute와 별도로 지정하는 것이 편리할때가 많습니다.
<form:form id="boardForm" name="boardForm" modelAttribute="boardVO"></form:form>
결과 HTML:
<form id="boardForm" name="boardForm" action="/offbyone/boardForm.do" method="post"></form>
3. form 태그에서 사용될 모델 객체를 설정하는 방법
form태그의 commandName 또는 modelAttribute에서 지정되는 폼의 요소들에 값을 제공할 객체의 지정은 보통 컨트롤러에서 하게 됩니다.
@RequestMapping(value = "/boardForm.do", method = RequestMethod.GET)
public String boardForm(Model model) throws Exception {
BoardVO boardVO = new BoardVO();
boardVO.setTitle("제목 입니다.");
model.addAttribute("boardVO", boardVO);
return "boardForm";
}
model 객체에 commandName에서 사용된 이름으로 BoardVO객체를 설정하고 있습니다.
@RequestMapping(value = "/boardForm.do", method = RequestMethod.GET)
public String boardForm(@ModelAttribute BoardVO boardVO, Model model) throws Exception {
boardVO.setTitle("제목 입니다.");
return "boardForm";
}
컨트롤러 메소드의 인자에 @ModelAttribute 아노테이션을 사용하는 방법도 가능합니다. 이름을 별도로 지정하지 않으면 변수명이 commandName에서 사용될 명칭이 됩니다.
@RequestMapping(value = "/boardForm.do", method = RequestMethod.GET)
public String boardForm(@ModelAttribute("boardVO") BoardVO vo, Model model) throws Exception {
vo.setTitle("제목 입니다.");
return "boardForm";
}
@ModelAttribute("boardVO") 처럼 이름을 지정하면 변수명(vo) 과 다른 이름을 사용할 수 있습니다.
form 태그에 commandName 또는 modelAttribute 속성을 사용하고 또한 폼요소를 사용하였는데, 컨트롤러에서 모델 객체를 설정하지 않으면 에러가 발생합니다.
form:input 요소 사용 :
<form:form modelAttribute="boardVO">
<form:input path="title" />
</form:form>
에러발생 :
ERROR: org.springframework.web.servlet.tags.form.InputTag -
Neither BindingResult nor plain target object for bean name 'boardVO' available as request attribute
4. 그외의 form 태그의 속성들
- id : 별도로 지정하지 않으면 commandName과 같은 값이 됩니다.
<form:form commandName="boardVO" id="boardForm"></form:form>
- name : 별도로 지정하지 않으면 commandName과 같은 값이 됩니다.
<form:form commandName="boardVO" name="boardForm"></form:form>
- action : 별도로 지정하지 않으면 현재 페이지의 주소가 됩니다.
<form:form commandName="boardVO" action="/boardInsert.do"></form:form>
※ 컨텍스트 패스를 URL앞단에 자동으로 붙이기 위해서 <c:url> 태그를 사용하는데, 스프링 form 태그의 action 속성에는 <c:url> 태그를 사용할 수 없습니다. 다음과 같은 방법을 사용합니다.
<form:form action="${pageContext.request.contextPath}/boardInsert.do"> ... </form>
또는
<c:url value="/boardInsert.do" var="insertUrl" />
<form:form action="${insertUrl}"> ... </form>
- method : 기본값을 post 입니다.
<form:form method="post"> ... </form>
- htmlEscape : 폼 요소에 들어가는 값들을 escape 할지 지정합니다. 기본값은 현재 페이지의 html escape 값입니다.
<form:form htmlEscape="true"> .. </form>
페이지의 기본 값지정 방법입니다.
htmlEscape tag 사용:
<spring:htmlEscape defaultHtmlEscape="true" />
web.xml 파일에서 지정 :
<context-param>
<param-name>defaultHtmlEscape</param-name>
<param-value>true</param-value>
</context-param>
- cssClass : 폼에 스타일을 지정하기 위해서 사용합니다.
<style>
.formStyle { margin:0; padding:0; }
</style>
<form:form cssClass="formStyle"> ... </form>
- cssStyle : 인라인 스타일을 넣습니다.
<form:form cssStyle="margin:0;padding:0;"> ... </form>
- enctype : 파일 업로드를 위한 속성 입니다.
<form:form enctype="multipart/form-data"> ... </form>
그외에 HTML form 태그에서 사용되는 onsubmit같은 자바 스크립트 이벤트 핸들러도 모두 사용할 수 있습니다. 그리고 모든 속성들에는 EL을 사용해서 실행시간에 값을 지정할 수 있습니다.