spring專題---第三部分MVC---搞懂spring MVC數據綁定,讓開發變得簡單高效

在這裏插入圖片描述

本篇總結內容如下:

    前言
    基本數據類型
    包裝類
    數組
    POJO
    POJO級聯關係
    List
    Set
    Map
    JSON
    如何使用FastJson
    總結
    分享交流

前言

    本篇總結一下spring MVC的數據綁定,相信你會有些疑問,什麼是數據綁定?
    數據綁定就是在後臺業務方法中,直接獲取前端HTTP請求中的參數。
    上一篇文章說過,spring MVC裏邊有一個組件叫HandlerAdapter,它可以將前端請求的參數類型轉換爲後臺業務需要的形參類型,這些參數都一一對應,這就叫參數的綁定。
    上一篇文章我們爲了演示註解的使用,講了一部分數據綁定這一塊,但那僅是一小部分,這一講是對數據綁定的詳細講解。

基本數據類型

    這一塊其實在上一篇文章中提到過,我們簡單用代碼演示一下:
    以int爲例,後臺需要int類型的參數,直接在業務方法定義出添加int類型的形參即可,注意HTTP請求參數名必須和形參名一致

@Controller
public class HelloController {

    @RequestMapping("/test")
    @ResponseBody
    public String getPOJO(int id){
        return "id:"+id;
    }
}

    測試,HTTP請求不帶參數時,報500錯誤。
在這裏插入圖片描述
    測試,HTTP請求參數爲id=1,頁面回顯id值
在這裏插入圖片描述
    測試,id是否可以爲null,我們一起來看一下👇
在這裏插入圖片描述
    很顯然id值不能轉爲null,因爲我們知道基本數據類型不能賦值null,另外當請求參數爲“xxx”時,xxx如果是數字,那麼spring MVC可以轉換爲int,xxx如果是非數字,那麼就會轉換失敗,其實這個問題在Java中也是同樣的。

包裝類

@Controller
public class HelloController {

    @RequestMapping("/test")
    @ResponseBody
    public String getPOJO(Integer id){
        return "id:"+id;
    }
}

測試:HTTP請求無參數。
在這裏插入圖片描述
沒有報錯,直接打印null,因爲包裝類可以賦值null。
測試:HTTP請求參數類型爲字符串
在這裏插入圖片描述
400報錯,String類型不能轉換爲Integer類型。
正確使用👇:
在這裏插入圖片描述
參數列表添加@RequestParam註解,可以對參數進行相關設置。

@Controller
public class HelloController {

    @RequestMapping("/test")
    @ResponseBody
    public String Test(@RequestParam(value = "id",required = false,defaultValue = "2")Integer id){
        return "id:"+id;
    }
}

測試:HTTP請求不帶參數
在這裏插入圖片描述
我們看到,不帶參數同樣能正常訪問,而且id值爲2,這是因爲我們在參數中聲明瞭required = false,defaultValue = “2”

測試,HTTP請求參數id值爲3
在這裏插入圖片描述
我們看到,當我們指定了id值後,id爲我們指定的值。

required = false:id參數非必填,可省略。不寫required這一項則默認required=true。
defaultValue = “2”:若HTTP請求中沒有Id參數,則id默認爲1。

數組

@Controller
public class HelloController {

    @RequestMapping("/test")
    @ResponseBody
    public String Test(String[] name){
        StringBuffer sbf=new StringBuffer();
        for (String item:name) {
            sbf.append(item).append(" ");
        }
        return "name:"+sbf.toString();
    }
}

在這裏插入圖片描述

POJO

(1)創建User類:

public class User {
    private int id;
    private String name;
    //這裏省略setter,toString方法
}

(2)創建addUser.jsp頁面,input標籤的name與實體類的屬性名對應:

<form action="addUser" method="post">
    編號:<input type="text" name="id"/><br/>
    姓名:<input type="text" name="name"/><br/>
         <input type="submit" value="提交"/>
</form>

(3)業務方法:

@Controller
public class HelloController {

    @RequestMapping("/test")
    @ResponseBody
    public String Test(User user){
        return "註冊信息爲:"+user;
    }
}

(4)運行:
在這裏插入圖片描述
在這裏插入圖片描述
我們看到頁面上有亂碼,那麼我們處理一下@ResponseBody中文亂碼,在springmvc.xml中配置消息轉換器

    <mvc:annotation-driven >
        <!-- 消息轉換器 -->
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <property name="supportedMediaTypes" value="text/html;charset=UTF-8"/>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

在這裏插入圖片描述

POJO級聯關係

(1)創建Address類。

public class Address {
    private int id;
    private String name;
    //這裏省略setter,getter,toString方法。
}

(2)創建User類。

public class User {
    private int id;
    private String name;
    private Address address;
    //這裏省略setter,getter,toString方法。
}

(3)創建addUser.jsp。

<!--省略了html標籤、head標籤等-->
<form action="test" method="post">
    編號:<input type="text" name="id"/><br/>
    姓名:<input type="text" name="name"/><br/>
    地址:<input type="text" name="address.name"/><br/>
         <input type="submit" value="提交"/>
</form>

(4)創建測試類。

@Controller
public class HelloController {

    @RequestMapping(value = "/test")//注意,value在僅有它一個參數的時候value字樣可以省略,否則不能省略。
    @ResponseBody
    public String Test(User user){
        return "註冊信息爲:"+user;
    }
}

(5)訪問 http://localhost/test。
在這裏插入圖片描述

List

springMVC不支持List類型的直接轉換,需要包裝成Object。

List自定義包裝類:

public class UserList {
    private List<User> users;
    //這裏省略了setter,getter,toString方法
}

創建業務方法:

@Controller
public class HelloController {

    @RequestMapping(value = "/test")
    @ResponseBody
    public String Test(UserList userList){
        StringBuffer sbf=new StringBuffer();
        for(User user:userList.getUsers()){
            sbf.append(user);
        }
        return "註冊信息爲:"+sbf.toString();
    }
}

創建addUser.jsp,同時添加三個用戶信息,input的name指向自定義包裝類UserList中的users屬性,以下標區分集合中不同的對象。

<form action="test" method="post">
    編號1<input type="text" name="users[0].id"/><br/>
    姓名1<input type="text" name="users[0].name"/><br/>
    地址1<input type="text" name="users[0].address.name"/><br/>
    編號2<input type="text" name="users[1].id"/><br/>
    姓名2<input type="text" name="users[1].name"/><br/>
    地址2<input type="text" name="users[1].address.name"/><br/>
    編號3<input type="text" name="users[2].id"/><br/>
    姓名3<input type="text" name="users[2].name"/><br/>
    地址3<input type="text" name="users[2].address.name"/><br/>
         <input type="submit" value="提交"/>
</form>

在這裏插入圖片描述
在這裏插入圖片描述

Set

和List一樣,需要封裝自定義包裝類,將Set集合作爲屬性。不同的是,使用Set集合需要在包裝類中的構造函數中,爲Set添加初始化對象。

Set自定義包裝類:

public class UserSet {
    private Set<User> users=new HashSet<User>();

   public UserSet(){
       users.add(new User());
       users.add(new User());
       users.add(new User());
   }
   //這裏省略getter,setter,toString方法
}

創建業務方法:

@Controller
public class HelloController {

    @RequestMapping(value = "/test")
    @ResponseBody
    public String Test(UserSet userSet){
        StringBuffer sbf=new StringBuffer();
        for(User user:userSet.getUsers()){
            sbf.append(user);
        }
        return "註冊信息爲:"+sbf.toString();
    }
}

創建addUser.jsp,同時添加三個用戶信息,input的name指向自定義包裝類UserSet中的users屬性,以下標區分集合中不同的對象。

<form action="test" method="post">
    編號1<input type="text" name="users[0].id"/><br/>
    姓名1<input type="text" name="users[0].name"/><br/>
    地址1<input type="text" name="users[0].address.name"/><br/>
    編號2<input type="text" name="users[1].id"/><br/>
    姓名2<input type="text" name="users[1].name"/><br/>
    地址2<input type="text" name="users[1].address.name"/><br/>
    編號3<input type="text" name="users[2].id"/><br/>
    姓名3<input type="text" name="users[2].name"/><br/>
    地址3<input type="text" name="users[2].address.name"/><br/>
         <input type="submit" value="提交"/>
</form>

在這裏插入圖片描述
在這裏插入圖片描述

Map

自定義包裝類:

public class UserMap {
    private Map<String,User> users;
    //這裏省略了getter,setter,toString方法
}

業務方法,遍歷Map集合的key值,通過key值獲取value。

@Controller
public class HelloController {

    @RequestMapping(value = "/test")
    @ResponseBody
    public String Test(UserMap userMap){
        StringBuffer sbf=new StringBuffer();
        for(String key:userMap.getUsers().keySet()){
            User user =userMap.getUsers().get(key);
            sbf.append(user);
        }
        return "註冊信息爲:"+sbf.toString();
    }
}

JSP與List和Set不同的是,不能通過下標區分不同的對象,改爲通過key值區分。

<form action="test" method="post">
    編號1<input type="text" name="users['a'].id"/><br/>
    姓名1<input type="text" name="users['a'].name"/><br/>
    地址1<input type="text" name="users['a'].address.name"/><br/>
    編號2<input type="text" name="users['b'].id"/><br/>
    姓名2<input type="text" name="users['b'].name"/><br/>
    地址2<input type="text" name="users['b'].address.name"/><br/>
    編號3<input type="text" name="users['c'].id"/><br/>
    姓名3<input type="text" name="users['c'].name"/><br/>
    地址3<input type="text" name="users['c'].address.name"/><br/>
         <input type="submit" value="提交"/>
</form>

在這裏插入圖片描述
在這裏插入圖片描述

JSON

未完待續…

如何使用FastJson

未完待續…

總結

本篇還未更完,json和FastJson部分在寫博客測試的時候出現了問題,後期我會完善此篇博客,抱歉。

分享交流

     以上便是我對這一部分的理解,如果有錯誤或者你有其他疑惑都可以留言給出,我都會一一進行回覆,希望對你有所幫助,如果寫的不好也請您多多包涵。歡迎在下方補充留言喲。
     對SSM框架感興趣的童鞋,可以移步這裏,在這裏你可以快速的搭建好一個SSM框架。
     如果你在寫項目的時候,遇到一些不尋常的問題,也可以關注我的博客園,上邊會發布一些我在寫項目中遇到的各種問題以及解決方式。

發佈了31 篇原創文章 · 獲贊 30 · 訪問量 6513
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章