SpringMVC表單標籤封裝表單物件
SpringMVC<from:form>表單標籤和<input>表單標籤簡介
在使用SpringMVC的時候我們可以使用spring封裝的一系列表單標籤,這些標籤都可以訪問到ModelMap中的內容。下面將對這些標籤一一介紹。
在正式介紹SpringMVC的表單標籤之前,我們需要先在JSP中宣告使用的標籤,具體做法是在JSP檔案的頂部加入以下指令:
Jsp程式碼- <%@taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
1.1 form標籤
使用Spring的form標籤主要有兩個作用,第一是它會自動的繫結來自Model中的一個屬性值到當前form對應的實體物件,預設是command屬性,這樣我們就可以在form表單體裡面方便的使用該物件的屬性了;第二是它支援我們在提交表單的時候使用除GET和POST之外的其他方法進行提交,包括DELETE和PUT等。
1.1.1 支援繫結表單物件
我們先來看如下使用form標籤的一個示例:
Jsp程式碼- <form:form action="formTag/form.do" method="post">
- <table>
- <tr>
- <td>Name:</td><td><form:input path="name"/></td>
- </tr>
- <tr>
- <td>Age:</td><td><form:input path="age"
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value="提交"/></td>
- </tr>
- </table>
- </form:form>
這個時候如果Model中存在一個屬性名稱為command的javaBean,而且該javaBean擁有屬性name和age的時候,在渲染上面的程式碼時就會取command的對應屬性值賦給對應標籤的值。如在上面的程式碼中,假設Model中存在一個屬性名稱為command的javaBean,且它的name和age屬性分別為“Zhangsan”和“36”時,那麼它在渲染時就會生成如下一段程式碼:
Html程式碼- <formid="command"action="formTag/form.do"method="post">
- <table>
- <tr>
- <td>Name:</td><td><inputid="name"name="name"type="text"value="ZhangSan"/></td>
- </tr>
- <tr>
- <td>Age:</td><td><inputid="age"name="age"type="text"value="36"/></td>
- </tr>
- <tr>
- <tdcolspan="2"><inputtype="submit"value="提交"/></td>
- </tr>
- </table>
- </form>
- <formid="command"action="formTag/form.do"method="post">
- <table>
- <tr>
- <td>Name:</td><td><inputid="name"name="name"type="text"value="ZhangSan"/></td>
- </tr>
- <tr>
- <td>Age:</td><td><inputid="age"name="age"type="text"value="36"/></td>
- </tr>
- <tr>
- <tdcolspan="2"><inputtype="submit"value="提交"/></td>
- </tr>
- </table>
- </form>
<form id="command" action="formTag/form.do" method="post">
<table>
<tr>
<td>Name:</td><td><input id="name" name="name" type="text" value="ZhangSan"/></td>
</tr>
<tr>
<td>Age:</td><td><input id="age" name="age" type="text" value="36"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
從上面生成的程式碼中,我們可以看出,當沒有指定form標籤的id時它會自動獲取該form標籤繫結的Model中對應屬性名稱作為id,而對於input標籤在沒有指定id的情況下它會自動獲取path指定的屬性作為id和name。
我們指定form預設自動繫結的是Model的command屬性值,那麼當我的form物件對應的屬性名稱不是command的時候,應該怎麼辦呢?對於這種情況,Spring給我們提供了一個commandName屬性,我們可以通過該屬性來指定我們將使用Model中的哪個屬性作為form需要繫結的command物件。除了commandName屬性外,指定modelAttribute屬性也可以達到相同的效果。這裡假設上面程式碼中我們存放在Model中的是user物件而不是預設的command物件,那麼我們的程式碼就可以如下定義了:
Jsp程式碼- <form:form action="formTag/form.do" method="post" commandName="user">
- <table>
- <tr>
- <td>Name:</td><td><form:input path="name"/></td>
- </tr>
- <tr>
- <td>Age:</td><td><form:input path="age"/></td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value="提交"/></td>
- </tr>
- </table>
- </form:form>
1.1.2 支援全部的Http請求方法
Jsp程式碼- <form:form action="formTag/form.do" method="delete" modelAttribute="user">
- <table>
- <tr>
- <td>Name:</td><td><form:input path="name"/></td>
- </tr>
- <tr>
- <td>Age:</td><td><form:input path="age"/></td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value="提交"/></td>
- </tr>
- </table>
- </form:form>
在上面程式碼中我們設定了該form的提交方法是delete,這樣在後臺我們就可以給對應的請求方法的RequestMapping加上method為RequestMethod.DELETE的限制。我們來看一下上面的程式碼在進行渲染的時候會生成怎樣的Html程式碼,其生成的程式碼如下所示:
Html程式碼- <formid="user"action="formTag/form.do"method="post">
- <inputtype="hidden"name="_method"value="delete"/>
- <table>
- <tr>
- <td>Name:</td><td><inputid="name"name="name"type="text"value="ZhangSan"/></td>
- </tr>
- <tr>
- <td>Age:</td><td><inputid="age"name="age"type="text"value="36"/></td>
- </tr>
- <tr>
- <tdcolspan="2"><inputtype="submit"value="提交"/></td>
- </tr>
- </table>
- </form>
- <formid="user"action="formTag/form.do"method="post">
- <inputtype="hidden"name="_method"value="delete"/>
- <table>
- <tr>
- <td>Name:</td><td><inputid="name"name="name"type="text"value="ZhangSan"/></td>
- </tr>
- <tr>
- <td>Age:</td><td><inputid="age"name="age"type="text"value="36"/></td>
- </tr>
- <tr>
- <tdcolspan="2"><inputtype="submit"value="提交"/></td>
- </tr>
- </table>
- </form>
<form id="user" action="formTag/form.do" method="post">
<input type="hidden" name="_method" value="delete"/>
<table>
<tr>
<td>Name:</td><td><input id="name" name="name" type="text" value="ZhangSan"/></td>
</tr>
<tr>
<td>Age:</td><td><input id="age" name="age" type="text" value="36"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
從它生成的程式碼我們可以看出,Spring在實現除GET和POST之外的請求方法時,還是使用的POST方法進行請求,然後給表單加上了一個隱藏域,用以表示真正的請求方法,這個隱藏域的名稱預設是“_method”。上面這樣定義之後是不是就意味著我們可以以delete方式訪問到“formTag/form.do”了呢?答案是不行的。這樣定義我們只是多加了一個用以表示請求方法的隱藏域而已,實際的請求方式還是POST。Spring為我們提供了一個Filter——HiddenHttpMethodFilter,通過這個Filter我們可以把以POST方式傳遞過來的表示實際請求方式的引數轉換為對應的真正的Http請求方法。所以這個時候我們還需要在web.xml中加上如下程式碼:
Xml程式碼- <filter>
- <filter-name>hiddenHttpMethodFilter</filter-name>
- <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>hiddenHttpMethodFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
- <filter>
- <filter-name>hiddenHttpMethodFilter</filter-name>
- <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>hiddenHttpMethodFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
注意:HiddenHttpMethodFilter只能對以POST方式進行傳遞的表示請求方式的隱藏域轉換為真正的Http請求方式。當我們直接在form:form標籤的method中使用除GET和POST方法以外的其他方法時,Spring會自動生成以POST方式進行傳遞的表單以及對應的隱藏域。所以當我們需要手動的設定表示請求方法的隱藏域時,我們就需要指定表單的請求方式為POST,為GET將不會生效。
Jsp程式碼- <form:form action="formTag/form.do" method="post" modelAttribute="user">
- <input type="hidden" name="_method" value="head"/>
- <table>
- <tr>
- <td>Name:</td><td><form:input path="name"/></td>
- </tr>
- <tr>
- <td>Age:</td><td><form:input path="age"/></td>
- </tr>
- <tr>
- <td colspan="2"><input type="submit" value="提交"/></td>
- </tr>
- </table>
- </form:form>
上面程式碼就是一個手動定義請求方式的隱藏域的示例。這裡表示請求方式的隱藏域的名稱預設是“_method”,如果不想使用這個預設值的話,我們也可以通過form:form標籤的methodParam屬性來指定。如下面這個示例:
Jsp程式碼- <form:form action="formTag/form.do" method="post" methodParam="requestMethod" modelAttribute="user">
- <input type="hidden" name="requestMethod" value="head"/>
- <table>
- <tr>
- <td>Name:</td><td><form:input path="name"/></td>
- </tr>
- <tr>
- <td>Age:</td><td><form:input path="age"/></td>
- </tr>
- <tr>
- <td colspan="2"