SpringMVC学习--7 MessageConverter

MessageConverter作用是读取request中body的数据并进行转换,并将转换后的数据经过处理后写入response的body中。在配置类中添加MessageConverter的方法有两种:

extendMessageConverters(List

1. MessageConverter

package com.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.object.DemoObj;

public class DemoMessageConverter extends AbstractHttpMessageConverter<DemoObj> {

    /**define a new MediaType, which also can be done by invoking setSupportedMediaTypes method.
     * The former is constructor injection, the latter is setter injection.
     * 
     */
    public DemoMessageConverter() {
        super(new MediaType(
                "application", "xxx-apple", Charset.forName("UTF-8")));
    }

    /** 从request的body中读取数据,并转换为DemoObj
     * @param clazz
     * @param inputMessage
     * @return
     * @throws IOException
     * @throws HttpMessageNotReadableException
     */
    @Override
    protected DemoObj readInternal(Class<? extends DemoObj> clazz, HttpInputMessage inputMessage)
            throws IOException, HttpMessageNotReadableException {
        String temp = StreamUtils.copyToString(inputMessage.getBody(), 
                Charset.forName("UTF-8"));
        String strArr[] = temp.split("-"); // Acquire that the data String is contacted by "-"
        return new DemoObj(Long.valueOf(strArr[0]), strArr[1]);
    }

    /** 确定给定的类(即DemoObj)被该MessageConverter支持
     * @param clazz
     * @return
     */
    @Override
    protected boolean supports(Class<?> clazz) {
        return DemoObj.class.isAssignableFrom(clazz);
    }

    /**将DemoObj对象写入response的body中
     * @param t
     * @param outputMessage
     * @throws IOException
     * @throws HttpMessageNotWritableException
     */
    @Override
    protected void writeInternal(DemoObj t, HttpOutputMessage outputMessage)
            throws IOException, HttpMessageNotWritableException {
        String output = "Hello: " + t.getId() + "-" + t.getName();
        outputMessage.getBody().write(output.getBytes());
    }
}

2. 配置类中增加MessageConverter

 package com.config;

import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

import com.interceptor.DemoInterceptor;
import com.messageconverter.DemoMessageConverter;

@Configuration
@ComponentScan("com")
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {
    @Bean
    InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = 
                new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/classes/views/");
        viewResolver.setSuffix(".jsp");
        //JstlView is used to support java standard tag library and create jsp view
        viewResolver.setViewClass(JstlView.class); 
        return viewResolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
    }

    @Bean 
    DemoInterceptor demoInterceptor() {
        return new DemoInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(demoInterceptor());
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {           registry.addViewController("/viewController").setViewName("viewController");
        // file upload test url-view mapping
        registry.addViewController("/toUpload").setViewName("/upload");
        // MessageConverter test url-view mapping
        registry.addViewController("/converter").setViewName("/converter");
    }

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        configurer.setUseSuffixPatternMatch(false);
    }

    @Bean
    public MultipartResolver multipartResolver() {
        CommonsMultipartResolver multipartResolver = 
                new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(1000000);
        return multipartResolver;
    }

    @Bean
    public DemoMessageConverter demoMessageConverter() {
        return new DemoMessageConverter();
    }

    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(demoMessageConverter());
    }
}

3. Controller

package com.controller;

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.object.DemoObj;

@Controller
public class ConverterController {
    @RequestMapping(value="/convert", produces= {"application/xxx-apple"})
    @ResponseBody
    public DemoObj convert(@RequestBody DemoObj obj) {
        Long id = obj.getId() + 1;
        String name = obj.getName() + "macbook";
        return new DemoObj(id, name);
    }
}

4. JSP for test

<%@ 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>Insert title here</title>
</head>
<body>
    <div id="resp"></div>
    <input type="button" onclick="req();" value="请求"/>
    <script src="assets/js/jquery-3.3.1.min.js" type="text/javascript"></script>
    <script>
        function req() {
            $.ajax({
                url: "convert",
                data: "1-apple",
                type: "POST",
                contentType:  "application/xxx-apple",
                success: function(data) {
                    $("#resp").html(data);
                }
            });
        }
    </script>
</body>
</html>

5. Test result

通过ajax发送的数据“1-apple”经过MessageConverter后返回到jsp页面变成:
Hello: 2-applemacbook
试验成功。

猜你喜欢

转载自blog.csdn.net/xiewz1112/article/details/80587573