消息轉(zhuǎn)換器-HttpMessageConverter
概述
在springMVC中,可以使用@RequestBody和@ResponceBody這2個(gè)注解完成請(qǐng)求報(bào)文到數(shù)據(jù)對(duì)象晒奕,和數(shù)據(jù)對(duì)象到響應(yīng)報(bào)文的轉(zhuǎn)化, 便是使用了HttpMessageConverter這種靈活的消息轉(zhuǎn)換機(jī)制脑慧。
java中的http請(qǐng)求
在servlet標(biāo)準(zhǔn)中,可以使用javax.servlet.request接口中的以下方法:
public ServletInputStream getInputStream() throws IOException;
ServletInputStream是一個(gè)可以讀取到請(qǐng)求報(bào)文中內(nèi)容的輸入流坑律。
public ServletOutputStream getOutputStream() throws IOException;
ServletOutputStream則是用來輸出響應(yīng)報(bào)文內(nèi)容的輸出流囊骤。
不論是請(qǐng)求報(bào)文還是響應(yīng)報(bào)文,內(nèi)容實(shí)際上都是字符串宫屠,而在業(yè)務(wù)邏輯處理中往往都需要用到對(duì)象滑蚯,所以就存在一個(gè)字符串跟對(duì)象相互轉(zhuǎn)換的一個(gè)問題抵栈。在springMVC中古劲,便是用HttpMessageConverter機(jī)制來處理這個(gè)問題的。
HttpInputMessage和HttpOutputMessage
HttpInputMessage是對(duì)一次http請(qǐng)求報(bào)文的抽象绢慢,它是HttpMessageConverter的read()方法中的一個(gè)參數(shù)胰舆,抽象名為"請(qǐng)求信息"蹬挤,消息轉(zhuǎn)化器就按照一定的規(guī)則從"請(qǐng)求信息"中提取出信息。
package org.springframework.http;
import java.io.IOException;
import java.io.InputStream;
public interface HttpInputMessage extends HttpMessage {
InputStream getBody() throws IOException;
}
HttpOutputMessage則是響應(yīng)報(bào)文的抽象倦零,它是HttpMessageConventer中write()方法的參數(shù)吨悍,消息轉(zhuǎn)換器按照一定規(guī)則把響應(yīng)消息寫入到響應(yīng)報(bào)文中。
package org.springframework.http;
import java.io.IOException;
import java.io.OutputStream;
public interface HttpOutputMessage extends HttpMessage {
OutputStream getBody() throws IOException;
}
HttpMessageConventer
對(duì)消息轉(zhuǎn)換器最高層次的接口抽象葫隙,描述了消息轉(zhuǎn)換器的一般特征恋脚。
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;
}