Loading...
Spring Framework Reference Documentation 7.0.2의 JSP and JSTL의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
Spring Framework는 JSP와 JSTL과 함께 Spring MVC를 사용하기 위한 내장 integration을 제공합니다.
JSP로 개발할 때는 일반적으로 InternalResourceViewResolver 빈을 선언합니다.
InternalResourceViewResolver는 어떤 Servlet 리소스로든 dispatch하는 데 사용할 수 있지만,
특히 JSP에 적합합니다. 모범 사례로서, JSP 파일들을 WEB-INF 디렉터리 하위의 디렉터리에
배치할 것을 강력히 권장합니다. 이렇게 하면 클라이언트가 직접 접근할 수 없습니다.
아래의 설정은 JSP 뷰 리졸버를 등록하는 예로, 뷰 이름 prefix의 기본값을
"/WEB-INF/"로, suffix의 기본값을 ".jsp"로 사용하는 설정입니다.
1@EnableWebMvc 2@Configuration 3public class WebConfig implements WebMvcConfigurer { 4 5 @Override 6 public void configureViewResolvers(ViewResolverRegistry registry) { 7 registry.jsp(); 8 } 9}
1<mvc:annotation-driven/> 2 3<mvc:view-resolvers> 4 <mvc:jsp/> 5</mvc:view-resolvers>
custom prefix와 suffix를 지정할 수 있습니다.
JSP Standard Tag Library (JSTL)를 사용할 때는 특별한 뷰 클래스인 JstlView를 사용해야 합니다.
JSTL은 I18N 기능과 같은 것들이 동작할 수 있도록 약간의 준비가 필요하기 때문입니다.
Spring은 앞 장들에서 설명한 것처럼 요청 파라미터를 커맨드 객체에 데이터 바인딩하는 기능을 제공합니다. 이러한 데이터 바인딩 기능과 결합하여 JSP 페이지 개발을 용이하게 하기 위해, Spring은 작업을 더 쉽게 만들어 주는 몇 가지 태그를 제공합니다. 모든 Spring 태그에는 문자 이스케이프를 활성화하거나 비활성화할 수 있는 HTML 이스케이프 기능이 있습니다.
spring.tld 태그 라이브러리 디스크립터(TLD)는 spring-webmvc.jar에 포함되어 있습니다.
개별 태그에 대한 포괄적인 참고 문서는
API reference
를 보거나 태그 라이브러리 설명을 참조하면 됩니다.
버전 2.0부터 Spring은 JSP와 Spring Web MVC를 사용할 때 폼 요소를 처리하기 위한, 데이터 바인딩 인식 태그의 포괄적인 집합을 제공합니다. 각 태그는 해당 HTML 태그 대응물의 속성 집합을 지원하므로, 태그가 친숙하고 직관적으로 사용할 수 있습니다. 태그가 생성하는 HTML은 HTML 4.01/XHTML 1.0을 준수합니다.
다른 form/input 태그 라이브러리와는 달리, Spring의 form 태그 라이브러리는 Spring Web MVC와 통합되어 있어, 태그는 컨트롤러가 다루는 커맨드 객체와 참조 데이터에 접근할 수 있습니다. 다음 예제에서 보듯이, form 태그는 JSP를 더 쉽게 개발하고, 읽고, 유지보수할 수 있게 해줍니다.
form 태그들을 살펴보고 각 태그가 어떻게 사용되는지에 대한 예를 봅니다. 특정 태그에 추가적인 설명이 필요한 경우, 생성된 HTML 스니펫도 포함했습니다.
form 태그 라이브러리는 spring-webmvc.jar에 함께 포함되어 있습니다. 라이브러리 디스크립터의
이름은 spring-form.tld입니다.
이 라이브러리의 태그를 사용하려면, JSP 페이지 상단에 다음 디렉티브를 추가합니다:
1<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
여기서 form은 이 라이브러리의 태그에 사용하려는 태그 이름 prefix입니다.
이 태그는 HTML form 요소를 렌더링하고 바인딩을 위한 바인딩 경로를 inner 태그에
노출합니다. 이 태그는 커맨드 객체를 PageContext에 넣어 inner 태그가 커맨드 객체에
접근할 수 있게 합니다. 이 라이브러리의 다른 모든 태그는 form 태그의 중첩 태그입니다.
User라는 도메인 객체가 있다고 가정합니다. 이 객체는 firstName과 lastName 같은
프로퍼티를 가진 JavaBean입니다. 이를 form 컨트롤러의 form-backing 객체로 사용할 수 있으며,
해당 컨트롤러는 form.jsp를 반환합니다. 다음 예제는 form.jsp가 어떻게 보일 수 있는지
보여줍니다:
1<form:form> 2 <table> 3 <tr> 4 <td>First Name:</td> 5 <td><form:input path="firstName"/></td> 6 </tr> 7 <tr> 8 <td>Last Name:</td> 9 <td><form:input path="lastName"/></td> 10 </tr> 11 <tr> 12 <td colspan="2"> 13 <input type="submit" value="Save Changes"/> 14 </td> 15 </tr> 16 </table> 17</form:form>
firstName과 lastName 값은 페이지 컨트롤러가 PageContext에 넣은 커맨드 객체에서
가져옵니다. form 태그와 함께 inner 태그가 어떻게 사용되는지에 대한 더 복잡한 예제를 계속
읽어보십시오.
다음 listing은 생성된 HTML을 보여주며, 이는 표준 form과 같습니다:
1<form method="POST"> 2 <table> 3 <tr> 4 <td>First Name:</td> 5 <td><input name="firstName" type="text" value="Harry"/></td> 6 </tr> 7 <tr> 8 <td>Last Name:</td> 9 <td><input name="lastName" type="text" value="Potter"/></td> 10 </tr> 11 <tr> 12 <td colspan="2"> 13 <input type="submit" value="Save Changes"/> 14 </td> 15 </tr> 16 </table> 17</form>
앞의 JSP는 form-backing 객체의 변수 이름이 command라고 가정합니다. form-backing
객체를 모델에 다른 이름으로 넣은 경우(이는 확실히 모범 사례입니다), 다음 예제와 같이
form을 해당 이름의 변수에 바인딩할 수 있습니다:
1<form:form modelAttribute="user"> 2 <table> 3 <tr> 4 <td>First Name:</td> 5 <td><form:input path="firstName"/></td> 6 </tr> 7 <tr> 8 <td>Last Name:</td> 9 <td><form:input path="lastName"/></td> 10 </tr> 11 <tr> 12 <td colspan="2"> 13 <input type="submit" value="Save Changes"/> 14 </td> 15 </tr> 16 </table> 17</form:form>
input Tag이 태그는 기본적으로 bound value와 함께 type='text'인 HTML input 요소를 렌더링합니다.
이 태그의 예는
The Form Tag
를 참조하십시오. email, tel, date 등과 같은 HTML5-specific type도 사용할 수 있습니다.
checkbox Tag이 태그는 type이 checkbox로 설정된 HTML input 태그를 렌더링합니다.
User에 newsletter 구독과 취미 목록 같은 preference가 있다고 가정합니다. 다음 예제는
Preferences 클래스를 보여줍니다:
1public class Preferences { 2 3 private boolean receiveNewsletter; 4 private String[] interests; 5 private String favouriteWord; 6 7 public boolean isReceiveNewsletter() { 8 return receiveNewsletter; 9 } 10 11 public void setReceiveNewsletter(boolean receiveNewsletter) { 12 this.receiveNewsletter = receiveNewsletter; 13 } 14 15 public String[] getInterests() { 16 return interests; 17 } 18 19 public void setInterests(String[] interests) { 20 this.interests = interests; 21 } 22 23 public String getFavouriteWord() { 24 return favouriteWord; 25 } 26 27 public void setFavouriteWord(String favouriteWord) { 28 this.favouriteWord = favouriteWord; 29 } 30}
1class Preferences( 2 var receiveNewsletter: Boolean, 3 var interests: StringArray, 4 var favouriteWord: String 5)
이에 해당하는 form.jsp는 다음과 비슷할 수 있습니다:
1<form:form> 2 <table> 3 <tr> 4 <td>Subscribe to newsletter?:</td> 5 <%-- Approach 1: Property is of type java.lang.Boolean --%> 6 <td><form:checkbox path="preferences.receiveNewsletter"/></td> 7 </tr> 8 9 <tr> 10 <td>Interests:</td> 11 <%-- Approach 2: Property is of an array or of type java.util.Collection --%> 12 <td> 13 Quidditch: <form:checkbox path="preferences.interests" value="Quidditch"/> 14 Herbology: <form:checkbox path="preferences.interests" value="Herbology"/> 15 Defence Against the Dark Arts: <form:checkbox path="preferences.interests" value="Defence Against the Dark Arts"/> 16 </td> 17 </tr> 18 19 <tr> 20 <td>Favourite Word:</td> 21 <%-- Approach 3: Property is of type java.lang.Object --%> 22 <td> 23 Magic: <form:checkbox path="preferences.favouriteWord" value="Magic"/> 24 </td> 25 </tr> 26 </table> 27</form:form>
checkbox 태그에는 세 가지 approach가 있으며, 이는 checkbox에 대한 모든 요구 사항을
충족할 수 있습니다.
Approach One: bound value가 java.lang.Boolean type인 경우, bound value가 true이면
input(checkbox)는 checked로 표시됩니다. value 속성은 setValue(Object) value
프로퍼티의 resolved value에 해당합니다.
Approach Two: bound value가 array 또는 java.util.Collection type인 경우,
input(checkbox)는 bound Collection에 설정된 setValue(Object) value가 존재하면
checked로 표시됩니다.
Approach Three: 다른 어떤 bound value type에 대해서든, input(checkbox)는 설정된
setValue(Object)가 bound value와 같으면 checked로 표시됩니다.
approach와 관계없이, 동일한 HTML 구조가 생성된다는 점에 유의하십시오. 다음 HTML 스니펫은 몇 개의 checkbox를 정의합니다:
1<tr> 2 <td>Interests:</td> 3 <td> 4 Quidditch: <input name="preferences.interests" type="checkbox" value="Quidditch"/> 5 <input type="hidden" value="1" name="_preferences.interests"/> 6 Herbology: <input name="preferences.interests" type="checkbox" value="Herbology"/> 7 <input type="hidden" value="1" name="_preferences.interests"/> 8 Defence Against the Dark Arts: <input name="preferences.interests" type="checkbox" value="Defence Against the Dark Arts"/> 9 <input type="hidden" value="1" name="_preferences.interests"/> 10 </td> 11</tr>
각 checkbox 뒤에 추가적인 hidden 필드가 있는 것을 예상하지 못할 수도 있습니다.
HTML 페이지에서 checkbox가 체크되지 않은 경우, form이 submit될 때 그 값은 HTTP 요청
파라미터의 일부로 서버에 전송되지 않습니다. 따라서 Spring form 데이터 바인딩이
동작하도록 하기 위해 HTML의 이러한 특이점에 대한 우회 방법이 필요합니다. checkbox
태그는 각 checkbox에 대해 underscore(_)가 prefix로 붙은 hidden 파라미터를 포함하는 기존
Spring 관례를 따릅니다. 이렇게 함으로써, 사실상 Spring에게
“checkbox가 form에 표시되었고, form 데이터가 바인딩되는 내 객체가 checkbox의 상태를,
어떤 경우든 반영하길 원한다.”라고 말하는 셈입니다.
checkboxes Tag이 태그는 type이 checkbox로 설정된 여러 HTML input 태그를 렌더링합니다.
이 section은 이전 checkbox 태그 section의 예를 기반으로 합니다. 때로는 JSP 페이지에 가능한
모든 취미를 나열하고 싶지 않을 때가 있습니다. 대신 runtime에 사용 가능한 option의 목록을
제공하고, 이를 태그에 전달하고자 할 수 있습니다. 이것이 checkboxes 태그의 목적입니다.
items 프로퍼티에 사용 가능한 option을 포함하는 Array, List, 또는 Map을 전달할 수
있습니다. 일반적으로 bound 프로퍼티는 사용자가 선택한 여러 값을 담을 수 있도록 collection입니다.
다음 예제는 이 태그를 사용하는 JSP를 보여줍니다:
1<form:form> 2 <table> 3 <tr> 4 <td>Interests:</td> 5 <td> 6 <%-- Property is of an array or of type java.util.Collection --%> 7 <form:checkboxes path="preferences.interests" items="${interestList}"/> 8 </td> 9 </tr> 10 </table> 11</form:form>
이 예는 interestList가 모델 attribute로 사용 가능한 List이며, 선택할 값의 string을
포함하고 있다고 가정합니다. Map을 사용하는 경우, map entry key는 value로 사용되고,
map entry의 value는 표시할 label로 사용됩니다. 또한 custom 객체를 사용할 수도 있으며,
이때 itemValue를 사용해 value에 대한 프로퍼티 이름을, itemLabel을 사용해 label에 대한
프로퍼티 이름을 제공할 수 있습니다.
radiobutton Tag이 태그는 type이 radio로 설정된 HTML input 요소를 렌더링합니다.
일반적인 사용 패턴은 서로 다른 value를 가진, 동일한 프로퍼티에 bound된 여러 태그 인스턴스를 포함하는 것입니다. 다음 예제와 같습니다:
1<tr> 2 <td>Sex:</td> 3 <td> 4 Male: <form:radiobutton path="sex" value="M"/> <br/> 5 Female: <form:radiobutton path="sex" value="F"/> 6 </td> 7</tr>
radiobuttons Tag이 태그는 type이 radio로 설정된 여러 HTML input 요소를 렌더링합니다.
checkboxes 태그와 마찬가지로,
runtime 변수로 사용 가능한 option을 전달하고 싶을 수 있습니다. 이러한 사용을 위해
radiobuttons 태그를 사용할 수 있습니다. 사용 가능한 option을 포함하는 Array, List,
또는 Map을 items 프로퍼티에 전달합니다. Map을 사용하는 경우, map entry key는 value로
사용되고, map entry의 value는 표시할 label로 사용됩니다. 또한 custom 객체를 사용할 수
있으며, 이때 itemValue를 사용해 value에 대한 프로퍼티 이름을, itemLabel을 사용해
label에 대한 프로퍼티 이름을 제공할 수 있습니다. 다음 예제와 같습니다:
1<tr> 2 <td>Sex:</td> 3 <td><form:radiobuttons path="sex" items="${sexOptions}"/></td> 4</tr>
password Tag이 태그는 bound value와 함께 type이 password로 설정된 HTML input 태그를 렌더링합니다.
1<tr> 2 <td>Password:</td> 3 <td> 4 <form:password path="password"/> 5 </td> 6</tr>
기본적으로 password value는 표시되지 않는다는 점에 유의하십시오. password value를
표시하고 싶은 경우, 다음 예제와 같이 showPassword 속성의 값을 true로 설정할 수
있습니다:
1<tr> 2 <td>Password:</td> 3 <td> 4 <form:password path="password" value="^76525bvHGq" showPassword="true"/> 5 </td> 6</tr>
select Tag이 태그는 HTML select 요소를 렌더링합니다. 선택된 option에 대한 데이터 바인딩과 중첩
option 및 options 태그 사용을 지원합니다.
User에 skill 목록이 있다고 가정합니다. 이에 해당하는 HTML은 다음과 같을 수 있습니다:
1<tr> 2 <td>Skills:</td> 3 <td><form:select path="skills" items="${skills}"/></td> 4</tr>
User의 skill이 Herbology인 경우, 'Skills' 행의 HTML 소스는 다음과 같을 수 있습니다:
1<tr> 2 <td>Skills:</td> 3 <td> 4 <select name="skills" multiple="true"> 5 <option value="Potions">Potions</option> 6 <option value="Herbology" selected="selected">Herbology</option> 7 <option value="Quidditch">Quidditch</option> 8 </select> 9 </td> 10</tr>
option Tag이 태그는 HTML option 요소를 렌더링합니다. bound value를 기반으로 selected를
설정합니다. 다음 HTML은 이에 대한 typical output을 보여줍니다:
1<tr> 2 <td>House:</td> 3 <td> 4 <form:select path="house"> 5 <form:option value="Gryffindor"/> 6 <form:option value="Hufflepuff"/> 7 <form:option value="Ravenclaw"/> 8 <form:option value="Slytherin"/> 9 </form:select> 10 </td> 11</tr>
User의 house가 Gryffindor인 경우, 'House' 행의 HTML 소스는 다음과 같습니다:
1<tr> 2 <td>House:</td> 3 <td> 4 <select name="house"> 5 <option value="Gryffindor" selected="selected">Gryffindor</option> (1) 6 <option value="Hufflepuff">Hufflepuff</option> 7 <option value="Ravenclaw">Ravenclaw</option> 8 <option value="Slytherin">Slytherin</option> 9 </select> 10 </td> 11</tr>
| 1 | selected 속성이 추가된 점에 유의하십시오. |
options Tag이 태그는 HTML option 요소 목록을 렌더링합니다. bound value를 기반으로 selected
속성을 설정합니다. 다음 HTML은 typical output을 보여줍니다:
1<tr> 2 <td>Country:</td> 3 <td> 4 <form:select path="country"> 5 <form:option value="-" label="--Please Select"/> 6 <form:options items="${countryList}" itemValue="code" itemLabel="name"/> 7 </form:select> 8 </td> 9</tr>
User가 UK에 거주하는 경우, 'Country' 행의 HTML 소스는 다음과 같습니다:
1<tr> 2 <td>Country:</td> 3 <td> 4 <select name="country"> 5 <option value="-">--Please Select</option> 6 <option value="AT">Austria</option> 7 <option value="UK" selected="selected">United Kingdom</option> (1) 8 <option value="US">United States</option> 9 </select> 10 </td> 11</tr>
| 1 | selected 속성이 추가된 점에 유의하십시오. |
앞의 예에서 보듯이, option 태그와 options 태그를 결합해서 사용하면 동일한 표준 HTML을
생성하지만, 예제의 기본 string인 "-- Please Select"처럼, display 전용으로 JSP에
명시적으로 값을 지정할 수 있게 해줍니다(값이 있어야 할 위치에).
items 속성은 일반적으로 item 객체의 collection 또는 array로 채워집니다.
itemValue와 itemLabel은 지정된 경우, 이러한 item 객체의 bean 프로퍼티를 참조합니다.
그렇지 않으면, item 객체 자체가 string으로 변환됩니다. 또는 item의 Map을 지정할 수
있으며, 이 경우 map key는 option value로 해석되고, map value는 option label에 해당합니다.
itemValue 또는 itemLabel(또는 둘 다)이 지정된 경우, item value 프로퍼티는 map key에
적용되고, item label 프로퍼티는 map value에 적용됩니다.
textarea Tag이 태그는 HTML textarea 요소를 렌더링합니다. 다음 HTML은 typical output을 보여줍니다:
1<tr> 2 <td>Notes:</td> 3 <td><form:textarea path="notes" rows="3" cols="20"/></td> 4 <td><form:errors path="notes"/></td> 5</tr>
hidden Tag이 태그는 bound value와 함께 type이 hidden으로 설정된 HTML input 태그를 렌더링합니다.
bound되지 않은 hidden value를 submit하려면, type이 hidden으로 설정된 HTML input 태그를
사용하십시오. 다음 HTML은 typical output을 보여줍니다:
1<form:hidden path="house"/>
house 값을 hidden으로 submit하기로 선택한 경우, HTML은 다음과 같습니다:
1<input name="house" type="hidden" value="Gryffindor"/>
errors Tag이 태그는 field error를 HTML span 요소에 렌더링합니다. 이 태그는 컨트롤러에서 생성한
error나 컨트롤러와 연관된 validator가 생성한 error에 접근할 수 있게 합니다.
form을 submit한 후 firstName과 lastName field에 대한 모든 error message를 표시하고
싶다고 가정합니다. User 클래스 인스턴스에 대한 validator인 UserValidator가 있으며,
다음 예제와 같습니다:
1public class UserValidator implements Validator { 2 3 public boolean supports(Class candidate) { 4 return User.class.isAssignableFrom(candidate); 5 } 6 7 public void validate(Object obj, Errors errors) { 8 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "required", "Field is required."); 9 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "required", "Field is required."); 10 } 11}
1class UserValidator : Validator { 2 3 override fun supports(candidate: Class<*>): Boolean { 4 return User::class.java.isAssignableFrom(candidate) 5 } 6 7 override fun validate(obj: Any, errors: Errors) { 8 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "firstName", "required", "Field is required.") 9 ValidationUtils.rejectIfEmptyOrWhitespace(errors, "lastName", "required", "Field is required.") 10 } 11}
form.jsp는 다음과 같을 수 있습니다:
1<form:form> 2 <table> 3 <tr> 4 <td>First Name:</td> 5 <td><form:input path="firstName"/></td> 6 <%-- Show errors for firstName field --%> 7 <td><form:errors path="firstName"/></td> 8 </tr> 9 10 <tr> 11 <td>Last Name:</td> 12 <td><form:input path="lastName"/></td> 13 <%-- Show errors for lastName field --%> 14 <td><form:errors path="lastName"/></td> 15 </tr> 16 <tr> 17 <td colspan="3"> 18 <input type="submit" value="Save Changes"/> 19 </td> 20 </tr> 21 </table> 22</form:form>
firstName과 lastName field에 빈 값을 넣고 form을 submit하면, HTML은 다음과 같습니다:
1<form method="POST"> 2 <table> 3 <tr> 4 <td>First Name:</td> 5 <td><input name="firstName" type="text" value=""/></td> 6 <%-- Associated errors to firstName field displayed --%> 7 <td><span name="firstName.errors">Field is required.</span></td> 8 </tr> 9 10 <tr> 11 <td>Last Name:</td> 12 <td><input name="lastName" type="text" value=""/></td> 13 <%-- Associated errors to lastName field displayed --%> 14 <td><span name="lastName.errors">Field is required.</span></td> 15 </tr> 16 <tr> 17 <td colspan="3"> 18 <input type="submit" value="Save Changes"/> 19 </td> 20 </tr> 21 </table> 22</form>
주어진 페이지에 대한 전체 error 목록을 표시하고 싶다면 어떻게 해야 할까요? 다음 예제는
errors 태그가 기본적인 wildcard 기능도 지원함을 보여줍니다.
path="*": 모든 error를 표시합니다.path="lastName": lastName field와 연관된 모든 error를 표시합니다.path가 생략되면, 객체 error만 표시됩니다.다음 예제는 페이지 상단에 error 목록을 표시한 다음, field 옆에 field-specific error를 표시합니다:
1<form:form> 2 <form:errors path="*" cssClass="errorBox"/> 3 <table> 4 <tr> 5 <td>First Name:</td> 6 <td><form:input path="firstName"/></td> 7 <td><form:errors path="firstName"/></td> 8 </tr> 9 <tr> 10 <td>Last Name:</td> 11 <td><form:input path="lastName"/></td> 12 <td><form:errors path="lastName"/></td> 13 </tr> 14 <tr> 15 <td colspan="3"> 16 <input type="submit" value="Save Changes"/> 17 </td> 18 </tr> 19 </table> 20</form:form>
HTML은 다음과 같습니다:
1<form method="POST"> 2 <span name="*.errors" class="errorBox">Field is required.<br/>Field is required.</span> 3 <table> 4 <tr> 5 <td>First Name:</td> 6 <td><input name="firstName" type="text" value=""/></td> 7 <td><span name="firstName.errors">Field is required.</span></td> 8 </tr> 9 10 <tr> 11 <td>Last Name:</td> 12 <td><input name="lastName" type="text" value=""/></td> 13 <td><span name="lastName.errors">Field is required.</span></td> 14 </tr> 15 <tr> 16 <td colspan="3"> 17 <input type="submit" value="Save Changes"/> 18 </td> 19 </tr> 20 </table> 21</form>
spring-form.tld 태그 라이브러리 디스크립터(TLD)는 spring-webmvc.jar에 포함되어 있습니다.
개별 태그에 대한 포괄적인 참고 문서는
API reference
를 보거나 태그 라이브러리 설명을 참조하면 됩니다.
REST의 핵심 원칙 중 하나는 “Uniform Interface”의 사용입니다. 이는 모든 리소스(URL)를 네 가지 HTTP 메서드: GET, PUT, POST, DELETE를 사용하여 조작할 수 있음을 의미합니다. 각 메서드에 대해 HTTP 명세는 정확한 의미를 정의합니다. 예를 들어, GET은 항상 부작용이 없는, 안전한 연산이어야 하며, PUT이나 DELETE는 멱등이어야 합니다.
즉, 이러한 연산을 여러 번 반복할 수 있지만, 최종 결과는 동일해야 합니다. HTTP는 이
네 가지 메서드를 정의하지만, HTML은 두 가지(GET과 POST)만 지원합니다. 다행히 두 가지
우회 방법이 있습니다. JavaScript를 사용해 PUT이나 DELETE를 수행하거나, “실제” 메서드를
추가 파라미터(HTML form에서 hidden input 필드로 모델링)로 포함한 POST를 수행하는
방법입니다. Spring의 HiddenHttpMethodFilter는 후자의 trick을 사용합니다. 이 필터는
일반 Servlet 필터이므로, 어떤 웹 프레임워크(Spring MVC뿐 아니라)와도 함께 사용할 수
있습니다. 이 필터를 web.xml에 추가하면, hidden method 파라미터가 있는 POST는 해당
HTTP 메서드 요청으로 변환됩니다.
HTTP 메서드 변환을 지원하기 위해, Spring MVC form 태그는 HTTP 메서드 설정을 지원하도록 업데이트되었습니다. 예를 들어, 다음 스니펫은 Pet Clinic 샘플에서 가져온 것입니다:
1<form:form method="delete"> 2 <p class="submit"><input type="submit" value="Delete Pet"/></p> 3</form:form>
앞의 예제는 HTTP POST를 수행하며, “실제” DELETE 메서드는 요청 파라미터 뒤에 숨겨져
있습니다. 이 파라미터는 web.xml에 정의된 HiddenHttpMethodFilter에 의해 처리됩니다.
다음 예제와 같습니다:
1<filter> 2 <filter-name>httpMethodFilter</filter-name> 3 <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 4</filter> 5 6<filter-mapping> 7 <filter-name>httpMethodFilter</filter-name> 8 <servlet-name>petclinic</servlet-name> 9</filter-mapping>
다음 예제는 이에 해당하는 @Controller 메서드를 보여줍니다:
1@RequestMapping(method = RequestMethod.DELETE) 2public String deletePet(@PathVariable int ownerId, @PathVariable int petId) { 3 this.clinic.deletePet(petId); 4 return "redirect:/owners/" + ownerId; 5}
1@RequestMapping(method = [RequestMethod.DELETE]) 2fun deletePet(@PathVariable ownerId: Int, @PathVariable petId: Int): String { 3 clinic.deletePet(petId) 4 return "redirect:/owners/$ownerId" 5}
Spring form 태그 라이브러리는 dynamic 속성 입력을 허용하므로, 모든 HTML5 specific 속성을 입력할 수 있습니다.
form input 태그는 text 이외의 type 속성 입력을 지원합니다. 이는 email, date,
range 등과 같은 새로운 HTML5 specific input type을 렌더링할 수 있도록 하기 위한
것입니다. type='text'를 입력할 필요는 없으며, text는 기본 type이라는 점에 유의하십시오.
HTML Fragments
RSS and Atom