SpringMvc---MessageConverter
HttpMessageConverter,报文信息转换器,将请求报文转换为Java对象,或将Java对象转换为响应报文
HttpMessageConverter提供了两个注解和两个类型:@RequestBody,@ResponseBody,RequestEntity,
ResponseEntity
使用这些注解就能把控制器返回值直接显示在页面上,而不是被解析为视图。
1、@RequestBody
这个注解在参数上使用
@RequestBody可以获取请求体,需要在控制器方法设置一个形参,使用@RequestBody进行标识,当前请求的请求体就会为当前注解所标识的形参赋值
@RequestMapping("/requestBody")
public String testMessage(@RequestBody String requestBody) {
// post将请求参数封装在请求体中,就能在请求体中发现参数键值对
System.out.println(requestBody);
return "requestBody";
}
页面中
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="text/html;UTF-8">
<title>Title</title>
</head>
<body>
<form th:action="@{/requestBody}" method="post">
用户名:<input type="text" name="username" ><br>
密 码:<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
</html>
2、RequestEntity
使用RequestEntity时,在控制器方法里面设置一个RequestEntity的String类型的数组作为参数,然后就能调用RequestEntity中的方法获取请求头请求体以及请求的类型等
RequestEntity封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过getHeaders()获取请求头信息,通过getBody()获取请求体信息
@RequestMapping("requestEntity")
public String testRequestEntity(RequestEntity<String> requestEntity){
System.out.println("请求头:"+requestEntity.getHeaders());
System.out.println("请求体:"+requestEntity.getBody());
return "requestEntity";
}
输出
请求头:[host:"localhost:8080", connection:"keep-alive", content-length:"32", cache-control:"max-age=0", sec-ch-ua:"" Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"", sec-ch-ua-mobile:"?0", sec-ch-ua-platform:""Windows"", upgrade-insecure-requests:"1", origin:"http://localhost:8080", user-agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36", accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", sec-fetch-site:"same-origin", sec-fetch-mode:"navigate", sec-fetch-user:"?1", sec-fetch-dest:"document", referer:"http://localhost:8080/SpringMvc_03/aaa", accept-encoding:"gzip, deflate, br", accept-language:"zh-CN,zh;q=0.9", Content-Type:"application/x-www-form-urlencoded;charset=UTF-8"] 请求体:username=typora&password=qweqweq
3、@ResponseBody
使用原生servlet的response也能实现页面响应,输出中文要声明响应类型的格式
@RequestMappin("/ServletResponse")
public String testResponse(HttpServletResponse response){
response.setContenType("text/html");
return "哈哈哈";
}
这个注解能直接把控制器方法的返回值作为响应体输出在页面上,响应出一个完整的页面。
如果中文乱码需要在SpringMvc的配置文件中,在开启mvc注解的标签里加
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/html; charset=UTF-8"/>
<property name="defaultCharset" value="UTF-8"/>
</bean>
</mvc:message-converters>
在java中
@RequestMapping("/testResponseBody")
@ResponseBody
public String testResponseBody(){
return "哈哈";
}
4、SpringMvc对json的处理
首先导入依赖
<!--解析json的依赖-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
然后开启mvc的注解驱动
<mvc:annotation-dirven />
再给控制器方法加上注解@ResponseBody注解
再就是直接返回bean对象,就能在浏览器中看见返回的json对象,浏览器中会返回一个json对象,JSON中对象是{}修饰,数组是[]修饰
@Repository
public class User {
private String id;
private String username;
private String password;
private String email;
public User() {
}
public User(String id, String username, String password, String email) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
}
public String getId() {
return id;
}
public void setId(String 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 String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
在Controller中
@RequestMapping("/testJson")
@ResponseBody
public User testJson(){
return new User("1a","幸运","123abc","qweqwe@qq.com");
}
5、使用SpringMvc处理Ajax数据
先要有vue的js文件,百度有官网
首先下载vue的ajax支持文件axios.min.js,去https://github.com/axios/axios/releases下载zip包,解压后在list文件夹下就可以找到这个js文件,复制到之前那个static静态资源的目录下。由于使用maven构建的项目,打包也是maven完成的,所以就要再次打包文件,将后来加入进去的文件打包进去,重新部署项目,才能保证axios.min.js文件被找到.
在html中
<div id="resp">
<a th:href="@{testAjax}" @click="testAjax">返回json数据使用展示效果</a><br>
</div>
<!--引入vue和ajax文件-->
<script th:src="@{/static/lib/vue.js}"></script>
<script th:src="@{/static/lib/axios.min.js}"></script>
<script type="text/javascript">
new Vue({
el:"#resp",
methods:{
testAjax:function (event) {
axios({
//设置ajax提交数据的请求方式
method:"post",
//获取点击的a标签的请求地址并作为提交ajax数据的请求地址
url:event.target.href,
//提交的参数key=value
params:{
username:"admin",
password:"123123"
}
}).then(function (response){
//局部将控制器返回的响应内容展示
alert(response.data)
})
//取消a标签的默认执行内容
event.preventDefault();
}
}
})
</script>
给a标签设置一个容器,并为容器设置一个id。为a标签设置单机事件注解,最后通过vue的语法完成。
在java中
方法中使用同名参数接收提交的数据
@RequestMapping("/testAjax")
@ResponseBody
public String testAjax(String username,String password){
System.out.println(username+","+password);
return "你好";
}
6、@RestController注解
当在一个Contrller中每一个方法都需要添加@ResponseBody注解,就可以用这个复合注解对当前的控制器类进行标识
@RestController注解是springMVC提供的一个复合注解,标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解
在java中
@org.springframework.web.bind.annotation.RestController
public class RestController {
@RequestMapping("/test1")
public String test1() {
return "123abc";
}
@RequestMapping("/test2")
public User test2() {
return new User("12", "哼哼", "123abc", "123@qq.com");
}
@RequestMapping("/test3")
public String test3(String username,String password){
System.out.println(username+","+password);
return "第三个";
}
}
在html中
<a th:href="@{/test1}">使用@RestController注解的使用展示效果</a><br>
<a th:href="@{/test2}">使用@RestController注解返回json数据使用展示效果</a><br>
<div id="test">
<a th:href="@{/test3}" @click="test3">使用@RestController注解接收Ajax数据</a><br>
</div>
<!--引入vue和ajax文件-->
<script th:src="@{/static/lib/vue.js}"></script>
<script th:src="@{/static/lib/axios.min.js}"></script>
<script type="text/javascript">
new Vue({
el:"#test",
methods: {
test3:function (event){
axios({
method:"post",
url:event.target.href,
params: {
username:"刘能",
password:"123abc"
}
}).then(function (resp){
alert(resp.data)
})
event.preventDefault()
}
}
})
</script>
7、ResponseEntity
ResponseEntity使用时作为控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文