Tag library

Spring MVC에서는 입력 폼 구현을 보다 쉽게 구현하기 위해 Spring Form Tag를 제공한다. 이는 태그에서 command 객체, controller 참조 데이터로의 접근이 가능하다. Spring Form tag의 사용방법은 매우 간단하며 예제를 중심으로 각 tag에 대한 내용을 살펴본다.

configuration

Spring Form Tag를 사용하기 위해서는 spring-form.tld파일이 필요하고 이는 spring-webmvc-2.5.2.jar 파일에 포함되어 있다. 이 폼 태그를 사용하기 위해서는 JSP 페이지에 taglib을 추가해줘야한다.
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

form

<form>은 데이터 바인딩을 위해 태그 안에 바인딩 path를 지정해 줄 수 있다. path에 해당되는 값은 도메인 모델의 Bean 객체를 의미한다. 사용예는 다음과 같다.
<form:form commandName="user">
userId : <form:input path="userId" />
</form:form>
또한 Spring Form Tag를 이용하기 위해서는 각각의 입력 path값에 매칭될 트랜스퍼 오브젝트를 지정해 줘야 하는데 <form>안에 commandName 속성으로 다음과 같이 지정해 줄 수 있다.
<% request.setAttribute("user", sample.services.UserVO())%>
이러한 commandName의 기본값은 "command"이며 input값들과 매칭될 트랜스퍼 오브젝트를 request값으로 세팅해 줘야한다. 이 값은 SimpleFormController를 사용할 경우 FormBackingObject()메소드에서 지정해 줄 수도있다.
protected Object formBackingObject(HttpServletRequest request)
	throws Exception {
	UserVO vo=new UserVO();
	request.setAttribute("user",vo);
	return new UserVO();
}

input

HTML의 <input>의 value가 text인 것을 기본 value로 갖는다. 이 태그의 예는 위의 <form> 예에서 볼 수 있다.

checkbox

다음은 <heckbox>의 예이다. 마찬가지로 path에 트랜스퍼 오브젝트의 bean name을 매핑시켜주고 label속성을 이용하면 jsp페이지로 보여질 이름을 설정할 수 있다.
<form:checkbox path="hobby" value="listeningMusic" label="음악감상"/>
<form:checkbox path="hobby" value="study" label="공부"/>
※ 위 코드는 아래와 같은 화면을 출력한다.

checkboxes

위의 <checkbox>는 각각의 항목에 대해 작성해줘야 하지만 <checkboxes>를 사용하면 items속성을 이용해서 한줄로 나타내줄 수 있다. 이러한 items에 들어갈 값은 컨트롤러의 formBackingObject()메소드에서 Array, List, Map형태의 것들로 넘겨 줄 수 있다. Map의 key와 value쌍으로 넘겨줄 경우 key는 태그의 value값이 되고 value는 label명이 된다. (단, Array나 List로 넘길 경우 label은 value와 같은 값을 가지게 된다.) 다음은 그 예이다.
protected Object formBackingObject(HttpServletRequest request)
 	throws Exception {
	UserVO vo=new UserVO();
	Map interest =new HashMap();
	interest.put("reading", "독서");
	interest.put("listeningMusic", "음악감상");
	interest.put("study", "공부");
	request.setAttribute("interest",interest);
 	request.setAttribute("user",vo);
	return new UserVO();
}
<tr>
	<td>hobby :</td>
	<td><form:checkboxes path="hobby" items="${interest}" /></td>
</tr>
※ 위 코드는 아래와 같은 화면을 출력한다.

radiobutton

다음은 <radiobutton>의 예이다. <radiobutton> 또한 label 속성을 이용하여 label명을 설정해 줄 수 있다.
<tr>
    <td>Sex:</td>
    <td>Male: <form:radiobutton path="sex" value="M" label="남자"/> <br/>
        Female: <form:radiobutton path="sex" value="F" label="여자"/> </td>
</tr>
※ 위 코드는 아래와 같은 화면을 출력한다.

radiobuttons

다음은 <radiobuttons>의 예이다. items 속성의 사용방법은 위의 <checkboxes>와 동일하다.
<tr>
    <td>Sex:</td>
    <td><form:radiobuttons path="sex" items="${sexOptions}"/></td>
</tr>

password

다음은 <password>의 예이다.
<tr>
	<td>password :</td>
	<td><form:password path="password" /></td>
</tr>
※ 위 코드는 아래와 같은 화면을 출력한다.

select

<select>도 위의 <checkboxes>나 <radiobuttons>처럼 items 속성을 이용하여 formBackingObject에서 넘겨주는 값으로 자동 매핑 시켜줄 수 있다.
protected Object formBackingObject(HttpServletRequest request)
 	throws Exception {
	UserVO vo=new UserVO();
	Map address =new HashMap();
	address.put("seoul","서울");
	address.put("daegu","대구");
	address.put("busan","부산");
	request.setAttribute("address",address);
 	request.setAttribute("user",vo);
return new UserVO();
}
<tr>
	<td>주소</td>
	<td><form:select path="address" items="${address}" /></td>
</tr>
※ 위 코드는 아래와 같은 화면을 출력한다.
일반적인 <option>와 함께 아래와 같이 사용할 수도 있다.

option

다음은 <option>의 사용 예이다.
<tr>
	<td>주소</td>
	<td><form:select path="address">
		<form:option value="seoul" label="서울" />
		<form:option value="daegu" label="대구" />
		<form:option value="busan" label="부산" />
	</form:select></td>
</tr>

options

다음은 <options>의 사용예이다.
<tr>
	<td>주소</td>
	<td><form:select path="address">
		<form:options items="${address}" />
	</form:select></td>
</tr>

textarea

다음은 <textarea>의 사용 예이다.
<td>Note :</td>
<td><form:textarea path="comment" rows="3" cols="20"></form:textarea></td>
※ 위 코드는 아래와 같은 화면을 출력한다.

hidden

다음은 <hidden>의 사용 예이다.
<form:hidden path="userId" />

errors

Spring MVC는 validatior에서 얻어진 메시지를 JSP페이지에서 쉽게 출력할 수 있도록 Spring Form 태그의 <form:errors>를 제공한다. 이는 생성한 validator를 통해 입력값의 유효성 체크 후 에러 메시지를 출력해주는데 자세한 사항은 본 매뉴얼 Spring MVC validator - form:errors 태그 사용 방법 을 참고한다.

sample

입력 화면

다음은 입력 화면 작성 예인 userForm.jsp 파일의 일부이다.
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<form:form commandName="users" name="form" enctype="multipart/form-data">
	<table>
	<tr><td colspan="3"><center><strong>
		<spring:message code="title.user.form"></spring:message>
	</strong></center><br/><br/></td></tr>
		<tr>
			<td> Name :</td>
			<td><form:input path="userName" />(required)</td>
			<td><form:errors path="userName" /></td>
		</tr>
		<tr>
			<td>password :</td>
			<td><form:password path="password" />(required, 6자이상입력)</td>
			<td><form:errors path="password" /></td>
		</tr>
		<tr>
			<td>confirm password :</td>
			<td><form:password path="confirmPassword" />(위의 password와 동일해야함)</td>
			<td><form:errors path="confirmPassword" /></td>
		</tr>
		<tr>
			<td>sex :</td>
			<td><form:radiobutton path="sex" value="M" label="남자" /> 
			<form:radiobutton path="sex" value="F" label="여자" /></td>
		</tr>
		<tr>
			<td>address :</td>
			<!-- items 속성을 사용하여 컨트롤러의 
			formbackingObject()에서 넘겨준  Map 형태의 객체를 받아 출력해준다. -->
			<td><form:select path="address" items="${address}"/>
		</tr>
		<tr>
			<td>hobby :</td>
			<td><form:checkboxes path="hobby" items="${hobby}" /></td>
		</tr>
		<tr>
			<td>Note :</td>
			<td><form:textarea path="comment" rows="3" cols="20"></form:textarea></td>
		</tr>
	</table>
	<a href="javascript:fncGetUser();">submit</a>
</form:form>

Controller 클래스

다음은 Form에서 사용할 객체를 셋팅해주는 UserController.java 파일의 FormBackingObjet()메소드와 요청 처리 결과를 모델객체에 셋팅해서 view로 넘겨주는 onSubmit()메소드의 일부이다.
public class UserController extends SimpleFormController {

	... 중략...
	// setting command class for data binding
	public UserController() {
		setCommandClass(UserVO.class);
		//form tag에서 사용할 commandName 된다. 
		setCommandName("users"); 
		setFormView("/jsp/user/userForm.jsp");
	}

	// override onSubmit() method.
	protected ModelAndView onSubmit(Object command) throws Exception {
		// data binding using command object
		UserVO userVO = (UserVO) command;

		// call business service
		userVO = userService.getUser(userVO);
		// setting view name
		ModelAndView mav = new ModelAndView("/jsp/user/getUser.jsp");
		//view에 "userVO"라는 모델 객체를 넘겨준다. 
		mav.addObject(userVO);
		// return a ModelAndView object.
		return mav;
	}

	protected Object formBackingObject(HttpServletRequest request)
			throws Exception {
		Map address = new HashMap();
		address.put("seoul", "서울");
		address.put("daegu", "대구");
		address.put("busan", "부산");

		Map hobby = new HashMap();
		hobby.put("reading", "독서");
		hobby.put("listeningMusic", "음악감상");
		hobby.put("study", "공부");
		
		request.setAttribute("address", address);
		request.setAttribute("hobby", hobby);
		
		//commandName인 "users"에 return값이 셋팅된다. 
		return new UserVO();
	}

}

출력 화면

다음은 EL문을 사용한 데이터 출력을 작성한 getUser.jsp 파일의 일부이다.
<tr><td>User Name : </td><td>${userVO.userName}</td></tr>
<tr><td>User Password : </td><td>${userVO.password}</td></tr>
<tr><td>User Address : </td><td>${userVO.address}</td></tr>
<tr><td>User hobby : </td><td>${userVO.hobby}</td></tr>
위의 JSP 코드처럼 Expression Language(JSP 2.0에서 지원)를 사용하여 Controller에서 넘겨준 "userVO"라는 이름의 모델 객체의 값을 출력할 수 있다.

Resources

  • 다운로드
  • 이클립스 프로젝트 형태의 샘플 웹 어플리케이션을 포함하고 있는 anyframe-springmvc-sample-basic.zip 파일을 다운받은 후, 테스트 환경 설정 을 참조하여 위에서 제시한 예제 코드를 실행해 볼 수 있다.
    Name
    Download
    anyframe-springmvc-sample-basic.zip
    Download

  • 참고자료