SpringMVC HttpMessageConverter报文信息转换器

目录
  • SpringMVC HttpMessageConverter报文信息转换器
    • 一、@RequestBody
    • 二、RequestEntity
    • 三、@ResponseBody
      • 1.不使用 @ResponseBody
      • 2.使用 @ResponseBody
      • 3. springMVC 处理 json
      • 4. springMVC 处理 ajax
    • 四、@RestController 注解
    • 五、ResponseEntity

SpringMVC HttpMessageConverter报文信息转换器

HttpMessageConverter 是报文信息转换器,作用有 2 个:

将请求报文转换为Java对象:请求报文是从浏览器发送到服务器,发送到服务器中就是 request 对象

将Java对象转换为响应报文:响应报文是服务器响应给浏览器的,服务器中用的java,浏览器不能解析java,所以要转换成响应报文给浏览器。

其中,HttpMessageConverter 提供了两个注解:@RequestBody@ResponseBody。还有两个类型:RequestEntityResponseEntity

最常用的还是用来将Java对象转换为响应报文的两个:@ResponseBodyResponseEntity

至于获取请求参数,或者请求头什么的,前面已经有过好几种方法了,没必要再使用这里的 @RequestBodyRequestEntity

一、@RequestBody

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

比如这有一个页面表单,用来发送请求。

<form th:action="@{/testRequestBody}" method="post">
    用户名:<input type="text" name="username">

    密码:<input type="password" name="password">

    <input type="submit">
</form>

对应的有个控制器处理这个请求:

@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String requestBody){
    System.out.println("requestBody:"+requestBody);
    return "success";
}

这里要补充一个 success.html 以供跳转。

然后我们在表单中输入 username=admin,password=123456,提交后,查看控制台的输出:

requestBody:username=admin&password=123456

username=admin&password=123456这个就是请求体的内容了。

二、RequestEntity

RequestEntity是封装请求报文的一种类型,包含了请求头和请求体

使用时,需要在控制器方法的形参中设置该类型的形参,当前请求的请求报文就会赋值给该形参。

接着,就可以通过getHeaders()获取请求头信息,通过getBody()获取请求体信息。

复制一下上面的表单,请求地址换一下:

<form th:action="@{/testRequestEntity}" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit">
</form>

然后补充一个控制器方法:

@RequestMapping("/testRequestEntity")
    public String testRequestEntity(RequestEntity<String> requestEntity){
        System.out.println("请求头:"+requestEntity.getHeaders());
        System.out.println("请求体:"+requestEntity.getBody());
        return "success";
    }

输入表单提交测试一下:

三、@ResponseBody

1.不使用 @ResponseBody

在不使用@ResponseBody这个注解的时候,使用servlet api 中 HttpServletResponse 也是可以响应给浏览器的。

比如:

@RequestMapping("/testResponse")
    public void testResponse(HttpServletResponse response) throws IOException {
        response.getWriter().print("hello, response");
    }

前端写一个超链接测试一下:

<a th:href="@{/testResponse}" rel="external nofollow" >使用HttpServletResponse响应浏览器</a>

点击超链接。

2.使用 @ResponseBody

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

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

这里的控制器方法增加了@ResponseBody

  • 如果没有这个注解,返回的 "success",会匹配要跳转的页面。
  • 加上之后, "success"则不再代表视图名称,而是直接返回给浏览器的响应体。

继续增加超链接测试一下:

<a th:href="@{/testResponseBody}" rel="external nofollow" >使用 @testResponseBody 响应浏览器</a>

注意,为了区分效果,success.html 里我修改下内容:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>这是 success.html 页面</h1>
</body>
</html>

OK,现在点击超链接,页面显示 success。

接着,我去掉控制器里的 @ResponseBody,再重新部署点击超链接试试。

跳转到了 success.html 页面。

所以,使用@ResponseBody还是很方便的,我们需要返回给浏览器什么数据,直接在控制器方法里 return 即可。

3. springMVC 处理 json

上面示例响应的是个字符串,对于浏览器来说就直接显示了。如果我要响应一个对象呢?

比如,新建一个 User 类,设置好构造方法,set 和 get:

public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private String sex;
... ...

编写控制器:

@RequestMapping("/testResponseUser")
    @ResponseBody
    public User testResponseUser() {
        return new User(1001, "大周", "123456", 11, "男");
    }

直接返回一个 User 对象。

为了测试,继续在前端页面增加一个超链接:

<a th:href="@{/testResponseUser}" rel="external nofollow" >响应浏览器User对象</a>

重新部署,点击测试,报错了。

这里还需要转换的步骤,把 User 对象转换成 json 格式的字符串。

在 pom.xml 中加入依赖 jackson

<!--对象转化json 响应给浏览器-->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.12.1</version>
    </dependency>

另外,检查一下 springMVC.xml 配置文件中的注解驱动是否开启:

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

重新部署,点击超链接。

响应正常。

4. springMVC 处理 ajax

使用ajax发送请求,跟上面点击超链接发送请,也只是发送请求方式不同而已,对于服务器来说,都是一样处理。

ajax的优点就是页面不刷新的情况下,可以与服务器进行交互。

继续在前端页面增加内容,新增一个超链接,绑定一个点击事件@click

<div id="app">
	<a th:href="@{/testAjax}" rel="external nofollow"  @click="testAjax">springMVC 处理ajax</a><br>
</div>

这里需要用到静态资源 vue.min.jsaxios.min.js,下载后放到webapp\static\js下。

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

<!--引入-->
<script type="text/javascript" th:src="@{/static/js/vue.min.js}"></script>
<script type="text/javascript" th:src="@{/static/js/axios.min.js}"></script>
<script>
    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)  // response.data 获取到响应的数据
                });
                event.preventDefault();  // 取消超链接的默认行为
            }
        }
    });
</script>

增加对于的请求控制器:

@RequestMapping("/testAjax")
    @ResponseBody
    public String testAjax(String username, String password) {
        System.out.println("username:" + username + ",password:" + password);
        return "hello, Ajax";
    }

重新部署之前,记得maven 重新打包一下。

另外,springMVC 配置文件中记得放开静态资源的访问:

<!--放开静态资源的访问-->
    <mvc:default-servlet-handler />

重新部署,点击超链接。

四、@RestController 注解

这是以后会经常用的注解。

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

标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解。

五、ResponseEntity

ResponseEntity用于控制器方法的返回值类型。

该控制器方法的返回值就是响应到浏览器的响应报文,后面的下载上传文件的示例中会使用到。

以上就是SpringMVC HttpMessageConverter报文信息转换器的详细内容,更多关于SpringMVC HttpMessageConverter的资料请关注我们其它相关文章!

(0)

相关推荐

  • Spring HttpMessageConverter的作用及替换解析

    相信使用过Spring的开发人员都用过@RequestBody.@ResponseBody注解,可以直接将输入解析成Json.将输出解析成Json,但HTTP 请求和响应是基于文本的,意味着浏览器和服务器通过交换原始文本进行通信,而这里其实就是HttpMessageConverter发挥着作用. HttpMessageConverter Http请求响应报文其实都是字符串,当请求报文到java程序会被封装为一个ServletInputStream流,开发人员再读取报文,响应报文则通过Servle

  • SpringMVC 中HttpMessageConverter简介和Http请求415 的问题

    一.问题描述: 在SprinvMVC的Web程序中,我在页面发送Ajax 的POST请求,然后在服务器端利用@requestBody接收请求body中的参数,当时运行过程中,我想服务器发送Ajax请求,浏览器一直反馈415 Unsupported Media Type或者400的状态码,以为是Ajax写的有问题.便查找了半天资料,才发现spring-mvc.config文件的配置中少了东西,当然也有可能是你真的在Ajax中缺少了对Content-Type参数的设置.分析后应该是我springMV

  • springmvc中RequestMappingHandlerAdapter与HttpMessageConverter的装配讲解

    一.DispatcherServlet 默认装配 RequestMappingHandlerAdapter ,而 RequestMappingHandlerAdapter 默认装配如下 HttpMessageConverter HttpMessageConverter: 2)加入jackson jar 包后,RequestMappingHandlerAdapter 装配的HttpMessageConverter 如下: 二. HttpMessageConverter 1)HttpMessageC

  • HttpMessageConverter报文信息转换器的深入讲解

    目录 前言 HttpMessageConverter 介绍 一.@RequestBody 请求体注解 1.1.表单提交模拟 1.2.控制器方法示例 二.RequestEntity 请求封装对象 2.1.控制器方式示例 2.2.输出结果 三.@ResponseBody 响应体注解 3.1.控制器方式示例 3.2.SpringMVC 添加Json格式转换器 3.3.控制器使用 Json 格式转换器示例 3.4.@RestController注解 四.ResponseEntity 响应封装对象 总结

  • SpringMVC源码解析之消息转换器HttpMessageConverter

    摘要 SpringMVC使用消息转换器实现请求报文和对象.对象和响应报文之间的自动转换 在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制,就是Spring3.x中新引入的HttpMessageConverter即消息转换器机制. #Http请求的抽象 还是回到请求-响应,也就是解析请求体,然后返回响应报文这个最基本的Http请求过程中来.我们知道,在servlet标准中,可以用j

  • SpringMVC HttpMessageConverter报文信息转换器

    目录 SpringMVC HttpMessageConverter报文信息转换器 一.@RequestBody 二.RequestEntity 三.@ResponseBody 1.不使用 @ResponseBody 2.使用 @ResponseBody 3. springMVC 处理 json 4. springMVC 处理 ajax 四.@RestController 注解 五.ResponseEntity SpringMVC HttpMessageConverter报文信息转换器 HttpM

  • 详解自定义SpringMVC的Http信息转换器的使用

    在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制.使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上. HttpInputMessage 这个类是SpringMVC内部对一次Http请求报文的抽象,在HttpMessageConverter的read()方法中,有一个HttpInputMessage的形参,它正是SpringM

  • 详解SpringMVC常用注解功能及属性

    目录 1.@RequestMapping注解 1.1@RequestMapping注解的功能 1.2@RequestMapping注解的位置 1.3@RequestMapping注解的value属性 1.4@RequestMapping注解的method属性 1.5@RequestMapping注解的params属性(了解) 1.6@RequestMapping注解的headers属性(了解) 1.7SpringMVC支持路径中的占位符(@PathVariable)(重点) 2.SpringMV

  • SpringMVC 限流的示例代码

    在使用SpringBoot做接口访问如何做接口的限流,这里我们可以使用google的Guava包来实现,当然我们也可以自己实现限流,Guava中的限流是久经考验的我们没必需重新再去写一个,如果想了解限流原理的同学可以自己查阅一下相关的资料,本文不作过来说明噢. 使用说明 在项目中引入Guava相关包 http://mvnrepository.com/artifact/com.google.guava/guava/21.0 maven项目 <!-- https://mvnrepository.co

  • 浅谈Springmvc中的页面跳转问题

    SpringMvc跳转问题 SpringMvc的Controller每次处理完数据后都会返回一个逻辑视图(view)和模型(model) 所以我们会看到原生的Controller是返回一个ModelAndView(内部包含了view和model). 正常情况下(除非被@ModelAttribute注解了的方法),否则最终都会返回ModelAndView. 当然有时候一个功能处理方法不一定要返回一个逻辑视图,也可以重定向到另一个功能方法 服务器内部转发到一个逻辑视图或者另一个功能方法. --- S

  • Spring MVC基于注解的使用之JSON数据处理的方法

    目录 1.JSON数据交互 1.1 JSON概述 1.1.1 对象结构 1.1.2 数组结构 1.2 JSON数据转换 2. HttpMessageConverter 2.1 @RequestBody 2.2 @ResponseBody 1.JSON数据交互 1.1 JSON概述 JSON 是一种轻量级的数据交换格式,是一种理想的数据交互语言,它易于阅读和编写,同时也易于机器解析和生成.JSON有两种数据结构: 对象结构 数组结构 1.1.1 对象结构 对象结构是由花括号括起来的逗号分割的键值对

随机推荐