1. 程式人生 > >springMVC4(12)複雜物件和集合型別入參繫結

springMVC4(12)複雜物件和集合型別入參繫結

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="提交">

3. 測試引數輸入