9. Spring MVC4.1-Spring MVC的配置(含自定义HttpMessageConverter)

翻译 2015年11月19日 21:58:19
  • Spring MVC的配置是通过继承WebMvcConfigurerAdapter类并重载其方法实现的;
  • 前几个教程已做了得配置包括
    • 01点睛Spring MVC 4.1-搭建环境 配置viewResolver
    • 03点睛Spring MVC 4.1-REST 静态资源映射
    • 04点睛Spring MVC 4.1-拦截器 配置拦截器
    • 06点睛Spring MVC 4.1-文件上传 配置multipartResolver
    • 07点睛Spring MVC4.1-ContentNegotiatingViewResolver 配置ContentNegotiatingViewResolver

9.2 演示

9.2.1 配置路径匹配参数

  • 在Spring MVC中路径参数如果带.的话,.后面的值将被忽略,本例演示配置configurePathMatch不忽略点后面的参数;

  • 演示控制器

@RequestMapping("/configPath/{test}")
    public @ResponseBody String configPath(@PathVariable String test){
        return "request value:"+test;
    }
  • 运行:访问http://localhost:8080/testSpringMVC/configPath/xx.yy

  • 在继承WebMvcConfigurerAdapterDemoMVCConfig类中重载configurePathMatch
    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
         configurer.setUseSuffixPatternMatch(false);
    }
  • 再次运行:访问访问http://localhost:8080/testSpringMVC/configPath/xx.yy

9.2.2 快捷定义ViewController

  • 我们经常涉及到页面转向,但没任何处理业务的时候,快捷的页面转向定义会节省好多代码;
  • 在views目录下建一个任意的test.jsp
  • 常规的方案是这样写的
@RequestMapping("/mytest")
    public String test(){
        return "test";
    }
  • 在继承WebMvcConfigurerAdapterDemoMVCConfig类中重载addViewControllers
  @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/mytest").setViewName("/test");
        //添加更多
    }
  • 以上效果等同,均会指向views下的test.jsp

9.2.3 配置HttpMessageConverter

  • HttpMessageConverter是对http的request和response进行自动转换
  • 配置HttpMessageConverter可重载下面两个方法任意一个

    • configureMessageConverters:重载会覆盖掉spring mvc默认注册的多个HttpMessageConverter
    • extendMessageConverters:仅添加一个自定义的HttpMessageConverter,不覆盖默认注册的HttpMessageConverter
  • 通过对上面的讲述,我们一般是重载extendMessageConverters方法;

  • 下面我们演示使用js向spring mvc发送自定义格式的字符串(属性用-隔开),通过自定义的HttpMessageConverter自动转换成对象,然后通过HttpMessageConverter输出指定格式到浏览器

  • 测试javabean

    • Person
package com.wisely.domain;

public class Person {

    private String firstName;
    private String lastName;
        public Person(String firstName, String lastName) {
        super();
        this.firstName = firstName;
        this.lastName = lastName;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

}
  • 自定义HttpMessageConverterWiselyMessageConverter
package com.wisely.converters;

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.domain.Person;

public class WiselyMessageConverter extends AbstractHttpMessageConverter<Person> {

     //自定义媒体类型
    public WiselyMessageConverter(){
        super(new MediaType("application", "x-wisely", Charset.forName("UTF-8")));
    }
    //从request里获得构造Person实例的数据
    @Override
    protected Person readInternal(Class<? extends Person> clazz,
     HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        String temp = StreamUtils.copyToString(inputMessage.getBody(), 

Charset.forName("UTF-8"));
        String[] tempArr = temp.split("-");
        return new Person(tempArr[0],tempArr[1]);
    }

    //只支持Person类
    @Override
    protected boolean supports(Class<?> clazz) {
        return Person.class.isAssignableFrom(clazz);
    }

    //将person实例转换成你想要的字符串格式
    @Override
    protected void writeInternal(Person person, HttpOutputMessage outputMessage) 
                                 throws IOException, HttpMessageNotWritableException {
        String out = "hello:" +person.getFirstName() + "-" + person.getLastName();
        outputMessage.getBody().write(out.getBytes());
    }

}

  • 配置WiselyMessageConverter
  @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        WiselyMessageConverter converter = new WiselyMessageConverter();
        converters.add(converter);
    }

注释掉上例的configureContentNegotiation,这里会自动将媒体类型变为text/html

// 配置ContentNegotiationManager,在无后缀名情况下默认为jsp view resolver
//  @Override
//  public void configureContentNegotiation(
//          ContentNegotiationConfigurer configurer) {
//      //忽略请求的header信息,并将contentType置为text/html
//      configurer.ignoreAcceptHeader(true).defaultContentType(
//              MediaType.TEXT_HTML);
//  }
  • 测试控制器
@RequestMapping(value = "/convert", produces = { "application/x-wisely" })
    public @ResponseBody Person convert(@RequestBody Person person) {
        return person;
    }
  • 测试页面:test.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>Insert title here</title>
</head>
<body>
    <div id="resp"></div><input type="button" onclick="req();" value="请求"/>
<script src="js/jquery.js" type="text/javascript"></script>
<script>
    function req(){
        $.ajax({
            url: "convert",
            data: "wang-yunfei",//注意此处的格式
            type:"POST",
            contentType:"application/x-wisely",
            success: function(data){
                $("#resp").html(data);
            }
        });
    }

</script>
</body>
</html>
  • 运行效果


 

相关文章推荐

messageConverter应用

在springmvc和springboot中,均默认采用MappingJackson2HttpMessageConverter来实现JSON数据的处理,那么我们是否可以通过其他转换器实现呢?可以的,本...

Spring MVC 中自定义视图 @Component 及 配置 多个视图解析器 Excel视图

首先我们建立一个自己的View实现View接口。要注意在类上面加上@Component的注解,因为看BeanNameViewResolver的源码知道,是直接从ioc容器里面拿的根据名字拿的视图,所以...

spring mvc中 一个完整的 web.xml配置,包括自定义友好提示页面

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/n...

Spring MVC--13.自定义拦截器

  • 2017年09月05日 20:24
  • 12.46MB
  • 下载

Spring MVC的HTTP请求信息转换器HttpMessageConverter

当控制器上添加@ResponseBody时,返回的java对象默认转成Json字符串输出。当然我们也可以自定义输出的数据类型如:XML等等。此时我们需要配置 RequestMappingHandler...

使用xml/json格式传输数据 spring mvc(HttpMessageConverter<T>的使用)

1.导入jar包(除spring之外的几个jar包) jackson-core-asl-1.4.2.jar jackson-mapper-asl-1.4.2.jar xstream-1.4.4.j...

【Spring MVC拦截器+logback日志+自定义注解】实现用户鉴权登陆和访问日志记录

spring-mvc.xml定义拦截器如下 logback.xml的定义如下 jweb_wb_mgmt ...

用Spring MVC实现自定义404页面

如何定义404404,说白了就是找不到页面,那么如何定义“找不到”呢?我们可以通过源代码来看看Spring MVC如何定义“404”的:// Determine handler for the cur...

spring mvc自定义过滤器filter实现对请求参数编解码的代码

百度,google了半天即使再万能的stackoverflow上也没有得到解答,今天偶然间发现springmvc注解@RequestParam不是通过HttpServletRequest.java的g...

Spring MVC自定义统一异常处理类,并且在控制台中输出错误日志

在使用SimpleMappingExceptionResolver实现统一异常处理后(参考Spring MVC的异常统一处理方法),发现出现异常时,log4j无法在控制台输出错误日志。因此需要自定义一...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:9. Spring MVC4.1-Spring MVC的配置(含自定义HttpMessageConverter)
举报原因:
原因补充:

(最多只允许输入30个字)