SpringMVC: 消息转换器-HttpMessageConverter

字数 364阅读 387

消息转换器-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;

}
消息转换流程

推荐阅读更多精彩内容