1. 程式人生 > >SpringMVC表單標籤封裝表單物件

SpringMVC表單標籤封裝表單物件



SpringMVC<from:form>表單標籤和<input>表單標籤簡介

   在使用SpringMVC的時候我們可以使用spring封裝的一系列表單標籤,這些標籤都可以訪問到ModelMap中的內容。下面將對這些標籤一一介紹。

   在正式介紹SpringMVC的表單標籤之前,我們需要先在JSP中宣告使用的標籤,具體做法是在JSP檔案的頂部加入以下指令:

Jsp程式碼 複製程式碼 收藏程式碼在CODE上檢視程式碼片派生到我的程式碼片
  1. <%@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程式碼
複製程式碼
 收藏程式碼在CODE上檢視程式碼片派生到我的程式碼片
  1. <form:form action="formTag/form.do" method="post">  
  2.     <table>  
  3.         <tr>  
  4.             <td>Name:</td><td><form:input path="name"/></td>  
  5.         </tr>  
  6.         <tr>  
  7.             <td>Age:</td><td><form:input path="age"
    /></td>  
  8.         </tr>  
  9.         <tr>  
  10.             <td colspan="2"><input type="submit" value="提交"/></td>  
  11.         </tr>  
  12.     </table>  
  13. </form:form>  

       這個時候如果Model中存在一個屬性名稱為command的javaBean,而且該javaBean擁有屬性name和age的時候,在渲染上面的程式碼時就會取command的對應屬性值賦給對應標籤的值。如在上面的程式碼中,假設Model中存在一個屬性名稱為command的javaBean,且它的name和age屬性分別為“Zhangsan”和“36”時,那麼它在渲染時就會生成如下一段程式碼:

Html程式碼 複製程式碼 收藏程式碼
  1. <formid="command"action="formTag/form.do"method="post">
  2.     <table>
  3.         <tr>
  4.             <td>Name:</td><td><inputid="name"name="name"type="text"value="ZhangSan"/></td>
  5.         </tr>
  6.         <tr>
  7.             <td>Age:</td><td><inputid="age"name="age"type="text"value="36"/></td>
  8.         </tr>
  9.         <tr>
  10.             <tdcolspan="2"><inputtype="submit"value="提交"/></td>
  11.         </tr>
  12.     </table>
  13. </form>
[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <formid="command"action="formTag/form.do"method="post">
  2.     <table>
  3.         <tr>
  4.             <td>Name:</td><td><inputid="name"name="name"type="text"value="ZhangSan"/></td>
  5.         </tr>
  6.         <tr>
  7.             <td>Age:</td><td><inputid="age"name="age"type="text"value="36"/></td>
  8.         </tr>
  9.         <tr>
  10.             <tdcolspan="2"><inputtype="submit"value="提交"/></td>
  11.         </tr>
  12.     </table>
  13. </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程式碼 複製程式碼 收藏程式碼在CODE上檢視程式碼片派生到我的程式碼片
  1. <form:form action="formTag/form.do" method="post" commandName="user">  
  2.     <table>  
  3.         <tr>  
  4.             <td>Name:</td><td><form:input path="name"/></td>  
  5.         </tr>  
  6.         <tr>  
  7.             <td>Age:</td><td><form:input path="age"/></td>  
  8.         </tr>  
  9.         <tr>  
  10.             <td colspan="2"><input type="submit" value="提交"/></td>  
  11.         </tr>  
  12.     </table>  
  13. </form:form>  

1.1.2  支援全部的Http請求方法

Jsp程式碼 複製程式碼 收藏程式碼在CODE上檢視程式碼片派生到我的程式碼片
  1. <form:form action="formTag/form.do" method="delete" modelAttribute="user">  
  2.     <table>  
  3.         <tr>  
  4.             <td>Name:</td><td><form:input path="name"/></td>  
  5.         </tr>  
  6.         <tr>  
  7.             <td>Age:</td><td><form:input path="age"/></td>  
  8.         </tr>  
  9.         <tr>  
  10.             <td colspan="2"><input type="submit" value="提交"/></td>  
  11.         </tr>  
  12.     </table>  
  13. </form:form>  

在上面程式碼中我們設定了該form的提交方法是delete,這樣在後臺我們就可以給對應的請求方法的RequestMapping加上method為RequestMethod.DELETE的限制。我們來看一下上面的程式碼在進行渲染的時候會生成怎樣的Html程式碼,其生成的程式碼如下所示:

Html程式碼 複製程式碼 收藏程式碼
  1. <formid="user"action="formTag/form.do"method="post">
  2.     <inputtype="hidden"name="_method"value="delete"/>
  3.     <table>
  4.         <tr>
  5.             <td>Name:</td><td><inputid="name"name="name"type="text"value="ZhangSan"/></td>
  6.         </tr>
  7.         <tr>
  8.             <td>Age:</td><td><inputid="age"name="age"type="text"value="36"/></td>
  9.         </tr>
  10.         <tr>
  11.             <tdcolspan="2"><inputtype="submit"value="提交"/></td>
  12.         </tr>
  13.     </table>
  14. </form>
[html] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <formid="user"action="formTag/form.do"method="post">
  2.     <inputtype="hidden"name="_method"value="delete"/>
  3.     <table>
  4.         <tr>
  5.             <td>Name:</td><td><inputid="name"name="name"type="text"value="ZhangSan"/></td>
  6.         </tr>
  7.         <tr>
  8.             <td>Age:</td><td><inputid="age"name="age"type="text"value="36"/></td>
  9.         </tr>
  10.         <tr>
  11.             <tdcolspan="2"><inputtype="submit"value="提交"/></td>
  12.         </tr>
  13.     </table>
  14. </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程式碼 複製程式碼 收藏程式碼
  1. <filter>
  2.    <filter-name>hiddenHttpMethodFilter</filter-name>
  3.    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6.    <filter-name>hiddenHttpMethodFilter</filter-name>
  7.    <url-pattern>/*</url-pattern>
  8. </filter-mapping>
[xml] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. <filter>
  2.    <filter-name>hiddenHttpMethodFilter</filter-name>
  3.    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  4. </filter>
  5. <filter-mapping>
  6.    <filter-name>hiddenHttpMethodFilter</filter-name>
  7.    <url-pattern>/*</url-pattern>
  8. </filter-mapping>

       注意:HiddenHttpMethodFilter只能對以POST方式進行傳遞的表示請求方式的隱藏域轉換為真正的Http請求方式。當我們直接在form:form標籤的method中使用除GET和POST方法以外的其他方法時,Spring會自動生成以POST方式進行傳遞的表單以及對應的隱藏域。所以當我們需要手動的設定表示請求方法的隱藏域時,我們就需要指定表單的請求方式為POST,為GET將不會生效。

Jsp程式碼 複製程式碼 收藏程式碼在CODE上檢視程式碼片派生到我的程式碼片
  1. <form:form action="formTag/form.do" method="post" modelAttribute="user">  
  2.     <input type="hidden" name="_method" value="head"/>  
  3.     <table>  
  4.         <tr>  
  5.             <td>Name:</td><td><form:input path="name"/></td>  
  6.         </tr>  
  7.         <tr>  
  8.             <td>Age:</td><td><form:input path="age"/></td>  
  9.         </tr>  
  10.         <tr>  
  11.             <td colspan="2"><input type="submit" value="提交"/></td>  
  12.         </tr>  
  13.     </table>  
  14. </form:form>  

上面程式碼就是一個手動定義請求方式的隱藏域的示例。這裡表示請求方式的隱藏域的名稱預設是“_method”,如果不想使用這個預設值的話,我們也可以通過form:form標籤的methodParam屬性來指定。如下面這個示例:

Jsp程式碼 複製程式碼 收藏程式碼在CODE上檢視程式碼片派生到我的程式碼片
  1. <form:form action="formTag/form.do" method="post" methodParam="requestMethod" modelAttribute="user">  
  2.     <input type="hidden" name="requestMethod" value="head"/>  
  3.     <table>  
  4.         <tr>  
  5.             <td>Name:</td><td><form:input path="name"/></td>  
  6.         </tr>  
  7.         <tr>  
  8.             <td>Age:</td><td><form:input path="age"/></td>  
  9.         </tr>  
  10.         <tr>  
  11.             <td colspan="2"