自定义HttpMessageConvert

一 点睛

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

单击“请求”

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/81808560