springMVC4(12)复杂对象和集合类型入参绑定

Posted jeanheo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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格式化输出
    }
}

我们在前端表单输入参数如下所示:
这里写图片描述
点击提交后,页面输出:
这里写图片描述
或者我们也可直接通过访问如下链接得到相同结果:
http://localhost:8080/springMVC/saveUser?userName=username&password=password&article.title=title&article.content=content

从上可知,对于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>

提交如下数据:
这里写图片描述
或我们也可直接在游览器地址栏访问:http://localhost:8080/springMVC/getIds?ids=11&ids=22&ids=33
此时游览器输出:
这里写图片描述

集合类型参数绑定

对于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. 测试参数输入

我们输入如下图所示的参数:
这里写图片描述
点击提交按钮,获得输出数据:
这里写图片描述
或者我们也可以通过游览器地址访问:
http://localhost:8080/springMVC/getAll?userName=username1&password=password1&numList[0]=11&numList[1]=22&articleList[0].title=title1&articleList[0].content=content1&articleList[1].title=title2&articleList[1].content=content2&articleSet[0].title=title3&articleSet[0].content=cotent3&articleSet[1].title=title4&articleSet[1].content=cotent4&numMap[%27num1%27]=55&numMap[%27num2%27]=66&articleMap[%27article1%27].title=title5&articleMap[%27article1%27].content=content5&articleMap[%27article2%27].title=title6&articleMap[%27article2%27].content=content6
从上面我们可以看到,使用绑定List和Set入参都是以成员属性名[索引](.级联成员属性名)的形式完成绑定,使用Map的话则以成员属性名[键名](.级联成员属性名)的形式完成绑定

以上是关于springMVC4(12)复杂对象和集合类型入参绑定的主要内容,如果未能解决你的问题,请参考以下文章

存储过程返回集合复杂类型对象生成器工具

如何比较Oracle中的复杂集合?

restful 接口 复杂对象入参

根据接口入参不同返回不同对象集合的方法

mybatis入参有多个 多种类型

Java代码重构时,为什么禁止在方法内对对象类型的入参赋值