從Spring2.0起就提供了一組全面的自動數據綁定標籤來處理表單元素。生成的標籤兼容HTML 4.01與XHTML 1.0。表單標籤庫中包含了能夠用在JSP頁面中渲染HTML元素的標籤。表單標記庫包含在spring-webmvc.jar中,庫的描述符稱爲spring-form.tld,爲了使用這些標籤必須在jsp頁面開頭處聲明這個tablib指令。html
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
如下表格展現了標籤庫中的經常使用標籤:java
標籤web |
描述spring |
form數組 |
渲染表單元素form服務器 |
inputmvc |
渲染<input type=」text」/>元素app |
passwordjsp |
渲染<input type=」password」/>元素 |
hidden |
渲染<input type=」hidden」/>元素 |
textarea |
渲染textarea元素 |
checkbox |
渲染一個<input type=」checkbox」/>複選元素 |
checkboxs |
渲染多個<input type=」checkbox」/>元素 |
radiobutton |
渲染一個<input type=」radio」/>單選元素 |
radiobuttons |
渲染多個<input type=」radio」/>元素 |
select |
渲染一個選擇元素 |
option |
渲染一個可選元素 |
options |
渲染多個可選元素列表 |
errors |
在span元素中渲染字段錯誤 |
path:要綁定的屬性路徑,最重要的屬性,多個元素必填,至關於 modelAttribute.getXXX() 。
cssClass:定義要應用到被渲染元素的CSS類,類樣式。
cssStyle:定義要應用到被渲染元素的CSS樣式,行內樣式。
htmlEscape:接受true或者false,表示是否應該對被渲染的值進行HTML轉義。
cssErrorClass:定義要應用到被渲染input元素的CSS類,若是bound屬性中包含錯誤,則覆蓋cssClass屬性值。
這個標籤會生成HTML form標籤,同時爲form內部所包含的標籤提供一個綁定路徑(binding path)。 它把命令對象(command object)存在PageContext中,這樣form內部的標籤就可使用這個對象了。標籤庫中的其餘標籤都聲明在form標籤的內部。
讓咱們假設有一個叫User的領域對象,它是一個JavaBean,有着諸如 firstName和lastName這樣的屬性。咱們將把它看成 一個表單支持對象(form backing object),它對應的表單控制器用 form.jsp頁面來顯示錶單。
commandName:暴露表單對象的模型屬性名稱,默認爲command,它定義了模型屬性的名稱,其中包含了一個backing object,其屬性將用於填充生成的表單。若是該屬性存在,則必須在返回包含該表單的視圖的請求處理方法中添加相應的模型屬性。
modelAttribute:暴露form backing object的模型屬性名稱,默認爲command
commandName與modelAttribute功能基本同樣,使用modelAttribute就能夠了,由於commandName已被拋棄。
若是在頁面中使用form不設置任意屬性<form:form/>,解析後的結果以下:
<form id="command" action="/SpringMVC04/bar/action11" method="post"></form>
新建一個控制器,在控制器中添加一個action
1 package com.zhangguo.springmvc04.controllers; 2 import org.springframework.stereotype.Controller; 3 import org.springframework.ui.Model; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import com.zhangguo.springmvc04.entities.Product; 6 7 @Controller 8 @RequestMapping("/bar") 9 public class BarController { 10 @RequestMapping("/action11") 11 public String action11(Model model){ 12 //向模型中添加一個名爲product的對象,用於渲染視圖 13 model.addAttribute("product", new Product("Meizu note1", 999)); 14 return "bar/action11"; 15 } 16 }
在views/bar目錄下添加action11.jsp頁面
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>bar/action11</title> 9 </head> 10 <body> 11 <form:form modelAttribute="product"> 12 <p> 13 <label for="name">名稱:</label> 14 <form:input path="name" /> 15 </p> 16 <p> 17 <label for="price">價格:</label> 18 <form:input path="price" /> 19 </p> 20 </form:form> 21 </body> 22 </html>
form表單與模型中名稱爲product的對象進行綁定,form中的表單元素的path指的就是訪問該對象的路徑,若是沒有該對象或找不到屬性名將異常。系統將自動把指定模型中的值與頁面進行綁定,渲染後的結果以下
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>bar/action11</title> 6 </head> 7 <body> 8 <form id="product" action="/SpringMVC04/bar/action11" method="post"> 9 <p> 10 <label for="name">名稱:</label> 11 <input id="name" name="name" type="text" value="Meizu note1"/> 12 </p> 13 <p> 14 <label for="price">價格:</label> 15 <input id="price" name="price" type="text" value="999.0"/> 16 </p> 17 </form> 18 </body> 19 </html>
運行結果:
模型能夠爲空,不是爲null,中間能夠沒有數據,但非字符類型會取默認值,如價格會變成0.0。model.addAttribute("product", new Product()),結果以下:
input元素能夠設置其它的屬性,如前面提到的通用屬性,修改後的表單以下:
1 <p> 2 <label for="name">名稱:</label> 3 <form:input path="name" cssClass="textCss" cssStyle="color:blue" a="b" htmlEscape="false"/> 4 </p>
修改action11方法的內容以下:
//向模型中添加一個名爲product的對象,用於渲染視圖 model.addAttribute("product", new Product("Meizu note1<hr/>", 999));
渲染結果:
1 <p> 2 <label for="name">名稱:</label> 3 <input id="name" name="name" class="textCss" style="color:blue" a="b" type="text" value="Meizu note1<hr/>"/> 4 </p>
默認從服務器發送到客戶端的數據中是會編碼的,如示例中<hr/>,會解析成<hr>,但咱們設置屬性htmlEscape="false"結果原樣輸出;咱們在標籤中設置a="b"原樣解析出來,這裏給開發者留了很大的空間,如想使用原input標籤的屬性均可以直接寫。
form:checkbox元素將渲染成一個複選框,經過該元素能夠得到3種不一樣類型的值,分別是boolean,數組,基本數據類型,添加一個新的實體類Person,以下所示:
1 package com.zhangguo.springmvc04.entities; 2 3 public class Person { 4 /* 5 * 婚否 6 */ 7 private boolean isMarried; 8 /* 9 * 愛好 10 */ 11 private String[] hobbies; 12 /** 13 * 學歷 14 */ 15 private String education; 16 17 18 public boolean getIsMarried() { 19 return isMarried; 20 } 21 public void setIsMarried(boolean isMarried) { 22 this.isMarried = isMarried; 23 } 24 public String[] getHobbies() { 25 return hobbies; 26 } 27 public void setHobbies(String[] hobbies) { 28 this.hobbies = hobbies; 29 } 30 public String getEducation() { 31 return education; 32 } 33 public void setEducation(String education) { 34 this.education = education; 35 } 36 }
特別注意的是boolean類型的值生成的get/set屬性名稱前是不帶get與set的,這樣會引發異常,建議手動修改。
在控制器中新增2個action,代碼以下:
1 //checkbox 2 @RequestMapping("/action21") 3 public String action21(Model model){ 4 model.addAttribute("person", new Person()); 5 return "bar/action21"; 6 } 7 8 @RequestMapping("/action22") 9 @ResponseBody 10 public Person action22(HttpServletResponse response,Person person){ 11 return person; 12 }
在views/bar目錄下添加action21視圖,視圖腳本以下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>bar/action21</title> 9 </head> 10 <body> 11 <form:form modelAttribute="person" action="action22"> 12 <p> 13 <label for="name">婚否:</label> 14 <form:checkbox path="isMarried" /> 15 </p> 16 <p> 17 <label for="name">愛好:</label> 18 <form:checkbox path="hobbies" value="讀書"/>讀書 19 <form:checkbox path="hobbies" value="上網"/>上網 20 <form:checkbox path="hobbies" value="電影"/>電影 21 </p> 22 <p> 23 <label for="name">畢業:</label> 24 <form:checkbox path="education" value="本科"/>大學本科 25 </p> 26 <p> 27 <button>提交</button> 28 </p> 29 </form:form> 30 </body> 31 </html>
渲染後的視圖以下:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>bar/action21</title> 6 </head> 7 <body> 8 <form id="person" action="action22" method="post"> 9 <p> 10 <label for="name">婚否:</label> 11 <input id="isMarried1" name="isMarried" type="checkbox" value="true"/><input type="hidden" name="_isMarried" value="on"/> 12 </p> 13 <p> 14 <label for="name">愛好:</label> 15 <input id="hobbies1" name="hobbies" type="checkbox" value="讀書"/><input type="hidden" name="_hobbies" value="on"/>讀書 16 <input id="hobbies2" name="hobbies" type="checkbox" value="上網"/><input type="hidden" name="_hobbies" value="on"/>上網 17 <input id="hobbies3" name="hobbies" type="checkbox" value="電影"/><input type="hidden" name="_hobbies" value="on"/>電影 18 </p> 19 <p> 20 <label for="name">畢業:</label> 21 <input id="education1" name="education" type="checkbox" value="本科"/><input type="hidden" name="_education" value="on"/>大學本科 22 </p> 23 <p> 24 <button>提交</button> 25 </p> 26 </form> 27 </body> 28 </html>
運行結果:
form:checkbox在渲染成input標籤裏會變成2個表單元素,這樣能夠確保用戶沒有選擇內容時也會將值帶會服務器,默認是沒有這樣的。
小結:checkbox有三種使用方法
第一種用法:若綁定值是java.lang.Boolean類型,則值爲true時,input(checkbox)標爲checked(選中)。其value(值)屬性對應於setValue(Object)值屬性的解析值。
第二種用法:若綁定值是Array(數組)類型或java.util.Collection,則配置的setValue(Object)值出如今綁定的Collection中時,input(checkbox)標爲checked(選中)。
第三種用法:若綁定值爲其餘類型,則當配置的setValue(Object)等於其綁定值時,input(checkbox)標爲checked(選中)。
這個標籤生成類型爲radio的HTML input 標籤,也就是常見的單選框。這個標籤的典型用法是一次聲明多個標籤實例,全部的標籤都有相同的path屬性,可是他們的value屬性不一樣。
定義2個action,代碼以下:
1 @RequestMapping("/action31") 2 public String action31(Model model){ 3 model.addAttribute("person", new Person()); 4 return "bar/action31"; 5 } 6 7 @RequestMapping("/action32") 8 @ResponseBody 9 public Person action32(HttpServletResponse response,Person person){ 10 return person; 11 }
在views/bar下定義視圖action31.jsp,腳本以下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>bar/action31</title> 9 </head> 10 <body> 11 <form:form modelAttribute="person" action="action32"> 12 <p> 13 <label for="name">學歷:</label> 14 <form:radiobutton path="education" value="專科"/>專科 15 <form:radiobutton path="education" value="本科"/>本科 16 <form:radiobutton path="education" value="研究生"/>研究生 17 </p> 18 <p> 19 <button>提交</button> 20 </p> 21 </form:form> 22 </body> 23 </html>
運行後頁面渲染結果:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>bar/action31</title> 6 </head> 7 <body> 8 <form id="person" action="action32" method="post"> 9 <p> 10 <label for="name">學歷:</label> 11 <input id="education1" name="education" type="radio" value="專科"/>專科 12 <input id="education2" name="education" type="radio" value="本科"/>本科 13 <input id="education3" name="education" type="radio" value="研究生"/>研究生 14 </p> 15 <p> 16 <button>提交</button> 17 </p> 18 </form> 19 </body> 20 </html>
運行結果:
這個標籤生成類型爲password的HTML input標籤,渲染後生成一個密碼框。input標籤的值和表單支持對象相應屬性的值保持一致。該標籤與input相似,但有一個特殊的屬性showPassword, 是否將對象中的值綁定到密碼框中,默認爲false,也意味着密碼框中不會出現默認的掩碼。
修改action31,修改後以下所示:
1 @RequestMapping("/action31") 2 public String action31(Model model){ 3 Person person=new Person(); 4 person.setEducation("edu"); 5 model.addAttribute("person", person); 6 return "bar/action31"; 7 }
當頁面腳本以下時:
<p> <label>密碼:</label> <form:password path="education" showPassword="true"/> </p>
渲染結果:
<p> <label>密碼:</label> <input id="education" name="education" type="password" value="edu"/> </p>
當頁面腳本以下時:
<p> <label>密碼:</label> <form:password path="education" showPassword="false"/> </p>
渲染結果:
<p> <label>密碼:</label> <input id="education" name="education" type="password" value=""/> </p>
這個標籤生成HTML select標籤,就是下拉框,多選框。在生成的HTML代碼中,被選中的選項和表單支持對象相應屬性的值保持一致。這個標籤也支持嵌套的option和options標籤。
定義兩個action,代碼以下:
1 //select 下拉列表 2 @RequestMapping("/action41") 3 public String action41(Model model){ 4 List<ProductType> productTypes = new ArrayList<ProductType>(); 5 productTypes.add(new ProductType(11, "數碼電子")); 6 productTypes.add(new ProductType(21, "鞋帽服飾")); 7 productTypes.add(new ProductType(31, "圖書音像")); 8 productTypes.add(new ProductType(41, "五金家電")); 9 productTypes.add(new ProductType(51, "生鮮水果")); 10 model.addAttribute("productTypes", productTypes); 11 model.addAttribute("person", new Person()); 12 return "bar/action41"; 13 } 14 15 @RequestMapping("/action42") 16 @ResponseBody 17 public Person action42(HttpServletResponse response,Person person){ 18 return person; 19 }
在action41中爲模型添加了一個屬性productTypes,該對象用於綁定到頁面的下拉列表框。
在views/bar下添加視圖action41.jsp,腳本以下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>bar/action41</title> 9 </head> 10 <body> 11 <form:form modelAttribute="person" action="action42"> 12 <p> 13 <label for="name">產品類型:</label> 14 <form:select size="3" multiple="multiple" path="education" items="${productTypes}" itemLabel="name" itemValue="id"></form:select> 15 </p> 16 <p> 17 <button>提交</button> 18 </p> 19 </form:form> 20 </body> 21 </html>
size="3" 表示可見項爲3項,默承認見項爲1項
multiple="multiple" 容許多選,默認爲單選
path="education" 與表單中指定的modelAttribute對象進行雙向綁定
items="${productTypes}" 綁定到下拉列表的集合對象
itemLabel="name" 集合中的對象用於做爲下拉列表option的text屬性
itemValue="id" 集合中的對象用於做爲下拉列表option的value屬性
渲染後的頁面:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>bar/action41</title> 6 </head> 7 <body> 8 <form id="person" action="action42" method="post"> 9 <p> 10 <label for="name">產品類型:</label> 11 <select id="education" name="education" multiple="multiple" size="3"> 12 <option value="11">數碼電子</option> 13 <option value="21">鞋帽服飾</option> 14 <option value="31">圖書音像</option> 15 <option value="41">五金家電</option> 16 <option value="51">生鮮水果</option></select> 17 <input type="hidden" name="_education" value="1" /> 18 </p> 19 <p> 20 <button>提交</button> 21 </p> 22 </form> 23 </body> 24 </html>
請注意渲染後一個form:selelct標籤變成了2個標籤,多出一個hidden,保證沒有選擇時也有值帶回服務器。
運行結果:
這個標籤生成HTML option標籤,能夠用於生成select表單元素中的單項,沒有path屬性,有label與value屬性。新增2個action,代碼以下:
1 //option 2 @RequestMapping("/action51") 3 public String action51(Model model){ 4 model.addAttribute("person", new Person()); 5 return "bar/action51"; 6 } 7 8 @RequestMapping("/action52") 9 @ResponseBody 10 public Person action52(HttpServletResponse response,Person person){ 11 return person; 12 }
在views/bar下新增頁面action51.jsp,內容以下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>bar/action51</title> 9 </head> 10 <body> 11 <form:form modelAttribute="person" action="action52"> 12 <p> 13 <label for="name">學歷:</label> 14 <form:select path="education"> 15 <form:option value="" >--請選擇--</form:option> 16 <form:option value="大專">大專</form:option> 17 <form:option value="本科">本科</form:option> 18 <form:option value="研究生">研究生</form:option> 19 </form:select> 20 </p> 21 <p> 22 <button>提交</button> 23 </p> 24 </form:form> 25 </body> 26 </html>
渲染後的頁面:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>bar/action51</title> 6 </head> 7 <body> 8 <form id="person" action="action52" method="post"> 9 <p> 10 <label for="name">學歷:</label> 11 <select id="education" name="education"> 12 <option value="">--請選擇--</option> 13 <option value="大專">大專</option> 14 <option value="本科">本科</option> 15 <option value="研究生">研究生</option> 16 </select> 17 </p> 18 <p> 19 <button>提交</button> 20 </p> 21 </form> 22 </body> 23 </html>
運行結果:
這個標籤生成一系列的HTML option標籤,能夠用它生成select標籤中的子標籤,在控制器中新增兩個action,代碼以下:
1 //options 2 @RequestMapping("/action61") 3 public String action61(Model model){ 4 List<ProductType> productTypes = new ArrayList<ProductType>(); 5 productTypes.add(new ProductType(11, "數碼電子")); 6 productTypes.add(new ProductType(21, "鞋帽服飾")); 7 productTypes.add(new ProductType(31, "圖書音像")); 8 productTypes.add(new ProductType(41, "五金家電")); 9 productTypes.add(new ProductType(51, "生鮮水果")); 10 model.addAttribute("productTypes", productTypes); 11 model.addAttribute("person", new Person()); 12 return "bar/action61"; 13 } 14 15 @RequestMapping("/action62") 16 @ResponseBody 17 public Person action62(HttpServletResponse response,Person person){ 18 return person; 19 }
在views/bar下增長一個名爲action61.jsp的頁面,頁面腳本以下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>bar/action61</title> 9 </head> 10 <body> 11 <form:form modelAttribute="person" action="action62"> 12 <p> 13 <label for="name">產品類型:</label> 14 <form:select path="education"> 15 <form:option value="">--請選擇--</form:option> 16 <form:options items="${productTypes}" itemLabel="name" itemValue="id"/> 17 </form:select> 18 </p> 19 <p> 20 <button>提交</button> 21 </p> 22 </form:form> 23 </body> 24 </html>
綁定集合的方法與select相似,渲染後的頁面生成結果以下:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>bar/action61</title> 6 </head> 7 <body> 8 <form id="person" action="action62" method="post"> 9 <p> 10 <label for="name">產品類型:</label> 11 <select id="education" name="education"> 12 <option value="">--請選擇--</option> 13 <option value="11">數碼電子</option> 14 <option value="21">鞋帽服飾</option> 15 <option value="31">圖書音像</option> 16 <option value="41">五金家電</option> 17 <option value="51">生鮮水果</option> 18 </select> 19 </p> 20 <p> 21 <button>提交</button> 22 </p> 23 </form> 24 </body> 25 </html>
經過這個方式實現了一個請選擇標籤,運行結果以下:
上面的這個例子同時使用了option標籤和options標籤。這兩個標籤生成的HTML代碼是相同的,可是第一個option標籤容許你在JSP中明確聲明這個標籤的值只供顯示使用,並不綁定到表單支持對象的屬性上。
這個標籤生成HTML textarea標籤,就是一個多行文本標籤,用法與input很是相似。errors標籤用於顯示錯誤信息,以下腳本:
<tr> <td>學歷:</td> <td><form:textarea path="education" rows="3" cols="20" /></td> <td><form:errors path="education" /></td> </tr>
將被渲染成:
<tr> <td>學歷:</td> <td><textarea id="education" name="education" rows="3" cols="20"></textarea></td> <td></td> </tr>
由於當前並無對應的錯誤信息,因此errors標籤並未生成任何HTML腳本。errors標籤生成類型爲'span'的HTML標籤,用來顯示錶單驗證時出現的錯誤信息。經過這個標籤,你能夠訪問控制器(controller)和與控制器關聯的驗證器(validator)產生的錯誤信息。
這個標籤生成類型爲hidden的HTML input標籤。在生成的HTML代碼中,input標籤的值和表單支持對象相應屬性的值保持一致。若是你須要聲明一個類型爲hidden的input標籤,可是表單支持對象中沒有對應的屬性,你只能使用HTML的標籤。在控制器下新增兩個action,代碼以下:
1 //hidden 2 @RequestMapping("/action71") 3 public String action71(Model model){ 4 Person person=new Person(); 5 person.setEducation("99"); 6 model.addAttribute("person", person); 7 return "bar/action71"; 8 } 9 10 @RequestMapping("/action72") 11 @ResponseBody 12 public Person action72(HttpServletResponse response,Person person){ 13 return person; 14 }
在views/bar目錄下新增視圖action71.jsp,腳本以下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>bar/action71</title> 9 </head> 10 <body> 11 <form:form modelAttribute="person" action="action72"> 12 <p> 13 <form:hidden path="education" /> 14 <input type="hidden" value="1" name="id"> 15 </p> 16 <p> 17 <button>提交</button> 18 </p> 19 </form:form> 20 </body> 21 </html>
渲染後的頁面:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>bar/action61</title> 6 </head> 7 <body> 8 <form id="person" action="action62" method="post"> 9 <p> 10 <input id="education" name="education" type="hidden" value="99"/> 11 <input type="hidden" value="1" name="id"> 12 </p> 13 <p> 14 <button>提交</button> 15 </p> 16 </form> 17 </body> 18 </html>
運行結果:
隱藏域用於保持頁面狀態。
radiobuttons將生成一組單選框,只容許多箇中選擇1個;checkboxs生成一組複選列表,容許多選。添加兩個action,代碼以下:
1 //radiobuttons,checkboxs 2 @RequestMapping("/action81") 3 public String action81(Model model) { 4 List<ProductType> productTypes = new ArrayList<ProductType>(); 5 productTypes.add(new ProductType(11, "數碼電子")); 6 productTypes.add(new ProductType(21, "鞋帽服飾")); 7 productTypes.add(new ProductType(31, "圖書音像")); 8 productTypes.add(new ProductType(41, "五金家電")); 9 productTypes.add(new ProductType(51, "生鮮水果")); 10 model.addAttribute("productTypes", productTypes); 11 model.addAttribute("person", new Person()); 12 return "bar/action81"; 13 } 14 15 @RequestMapping("/action82") 16 @ResponseBody 17 public Person action82(HttpServletResponse response, Person person) { 18 return person; 19 }
在views/bar目錄下添加一個名爲action81.jsp的視圖,腳本以下:
1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 3 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> 4 <!DOCTYPE html> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 8 <title>bar/action81</title> 9 </head> 10 <body> 11 <form:form modelAttribute="person" action="action82"> 12 <p> 13 <label for="name">產品類型:</label> 14 <form:radiobuttons path="education" items="${productTypes}" itemLabel="name" itemValue="id" delimiter="," element="a"/> 15 </p> 16 <p> 17 <label for="name">產品類型:</label> 18 <form:checkboxes path="education" items="${productTypes}" itemLabel="name" itemValue="id" delimiter="-"/> 19 </p> 20 <p> 21 <button>提交</button> 22 </p> 23 </form:form> 24 </body> 25 </html>
屬性delimiter=",",表示生成的單項間使用「,」號分隔,默認爲空。
屬性element="a",表示生成的單項容器,默認爲span。
渲染後結果以下:
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5 <title>bar/action81</title> 6 </head> 7 <body> 8 <form id="person" action="action82" method="post"> 9 <p> 10 <label for="name">產品類型:</label> 11 <a><input id="education1" name="education" type="radio" value="11"/><label for="education1">數碼電子</label></a><a>,<input id="education2" name="education" type="radio" value="21"/><label for="education2">鞋帽服飾</label></a><a>,<input id="education3" name="education" type="radio" value="31"/><label for="education3">圖書音像</label></a><a>,<input id="education4" name="education" type="radio" value="41"/><label for="education4">五金家電</label></a><a>,<input id="education5" name="education" type="radio" value="51"/><label for="education5">生鮮水果</label></a> 12 </p> 13 <p> 14 <label for="name">產品類型:</label> 15 <span><input id="education6" name="education" type="checkbox" value="11"/><label for="education6">數碼電子</label></span><span>-<input id="education7" name="education" type="checkbox" value="21"/><label for="education7">鞋帽服飾</label></span><span>-<input id="education8" name="education" type="checkbox" value="31"/><label for="education8">圖書音像</label></span><span>-<input id="education9" name="education" type="checkbox" value="41"/><label for="education9">五金家電</label></span><span>-<input id="education10" name="education" type="checkbox" value="51"/><label for="education10">生鮮水果</label></span><input type="hidden" name="_education" value="on"/> 16 </p> 17 <p> 18 <button>提交</button> 19 </p> 20 </form> 21 </body> 22 </html>
運行結果以下:
從Spring2.0起就提供了一組全面的自動數據綁定標籤來處理表單元素。生成的標籤兼容HTML 4.01與XHTML 1.0。表單標籤庫中包含了能夠用在JSP頁面中渲染HTML元素的標籤。表單標記庫包含在spring-webmvc.jar中,庫的描述符稱爲spring-form.tld,爲了使用這些標籤必須在jsp頁面開頭處聲明這個tablib指令。
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
如下表格展現了標籤庫中的經常使用標籤:
標籤 |
描述 |
form |
渲染表單元素form |
input |
渲染<input type=」text」/>元素 |
password |
渲染<input type=」password」/>元素 |
hidden |
渲染<input type=」hidden」/>元素 |
textarea |
渲染textarea元素 |
checkbox |
渲染一個<input type=」checkbox」/>複選元素 |
checkboxs |
渲染多個<input type=」checkbox」/>元素 |
radiobutton |
渲染一個<input type=」radio」/>單選元素 |
radiobuttons |
渲染多個<input type=」radio」/>元素 |
select |
渲染一個選擇元素 |
option |
渲染一個可選元素 |
options |
渲染多個可選元素列表 |
errors |
在span元素中渲染字段錯誤 |
path:要綁定的屬性路徑,最重要的屬性,多個元素必填,至關於 modelAttribute.getXXX() 。
cssClass:定義要應用到被渲染元素的CSS類,類樣式。
cssStyle:定義要應用到被渲染元素的CSS樣式,行內樣式。
htmlEscape:接受true或者false,表示是否應該對被渲染的值進行HTML轉義。
cssErrorClass:定義要應用到被渲染input元素的CSS類,若是bound屬性中包含錯誤,則覆蓋cssClass屬性值。
這個標籤會生成HTML form標籤,同時爲form內部所包含的標籤提供一個綁定路徑(binding path)。 它把命令對象(command object)存在PageContext中,這樣form內部的標籤就可使用這個對象了。標籤庫中的其餘標籤都聲明在form標籤的內部。
讓咱們假設有一個叫User的領域對象,它是一個JavaBean,有着諸如 firstName和lastName這樣的屬性。咱們將把它看成 一個表單支持對象(form backing object),它對應的表單控制器用 form.jsp頁面來顯示錶單。
commandName:暴露表單對象的模型屬性名稱,默認爲command,它定義了模型屬性的名稱,其中包含了一個backing object,其屬性將用於填充生成的表單。若是該屬性存在,則必須在返回包含該表單的視圖的請求處理方法中添加相應的模型屬性。
modelAttribute:暴露form backing object的模型屬性名稱,默認爲command
commandName與modelAttribute功能基本同樣,使用modelAttribute就能夠了,由於commandName已被拋棄。
若是在頁面中使用form不設置任意屬性<form:form/>,解析後的結果以下:
<form id="command" action="/SpringMVC04/bar/action11" method="post"></form>