본문 바로가기
프로그래밍/스프링프레임워크

스프링프레임워크 <form:form> 태그 사용법

by pentode 2018. 8. 5.

스프링프레임워크의 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 옵션


commandNamemodelAttribute 옵션은 폼에 있는 요소들의 값을 채우기 위해서 사용될 객체를 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을 사용해서 실행시간에 값을 지정할 수 있습니다.


반응형