SpringMVC接收多个对象的4种方法

问题背景:
我要在一个表单里同时一次性提交多名乘客的个人信息到SpringMVC,前端HTML和SpringMVC Controller里该如何处理?
第1种方法:表单提交,以字段数组接收;
第2种方法:表单提交,以BeanListModel接收;
第3种方法:将Json对象序列化成Json字符串提交,以List接收;
第4种方法:将表单对象序列化成Json字符串提交,以List接收;
第4种方法其实是第3种方法的升级,就是将表单转成Json对象,再转成Json字符串提交;
然而,第4种方法还不支持含有多选控件表单的提交,故应该还有第5种加强版的方法。
以上4种方法都共用同一个User实体类,代码如下:

public class User {

  private Integer id;
  private String name;
  private String pwd;

  @Override
  public String toString() {
    return "User{" +
        "id=" + id +
        ", name='" + name + '\'' +
        ", pwd='" + pwd + '\'' +
        '}';
  }
  // .......后面还有getter、setter方法,省略了
 }

第1种方法:表单提交,以字段数组接收

HTML代码如下:

  <form action="/user/submitUserList_1" method="post">
    ID:<input type="text" name="id"><br/>
    Username:<input type="text" name="name"><br/>
    Password:<input type="text" name="pwd"><br/><br/>

    ID:<input type="text" name="id"><br/>
    Username:<input type="text" name="name"><br/>
    Password:<input type="text" name="pwd"><br/><br/>
    <input type="submit" value="submit">
  </form>

Java代码如下:

  @RequestMapping(value = "/submitUserList_1", method ={RequestMethod.POST})
  @ResponseBody
  public String submitUserList_1(HttpServletResponse response,Integer[] id, String[] name, String[] pwd)
              throws Exception{
    String result = "";
    if(id == null || id.length <= 0){ return "No any ID.中文"; }
    List<User> userList = new ArrayList<User>();
    for (int i = 0; i < id.length; i++ ) {
      User user = new User();
      user.setId(id[i]);
      user.setName(name[i]);
      user.setPwd(pwd[i]);
      userList.add(user);
    }
    result = this.showUserList(userList);
    return result;
  }

第2种方法:表单提交,以BeanListModel接收

HTML代码如下:

  <form action="/user/submitUserList_2" method="post">
    ID:<input type="text" name="users[0].id"><br/>
    Username:<input type="text" name="users[0].name"><br/>
    Password:<input type="text" name="users[0].pwd"><br/><br/>

    ID:<input type="text" name="users[2].id"><br/>
    Username:<input type="text" name="users[2].name"><br/>
    Password:<input type="text" name="users[2].pwd"><br/><br/>
    <input type="submit" value="Submit">
  </form>

Java代码:
除了刚才公用的User类,还要封装一个User的容器类UserModel:

public class UserModel {
  private List<User> users;

  public List<User> getUsers() {
    return users;
  }

  public void setUsers(List<User> users) {
    this.users = users;
  }

  public UserModel(List<User> users) {
    super();
    this.users = users;
  }

  public UserModel() {
    super();
  }

}

SpringMVC Controller方法:

  @RequestMapping(value = "/submitUserList_2", method ={RequestMethod.POST})
  @ResponseBody
  public String submitUserList_2(UserModel users)
      throws Exception{
    String result = "";
    List<User> userList = users.getUsers();
    if(userList == null || userList.size() <= 0){ return "No any ID.中文"; }
    result = this.showUserList(userList);
    return result;
  }

第3种方法:将Json对象序列化成Json字符串提交,以List接收

HTML代码:

<head>
  <title>submitUserList_3</title>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <script language="JavaScript" src="/js/jquery.min.js" ></script>
  <script language="JavaScript" src="/js/jquery.json.min.js" ></script>
  <script type="text/javascript" language="JavaScript">
    function submitUserList_3() {alert("ok");
      var customerArray = new Array();
      customerArray.push({id: "1", name: "李四", pwd: "123"});
      customerArray.push({id: "2", name: "张三", pwd: "332"});
      $.ajax({
        url: "/user/submitUserList_3",
        type: "POST",
        contentType : 'application/json;charset=utf-8', //设置请求头信息
        dataType:"json",
        //data: JSON.stringify(customerArray),  //将Json对象序列化成Json字符串,JSON.stringify()原生态方法
        data: $.toJSON(customerArray),      //将Json对象序列化成Json字符串,toJSON()需要引用jquery.json.min.js
        success: function(data){
          alert(data);
        },
        error: function(res){
          alert(res.responseText);
        }
      });
    }
  </script>
</head>

<body>
  <h1>submitUserList_3</h1>
  <input id="submit" type="button" value="Submit" onclick="submitUserList_3();">
</body>

Java代码:

  @RequestMapping(value = "/submitUserList_3", method ={RequestMethod.POST})
  @ResponseBody
  public String submitUserList_3(@RequestBody List<User> users)
      throws Exception{
    String result = "";
    if(users == null || users.size() <= 0){ return "No any ID.中文"; }
    result = this.showUserList(users);
    return result;
  }

第4种方法:将表单对象序列化成Json字符串提交,以List接收

HTML代码:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <title>submitUserList_4</title>
  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <script language="JavaScript" src="/js/jquery.min.js" ></script>
  <script type="text/javascript" language="JavaScript">
    //将表单序列化成json格式的数据(但不适用于含有控件的表单,例如复选框、多选的select)
    (function($){
      $.fn.serializeJson = function(){
        var jsonData1 = {};
        var serializeArray = this.serializeArray();
        // 先转换成{"id": ["12","14"], "name": ["aaa","bbb"], "pwd":["pwd1","pwd2"]}这种形式
        $(serializeArray).each(function () {
          if (jsonData1[this.name]) {
            if ($.isArray(jsonData1[this.name])) {
              jsonData1[this.name].push(this.value);
            } else {
              jsonData1[this.name] = [jsonData1[this.name], this.value];
            }
          } else {
            jsonData1[this.name] = this.value;
          }
        });
        // 再转成[{"id": "12", "name": "aaa", "pwd":"pwd1"},{"id": "14", "name": "bb", "pwd":"pwd2"}]的形式
        var vCount = 0;
        // 计算json内部的数组最大长度
        for(var item in jsonData1){
          var tmp = $.isArray(jsonData1[item]) ? jsonData1[item].length : 1;
          vCount = (tmp > vCount) ? tmp : vCount;
        }

        if(vCount > 1) {
          var jsonData2 = new Array();
          for(var i = 0; i < vCount; i++){
            var jsonObj = {};
            for(var item in jsonData1) {
              jsonObj[item] = jsonData1[item][i];
            }
            jsonData2.push(jsonObj);
          }
          return JSON.stringify(jsonData2);
        }else{
          return "[" + JSON.stringify(jsonData1) + "]";
        }
      };
    })(jQuery);

    function submitUserList_4() {alert("ok");
      var jsonStr = $("#form1").serializeJson();
      //console.log("jsonStr:\r\n" + jsonStr);
      //alert(jsonStr);
      $.ajax({
        url: "/user/submitUserList_4",
        type: "POST",
        contentType : 'application/json;charset=utf-8', //设置请求头信息
        dataType:"json",
        data: jsonStr,
        success: function(data){
          alert(data);
        },
        error: function(res){
          alert(res.responseText);
        }
      });
    }
  </script>
</head>

<body>
  <h1>submitUserList_4</h1>
  <form id="form1">
    ID:<input type="text" name="id"><br/>
    Username:<input type="text" name="name"><br/>
    Password:<input type="text" name="pwd"><br/><br/>

    ID:<input type="text" name="id"><br/>
    Username:<input type="text" name="name"><br/>
    Password:<input type="text" name="pwd"><br/><br/>
    <input type="button" value="submit" onclick="submitUserList_4();">
  </form>
</body>
</html>

Java代码:

  @RequestMapping(value = "/submitUserList_4", method ={RequestMethod.POST})
  @ResponseBody
  public String submitUserList_4(@RequestBody List<User> users)
      throws Exception{
    String result = "";
    if(users == null || users.size() <= 0){ return "No any ID.中文"; }
    result = this.showUserList(users);
    return result;
  }

总结:
第1、2种方法其实都有一个共同的BUG:假如提交三条记录时,前面两条记录的某些字段不填值的话,在SpringMVC里接收不准确了。而且,每2种方法在HMTL中需要给name属性添加[下标],如果下标有跨度的话(比如第一组控件下标是0,第二组下标是2),那么SpringMVC里其实的是0到2三个对象的,默认下标是1的那个对象全为null值。
第3、4种方法最实用。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringMVC实现controller中获取session的实例代码

    平时使用springMVC,在方法中访问session中经常很自然地调用Servlet API.用起来非常直观方便,一直没有多考虑什么. 比如这样: @RequestMapping(value = "/logout") public String logout(HttpSession session) { session.removeAttribute("user"); return "/login"; } 但毕竟这样对Servlet API产生

  • 详解SpringMVC中设置静态资源不被拦截的问题

    这两天使用SpringMVC来做登录,注册的小demo,其中用到了springmvc拦截器对登录操作进行拦截处理,并对url进行验证.验证通过则可以进行handler的处理,如果验证不通过直接跳回或者重定向到指定的页面. 但是在做这个操作的时候,遇到很大的一个问题就是项目demo中的静态资源都会在每次请求中被拦截处理了!跳回页面的时候,页面就不再是想想中的呈现的样子了. 以为我在springmvc.xml中已经配置了拦截器和静态资源的配置却还是出现这样的结果,所以就又是看前段浏览器的设置,又是看

  • SpringMVC对日期类型的转换示例

    在做web开发的时候,页面传入的都是String类型,SpringMVC可以对一些基本的类型进行转换,但是对于日期类的转换可能就需要我们配置. 1.如果查询类使我们自己写,那么在属性前面加上@DateTimeFormat(pattern = "yyyy-MM-dd")  ,即可将String转换为Date类型,如下 @DateTimeFormat(pattern = "yyyy-MM-dd") private Date createTime; 2.如果我们只负责we

  • SpringMVC访问静态资源的方法

    在SpringMVC中常用的就是Controller与View.但是我们常常会需要访问静态资源,如html,js,css,image等. 默认的访问的URL都会被DispatcherServlet所拦截,但是我们希望静态资源可以直接访问.该肿么办呢? 在配置文件:web.xml可以看到: <!-- Processes application requests --> <servlet> <servlet-name>appServlet</servlet-name&

  • SpringMVC 实现用户登录实例代码

    SpringMVC的一个登陆小案例 准备工作 创建一个Dynamic Web Project(本人是Eclipse) 添加相关的jar包,构建路径 创建springMVC-servlet.xml,及完善web.xml 创建代码逻辑 目录结构如下 对于新手而言,有一个项目的完整的目录结构是多么幸福的一件事啊. 目录结构 个人建议:注意其中的springMVC-servlet.xml的位置.以及源代码包的名称. 代码实战 首先是大管家,web.xml: <?xml version="1.0&q

  • 详解SpringMVC重定向传参数的实现

    在spring的一个controller中要把参数传到页面,只要配置视图解析器,把参数添加到Model中,在页面用el表达式就可以取到.但是,这样使用的是forward方式,浏览器的地址栏是不变的,如果这时候浏览器F5刷新,就会造成表单重复提交的情况.所以,我们可以使用重定向的方式,改变浏览器的地址栏,防止表单因为刷新重复提交. jsp文件: <%@ page language="java" contentType="text/html; charset=UTF-8&q

  • springMvc请求的跳转和传值的方法

    forword跳转页面的三种方式: 1.使用serlvet /** * 使用forward跳转,传递基本类型参数到页面 * 注意: * 1.使用servlet原生API Request作用域 * */ @RequestMapping("/test") public String test(HttpServletRequest request,HttpServletResponse response){ String name = "张小三"; request.set

  • springmvc处理异步请求的示例

    springmvc 3.2开始就支持servlet3.0的异步请求.平常我们请求一个controller一般都是同步的,如果在代码执行中,遇到耗时的业务操作,那servlet容器线程就会被锁死,当有其他请求进来的时候就会受堵了. springmvc3.2之后支持异步请求,能够在controller中返回一个Callable或者DeferredResult.当返回Callable的时候,大概的执行过程如下: 当controller返回值是Callable的时候,springmvc就会启动一个线程将

  • 解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理

    有时在Spring MVC中返回JSON格式的response的时候会使用@ResponseBody注解,不过在处理java8中时间的时候会很麻烦,一般我们使用的HTTPMessageConverter是MappingJackson2HttpMessageConverter,它默认返回的时间格式是这种: "startDate" : { "year" : 2010, "month" : "JANUARY", "dayO

  • SpringMVC接收多个对象的4种方法

    问题背景: 我要在一个表单里同时一次性提交多名乘客的个人信息到SpringMVC,前端HTML和SpringMVC Controller里该如何处理? 第1种方法:表单提交,以字段数组接收: 第2种方法:表单提交,以BeanListModel接收: 第3种方法:将Json对象序列化成Json字符串提交,以List接收: 第4种方法:将表单对象序列化成Json字符串提交,以List接收: 第4种方法其实是第3种方法的升级,就是将表单转成Json对象,再转成Json字符串提交: 然而,第4种方法还不

  • SpringMVC接收复杂集合对象(参数)代码示例

    SpringMVC在接收集合请求参数时,需要在Controller方法的集合参数里前添加@RequestBody,而@RequestBody默认接收的enctype(MIME编码)是application/json,因此发送POST请求时需要设置请求报文头信息,否则SpringMVC在解析集合请求参数时不会自动的转换成JSON数据再解析成相应的集合.以下列举接收List<String>.List<User>.List<Map<String,Object>>.

  • SpringMVC 接收前端传递的参数四种方式小结

    目录 SpringMVC 接收前端传递的参数四种方式 @RequestParam 获取注解 @PathVariable获取注解 SpringMVC,可以不设置任何注解即可接收参数 SpringMVC,也可以自动包装成对象 @RequestBody 用来接收数组或者复杂对象 SpringMVC的自动封装(不传参也能进入) SpringMVC接收不到前端传递的参数原因 代码清单 SpringMVC 接收前端传递的参数四种方式 @RequestParam注解 @PathVariable注解 Sprin

  • springmvc接收json串,转换为实体类List方法

    开始我用List<泛型>接受json串,如下,结果list内并非泛型对象,而是JSONObject对象.这样在遍历的时候就报了转化异常的错误.我不知道为什么springmvc在处理这个的时候并没有将json对象转化为泛型对象(我认为应该能获取到,可能是配置问题或者使用不当导致的),这个错误用实际证明了java是假泛型. 如何解决呢,暂时有两种方案,第一种是使用json工具类转化json对象为泛型对象,第二种使用数组接受,然后将数组转化为list对象.代码如下下.如果哪天找到了更好的解决方案,或

  • springboot 接收List 入参的几种方法

    目录 第一种方式:使用@ModelAttribute 注解 + 对象接收 第二种方式: 使用 @RequestParam 注解接收 第三种方式:利用数组接收 第四种方式: 第五种方式: @RequestBody 加 对象 接收 第六种方式: 接收list<T>对象 第七种方式:  利用String 接收然后参数,然后在后台强转 第一种方式:使用@ModelAttribute 注解 + 对象接收 1. get 请求  入参为 projectIds=1,2,3 2. @RequestMapping

  • Spring Data Jpa返回自定义对象的3种方法实例

    目录 方法一.简单查询直接new对象 方法二.Service层使用EntityManager 方法三.Dao层使用Map接收自定义对象 总结 tasks表对应的Entity @Entity @NoArgsConstructor @AllArgsConstructor @Table(name = "tasks") @Data public class Tasks extends BaseEntity { @Id @GeneratedValue(strategy = GenerationT

  • Python中的is和==比较两个对象的两种方法

    Python中的is和==比较两个对象的两种方法 在Python中有两种方式比较两个对象是否相等,分别是is和==,两者之间是不同的 ==比较的是值(如同java中的equals方法) is比较的是引用(可以看作比较内存地址, 类似于java中的==) 对于: >>> n = 1 >>> n is 1 True >>> b = '1' >>> b is 1 False >>> n == b False 由于1和'1'

  • Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍

    Android Intent传递对象的两种方法(Serializable,Parcelable)详细介绍 今天要给大家讲一下Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putParcelable(Key, Object);当然这些Object是有一定的条件的,前者是实现了Serializable接口,而后者是实现了Parcelable接口,为了让大家更容易理解我还是照常写

  • JS实现判断对象是否为空对象的5种方法

    1.将json对象转化为json字符串,再判断该字符串是否为"{}" var data = {}; var b = (JSON.stringify(data) == "{}"); alert(b);//true 2.for in 循环判断 var obj = {}; var b = function() { for(var key in obj) { return false; } return true; } alert(b());//true 3.jquery的

  • java8 List<Object>去掉重复对象的几种方法

    目录 一.去除List中重复的String 二.List中对象去重 三.根据对象的属性去重 参考: 一.去除List中重复的String public List<String> removeStringListDupli(List<String> stringList) {     Set<String> set = new LinkedHashSet<>();     set.addAll(stringList);     stringList.clear

随机推荐