Spring MVC(九)--控制器接受对象列表参数

前一篇文章介绍是传递一个参数列表,列表中的元素为基本类型,其实有时候需要传递多个同一类型的对象,测试也可以使用列表,只是列表中的元素为对象类型。

我模拟的场景是:通过页面按钮触发传递参数的请求,为了简单起见将需要传递的对象列表写死,然后渲染到JSON视图中,在前端查看获取到的参数是不是传过去的值。

1、创建触发请求页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<%
    String root = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort()
            + root + "/";
%>
<script type="text/javascript"
    src="<%=basePath%>jslib/jquery-1.8.3.min.js"></script>
<script type="text/javascript" src="<%=basePath%>jslib/jquery.form.js"></script>
<script type="text/javascript" src="<%=basePath%>js/param.js"></script>
<link href="<%=basePath%>css/param.css" type="text/css" rel="stylesheet">
<title>Insert title here</title>
</head>
<body>
    <div class="param">
        <!--使用列表传递参数:列表元素为对象类型  -->
        <div class="public objList">
            <p style="text-align: center;">列表方式传递参数(对象类型)</p>
            <div id="objListForm">
                <input type="button" value="测试" id="setObjListParam">
            </div>
        </div>
</body>
</html>

页面效果如下:

只要点击测试按钮,就可以触发请求,所以接下来就是给按钮绑定一个请求事件。

2、绑定请求

$(function() {

    /* 列表方式传递数据:列表元素为对象类型 */
    var paramList = [ {
        paramId : 1,
        paramName : "testname",
        paramDesc : "testdesc",
        pramTime : "20181003"
    }, {
        paramId : 2,
        paramName : "testname",
        paramDesc : "testdesc",
        pramTime : "20181003"
    }, {
        paramId : 3,
        paramName : "testname",
        paramDesc : "testdesc",
        pramTime : "20181003"
    } ];
    $("#setObjListParam").click(function() {
        $.ajax({
            url : "./objListParam",
            type : "POST",
            /* 此处需要定义传递参数的类型为json */
            contentType : "application/json",
            /* 将json转化为字符串 */
            data : JSON.stringify(paramList),
            success : function(data) {
                console.info(data.paramList);
            }
        });
    });

});

其中列表中对象对应的pojo如下:

public class Param {
    private Integer paramId;

    private String paramName;

    private String paramDesc;

    private String pramTime;

    public Integer getParamId() {
        return paramId;
    }

    public void setParamId(Integer paramId) {
        this.paramId = paramId;
    }

    public String getParamName() {
        return paramName;
    }

    public void setParamName(String paramName) {
        this.paramName = paramName == null ? null : paramName.trim();
    }

    public String getParamDesc() {
        return paramDesc;
    }

    public void setParamDesc(String paramDesc) {
        this.paramDesc = paramDesc == null ? null : paramDesc.trim();
    }

    public String getPramTime() {
        return pramTime;
    }

    public void setPramTime(String pramTime) {
        this.pramTime = pramTime == null ? null : pramTime.trim();
    }
}

注意⚠️:对象列表中对象的各属性名必须和对应的pojo中的属性名保持一致,这才是关键。

3、创建控制器

@Controller
@RequestMapping("/param")
public class ParamController {

    /**
     * 获取列表数据:列表元素为对象类型
     * 
     * @param idList
     * @return
     */
    @RequestMapping(value = "objListParam")
    public ModelAndView getParamByObjList(@RequestBody List<Param> paramList) {
        ModelAndView mv = new ModelAndView();
        mv.addObject(paramList);
        mv.setView(new MappingJackson2JsonView());
        return mv;
    }

}

上面代码中红色加粗的部分,就是接受对象列表的方式,还是使用注解@RequestBody,并且参数类型是一个对象列表,参数名就是前端定义的参数名。这个控制器中我直接获取的参数渲染到JSON视图中。至此代码全部完成,下面进行测试。

4、测试

因为控制器中直接将获取到的参数渲染到JSON视图中了,所以测试只要点击页面按钮查看响应结果即可。

👇请求参数,可以看到是个对席那个列表,就是前端自定义的列表。

👇响应结果,可以看到和前端传递的参数完全一样,只不过是个JSON格式,证明控制器接受参数成功。

5、总结

这种方式需要注意以下几点

  • 对象列表中各对象的字段必须和对应的pojo属性保持一致;
  • 传给请求方法的参数名称就是前端定义的列表名称;
  • 请求时需要将对象列表转化成字符串传递;
  • 方法接受参数时使用注解@RequestBody,并且参数类型为对象列表;
posted @ 2018-10-04 10:43  bug改了我  阅读(1215)  评论(0编辑  收藏  举报