创建名为spring_mvc_ajax的新module,过程参考9.1节和9.5节

10.1、SpringMVC处理Ajax请求

10.1.1、页面请求示例

<input type="button" value="测试SpringMVC处理Ajax请求" onclick="testAjax()">

<script type="text/javascript">
function testAjax() {
// 实例化 XMLHttpRequest 对象
var xhr = new XMLHttpRequest() // 设置请求方式和请求路径
// 因为thymeleaf语法只能应用于html的属性,所以在js中的请求要包含上下文信息
xhr.open("post","/spring_mvc_ajax/test/ajax?id=1001") // 设置请求头
// 一般 get 不需要设置,而 post 必须设置请求头
// 必须写在在open()和send()之间
xhr.setRequestHeader("Content-Type", "application/json") // 发送请求
// JSON.stringify() 是用来将合法的JSON数据字符串化的
xhr.send( JSON.stringify( {"username":"admin","password":123} ) ) // 设置 XMLHttpRequest 对象状态变化事件的处理函数
xhr.onreadystatechange = function () {
// readyState的值为4时,表示已获取到服务器的响应
if (xhr.readyState == 4){
// 在浏览器控制台输出服务器响应的内容
console.log(xhr.responseText)
}
}
}
</script>

10.1.2、控制器方法示例

    @RequestMapping("/test/ajax")
public void testAajx(Integer id , HttpServletResponse response) throws IOException {
// 通过形参获取 url 中的请求参数
System.out.println("id:"+id);
// 通过 HttpServletResponse 对象为 Ajax 请求响应(字符串)数据
response.getWriter().write("hello,ajax");
}

10.1.3、测试效果

10.2、@RequestBody注解的基础示例

10.2.1、作用

@RequestBody 注解用于将请求体中的内容和控制器方法中的形参进行绑定

10.2.2、控制器方法示例

页面请求示例,见10.1.1节

    @RequestMapping("/test/ajax")
public void testAajx(Integer id ,@RequestBody String requestBody ,HttpServletResponse response) throws IOException {
// 通过形参获取 url 中的请求参数
System.out.println("id:"+id); // 通过 @RequestBody 注解后的形参,获取请求体中的内容
System.out.println("requestBody:"+requestBody); // 通过 HttpServletResponse 对象为 Ajax 请求响应(字符串)数据
response.getWriter().write("hello,ajax");
}

10.2.3、测试效果

10.3、@RequestBody注解的进阶示例

10.3.1、前提条件一(引入jackson依赖)

        <!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>

10.3.2、前提条件二(开启mvc的注解驱动)

mvc的注解驱动,在配置视图控制器和默认的servlet处理器的时候,已经开启;其重要性不言而喻

    <!--开启mvc的注解驱动-->
<mvc:annotation-driven></mvc:annotation-driven>

10.3.3、前提条件三(一个匹配json格式的Java类型)

匹配json格式的Java类型,一般是自定义实体类或map类型

package online.liaojy.pojo;

import java.io.Serializable;

/**
* @author liaojy
* @date 2023/10/30 - 0:02
*/
public class User implements Serializable { private Integer id; private String username; private String password; private Integer age; private String gender; public User() {
} public User(Integer id, String username, String password, Integer age, String gender) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.gender = gender;
} public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getGender() {
return gender;
} public void setGender(String gender) {
this.gender = gender;
} @Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}

10.3.4、页面请求示例

<input type="button" value="测试使用@RequestBody注解处理json格式的请求参数" onclick="testRequestBody()">

<script type="text/javascript">
function testRequestBody() {
// 实例化 XMLHttpRequest 对象
var xhr = new XMLHttpRequest() // 设置请求方式和请求路径
// 因为thymeleaf语法只能应用于html的属性,所以在js中的请求要包含上下文信息
xhr.open("post","/spring_mvc_ajax/test/RequestBody/json") // 设置请求头
// 一般 get 不需要设置,而 post 必须设置请求头
// 必须写在在open()和send()之间
xhr.setRequestHeader("Content-Type", "application/json") // 发送请求
// JSON.stringify() 是用来将合法的JSON数据字符串化的
xhr.send( JSON.stringify( {"username":"admin","password":"123","age":18,"gender":"男"} ) ) // 设置 XMLHttpRequest 对象状态变化事件的处理函数
xhr.onreadystatechange = function () {
// readyState的值为4时,表示已获取到服务器的响应
if (xhr.readyState == 4){
// 在浏览器控制台输出服务器响应的内容
console.log(xhr.responseText)
}
}
}
</script>

10.3.5、控制器方法示例(自定义实体类)

    // 通过 @RequestBody 注解形参,将json格式的请求参数转换为Java对象(自定义实体类)
@RequestMapping("/test/RequestBody/json")
public void testRequestBody(@RequestBody User user,HttpServletResponse response) throws IOException {
System.out.println("user:"+user);
response.getWriter().write("hello,RequestBody");
}

10.3.6、测试效果(自定义实体类)

因为json格式的请求参数中,没有包含id的键值对,所以转换后的Java实体类对象的id值为null

10.3.7、控制器方法示例(map集合)

    // 通过 @RequestBody 注解形参,将json格式的请求参数转换为Java对象(map集合)
@RequestMapping("/test/RequestBody/json")
public void testRequestBody(@RequestBody Map<String,Object> map, HttpServletResponse response) throws IOException {
System.out.println("map:"+map);
response.getWriter().write("hello,RequestBody");
}

10.3.8、测试效果(map集合)

10.4、@ResponseBody注解的基础示例

10.4.1、作用

@ResponseBody 注解用于将控制器方法的返回值,作为响应报文的响应体,响应到浏览器

10.4.2、页面请求示例

<a th:href="@{/test/ResponseBody}">测试通过@ResponseBody注解响应浏览器数据</a>

10.4.3、控制器方法示例(没使用@ResponseBody注解)

    @RequestMapping("/test/ResponseBody")
public String testResponseBody(){
return "success";
}

10.4.4、测试效果(没使用@ResponseBody注解)

没使用@ResponseBody注解时,return "success"响应的是success逻辑视图所对应的页面

10.4.5、控制器方法示例(有使用@ResponseBody注解)

    @RequestMapping("/test/ResponseBody")
@ResponseBody
public String testResponseBody(){
return "success";
}

10.4.6、测试效果(有使用@ResponseBody注解)

有使用@ResponseBody注解时,return "success"响应的是success字符串

10.5、@ResponseBody注解的进阶示例

10.5.1、前提条件

  • 引入jackson依赖,参考10.3.1节

  • 开启mvc的注解驱动,参考10.3.2节

  • 一个匹配json格式的Java类型,参考10.3.3节

10.5.2、页面请求示例

<input type="button" value="测试使用@ResponseBody注解响应浏览器json格式的数据" onclick="testResponseBody()">

<script type="text/javascript">
function testResponseBody() {
// 实例化 XMLHttpRequest 对象
var xhr = new XMLHttpRequest() // 设置请求方式和请求路径
// 因为thymeleaf语法只能应用于html的属性,所以在js中的请求要包含上下文信息
xhr.open("get","/spring_mvc_ajax/test/ResponseBody/json") // 设置请求头
// 一般 get 不需要设置,而 post 必须设置请求头 // 发送请求
xhr.send() // 设置 XMLHttpRequest 对象状态变化事件的处理函数
xhr.onreadystatechange = function () {
// readyState的值为4时,表示已获取到服务器的响应
if (xhr.readyState == 4){
// 在浏览器控制台输出服务器响应的内容
// JSON.parse()用来将JSON字符串,解析成字符串描述的JavaScript值或对象
console.log(JSON.parse(xhr.responseText))
}
}
}
</script>

10.5.3、Java对象与Json数据的转换关系

Java对象 Json数据
实体类 Json对象
map集合 Json对象
list集合 Json数组

10.5.4、控制器方法示例(实体类)

使用@ResponseBody注解,可以取代将Java对象通过第三方类库转换为Json字符串的繁琐过程

    @RequestMapping("/test/ResponseBody/json")
@ResponseBody
public User testResponseBodyjson(){
User user = new User(1001, "admin", "123456", 28, "男");
return user;
}

10.5.5、测试效果(实体类)

10.5.6、控制器方法示例(map集合)

    @RequestMapping("/test/ResponseBody/json")
@ResponseBody
public Map<String,Object> testResponseBodyjson(){
User user1 = new User(1001, "admin1", "123456", 28, "男");
User user2 = new User(1002, "admin2", "123456", 28, "男");
User user3 = new User(1003, "admin3", "123456", 28, "男");
Map<String, Object> map = new HashMap<String, Object>();
map.put("1001",user1);
map.put("1002",user2);
map.put("1003",user3);
return map;
}

10.5.7、测试效果(map集合)

10.5.8、控制器方法示例(list集合)

    @RequestMapping("/test/ResponseBody/json")
@ResponseBody
public List<User> testResponseBodyjson(){
User user1 = new User(1001, "admin1", "123456", 28, "男");
User user2 = new User(1002, "admin2", "123456", 28, "男");
User user3 = new User(1003, "admin3", "123456", 28, "男");
LinkedList<User> users = new LinkedList<User>();
users.add(user1);
users.add(user2);
users.add(user3);
return users;
}

10.5.9、测试效果(list集合)

与map集合转换后的json相比,list集合转换后的json外面用的是中括号(数组的符号),而且还有长度

![image](https://img2023.cnblogs.com/blog/2052479/202311/2052479-20231101173920863-1481359634.png

10.6、@RestController注解

  • @RestController 注解是springMVC提供的一个复合注解;

  • 其标识的位置是在类上面;

  • 其效果相当于为类添加了 @Controller 注解,并且为其中的所有方法都添加了 @ResponseBody 注解

@Controller
public class TestAjaxController { @RequestMapping("/test/ResponseBody")
@ResponseBody
public String testResponseBody(){
return "success";
} @RequestMapping("/test/ResponseBody/json")
@ResponseBody
public User testResponseBodyjson(){
User user = new User(1001, "admin", "123456", 28, "男");
return user;
} }
@RestController
public class TestAjaxController { @RequestMapping("/test/ResponseBody")
public String testResponseBody(){
return "success";
} @RequestMapping("/test/ResponseBody/json")
public User testResponseBodyjson(){
User user = new User(1001, "admin", "123456", 28, "男");
return user;
} }

10、SpringMVC之处理Ajax请求的更多相关文章

  1. springmvc框架下ajax请求传参数中文乱码解决

    springmvc框架下jsp界面通过ajax请求后台数据,传递中文参数到后台显示乱码 解决方法:js代码 运用encodeURI处理两次 /* *掩码处理 */ function maskWord( ...

  2. springmvc 前端 发ajax请求的几种方式

    一.传json单值或对象 1.前端 var data = {'id':id,'name':name}; $.ajax({ type:"POST", url:"user/s ...

  3. SpringMVC经典系列-13使用SpringMVC处理Ajax请求---【LinusZhu】

    注意:此文章是个人原创,希望有转载须要的朋友们标明文章出处,假设各位朋友们认为写的还好,就给个赞哈,你的鼓舞是我创作的最大动力,LinusZhu在此表示十分感谢,当然文章中如有纰漏,请联系linusz ...

  4. SpringMVC下Ajax请求的方法,@Responsebody如果返回的是布尔值,ajax不会接到任何回传数据

    SpringMVC框架下,如果用ajax向后台请求得方法如果使用@Responsebody返回布尔值的话,ajax得不到任何的回传数据. 但是如果返回String类型,就是正常的. 测试了下代码写得没 ...

  5. springmvc处理ajax请求

    1.controller将数据封装成json格式返回页面 @RequestMapping("/dataList") public void datalist(CsoftCunsto ...

  6. SpringMVC处理ajax请求的注意事项

    .首先要知道ajax请求的核心是JavaScrip对象和XmlHttpRequest,而浏览器请求的核心是浏览器 ajax请求 浏览器请求 场景一:使用ajax获取session中的user 从上图可 ...

  7. legend2---开发日志10(ajax请求的方法是否同样会执行base控制器里面的方法)

    legend2---开发日志10(ajax请求的方法是否同样会执行base控制器里面的方法) 一.总结 一句话总结:会执行的,所以写base控制器里面的方法要注意,base控制器里面的方法要以查数据为 ...

  8. springmvc接受及响应ajax请求。 以及@RequestBody 和@ResponseBody注解的使用

    1.发送ajax请求 $.ajax({ url:"user/testAjax", contentType:"application/json;charset=UTF-8& ...

  9. SpringMVC处理ajax请求的跨域问题和注意事项

    .首先要知道ajax请求的核心是JavaScrip对象和XmlHttpRequest,而浏览器请求的核心是浏览器我的个人博客(基于SSM,Redis,Tomcat集群的后台架构) github:htt ...

  10. SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析

    SpringMVC中使用Ajax POST请求以json格式传递参数服务端通过request.getParameter("name")无法获取参数值问题分析 一:问题demo展示 ...

随机推荐

  1. 虚拟机ping不通物理机 PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.

    准备做samba服务配置的时候 ping 192.168.10.1 (物理机地址) PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data. 查看自 ...

  2. kettle从入门到精通 第六十六课 ETL之kettle kettle阻塞教程,轻松获取最后一行数据,so easy

    场景:ETL沟通交流群内有小伙伴反馈,如何在同步一批数据完成之后记录下同步结果呢?或者是调用后续步骤.存储过程.三方接口等. 解决:使用步骤Blocking step进行阻塞处理即可. 1.下面的de ...

  3. C#.NET Winform承载WCF RESTful API (App.config 方式)

    1.新建一个名为"WindowsForms承载WCF"的WINFORM程序. 2.在解决方案里添加一个"WCF 服务库"的项目,名为"WcfYeah& ...

  4. 使用 OpenTelemetry 构建可观测性 06 - 生态系统

    过去的五篇文章讨论了如何使用 OpenTelemetry 来构建可观测性的技术细节.我认为在本博文系列的结尾介绍有关 OTel 生态系统的信息,为读者提供更全面的了解非常重要.OpenTelemetr ...

  5. 5分钟带你了解RabbitMQ的(普通/镜像)集群

    前言 让我们深入探讨RabbitMQ的集群配置,了解各种集群模式的利弊.本次讨论的重点是帮助您快速理解RabbitMQ集群的运作方式,以及选择最适合您需求的模式.好的,话不多说.在RabbitMQ中, ...

  6. ITMS-90717: 无效的应用程序商店图标

    PS导入照片 图像->模式->索引颜色 透明度去掉打勾保存即可

  7. kylin的除法函数的坑

    1.select 1/6   (整数相除除不过直接就为0) 解决办法:select cast(1 as double)/6 2.select  round (0/6,2)  (0除以任何数都是0,无法 ...

  8. python 二次封装logging,打印日志文件名正确,且正确写入/结合pytest执行,日志不输出的问题

    基于之前日志问题,二次封装日志后,导致日志输出的文件名不对,取到的文件一直都是当前二次封装的log的文件名,基于这个问题,做了优化,详细看 https://www.cnblogs.com/cuitan ...

  9. 从github下好dirsearch后出现要下载文件依赖错误

    pip3 install -r requirements.txt

  10. 如何查看docker容器的volume挂载情况

    准备在docker容器当中编写个日常维护的脚本,但容器里连yum和vim命令都没有,所以就想到通过容器映射在本机的volume里编写脚本这样在容器中不就可以直接用了吗,那么在这之前你首先得知道dock ...