Spring綁定表單數據


  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" %>

  簡要說下幾個關鍵的標簽。

  1. 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));

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM