我的乖乖,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',
  1. 表示数据请求服务器的数据格式
contentType:'application/json;charset=utf-8',

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

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

扫描二维码关注公众号,回复: 13750102 查看本文章
@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字符串参数到方法入参。

猜你喜欢

转载自blog.csdn.net/qq_41239465/article/details/123441423