1. 程式人生 > >SpringMVC實現多種資料型別繫結

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