• 2.0SpringMVC中报文信息转换器HttpMessageConverter


    😹 作者: gh-xiaohe
    😻 gh-xiaohe的博客
    😽 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!!

    🚏 HttpMessageConverter

        HttpMessageConverter,报文信息转换器,将请求报文转换为Java对象,或将Java对象转换为响应报文

    报文信息转换器请求报文(浏览器到服务器 request对象),响应报文(服务器响应给浏览器)

        HttpMessageConverter提供了两个注解和两个类型:@RequestBody,@ResponseBody 常用 ,RequestEntity,ResponseEntity 常用

    🚀 1、@RequestBody

        @RequestBody可以获取请求体,需要在控制器方法设置一个形参,使用==@RequestBody==进行标识,当前请求的请求体就会为当前注解所标识的形参赋值

    <form th:action="@{/testRequestBody}" method="post">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        <input type="submit">
    </form>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    @RequestMapping("/testRequestBody")
    public String testRequestBody(@RequestBody String requestBody){
        System.out.println("requestBody:"+requestBody);
        return "success";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    输出结果:

    requestBody:username=admin&password=123456

    🚄 2、RequestEntity

        RequestEntity封装请求报文的一种类型,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参,可以通过getHeaders()获取请求头信息,通过getBody()获取请求体信息

    @RequestMapping("/testRequestEntity")
    public String testRequestEntity(RequestEntity<String> requestEntity){
         //当前requestEnity表示整个请求报文的信息
        System.out.println("requestHeader:"+requestEntity.getHeaders());
        System.out.println("requestBody:"+requestEntity.getBody());
        return "success";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出结果:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pUAo0uwH-1656123432337)(HttpMessageConverter.assets/image-20220625092904406.png)]

    🚒 3、@ResponseBody

    原生 HttpServletResponse 实现

    @RequestMapping("/testResponse")
    public void testResponse(HttpServletResponse response) throws IOException {
    
        response.getWriter().print("hello,response");
     
    	//response.getWriter().write()   //write() 是以流的形式,必须满足流的要求
    	//response.getWriter(). print(Object object)  // 可以响应这一组数据   
        //这两句话到底是什么意思 :将print方法中内容直接作为响应报文的响应体,响应到浏览器,相应提示什么,在浏览器看到的就是什么  	
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    getWriter()

    首先解释一下 PrintWriter = response.getWriter();

    ​ wirte()是类PrintWriter提供的一个方法,是发送请求内容至页面,ajax常用到这个
    ​ response.write()是直接在页面输出内容

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OpFCFzxT-1656123432338)(HttpMessageConverter.assets/image-20220625094406896.png)]

        @ResponseBody用于标识一个控制器方法,可以将该方法的返回值直接作为响应报文响应体响应到浏览器

        作用:方法返回的是 当前响应的响应体 (不书写是作为视图名称解析

    @RequestMapping("/testResponseBody")
    @ResponseBody
    public String testResponseBody(){
        return "成功";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    结果:浏览器页面显示成功

    🚤 4、SpringMVC处理json

        SpringMVC处理JSON (JSON一种数据交互格式)、xml也是一种数据交互格式

        JSON有两种格式:一种是json对象 {}、一种是json数组[]

        SpringMVC处理ajax(ajax就是页面,发生跳转的情况下,与=服务器进行交互,不能使用转发重定向,只能使用响应浏览器数据

    🚬 @ResponseBody处理json的步骤:

    🚭 1、导入jackson的依赖 (把java对象转化为json对象)

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.1</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    🚭 2、开启mvc的注解驱动

        在SpringMVC的核心配置文件中开启mvc的注解驱动,此时在HandlerAdaptor中会自动装配一个消息转换器MappingJackson2HttpMessageConverter,可以将响应到浏览器的Java对象转换为Json格式的字符串

    <mvc:annotation-driven />
    
    • 1

    🚭 3、在处理器方法上使用@ResponseBody注解进行标识

    🚭 4、将Java对象直接作为控制器方法的返回值返回,就会自动转换为Json格式的字符串

    @RequestMapping("/testResponseUser")
    @ResponseBody
    public User testResponseUser(){
        return new User(1001,"admin","123456",23,"男");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    浏览器的页面中展示的结果:

    {“id”:1001,“username”:“admin”,“password”:“123456”,“age”:23,“sex”:“男”}

    🚗 5、SpringMVC处理ajax

    🚬 a>请求超链接:

    <div id="app">
    	<a th:href="@{/testAjax}" @click="testAjax">testAjax</a><br>
    </div>
    
    • 1
    • 2
    • 3

    🚬 b>通过vue和axios处理点击事件:

    <script type="text/javascript" th:src="@{/static/js/vue.js}"></script>
    <script type="text/javascript" th:src="@{/static/js/axios.min.js}"></script>
    <script type="text/javascript">
        var vue = new Vue({
            el:"#app",
            methods:{
                testAjax:function (event) {
                    axios({
                        method:"post",
                        url:event.target.href,
                        params:{
                            username:"admin",
                            password:"123456"
                        }
                    }).then(function (response) {
                        alert(response.data);
                    });
                    event.preventDefault();
                }
            }
        });
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    🚬 c>控制器方法:

    @RequestMapping("/testAjax")
    @ResponseBody
    public String testAjax(String username, String password){
        System.out.println("username:"+username+",password:"+password);
        return "hello,ajax";
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    🛹 6、@RestController 复合注解

        @RestController注解是springMVC提供的一个复合注解,标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了==@ResponseBody==注解

    🛴 7、ResponseEntity

        ResponseEntity用于控制器方法的返回值类型,该控制器方法的返回值就是响应到浏览器的响应报文

    自定义一个响应报文响应浏览器文件下载

  • 相关阅读:
    从XXL-job路由策略的“服务容错“说起
    自动化测试:webdriver的断言详解
    递归算法讲解,深度理解递归
    WordPress 常规设置页面调用媒体中心上传图片插入URL(新版可用)
    TiDB 监控框架概述
    【人工智能Ⅰ】8-回归 & 降维
    构建智能医患沟通:陪诊小程序开发实战
    复制带随机指针的链表
    vue内置组件Transition的详解
    Kotlin File.reader BufferedReader readLine
  • 原文地址:https://blog.csdn.net/gh_xiaohe/article/details/125456139