SpringMVC: 消息转换器-HttpMessageConverter

消息转换器-HttpMessageConverter

概述

在springMVC中,可以使用@RequestBody和@ResponceBody这2个注解完成请求报文到数据对象,和数据对象到响应报文的转化, 便是使用了HttpMessageConverter这种灵活的消息转换机制。

java中的http请求

在servlet标准中,可以使用javax.servlet.request接口中的以下方法:

public ServletInputStream getInputStream() throws IOException; 

ServletInputStream是一个可以读取到请求报文中内容的输入流。

public ServletOutputStream getOutputStream() throws IOException;

ServletOutputStream则是用来输出响应报文内容的输出流。

不论是请求报文还是响应报文,内容实际上都是字符串,而在业务逻辑处理中往往都需要用到对象,所以就存在一个字符串跟对象相互转换的一个问题。在springMVC中,便是用HttpMessageConverter机制来处理这个问题的。

HttpInputMessage和HttpOutputMessage

HttpInputMessage是对一次http请求报文的抽象,它是HttpMessageConverter的read()方法中的一个参数,抽象名为"请求信息",消息转化器就按照一定的规则从"请求信息"中提取出信息。

package org.springframework.http;

import java.io.IOException;
import java.io.InputStream;

public interface HttpInputMessage extends HttpMessage {

    InputStream getBody() throws IOException;

}

HttpOutputMessage则是响应报文的抽象,它是HttpMessageConventer中write()方法的参数,消息转换器按照一定规则把响应消息写入到响应报文中。

package org.springframework.http;

import java.io.IOException;
import java.io.OutputStream;

public interface HttpOutputMessage extends HttpMessage {

    OutputStream getBody() throws IOException;

}

HttpMessageConventer

对消息转换器最高层次的接口抽象,描述了消息转换器的一般特征。

package org.springframework.http.converter;

import java.io.IOException;
import java.util.List;

import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;

public interface HttpMessageConverter<T> {

    boolean canRead(Class<?> clazz, MediaType mediaType);

    boolean canWrite(Class<?> clazz, MediaType mediaType);

    List<MediaType> getSupportedMediaTypes();

    T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException;

    void write(T t, MediaType contentType, HttpOutputMessage outputMessage)
            throws IOException, HttpMessageNotWritableException;

}
消息转换流程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,420评论 11 349
  • @RequestBody将HTTP请求正文转换为适合的HttpMessageConverter对象。(请求报文到j...
    火星人想回火星阅读 742评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,874评论 18 399
  • 注意力>时间>金钱 当看到这个公式的时候很多人会困惑,作为工薪阶层,薪水本身就不高,如果用金钱去买时间去买注意力,...
    天蓝槑Ln阅读 184评论 0 2
  • 1.3 变量和常量命名 名称能够包含大部分字符,包括 Unicode 字符。但是不能包含以下字符:空格、数学符号、...
    Pleiades阅读 201评论 0 1