HttpmessageConvert是用来处理request和response里的数据的。Spring为我们内置了大量的HttpmessageConvert,
例如,MappingJackson2HttpMessageConverter/StringHttpMessageConverter等。
1.继承AbstractHttpMessageConverter实现自定义的HttpMessageConverter
package com.boot.springmvc.messageconvert;
import java.io.IOException;
import java.nio.charset.Charset;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import org.springframework.util.StreamUtils;
import com.boot.springmvc.domain.DemoObj;
public class MymessageConverter extends AbstractHttpMessageConverter<DemoObj> {// 1继承AbstractHttpMessageConverter实现自定义的HttpMessageConverter
public MymessageConverter() {
super(new MediaType("application", "blog-zh", Charset.forName("UTF-8")));// 2构造函数中我们自定义媒体类型(application/blog-zh)
}
// 3重写readInternal方法,处理请求数据。
@Override
protected DemoObj readInternal(Class<? extends DemoObj> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
String temp = StreamUtils.copyToString(inputMessage.getBody(), Charset.forName("UTF-8"));
String[] tempArr = temp.split("-");
return new DemoObj(new Long(tempArr[0]), tempArr[1]);
}
// 4HttpMessageConverter只处理DemoObj这个类
@Override
protected boolean supports(Class<?> clazz) {
return DemoObj.class.isAssignableFrom(clazz);
}
// 5处理response响应的数据。
@Override
protected void writeInternal(DemoObj t, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
String out="hello"+t.getId()+"-"+t.getName();
outputMessage.getBody().write(out.getBytes());
}
}
2.MyMvcConfig配置
/**
* 配置自定义的HttpMessageConverter
*注:
*1.configureMessageConverters:重载会覆盖掉spring mvc默认注册的 多个HttpMessageConverter。
*2.extendsMessageConverter:仅添加一个自定义 的HttpMessageConverter,不覆盖默认注册 的HttpMessageConverter.
**/
//使用extendsMessageConverter 添加一个自定义的HttpMessageConverter
@Bean
public MymessageConverter converter(){
return new MymessageConverter();
}
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(converter());
}
addviewControllers配置如下
// 演示HttpMessageConverter
registry.addViewController("/converter").setViewName("/converter");
3.控制器配置如下
package com.boot.springmvc.web.ch4;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.boot.springmvc.domain.DemoObj;
@Controller
public class ConverterController {
@RequestMapping(value = "/convert", produces = { "application/blog-zh" }) // 1
public @ResponseBody DemoObj convert(@RequestBody DemoObj demoObj) {
return demoObj;
}
}
4.jsp配置
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HttpMessageConverter Demo</title>
</head>
<body>
<div id="resp"></div><input type="button" οnclick="req();" value="请求"/>
<script src="/assets/js/jquery.js" type="text/javascript"></script>
<script>
function req(){
$.ajax({
url: "convert",
data: "1-blog", //1
type:"POST",
contentType:"application/blog-zh", //2
success: function(data){
$("#resp").html(data);
}
});
}
</script>
</body>
</html>