本篇總結內容如下:
前言
基本數據類型
包裝類
數組
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框架。
如果你在寫項目的時候,遇到一些不尋常的問題,也可以關注我的博客園,上邊會發布一些我在寫項目中遇到的各種問題以及解決方式。