springMVC4(12)複雜物件和集合型別入參繫結
阿新 • • 發佈:2019-02-02
1. 複雜物件引數繫結
對於普通的物件引數繫結,我們只需要物件成員變數名與請求引數名一一對應即可完成繫結。
而求對於組合物件,我們可以使用級聯的方式來繫結方法引數。見下面例項:
我們先定義兩個POJO類:User,Article其中Atricle是User的成員屬性:
public class Article {
private Integer id;
private String title;
private String content;
//忽略get和set方法
}
package com.mvc.model;
public class User {
public User() {
super();
}
private Integer id;
private String userName;
private String password;
private Article article;//組合物件
//忽略get和set方法
}
下面是我們的測試前端表單:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>test</title>
</head>
<body>
<form action="saveUser">
使用者名稱:<input type="text" name="userName"><br>
密碼:<input type="text" name="password"><br>
文章標題:<input type="text" name="article.title" ><br>
文章內容:<input type="text" name="article.content"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
下面是我們的控制層方法:
@Controller
public class UserController {
@RequestMapping("saveUser")
@ResponseBody
public User saveUser(User user){
return user;//直接將獲取的user物件json格式化輸出
}
}
從上可知,對於User的成員屬性article,如果我們繫結其對應的引數,可以通過級聯article.title,article.content來完成。
在這裡,如果我在控制器的方法入參中,同時定義多個user,或者有多個不同的類例項物件。只要它們的成員屬性名和引數名相同,都會完成繫結
2. 陣列引數繫結
陣列引數分為普通型別陣列和複雜物件陣列兩種,但由於沒有複雜物件陣列的構造方法,springMVC只能繫結普通型別陣列。
普通型別陣列是指Integer、Stirng、Long等基本資料型別的包裝類,下面通過例項來看如何完成繫結工作:
控制器方法:
@RequestMapping("getIds")
@ResponseBody
public Integer[] saveUser(Integer[] ids){
return ids;
}
前端表單定義:
<form action="getIds" method="post">
id1:<input type="text" name="ids"><br>
id2:<input type="text" name="ids"><br>
id3:<input type="text" name="ids"><br>
<input type="submit" value="提交">
</form>
集合型別引數繫結
對於list、Set、Map等的引數繫結,如果我們嘗試直接繫結,是會失敗的,必須將其作為一個具體類物件的成員屬性,這個時候我們也可稱這個具體類物件為一個包裝類。先看下面失敗例項:
@RequestMapping("getIds2")
@ResponseBody
public ArrayList<Integer> getIds2(ArrayList<Integer> ids){//我們嘗試將id集繫結一個List中
return ids;
}
我們的請求url和輸出結果如下圖所示:
它的輸出結果為空json陣列,說明我們的繫結失敗了。
這裡遇到的一個主要問題是,如果我們繫結Set型別引數時,必須先為Set新增預定大小的容器,否則會報錯。而且也不支援基本資料型別包裝類的Set繫結,**如果需要完成這一轉換,需要我們自定義轉換器來實現。
下面我們通過一個完整的綜合例子來展示集合型別的引數繫結:
1. POJO類
package com.mvc.model;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class User {
private String userName;
private String password;
private List<Integer> numList;
private List<Article> articleList;
private Set<Article> articleSet;
private Map<String, Integer> numMap;
private Map<String, Article> articleMap;
public User(){//這裡我們為Set預初始化兩個Article的容量大小
articleSet = new HashSet<Article>();
Article article = new Article();
articleSet.add(article);
Article article2 = new Article();
articleSet.add(article2);
numSet = new HashSet<Integer>();
}
//忽略get和set方法
}
2. 控制層配置
我們的控制層方法極為簡單:
@RequestMapping("getAll")
@ResponseBody
public User getAll(User user){
return user;
}
3. 測試表單程式碼:
<form action="getAll" >
使用者名稱:<input type="text" name="userName"><br>
密碼:<input type="text" name="password"><br>
numList部分:<br>
numList[0]:<input type="text" name="numList[0]"><br>
numList[1]:<input type="text" name="numList[1]"><br>
articleList部分:<br>
articleList[0].title:<input type="text" name="articleList[0].title"><br>
articleList[0].content:<input type="text" name="articleList[0].content"><br>
articleList[1].title:<input type="text" name="articleList[1].title"><br>
articleList[1].content:<input type="text" name="articleList[1].content"><br>
articleSet部分:<br>
articleSet[0].title:<input type="text" name="articleSet[0].title"><br>
articleSet[0].content:<input type="text" name="articleSet[0].content"><br>
articleSet[1].title:<input type="text" name="articleSet[1].title"><br>
articleSet[1].content:<input type="text" name="articleSet[1].content"><br>
numMap部分:<br>
numMap[0]:<input type="text" name="numMap['num1']"><br>
numMap[1]:<input type="text" name="numMap['num2']"><br>
articleMap部分:<br>
articleMap[0].title:<input type="text" name="articleMap['article1'].title"><br>
articleMap[0].content:<input type="text" name="articleMap['article2'].content"><br>
articleMap[1].title:<input type="text" name="articleMap['article2'].title"><br>
articleMap[1].content:<input type="text" name="articleMap['article2'].content"><br>
<input type="submit" value="提交">