Spring MVC参数自动绑定List的解决方法

最近遇到一个问题,在项目中需要传入一组对象。以前都只遇到过传入一个对象、多个对象或者一组数组的情况。很少遇到传入一组对象的情况。所以遇到这个问题的时候感觉有点棘手。本以为用这样的方法就能解决的。

@RequestMapping("save1")
public void save1(Plan plan, List<PlanItem> planItems, HttpServletResponse response) {
  //TODO more...
  addMessage(response, MESSAGE_TYPE_SUCCESS, null, MESSAGE_SUCCESS);
}

但是后来发现自己太傻太天真。这样的方式根本就绑定不了参数。有人说spring相较于struts追求了性能就必定要牺牲一部分东西。但是我对于spring和struts并没有什么研究,只是当一个工具再用而已。所以,我真的不知道为什么。扯远了,回到正题上。网上还有其他的解决方案。就是采用这种方式

public class PersonList { 

  private List<Person> person; 

  public List<Person> getPerson() {
    return person;
  } 

  public void setPerson(List<Person> person) {
    this.Person= person;
  } 

} 

controller里:

@RequestMapping(value = "xxx", method = RequestMethod.POST)
  public void test(PersonList person) {
    //遍历person
    }
}

页面要这样写:

<form id="form" action="test/test.do" method="post">
<input type="text" name="person[0].username" value="jobs"/>
<input type="text" name="person[0].age" value="55"/><br/>
<input type="text" name="person[1].username]" value="jim"/>
<input type="text" name="person[1].age" value="21"/><br/>
<input type="submit">
<form>

但是这种方法我试了,还是不行。不晓得是我太蠢还是为什么。

几经周折找到了另外一种解决方案。将list对象的json字符串传入后台。后台接收到参数后。再将json转为对象。前端代码就免了,后台代码如下。

@RequestMapping("save")
public void save(Plan plan, String planItemJson, HttpServletResponse response) {
  List<PlanItem> parseArray = JSON.parseArray(planItemJson, PlanItem.class);
  //TODO what u want
  addMessage(response, MESSAGE_TYPE_SUCCESS, null, MESSAGE_SUCCESS);
}

但是这样有一个小问题,就是json字符串,会被前段自动在key的地方加上双引号。导致后台解码的时候,将双引号转义为“&quot;”所以还需要将“&quot;”转为双引号。即,最终代码为

@RequestMapping("save")
public void save(Plan plan, String planItemJson, HttpServletResponse response) {
  planItemJson = planItemJson.replaceAll(""","\"");
  List<PlanItem> parseArray = JSON.parseArray(planItemJson, PlanItem.class);
  //TODO what u want
  addMessage(response, MESSAGE_TYPE_SUCCESS, null, MESSAGE_SUCCESS);
}

经测试,该方法对于list对象里面再包含list对象也是一样起作用的。

PS:为了提高程序健壮性,可以在转义JSON对象之后,对json进行校验,这样就避免了json转java对象出错的情况。

或者采用更加暴力的方式,在json转list的时候进行try catch操作。

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

(0)

相关推荐

  • spring mvc实现文件上传并携带其他参数的示例

    这是主要使用到的jar 文件是:spring mvc +apache common-fileuplad 第一步:web.xml 文件.[重点是spring mvc的拦截器和相关监听器] <?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi

  • 详解SpringMVC——接收请求参数和页面传参

    spring接收请求参数: 1,使用HttpServletRequest获取 @RequestMapping("/login.do") public String login(HttpServletRequest request){ String name = request.getParameter("name") String pass = request.getParameter("pass") } 2,Spring会自动将表单参数注入到方

  • Angular.js前台传list数组由后台spring MVC接收数组示例代码

    前言 本文主要给大家介绍了关于Angular.js前台传list数组由后台spring MVC接收数组的相关内容,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍吧. 在开发中有时候需要在前台自定义对象,然后把对象封装在list中,在传送到后台,这样的思想也比较合理,直接来看示例代码: 1. 前台代码 $scope.saveScore = function () { $scope.userScoreList = new Array();//自定义数组 angular.forEach (

  • 详解获取Spring MVC中所有RequestMapping以及对应方法和参数

    在Spring MVC中想要对每一个URL进行权限控制,不想手工整理这样会有遗漏,所以就动手写程序了.代码如下: /** * @return * @author Elwin ZHANG * 创建时间:2017年3月8日 上午11:48:22 * 功能:返回系统中的所有控制器映射路径,以及对应的方法 */ @RequestMapping(value = "/maps", produces = "application/json; charset=utf-8") @Re

  • 学习SpringMVC——如何获取请求参数详解

    @RequestParam,你一定见过:@PathVariable,你肯定也知道:@QueryParam,你怎么会不晓得?!还有你熟悉的他(@CookieValue)!她(@ModelAndView)!它(@ModelAttribute)!没错,仅注解这块,spring mvc就为你打开了五彩斑斓的世界.来来来,不要兴(mi)奋(hu),坐下来,我们好好聊聊这么些个注解兄弟们~~~(wait, 都没有听过? 好,来,你坐前排,就你!)  一.spring mvc如何匹配请求路径--"请求路径哪家

  • [Spring MVC]-详解SpringMVC的各种参数绑定方式

    SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似): Controller代码: @RequestMapping("saysth.do") public void test(int count) { } 表单代码: <form action="saysth.do" method="post"> <input name="count" value="10" t

  • SpringMVC中使用bean来接收form表单提交的参数时的注意点

    这是前辈们对于SpringMVC接收表单数据记录下来的总结经验: SpringMVC接收页面表单参数 springmvc请求参数获取的几种方法 下面是我自己在使用时发现的,前辈们没有记录的细节和注意点: 使用bean来接收form表单提交的参数时,pojo中必须含有默认的(即空的)构造函数,同时,需要设置到bean中的变量必须有setter方法. 注:以下代码均为示例代码,非本人实际运行代码,请自行补充. 例如:我有一个bean类是User,具有变量username和password.同时,表单

  • 解决angular的post请求后SpringMVC后台接收不到参数值问题的方法

    这是我后台SpringMVC控制器接收isform参数的方法,只是简单的打出它的值: @RequestMapping(method = RequestMethod.POST) @ResponseBody public Map<String, Object> save( @RequestParam(value = "isform", required = false) String isform) { System.out.println("isform value

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

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

  • spring mvc中的@PathVariable获得请求url中的动态参数

    spring mvc中的@PathVariable是用来获得请求url中的动态参数的,十分方便,复习下: @Controller public class TestController { @RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET) public String getLogin(@PathVariable("userId") String user

随机推荐