关于springboot中遇到的前后端传参问题及解决方法

关于org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported和Could not read document: Unrecognized token '’: was expecting (‘true’, ‘false’ or ‘null’)异常解决办法*

##问题##
最近在写springboot项目时遇到了传参问题,最初是想把jsp页面(本项目直接用了原生js写的jsp页面,没有做前后端分离)的一个复选框中选中的用户(批量)的id传给后端controller方法,不知道该怎么传参和接受解析批量数据

原因:Could not read document: Unrecognized token ‘*’: was expecting (‘true’, ‘false’ or ‘null’)异常是因为后端接收时用的注解不匹配,就是RequestBody不能解析multipart和form-data数据,需要用RequestParam解析,具体参考这篇博:https://blog.csdn.net/suxiexingchen/article/details/81214131

## 关于org.springframework.web.HttpMediaTypeNotSupportedException: Content type ‘application/x-www-form-urlencoded;charset=UTF-8’ not supported其他很多博客都能查到,在ajax请求中加一句:contentType: “application/json;charset=UTF-8”,
代码片.

// An highlighted block
$.ajax({
            url: url,
            type: 'post',
            contentType: "application/json;charset=UTF-8",
        });

关于批量参数传递的解决方案:

用数组存储被选中的用户ID(只要传ID就可以,其他信息可以在后端靠ID查到),jsp部分代码如下:

代码片.

//表单部分
<body>
<div align="center">
    <form action="${PageContext.request.getContextPath}/testboot/batchaddper" method="POST">
        <table border="1" style="background-color: dodgerblue">
            <tr>
            //这里用来控制全选
                <td><input id="c" type="checkbox" name="selectall" onclick="selectAll()">全选td>
            tr>
            <tr><c:forEach items="${user_list}" var="uList" varStatus="ind">tr>
            <tr><td><input type="checkbox" name="u_list" onclick="toCheck()" value="${uList.id}">
                    <c:if test="$ind.index==1">checked="checked"c:if>td>
                <td style="background-color: deepskyblue">${uList.id}td>
                <td style="background-color: darkgrey">${uList.u_name}td>
                <td style="background-color: gray">${uList.username}td>
            c:forEach>
            tr>
        table>
        //下面是一个下拉选择框,需要传一个id
        <select>
            <c:forEach items="${per_list}" var="plist">
                <option id="perid" value="${plist.id}">${plist.r_name}option>
            c:forEach>
        select>
        <input type="button" id="submit"  value="添加权限">
    form>
div>
body>

下面是js部分代码:
代码片.

//记得引入jQuery
<script src="/js/jquery-3.4.1.min.js"></script>
<script language="JavaScript" type="text/javascript">

    $("#submit").click(function(){
        var url = $('form').attr("action");
        //定义一个数组
        var uid = [];
        //获取选中的一行表单的值
        $("input:checkbox:checked").each(function(i){
            if($(this).val()=="on"){
            //如果全选会多个“on”字符串,需要判断消除
            }else{
                uid[i] = $(this).val();
            }
        });
        var pid = $("#perid").val();

        // console.log($("input:checkbox:checked"));
        $.ajax({
            url: url,
            type: 'post',
            datatype: "json",
            //传多个参数用{}括起来
            data: {"id":uid,"pid":pid},
            success: function (s) {
                alert("s",s);
            },
            error: function (e) {
                alert(e.responseText);
            }
        });
    })
    </script>

后端controller方法接受部分:

代码片.

//注意请求类型的统一,POST和GET
 @RequestMapping(value = "/batchaddper", method = RequestMethod.POST)
    public ModelAndView batchaddper(@RequestParam(value ="User", required = false) List<User> list,int pid){
    //如果没报错就可以调用你的service方法传入list和pid进行数据库操作啦
        ModelAndView mv = new ModelAndView();
        mv.setViewName("/successActionPage");
        return mv;
    }

如果前端传给后端的是一个字符串,比如你用JSON.stringify把要传的东西转成字符串传,建议后端了解一下fast JSON,别自己写个算法去往字符串里拆东西出来,这些麻烦事是框架的人会考虑到的。

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。

你可能感兴趣的:(springboot)