我的乖乖,ajax传值后台接收不到

我的乖乖,使用ajax传值后台接收不到!

情况:在利用ajax传值时,阿红遇到的情况如下,在设置jsp的ajax请求方式为:

<script>
    $("#btn1").click(function (){
        let url = "${pageContext.request.contextPath}/user/getAjaxInfo";
        $.ajax({
            type:'post',
            dataType:'json',
            url:url,
            data:{
                "id":23,
                "username":"王五"
            },
            contentType:'application/json;charset=utf-8',
            success: function (resp) {
                alert(JSON.stringify(resp));
            }
        })
    })
</script>

利用springMVC来接收参数:

  @ResponseBody
    @RequestMapping("/getAjaxInfo")
    public String ajax( @RequestParam("id") int id ,@RequestParam("username") String username){
        StringBuffer str = new StringBuffer();
        str.append(" id="+id).append("username="+username);
        System.out.println("------------"+str.toString());
        return str.toString();
    }

后台出现错误:

image-20220312112620676

利用浏览器查看请求信息:

image-20220312112734943

出现问题的原因:

出现这个请求无效说明请求没有进入后台服务器里,也就是我们值没有传到后台中。在我百思不得其解,是了几遍有几遍,问题还是没有解决。

问题分析:

  1. 表示服务器接收的数据类型为json

    dataType:‘json’,

  2. 表示数据请求服务器的数据格式

    contentType:‘application/json;charset=utf-8’,

contentType: "application/json”,首先明确一点,这也是一种文本类型(和text/json一样),表示json格式的字符串,如果ajax中设置为该类型,则发送的json对象必须要使用JSON.stringify进行序列化成字符串才能和设定的这个类型匹配。

而自己在后台接收参数直接用@RequestParam来接收,

@RequestParam("id") int id ,@RequestParam("username") String username

传递过来的并不是简单参数,而是一个json对象。所以我们必须要使用@RequestBody来注解来接收。

@RequestBody作用:主要用来解析前端传递给后端json字符串中的数据的

image-20220312115510544

但我们想拿到每个参数的对应值,此时可以采用Map<String,String>接收

@RequestMapping(value = "/Login",method = {RequestMethod.POST})
     public @ResponseBody Boolean Login(@RequestBody Map<String,String> map) {
        //此时map.get("id" 23)就是前端的id
        System.out.println(map.get("id"));
       //map.get("username" wangwu)就是前端的username
       System.out.println(map.get( "username"));

或者利用application/x-www-form-urlencoded的默认值(从前台删除即可)

后台接收:

    @ResponseBody
    @RequestMapping("/getAjaxInfo")
    public String ajax( @RequestParam("id") int id ,@RequestParam("username") String username){
        StringBuffer str = new StringBuffer();
        str.append(" id="+id).append("username="+username);
        System.out.println("------------"+str.toString());
        return str.toString();
    }

image-20220312120120624

2.application/x-www-form-urlencoded 和 application/json 两种类型的数据在后端如何接收并解析?
application/x-www-form-urlencoded 这种类型的参数提交方式有get和post两种,这两种方式的区别是前者把编码后的user=username&pass=password这种形式的参数放在url上进行提交,后者是放在请求报文的请求体部分进行发送,只是发送数据时数据放的位置不一样。服务端收到 user=username&pass=password 这种形式的参数后,原生的Servlet使用request.getParameter(“user”)的这种形式即可获取参数,spring mvc 中 框架可自动根据参数名进行匹配,即表单元素的name属性和接收参数的名称一样时即可自动匹配,如果不一样,还可以使用@RequestParam的方式匹配。

application/json 字符串数据原生的Servlet中可以使用request.getParameterMap()来获取,但需注意,这种只能获取Get方式传入的数据。post传入的需要使用输入流的方式来读取。在spring mvc中通过@RequestBody来解析并绑定json字符串参数到方法入参。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,Ajax可以向后端传递参数。一种常见的方式是使用GET或POST方法发送请求,并将参数作为请求的一部分发送给后端。下面是一个前后端的例子: 前端代码(HTML + JavaScript): ```html <!DOCTYPE html> <html> <head> <title>Ajax Example</title> <script> function sendData() { var xhr = new XMLHttpRequest(); var name = document.getElementById('name').value; var age = document.getElementById('age').value; var params = "name=" + encodeURIComponent(name) + "&age=" + encodeURIComponent(age); xhr.open('POST', 'backend.php', true); xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { var response = xhr.responseText; document.getElementById('output').innerHTML = response; } }; xhr.send(params); } </script> </head> <body> <input type="text" id="name" placeholder="Name"> <input type="text" id="age" placeholder="Age"> <button onclick="sendData()">Send Data</button> <div id="output"></div> </body> </html> ``` 后端代码(PHP): ```php <?php $name = $_POST['name']; $age = $_POST['age']; // 处理数据,这里只是简单地将数据拼接成字符串作为响应返回 $response = "Name: " . $name . ", Age: " . $age; echo $response; ?> ``` 在这个例子中,我们通过`document.getElementById()`方法获取了输入框中的name和age的值,并将它们作为参数传递给后端。在前端的`sendData()`函数中,我们使用`encodeURIComponent()`对参数进行编码,以确保特殊字符正确传递。 然后,我们创建了一个XMLHttpRequest对象,并使用POST方法向后端的`backend.php`发送请求。我们设置了请求头`Content-type`为`application/x-www-form-urlencoded`,并将参数作为请求的正文部分发送。 在后端的PHP代码中,我们通过`$_POST`超全局变量获取到传递过来的参数。然后,我们可以根据需要对数据进行处理,这里只是简单地将参数拼接成字符串作为响应返回。 当用户点击"Send Data"按钮时,前端会将name和age的值作为参数发送给后端,并将后端返回的响应数据显示在页面上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值