java中的消息转换器--HttpMessageConverter 分类:学习日记
来源:互联网 发布:邓云天觉知视频 编辑:程序博客网 时间:2024/06/03 07:14
目录:
- HTTP请求响应模型;
- 基于javax-servlet-api的请求、响应处理接口;
- 基于SpringMVC的请求、响应接口;
HTTP请求响应模型
一般情况下,我们使用的最简单的HTTP请求响应模型就是B/S模型了。
1、客户端发出http请求,http请求中包含着请求参数,发送到指定的HTTP Server;
2、HTTP Server接受 http 请求,并解析http请求,将http 请求中的请求参数暴露出来;
3、处理业务逻辑;
4、封装http响应报文,响应客户端;
本文从原始的servlet-api和springMVC框架两个角度分析http参数解析及http响应报文的解析与封装过程。
基于javax-servlet-api的请求、响应处理接口
解析http请求时,可以使用javax.servlet.ServletRequest中的getInputStream()方法:
来得到一个ServletInputStream。这个ServletInputStream中,可以读取到一个原始请求报文的所有内容。
封装http响应时,可以使用javax.servlet.ServletResponse中的getOutputStream()方法:来得到一个ServletOutputStream,这个ServletOutputSteam,继承自java中的OutputStream,可以让你输出Http的响应报文内容。
ServletRequest和ServletResponse接口关系:其中,ServletInputStream和ServletOutputStream类图关系:让我们尝试着像SpringMVC的设计者一样来思考一下。我们知道,Http请求和响应报文本质上都是一串字符串,当请求报文来到java世界,它会被封装成为一个ServletInputStream的输入流,供我们读取报文。响应报文则是通过一个ServletOutputStream的输出流,来输出响应报文。
我们从流中,只能读取到原始的字符串报文,同样,我们往输出流中,也只能写原始的字符。而在java世界中,处理业务逻辑,都是以一个个有业务意义的对象为处理维度的,那么在报文到达SpringMVC和从SpringMVC出去,都存在一个字符串到java对象的阻抗问题。这一过程,不可能由开发者手工转换。我们知道,在Struts2中,采用了OGNL来应对这个问题,而在SpringMVC中,它是HttpMessageConverter机制。-- 引用自《SpringMVC源码剖析(五)-消息转换器HttpMessageConverter》
基于SpringMVC的请求、响应接口
在SpringMVC中,不再是通过原始的输入输出流来获取http请求或http响应。而是通过消息转换器,按照一定规则从http请求中提取消息至方法形参中的内部对象中,或将内部对象按照一定规则写入到响应报文中。
在SpringMVC中,获取http请求的报文头部和报文body是基于HttpMessage接口的,同样先看接口关系图:
有了获取HttpMessage的方法,SpringMVC在HttpMessageConverter消息转换器中将HttpMessage作为方法参数来解析HttpMessage消息。看图:
可见,在HttpMessageConverter接口及其子类中,都是使用HttpMessage作为参数,而在HttpMessageConverter解析器的不同的实现方法中,实现了对Http请求响应的不同的解析。举个栗子:
这里就是用不同的解析器,一个是“StringHttpMessageConverter”,一个是“FastJsonHttpMEssageConverter”,他们都是HttpMessageConverter的实现。需要注意一点的是,在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,实现机制就是上面说的过程。举个用例:
在SpringMVC进入readString方法前,会根据@RequestBody注解选择适当的HttpMessageConverter实现类来将请求参数解析到string变量中,具体来说是使用了StringHttpMessageConverter类,它的canRead()方法返回true,然后它的read()方法会从请求中读出请求参数,绑定到readString()方法的string变量中。
当SpringMVC执行readString方法后,由于返回值标识了@ResponseBody,SpringMVC将使用StringHttpMessageConverter的write()方法,将结果作为String值写入响应报文,当然,此时canWrite()方法返回true。用图来说明一下这个过程:
版权声明:技术就要分享才有意思,欢迎大家分享(注明出处),欢迎大家纠错。
- java中的消息转换器--HttpMessageConverter 分类:学习日记
- java中的消息转换器--HttpMessageConverter
- 消息转换器HttpMessageConverter
- 消息转换器HttpMessageConverter
- HttpMessageConverter消息转换器
- SpringMVC源码-消息转换器HttpMessageConverter
- SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
- SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
- SpringMVC——消息转换器HttpMessageConverter
- HttpMessageConverter(消息转换器 )和@responsebody使用
- SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
- SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
- SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
- SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
- SpringMVC源码剖析(五) - 消息转换器HttpMessageConverter
- SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
- SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
- SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
- hdu 1530 Maximum Clique——最大团
- FJ的字符串
- angular中的$http服务及promiseA+规范总结
- Linux 内核clk 添加clk provider
- AS混淆打包和多渠道打包总结
- java中的消息转换器--HttpMessageConverter 分类:学习日记
- 利用navicat创建存储过程、触发器和使用游标的简单实例
- 浅谈原生JS和jQuery操作DOM
- 实现下拉框和搜索框一体功能
- caffe 01 win10 运行环境配置(不需要开发环境)
- 【Mysql】Mysql 各个版本区别
- 深入研究Servlet线程安全性问题
- Hadoop:CCAH及CCA系列认证
- Android APP 混淆器使用之二关键词命令