SpringMvc---MessageConverter

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使用时作为控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文


版权声明:本文为m0_55668855原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。