一 点睛
HttpMessageConvert是用来处理Request和Response里的数据。Spring为我们内置了大量的HttpMessageConvert。
二 项目说明
自定义HttpMessageConvert,并注册这个自定义HttpMessageConvert到Spring MVC。
三 实战
1 自定义HttpMessageConvert
package com.wisely.highlight_springmvc4.messageconverter;
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.wisely.highlight_springmvc4.domain.DemoObj;
//继承AbstractHttpMessageConverter接口来实现AbstractHttpMessageConverter
public class MyMessageConverter extends AbstractHttpMessageConverter<DemoObj> {
public MyMessageConverter() {
//新建一个我们自定义的媒体类型application/x-wisely
super(new MediaType("application", "x-wisely",Charset.forName("UTF-8")));
}
/**
* 重写readInternal方法,处理请求的数据。代表我们处理由"-"隔开的数据,并转成DemoObj对象
*/
@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]);
}
/**
* 表明HttpMessageConvert只处理DemoObj这个类
*/
@Override
protected boolean supports(Class<?> clazz) {
return DemoObj.class.isAssignableFrom(clazz);
}
/**
* 重写writeInternal,处理如何输出数据到response。此例中,在原样输出签名加上“hello:”
*/
@Override
protected void writeInternal(DemoObj obj, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
String out = "hello:" + obj.getId() + "-"
+ obj.getName();
outputMessage.getBody().write(out.getBytes());
}
}
2 配置
/*
配置自定义的HttpMessageConvert的Bean,在Spring MVC里注册HttpMessageConvert有两个方法:
configureMessageConverts:重置会覆盖Spring MVC里注册的多个HttpMessageConvert。
extendMessageConverters:仅添加一个自定义的HttpMessageConvert,不覆盖默认注册的HttpMessageConvert
这里重写extendMessageConverters
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(converter());
}
@Bean
public MyMessageConverter converter(){
return new MyMessageConverter();
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//映射路径和页面
registry.addViewController("/converter").setViewName("/converter");
}
3 控制器
package com.wisely.highlight_springmvc4.web.ch4_5;
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.wisely.highlight_springmvc4.domain.DemoObj;
@Controller
public class ConverterController {
//指定返回的媒体为我们自定义的媒体类型application/x-wisely
@RequestMapping(value = "/convert", produces = { "application/x-wisely" })
public @ResponseBody DemoObj convert(@RequestBody DemoObj demoObj) {
return demoObj;
}
}
4 页面展示
<%@ 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-wangyunfei", //后台处理按此格式,用'-'隔开
type:"POST",
contentType:"application/x-wisely", //设置媒体类型为自定义的application/x-wisely
success: function(data){
$("#resp").html(data);
}
});
}
</script>
</body>
</html>
四 运行
1 浏览器访问
http://localhost:8080/highlight_springmvc4/converter
单击“请求”