不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2021-05-24 10:08:27  修改时间:2024-03-23 14:34:02  分类:Java框架/系统  编辑

1.Ajax 请求 无论为 post ,或者 get ,url中带有?形式的参数,后台都能以String类型变量接收,变量名称和参数名称必须一致

前台Ajax:

$.ajax(
    "productForm?loginname2=jichen", // 发送请求的URL字符串。
    {
        dataType : "JSON", // 预期服务器返回的数据类型。如果服务器返回不一致,报 parseError
        type : "post" 或者 "get", // 请求方式 POST或GET
        contentType : "application/json;charset=UTF-8", // 发送信息至服务器时的内容编码类型
        。。。
    }
);

后台 Spring MVC:

@RequestMapping(value="/productForm")
@ResponseBody // 这个注解意味着这个方法的返回值不是页面名称,而是同一次请求的返回体(也就是服务器返回给客户端的数据)
public String ProductPost(String loginname2) { // 此处必须和前台传的参数名称一致
    System.out.println(loginname2); // 打印的值就是 jichen
}

2.推荐Ajax 请求 为 post , contentType 必须为 "application/json;charset=UTF-8",data 必须用 JSON.stringify() 格式化: JSON.stringify({id : 1}),则后台可以用 Map 类型的@RequestBody Map data 来接收,缺一不可;

前台Ajax:

$.ajax(
    "productForm?loginname2=jichen", // 发送请求的URL字符串。
    {
        type: "post", 
        contentType: "application/json;charset=UTF-8", // 发送信息至服务器时的内容编码类型,如果不加 charset,则中文传到后台为乱码

        // 发送到服务器的数据。
        data: JSON.stringify({id: 1, loginname: "Spring MVC企业应用实战"})
    }
)

后台springMVC:

@RequestMapping(value="/productForm")
@ResponseBody // 这个注解意味着这个方法的返回值不是页面名称,而是同一次请求的返回体(也就是服务器返回给客户端的数据)
public String ProductPost(String loginname2, @RequestBody Map data) {
    System.out.println(data.get("loginname")); // 打印出来 Spring MVC企业应用实战
}

3.Ajax 请求 为 get,data 不能用 JSON.stringify 格式化: JSON.stringify({id : 1}),可以直接传一个对象:{id : 1},如果传的是一个对象,则相当于给 url 加?形式的参数 productForm?id=1 ,如果用 JSON.stringify 格式化,报错:

Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

 还有,如果为 get 请求,则后台 springMVC 不能用 @RequestBody注解,因为http 1.1协议不支持,如果使用,报错:

Required request body is missing

前台Ajax:

$.ajax("productForm?loginname=jichen", // 发送请求的URL字符串。
    {
        dataType: "JSON", // 预期服务器返回的数据类型。如果服务器返回不一致,报 parseError
        type: "get", 

        // 发送到服务器的数据。
        data: {id: 1, loginname: "Spring MVC企业应用实战", auto: 123}
    }
)

后台SpringMVC:

@RequestMapping(value="/productForm")
@ResponseBody // 这个注解意味着这个方法的返回值不是页面名称,而是同一次请求的返回体(也就是服务器返回给客户端的数据)
public String ProductPost(String loginname) {                                  
    System.out.println(data.get("loginname")); // 打印出来 jichen,Spring MVC?????(使用?方式传参,中文为乱码)
}

4.如果把 3 的 type 改为 post,contentType 不能写 application/json (可直接省略,如果写成 application/json ,则data 对象传不到后台), data传的是对象{id: 1, loginname: "Spring MVC企业应用实战", auto: 123},其它不变,则还是相当于给url带参,?id=1&auto=123.。。。,但是,传到后台的中文不是乱码,神奇!

 

 

参考:

Spring MVC 中 ajax get 请求和 post 请求的坑以及参数传递

Spring MVC请求参数获取的几种方法

学习Spring MVC——如何获取请求参数

Spring MVC怎么获取request的请求参数