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的话则以成员属性名[键名](.级联成员属性名)的形式完成绑定

时间: 2024-10-16 08:48:44

springMVC4(12)复杂对象和集合类型入参绑定的相关文章

SpringMVC确定目标方法POJO类型入参的过程

SpringMVC确定目标方法POJO类型入参的过程 访问方法 @RequestMapping("/pojoparam") public String POJOParam(User user){ return "success"; } 1,首先确定一个key值 ①如果目标方法的POJO类型的参数没有使用@ModelAttribute作为入参修饰,则key为POJO类名的第一个字母小写 例test(User user){}这样的方法key就是user ②如果使用了@M

springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定

springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需求 表现层实现 list绑定 需求 表现层实现 map绑定 本文主要介绍注解开发的集合类型參数绑定,包含数组绑定,list绑定以及map绑定 数组绑定 需求 商品批量删除,用户在页面选择多个商品.批量删除. 表现层实现 关键:将页面选择(多选)的商品id,传到controller方法的形參,方法形參使用数组接收页面请求的多个商

JS魔法堂:那些困扰你的DOM集合类型

一.前言 大家先看看下面的js,猜猜结果会怎样吧! 可选答案: ①. 获取id属性值为id的节点元素 ②. 抛namedItem is undefined的异常 var nodes = document.getElementsByName('dummyName'); var node = nodes.namedItem('id'); 答案是两种都有可能哦!document.getElementsByName在Chrome和FF30.0中返回NodeList(木有namedItem方法的),在IE

mybatis框架之多参数入参--传入Map集合

需求:查询出指定性别和用户角色列表下的用户列表信息 实际上:mybatis在入参的时候,都是将参数封装成为map集合进行入参的,不管你是单参数入参,还是多参数入参,都是可以封装成map集合的,这是无可非议的. /** * 需求:查询出指定性别和用户角色列表下的用户列表信息 * @param roleids * @return */ public List<User> getUserListByGender_UserRoleids(Map<String,Object> conditi

springMVC中 request请求数据绑定到Controller入参 过程剖析

前言:Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型.若这个普通Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数.众所周知,无论客户端传入的是什么类型的请求参数,最终都要以字节的形式传给服务端.而服务端通过Request的getParameter方法取到的参数也都是字符串形式的结果.所以,需要有一个把字符串形式的参数转换成服务端真正需要的类型的转换工具(基类:PropertyEditorSupport) 注:只有

12.JAVA编程思想——集合的类型

12.JAVA编程思想--集合的类型 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51100510 标准Java 1.0 和1.1 库配套提供了非常少的一系列集合类.但对于自己的大多数编程要求,它们基本上都能胜任.Java 1.2 提供的是一套重新设计过的大型集合库. 1      Vector Vector 的用法很简单,大多数时候只需用addElement()插入对象,用elementAt()一次提取一个对象,并用el

含有Date类型的对象或集合转换成json时的问题

当我们把含有Date类型的对象或者集合直接转换为json,传回前台的时候不会报错,但是前台显示的时候是两个Object,而不会显示正常的日期. 当我们进debug调试的时候不会发现有错误,但是在解析JSON的时候就会发现: 在转换为JSON的过程中把date对象分开转化,即:年.月.日.时.分.秒,每个都当成一个对象给转化了. 这时候我们就需要做一些转换了 下面给大家提供一些大神给出常规的解决方案: 一:流星焱雨给出的解决方案 二:jadethao给出的解决方案 而当我们基本只需要临时显示日期的

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

最近要写一个外部调用的webservice接口,入参和出参都是xml格式,根据不同的type查询不同的集合返回,代码如下: 首先配置webservice接口的xml文件 然后写接口类 然后是实现类 实现类中最主要的是根据不同的type查询出结果然后分装成返回xml 封装的返回方法运用了泛型,可以传入不同的对象集合 public <T> String getDetailXml(String retCode,List<T> list){ Document doc=DocumentHel

C#集合类型——Array、ArrayList、List 之浅谈

在学习或工作中,集合是经常用到的,可以换一句话说“无项目无集合”,“项目皆有集合”.它一般存储一系列数据或者将一系列数据进行相关操作.在这里先大略谈一些集合类型的相关知识用于回顾. 数组(Array) 数组一般只存储一种类型的数据,有一维数组,二维数组等多维数组.都基于System.array类. 格式:type[]  typename:  type指类型,typename指数组名称. 一维数组有多种书写形式: int [] a={1,2,3}; int [] b=new int[]{1,2,3