Spring提供了一些jsp頁面常用的form標簽,很大程度上提高了我們開發的速度,不用再一個個的標簽去綁定屬性,而且后台接收數據也很簡單,可以直接接收object對象作為屬性。官方form標簽介紹的網址為http://docs.spring.io/spring/docs/4.2.6.RELEASE/spring-framework-reference/htmlsingle/#spring-form-tld。包含以下的標簽:
在jsp頁面使用spring提供的標簽需要引入相關的taglib:<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
簡要說下幾個關鍵的標簽。
- form標簽:
form標簽包含了幾個特有的屬性:
- method:請求方式,可以在controller上設置對於的請求方式。默認是"_method"。
- commandName: 等同與modelAttribute,設置暴露的對象名稱。該對象是model中存放的對象。默認名是"command"。
- methodParam:設置隱藏域的名稱。默認是"_method"。
- modelAttribute:等同於commandName。
2. option和options標簽
option標簽是配合form:select標簽使用的,用於下拉列表。如果option數據從后台傳過來的集合,可以使用options標簽,它有一個items屬性,可用集合、map和數組數據。itemLabel標簽顯示標簽名稱。itemValue 顯示值。相同的還有checkboxes和radiobuttons標簽。
3. error標簽
error標簽用於向頁面輸出后台傳遞的錯誤信息。需要配合Volidator使用。
如何從前端綁定數據到后台呢,springmvc提供了一個@initBinder注解,可用於我們綁定表單數據到后台方法。被注解的方法有一個參數WebDataBinder,可用於數據綁定和驗證。
例如我們現在有一個表單,表單代碼如下:
1 <form:form> 2 用戶:<input name="user" type="text"/> 3 地址:<input name="address" type="text"/> 4 <input type="submit" value="提交"/> 5 </form:form>
我們需要提交用戶和地址到后台接收,並且存在兩個對象,分別是User和UserWarpper對象:
1 public class User { 2 3 private String userName; 4 private int age; 5 // getter setter... 6 }
1 public class UserWarpper { 2 3 private User user; 4 private String address; 5 //getter setter... 6 }
綁定表單數據到后台需要對綁定的數據新建一個屬性編輯器PropertyEditorSupport,此處的對User進行數據綁定:
1 public class UserPropertyEditor extends PropertyEditorSupport{ 2 3 @Override 4 public void setAsText(String text) throws IllegalArgumentException { 5 if(text!=null){ 6 User user = new User(); 7 user.setName(text); 8 setValue(user); 9 } 10 11 } 12 }
下一步只需要在請求的controller里注冊即可:
1 @Controller 2 @RequestMapping("/form") 3 public class MyFormController { 4 5 @InitBinder 6 public void init(WebDataBinder binder){ 7 binder.registerCustomEditor(User.class, new UserPropertyEditor()); 8 } 9 10 @RequestMapping("/submit") 11 public void submit(UserWarpper userWarpper){ 12 13 } 14 }
假設前端輸入的是用戶的name屬性,那么在請求提交表單的時候,會將表單中的user屬性包裝成user對象並設置到UserWarpper對象中。
此外,WebDataBinder還有一個addValidators(Validator...)方法還可以用於數據的驗證,配合errors標簽向前端輸出錯誤信息。
首先建立驗證器:
1 public class MyValidator implements Validator{ 2 3 @Override 4 public boolean supports(Class<?> clazz) { 5 return User.class.equals(clazz); 6 } 7 8 @Override 9 public void validate(Object target, Errors errors) { 10 ValidationUtils.rejectIfEmpty(errors, "name", "名稱不能為空!"); 11 } 12 13 }
然后在initBinder注解的方法中添加驗證器:
binder.addValidators(new MyValidator());
那么在前端中顯示錯誤信息的代碼如下:
1 <form:errors path="name"/>
如果要顯示所有錯誤信息,使用“*”。
spring內置了很多基本的屬性編輯器,如時間編輯器等等可供我們使用:
1 binder.registerCustomEditor(Boolean.class, new CustomBooleanEditor(true)); 2 binder.registerCustomEditor(Number.class, new CustomNumberEditor(Number.class, true)); 3 binder.registerCustomEditor(ArrayList.class, new CustomCollectionEditor(ArrayList.class, true)); 4 binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-DD"), true));