SpringMVC實現多種資料型別繫結
繫結基本資料型別
Java基本資料型別int的預設值是0,在使用int進行url傳遞引數時,引數key是必須寫的,其值也只能是int型別的,否則將會報錯。
比如方法:
@RequestMapping(value = baseType.do) @ResponseBody //返回的資料放到ResponseBody的資料區中 public String baseType(int age){ return age:+age; }
請求的url地址:http://localhost:8080/baseType.do?age=10,其中引數age是必傳的,其值只能是int型別的;
如果不傳,將會報500錯誤。比如:http://localhost:8080/baseType.do
如果傳遞了,但是資料型別是其他型別,將會報400錯誤,比如:http://localhost:8080/baseType.do?age=abc
又比如方法:
@RequestMapping(value=baseType1.do) @ResponseBody public String baseType1(@RequestParam(value=xage)int age){ return age: + age; }
我們可以使用@RequestParam註解來為傳入的引數,定義一個別名引數,
@RequestParam(value=,required = true)value引數別名 required 該引數是否必傳,預設為true;
訪問的url地址如下:
http://localhost:8080/baseType1.do?xage=10
同樣xage這個引數也是必傳的,其型別為int。
如果是其他基本資料型別也是如此,其中
byte,short,int的預設值都為0,long的預設值為0L,float的預設值為0.0f,double的預設值為0.0d
在進行資料繫結時,其引數值必傳,其值的型別為其對應的基本資料型別。
繫結封裝資料型別
Java封裝型別Integer的預設值為null,在使用Integer進行url資料傳遞時,引數key可以不傳,對應引數的值就會預設為null。
比如方法:
@RequestMapping(value = baseType2.do) @ResponseBody public String baseType2(Integer age){ return age:+age; }
其url地址引數age可以不傳,也可以傳,對應的url地址如下:
http://localhost:8080/baseType2.do?age=10
http://localhost:8080/baseType2.do
但是如果傳遞了age引數,其值為其他資料型別,將會報400錯誤,比如:http://localhost:8080/baseType2.do?age=abc
資料繫結的數值型接受引數可以是基本型別和包裝型別,但二者有區別:
1、基本型別不可接受空值,會報錯。且輸入數值必須在指定資料型別的資料範圍內
2、包裝型別則可以接受空值,具有優勢,推薦使用,比如傳遞的引數是年齡、身高、長度、寬度等,具體情況可根據業務需要進行變更。
繫結陣列型別
Java陣列:它是一個具有相同資料型別,固定大小的物件。
繫結陣列型別的方法如下:
@RequestMapping(value = array.do) @ResponseBody public String array(String[] name){ StringBuilder sbf = new StringBuilder(); StringBuffer sb = new StringBuffer(); for(String item : name){ sbf.append(item).append( ); } return sbf.toString(); }
在使用url地址傳遞引數時,一次可以傳遞多個引數值,值與值之間使用分開,如下:
http://localhost:8080/array.do?name=Tomname=Lucyname=Jim
繫結物件型別
這裡以繫結User物件為例,繫結的方法如下:
@RequestMapping(value=/user) @ResponseBody public String GetUser(User user){ return user.toString(); }
使用url傳遞引數的方式如下:
http://localhost:8080/user?name=Tomage=10
其中name、age都是User物件的屬性。
物件型別的資料繫結,直接請求時對應其屬性即可,不必新增字首,如User類的屬性name,則直接在請求中使用name=xxx,而不是使用user.name=xxx的形式。url如下:
http://localhost:8080/user?name=Tomage=10
但如果是想對物件中物件的屬性再賦值的話,則需要使用xxx.xxx的形式,如下的contactInfo.phone表示將User類中的ContactInfo類的phone屬性賦值。 如下:
http://localhost:8080/object.do?name=Tomage=10contactInfo.phone=10086
兩個物件同屬性進行資料繫結
這裡以User物件和Admin物件為例,這兩個物件具有相同的屬性name,age,這兩個物件進行資料繫結的方法如下:
@RequestMapping(value = object.do) @ResponseBody public String object(User user,Admin admin){ return user.toString()+ +admin.toString(); }
在這裡是有Spring註解@InitBinder來初始化一個物件。
對於兩個不同的類,遇到同名屬性的情況,SpringMVC會預設針對所有類的同名屬性賦值,如下面url傳遞的name,age引數將是兩個物件共有的:
http://localhost:8080/object.do?name=Tomage=10
如果想要區別對待,直接使用xxx.xxx的形式是不行的,還需要在對應的Controller中定義方法,
以 @InitBinder 註解標記屬性名,形參使用 WebDataBinder 來定義請求引數字首,若沒加字首則是共有的。方法定義如下:
@InitBinder(user) //@InitBinder 初始化一個物件 public void initUser(WebDataBinder binder){ binder.setFieldDefaultPrefix(user.); } @InitBinder(admin) public void initAdmin(WebDataBinder binder){ binder.setFieldDefaultPrefix(admin.); }
使用url傳遞引數,如下:
http://localhost:8080/object.do?user.name=Tomadmin.name=Lucyage=10
其中age引數是兩個物件共用的。
繫結List物件
Java中List集合型別:List是一個有序,可重複的的線性表。
在繫結List物件資料時,首先要將物件封裝為List物件,並設定它的get/set方法,以User物件為例,封裝如下:
private List users;
然後controller下對應的方法定義如下:
@RequestMapping(value = list.do) @ResponseBody public String list(UserListForm userListForm){ return listSize:+userListForm.getUsers().size() + + userListForm.toString(); }
其中UserListForm是封裝的List物件類,使用url傳遞引數的方式如下:
http://localhost:8080/list.do?users[0].name=Tomusers[1].name=Lucy
Controller中List引數不能直接傳值,需要一個包裹類,類中有需要傳的List作為屬性和對應的get,set方法。 傳值時用users[0].name = Tom users[1].name = Luce 一定不要跳躍傳值,如users[0].name = Tomusers[20].name = Lucy 這樣中間的1~19也會佔用資源屬性值為空。
http://localhost:8080/list.do?users[0].name=Tomusers[1].name=Lucyusers[20].name=Jim
繫結Map物件
Java中Map集合物件:Map是一個基於kay-value鍵值對的集合型別,它是無序的,其中鍵key不可重複,值value可以重複。
在繫結Map物件資料時,首先要將物件封裝為Map物件,並設定它的get/set方法,以User物件為例,封裝如下:
private MapString,User users;
然後controller下對應的方法定義如下:
@RequestMapping(value = map.do) @ResponseBody public String map(UserMapForm userMapForm){ return userMapForm.toString(); }
其中UserMapForm是封裝的Map物件,使用url傳遞引數的方式如下:
http://localhost:8080/map.do?users[‘X’].name=Tomusers[‘X’].age=10users[‘Y’].name=Lucy
其中X,Y是key,型別是String型別。
繫結Set物件
Java中Set集合物件:Set集合無序,且不可重複,因為它重寫了hashCode()方法和equals()方法;
Set集合在實際的應用中,常用於物件的重複判斷或者排除重複。
在SpringMVC中繫結Set資料型別,介面的引數形式和繫結list是類似的,都是通過索引。但是不同的在於,Set必須初始化,它必須先包含了初始化物件,也即是說必須提前手動分配好空間,才能進行賦值,而使用List則沒有這個要求。
另外的一個坑在於,初始化Set時需要留意物件的equals方法,假如我們在提前分配兩個物件空間時,兩個物件通過equals方法判斷為相同,則我們期望的Set的size為2,最後實際因為去重變成了1,導致在資料繫結時很容易出現數組越界的異常。
Set集合型別:我們一般用來排重 使用Set的時候需要先進行初始化 要使用Set的排重功能必須在物件中覆寫hashcode和equals方法。 SpringMVC對Set支援並不太好,初始化進行排重時會導致size變小,致使無法接受更多的資料而丟擲異常,所以我們開發一般優先使用List。
在繫結Set物件資料時,首先要將物件封裝為Set物件,並設定它的get/set方法,並提供構造方法,封裝如下:
private SetUser users; private UserSetForm(){ users = new LinkedHashSetUser(); users.add(new User()); //定義兩個物件 users.add(new User()); }
其次還要重寫User物件的hashCode()方法和equals()方法
然後controller下對應的方法定義如下:
@RequestMapping(value = set.do) @ResponseBody public String set(UserSetForm userSetForm){ return userSetForm.toString(); }
其中UserSetForm是封裝的Set物件,使用url傳遞引數的方式如下:
http://localhost:8080/set.do?users[0].name=Tomusers[1].name=Lucy
且不可跳範圍傳值,如下:
http://localhost:8080/set.do?users[0].name=Tomusers[20].name=Lucy將會報錯。
繫結XML物件
Java繫結XML物件:XML是一種擴充套件標記語言,常用來儲存或傳輸資料。
對於xml型別的資料繫結,需要在方法形參上增加註解 @RequestBody,並且在Post請求時請求頭為Content-Type: application/xml。
這樣SpringMVC就會呼叫對應的解析器去解析,所以我們同時還需要在pom中新增xml解析的相關依賴 spring-oxm ,如下:
dependency
groupIdorg.springframework/groupId
artifactIdspring-oxm/artifactId
version4.0.0.RELEASE/version
/dependency
將xml對應的實體類進行註解標註,根節點放在類名,並使用name屬性設定對應的xml中的根節點名稱,其他節點同理。
對於Admin物件的name,age屬性定義為xml,格式如下:
?xml version=1.0 encoding=UTF-8 ?
Jim 16 xml 資料繫結:必須在實體類裡面加註解@XmlRootElement,在屬性上新增XmlElement。定義如下:
@XmlRootElement(name=admin) public class Admin { private String name; private Integer age; @XmlElement(name=name)public String getName() { return name;}public void setName(String name) { this.name = name;}@XmlElement(name=age)public Integer getAge() { return age;}public void setAge(Integer age) { this.age = age;}@Overridepublic String toString() { return Admin{ + name=' + name + '\'' + , age= + age + '}';}}
ex:@XmlElement(name=“age”):此時就會將xml 裡面對應的age資料新增到實體類中的age屬性中去。
然後controller下對應的方法定義如下:
@RequestMapping(value = xml.do) @ResponseBodypublic String xml(@RequestBody Admin admin){ return admin.toString();}
url請求地址為:
http://localhost:8080/xml.do, 請求頭為Content-Type: application/xml.
繫結Json物件
Java繫結Json物件:JSON 是輕量級的文字資料交換格式,常用於儲存和交換文字資訊。
SpringMVC接受http中body的json格式內容為引數,在方法的形參前加上註解 @RequestBody,用以呼叫解析器進行轉換,值得注意的是:
1、在引數中加註解@RequestBody( @RequestBody User user)。@RequestBody是把傳過來的Json資料反序列化繫結到控制器引數上。
controller中方法定義如下:
@RequestMapping(value = json.do) @ResponseBody public String json(@RequestBody User user){ return user.toString(); }
2、pom.xml檔案中引入依賴jar包,如下:
dependency
groupIdorg.codehaus.jackson/groupId
3、http請求頭:Content-Type: application/json。
url請求地址為:
http://localhost:8080/json.do