HttpMessageConverter
这是一个消息转换器,用于java对象和请求体,响应体内容直接的相互转换
使用原生Servlet API完成AJAX请求
web.xml
<!--字符编码过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!--初始化参数-->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--springmvc控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
springmvc-servlet.xml
<!--导入扫描包-->
<context:component-scan base-package="com.atli"></context:component-scan>
<!--thymeleaf视图解析器-->
<bean id="thymeleafViewResolver" class="org.thymeleaf.spring6.view.ThymeleafViewResolver">
<!--作用与视图渲染的过程中,可以设置视图渲染后输出时采用的编码字符集-->
<property name="characterEncoding" value="UTF-8"></property>
<!--如果配置多个视图解析器,它来决定优先使用那个视图解析器,值越小优先级越高-->
<property name="order" value="1"></property>
<!--当ThymeleafViewResolver渲染模板是,会使用该模板引擎来解析,编译和渲染模板-->
<property name="templateEngine">
<bean class="org.thymeleaf.spring6.SpringTemplateEngine">
<!--用于指定Thymeleaf 模板引擎使用的模板解析器。模板解析器负责根据模板位置、目标资源名称,文件编码等信息,加载模板并对其进行解析-->
<property name="templateResolver">
<bean class="org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver">
<!--设置模板文件的位置(前缀)-->
<property name="prefix" value="/WEB-INF/templates/"></property>
<!--设置模板文件后缀,thymeleaf文件扩展名不一定是html,也可以是其他,如txt-->
<property name="suffix" value=".html"></property>
<!--设置模板引擎类型,列如HTML,TEXT,JAVASCRIPT,CSS等-->
<property name="templateMode" value="HTML"></property>
<!--用于模板文件在读取和解析过程中采用的编码字符集-->
<property name="characterEncoding" value="UTF-8"></property>
</bean>
</property>
</bean>
</property>
</bean>
<!--开启注解支持-->
<mvc:annotation-driven />
<!--视图控制器-->
<mvc:view-controller path="/" view-name="index" />
<!--静态资源处理-->
<mvc:default-servlet-handler/>
AJAXController.java
@Controller
public class AJAXController {
@GetMapping("/ajax")
public void ajax(HttpServletResponse response) throws IOException {
PrintWriter writer = response.getWriter();
writer.println("from ajax");
}
}
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script th:src="@{/static/vue3.js}"></script>
<script th:src="@{/static/axios.js}"></script>
</head>
<body>
<div id="App">
<button name="message" onclick="getMessage" value="check me"></button>
<h1>{{message}}</h1>
</div>
<script th:inline="javascript">
Vue.createApp({
data(){
return {
message : ''
}
},
methods:{
/*ajax请求*/
async getMessage(){
let response = await axios.get('/ajax')
this.message=response.data
}
}
}).mount("#App")
</script>
</body>
</html>
@ResponseBody注解
上方写到的控制器方法采用原生的Servlet API来完成AJAX请求有诸多不便
此时我们只需要一个@ResponseBody
注解就可以完成上述工作,底层实现依旧是使用原生的API进行
// @Controller
// public class AJAXController {
// @GetMapping("/ajax")
// public void ajax(HttpServletResponse response) throws IOException {
// PrintWriter writer = response.getWriter();
// writer.println("from ajax");
// }
// }
@Controller
@ResponseBody
public class AJAXController {
@GetMapping("/ajax")
public String ajax(){
return "from ajax"
}
}
// 该程序使用的是StringHttpMessageConverter消息转换器
@ResponseBody
注解不仅能转换字符串还能将java对象与json串进行相互转换(需要添加jackson依赖)
@Controller
@ResponseBody
public class AJAXController {
@GetMapping("/ajax")
// 假设有一个User类属性为name和age
public User ajax(){
return new User("li","12");
}
}
通过上述代码,前端会收到[{'name':'li'},{'age':12}]
的json格式字符串
此时底层使用了MappingJackon2HttpMessageConverter消息转换器
对于FormHttpMessageConverter消息转换器在之前就有所涉及,即将响应体中数据转换为java对象
// request body: name=li&age=12
// 若前端是发送的json格式数据那么需要在前端响应头中添加
// xhr.setRequestHeader("Content-Type","application/json");
// 并且在形参前添加@RequestBody注解
@Controller
public class AJAXController(User user) {
}
@RestController注解
这是一个复合注解,用于类上,相当于@Controller+@RequestBody
@RequestBody注解
该注解用于控制器方法的参数上,使用该注解后,会将请求体中的数据直接赋值给被注解的变量(String)
// requestBody: from user
@RequestMapping("/save")
public String save(@RequestBody String requestBodyStr){
// 会输出 from user
System.out.println(requestBodyStr);
return 'success';
}
同时,该注解最常用的方法是将前端传递的JSON格式数据转换为对象(注意涉及json转换的都需要相关依赖)
// requestBody: [{'name':'li'},{'age':12}]
@RequestMapping("/save")
@RequestBody
public String save(@RequestBody User user){
return 'success';
}
RequestEntity类
该类封装了整个请求协议,使用时直接添加在处理器方法的形参上,可以用于获取所有的请求信息
ResponseEntity类
该类封装了整个响应协议,可以实现自定义的响应,使用同RequestEntity类