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" onclick="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>