欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?MVC數(shù)據(jù)綁定方式

 更新時(shí)間:2022年10月28日 11:01:17   作者:z.haoui  
這篇文章主要介紹了Spring?MVC數(shù)據(jù)綁定方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

 定義:簡單綁定是將一個(gè)用戶界面元素(控件)的屬性綁定到一個(gè)類型(對象)實(shí)例上的某個(gè)屬性的方法。

基本類型、包裝類型、數(shù)組(以參數(shù)age為例)

一、基本類型

1、key是必須的,即age是必須傳值的

2、只能是int類型,即傳給age的值必須為int類型且范圍也只能是int類型

如果沒有傳age,后臺會報(bào)500錯(cuò)誤,會提示當(dāng)前的age是不可以為空的

如果age傳一個(gè)字符串a(chǎn)bc,Spring MVC會進(jìn)行攔截,報(bào)400參數(shù)錯(cuò)誤異常

@Controller
public class TestController{
    /*
        RequestMapping注解
        value:RequestMapping的屬性,指定請求的實(shí)際地址
        method:RequestMapping的屬性,指定請求的method類型,分為GET、POST、PUT、DELETE等
        headers:RequestMapping的屬性
                 指定request中必須包含指定的header值,才能處理該請求
    */
    @RequestMapping(value = "baseType.do", method = RequestMethod.GET)
    @ResponseBody    //方法的返回值會放到ResponseBody數(shù)據(jù)區(qū)里
    /*
        RequestParam注解
        value:RequestParam的屬性,起別名
        required:RequestParam的屬性,是否必傳,默認(rèn)值是true
    */
    public String baseType(@RequestParam(value = "xage") int age){
        return "age:" + age;
    }
}

二、包裝類型

1、可以不傳key,即age可以為空

@Controller
public class TestController{
? ? @RequestMapping(value = "baseType.do")
? ? @ResponseBody
? ? public String baseType(Integer age){
? ? ? ? return "age:" + age;
? ? }
}

此時(shí)訪問localhost:8080/baseType.do,前臺顯示age:null

注意:在開發(fā)過程中,對可能為空的數(shù)據(jù),最好將參數(shù)數(shù)據(jù)定義為包裝類型

三、數(shù)組

一次性傳多個(gè)值,例如基本類型、包裝類型、String的對象類型

@Controller
public class TestController{
? ? @RequestMapping(value = "array.do")
? ? @ResponseBody
? ? public String array(String[] age){
? ? ? ? StringBuilder sdf = new StringBuilder();
? ? ? ? for(String item : age){
? ? ? ? ? ? sbf.append(item).append(" ");
? ? ? ? }
? ? ? ? return sbf.toString();
? ? }
}

此時(shí)訪問localhost:8080/array.do?age=17&age=18,前臺顯示17 18

簡單對象、多層級對象、同屬性對象

一、簡單對象(User類:name, age)

@Controller
public class TestController{
? ? @RequestMapping(value = "object.do")
? ? @ResponseBody
? ? public String object(User user){
? ? ? ? return user.toString();
? ? }
}

此時(shí)訪問localhost:8080/object.do?name=Tom&age=18,前臺顯示User{name='Tom',age=18}

二、多層級對象(User類:name, age, contactInfo、ContactInfo類:phone, adress)

@Controller
public class TestController{
? ? @RequestMapping(value = "object.do")
? ? @ResponseBody
? ? public String object(User user){
? ? ? ? return user.toString();
? ? }
}

此時(shí)訪問localhost:8080/object.do?name=Tom&age=18&contactInfo.phone=10000

前臺顯示User{name='Tom',age=18,contactInfo={phone='10000',address='null'}}

三、同屬性對象(User類:name, age、Admin類:name, age)

@Controller
public class TestController{
? ? @RequestMapping(value = "object.do")
? ? @ResponseBody
? ? public String object(User user, Admin admin){
? ? ? ? return user.toString() + " " + admin.toString();
? ? }
}

此時(shí)訪問localhost:8080/object.do?name=Tom&age=18,前臺顯示User{name='Tom',age=18} Admin{name='Tom',age=18}

@Controller
public class TestController{
? ? @RequestMapping(value = "object.do")
? ? @ResponseBody
? ? public String object(User user, Admin admin){
? ? ? ? return user.toString() + " " + admin.toString();
? ? }
}
?
@InitBinder("user") ? ?//綁定前綴
public void initUser(WebDataBinder binder){
? ? binder.setFieldDefaultPrefix("user.");
}
?
@InitBinder("admin") ? ?//綁定前綴
public void initUser(WebDataBinder binder){
? ? binder.setFieldDefaultPrefix("admin.");
}

此時(shí)訪問localhost:8080/object.do?user.name=Tom&admin.name=Lucy&age=18

前臺顯示User{name='Tom',age=18} Admin{name='Lucy',age=18}

如果沒有@InitBinder注解的輔助方法,這個(gè)方法如果傳遞user.name,admin.name結(jié)果會怎么樣呢?

如果沒有@InitBinder注解的輔助方法,Spring MVC會認(rèn)為是User類和Admin類里面的user字段的name,所以前臺顯示null

List、Set、Map

一、List

@Controller
public class TestController{
? ? @RequestMapping(value = "list.do")
? ? @ResponseBody
? ? public String list(UserList userList){
? ? ? ? return userList.toString();
? ? }
}

Spring MVC關(guān)于集合綁定需要一個(gè)data收集的對象,單純的綁定是無效的。 

建一個(gè)UserList類:

public class UserList{
? ? private List<User> users;
? ??
? ? public List<User> getUsers(){
? ? ? ? return users;
? ? }
?
? ? public void setUsers(List<User> users){
? ? ? ? this.users = users;
? ? }
?
? ? @Override
? ? public String toString(){
? ? ? ? return "UserList{" +
? ? ? ? ? ? ? ? "users=" + users +
? ? ? ? ? ? ? ? '}';
? ? }
}

此時(shí)訪問localhost:8080/list.do?users[0].name=Tom&users[1].name=Lucy

前臺顯示UserList{users=[User{name='Tom', age=null, contactInfo=null}, User{name='Lucy', age=null, contactInfo=null}]}

注意:如果訪問傳值的時(shí)候,users[0]直接跨到users[10],即訪問

localhost:8080/list.do?users[0].name=Tom&users[10].name=Lucy

則前臺顯示users[1]到users[9]以及users[11]為空對象,所以請求索引的時(shí)候一定要是連續(xù)的,否則會浪費(fèi)資源

二、Set

Set相對List來說有一定的局限性,它需要先初始化Set,而List是不需要的

Set在實(shí)際應(yīng)用場景當(dāng)中,大部分是做對象的重復(fù)判斷或排除重復(fù)

例如一個(gè)Student對象(姓名和Email),如果姓名和Email相同,則認(rèn)為這個(gè)對象是重復(fù)的,此時(shí)需要重寫hashcode方法和equals方法,然后在方法里寫重復(fù)判斷的邏輯(綁定到一個(gè)對象上)

@Controller
public class TestController{
? ? @RequestMapping(value = "set.do")
? ? @ResponseBody
? ? public String set(UserSet userSet){
? ? ? ? return userSet.toString();
? ? }
}

Set和List一樣,也需要一個(gè)data收集的對象

public class UserSet{
? ? private Set<User> users;
? ??
? ? //Set和List有一些區(qū)別,就是對它本身的初始化有一些要求
? ? private UserSet(){
? ? ? ? users = new LinkedHashSet<User>();
? ? ? ? users.add(new User());
? ? ? ? users.add(new User());
? ? }
?
? ? public Set<User> getUsers(){
? ? ? ? return users;
? ? }
?
? ? public void setUsers(Set<User> users){
? ? ? ? this.users = users;
? ? }
?
? ? @Override
? ? public String toString(){
? ? ? ? return "UserSet{" +
? ? ? ? ? ? ? ? "users=" + users +
? ? ? ? ? ? ? ? '}';
? ? }
}

此時(shí)訪問localhost:8080/set.do?users[0].name=Tom&users[1].name=Lucy

前臺顯示UserSet{users=[User{name='Tom', age=null, contactInfo=null}, User{name='Lucy', age=null, contactInfo=null}]}

如果跨界訪問,即訪問localhost:8080/set.do?users[0].name=Tom&users[10].name=Lucy

則會報(bào)錯(cuò),因?yàn)橐呀?jīng)定義了Set的size為2

注意:如果沒有重寫hashcode方法和equals方法進(jìn)行排重,則傳兩個(gè)相同對象的時(shí)候前臺還會顯示兩個(gè)對象

可是如果定義了Set的size為2,而又重寫了hashcode方法和equals方法進(jìn)行排重,那么當(dāng)我們傳兩個(gè)相同對象的時(shí)候則會拋異常,因?yàn)槌跏蓟疭et的時(shí)候定義的是兩個(gè)空對象,可是經(jīng)過hashcode方法和equals方法判

斷完之后會認(rèn)為是重復(fù)的對象,所以初始化的Set的size則為1,此時(shí)傳兩個(gè)對象就會報(bào)錯(cuò),所以Spring MVC對Set的支持并不友好

三、Map

@Controller
public class TestController{
? ? @RequestMapping(value = "map.do")
? ? @ResponseBody
? ? public String map(UserMap userMap){
? ? ? ? return userMap.toString();
? ? }
}

Map和List一樣,也需要一個(gè)data收集的對象

public class UserMap{
? ? private Map<String,User> users;
? ??
? ? public Map<User> getUsers(){
? ? ? ? return users;
? ? }
?
? ? public void setUsers(Map<String,User> users){
? ? ? ? this.users = users;
? ? }
?
? ? @Override
? ? public String toString(){
? ? ? ? return "UserMap{" +
? ? ? ? ? ? ? ? "users=" + users +
? ? ? ? ? ? ? ? '}';
? ? }
}

此時(shí)訪問localhost:8080/map.do?users["X"].name=Tom&users["X"].age=10&users["Y"].name=Lucy

前臺顯示UserMap{users={X=User[name='Tom', age=10, contactInfo=null}, Y=User{name='Lucy', age=null, contactInfo=null}}}

JSON、XML

RequestBody注解用于讀取Request請求的Body部分?jǐn)?shù)據(jù),使用系統(tǒng)默認(rèn)配置的HttpMessageConverter進(jìn)行解析,然后把相應(yīng)的數(shù)據(jù)綁定到要返回的對象上;再把HttpMessageConverter返回的對象數(shù)據(jù)綁定到Controller中方法的參數(shù)上。

RequestBody注解常用來處理Content-Type不是默認(rèn)的application/x-www-form-urlcoded編碼的內(nèi)容,比如說:application/json或者是application/xml等。一般情況下來說常用其來處理application/json類型。

一、JSON

@Controller
public class TestController{
? ? @RequestMapping(value = "json.do")
? ? @ResponseBody
? ? public String json(@RequestBody User user){
? ? ? ? return user.toString();
? ? }
}

利用PostMan等工具傳值:

{
? ? "name":"Jim",
? ? "age":16,
? ? "contactInfo":{
? ? "address":"beijing",
? ? "phone":"10010"
? ? }
}

返回值:

User{name='Jim', age=16,
contactInfo=ContactInfo{phone='10010',
address='beijing'}}

二、XML

這個(gè)功能需要spring-oxm依賴包提供支持以及在實(shí)體類中添加一些注解

@XmlRootElement(name="admin")
public class Admin{
? ? private String name;
? ??
? ? private String 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(String age) { this.age = age; }
?
? ? @Override
? ? public String toString(){
? ? ? ? return "Admin{" +
? ? ? ? ? ? ? ? "name='" + name + '\'' +
? ? ? ? ? ? ? ? ", age=" + age +
? ? ? ? ? ? ? ? '}';
? ? }
}

@Controller
public class TestController{
? ? @RequestMapping(value = "xml.do")
? ? @ResponseBody
? ? public String xml(@RequestBody User user){
? ? ? ? return user.toString();
? ? }
}

利用PostMan等工具傳值:

<?xml version="1.0" encoding="UTF-8" ?>
<admin>
? ? <name>Jim</name>
? ? <age>16</age>
</admin>

返回值:

Admin{name='Jim', age=16}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java貪吃蛇游戲?qū)崿F(xiàn)代碼

    java貪吃蛇游戲?qū)崿F(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了java貪吃蛇游戲?qū)崿F(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • java 設(shè)計(jì)模式之適配器模式的詳解

    java 設(shè)計(jì)模式之適配器模式的詳解

    這篇文章主要介紹了java 設(shè)計(jì)模式之適配器模式的詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • springboot接收日期類型參數(shù)的操作方法

    springboot接收日期類型參數(shù)的操作方法

    如果使用Get請求,直接使用對象接收,則可以使用@DateTimeFormat注解進(jìn)行格式化,本文重點(diǎn)給大家介紹springboot接收日期類型參數(shù)的方法,感興趣的朋友一起看看吧
    2024-02-02
  • Mybatis -如何處理clob類型數(shù)據(jù)

    Mybatis -如何處理clob類型數(shù)據(jù)

    這篇文章主要介紹了Mybatis 如何處理clob類型數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • JDBC增刪改查和查唯一的完整代碼解析

    JDBC增刪改查和查唯一的完整代碼解析

    這篇文章主要介紹了JDBC增刪改查和查唯一的完整代碼解析,代碼分為第四部分,每部分代碼都不錯(cuò),對jdbc增刪改查操作感興趣的朋友一起學(xué)習(xí)吧
    2016-12-12
  • Servlet開發(fā)JavaWeb工程示例詳解

    Servlet開發(fā)JavaWeb工程示例詳解

    這篇文章主要介紹了Servlet開發(fā)JavaWeb工程示例詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 完整的logback配置示例ELK整合包含生成json日志

    完整的logback配置示例ELK整合包含生成json日志

    這篇文章主要為大家介紹了完整的logback配置示例ELK整合包含生成json日志,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • SpringBoot如何實(shí)現(xiàn)一個(gè)實(shí)時(shí)更新的進(jìn)度條的示例代碼

    SpringBoot如何實(shí)現(xiàn)一個(gè)實(shí)時(shí)更新的進(jìn)度條的示例代碼

    本文詳細(xì)的介紹了SpringBoot如何實(shí)現(xiàn)一個(gè)實(shí)時(shí)更新的進(jìn)度條,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • SpringBoot整合Mybatis實(shí)現(xiàn)CRUD

    SpringBoot整合Mybatis實(shí)現(xiàn)CRUD

    這篇文章主要介紹了SpringBoot整合Mybatis實(shí)現(xiàn)CRUD的相關(guān)知識,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳解在Java的Struts2框架中配置Action的方法

    詳解在Java的Struts2框架中配置Action的方法

    這篇文章主要介紹了詳解在Java的Struts2框架中配置Action的方法,講解了包括struts.xml中的action配置及基于注解方式Action配置的兩個(gè)方式,需要的朋友可以參考下
    2016-03-03

最新評論