• 08点睛Spring MVC4.1-Spring MVC的配置(含自定义HttpMessageConverter)


    8.1 配置

    • 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

    8.2 演示

    8.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

    8.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

    8.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>
    • 运行效果

  • 相关阅读:
    Java零基础学习(四)JSP与Servlet
    Java零基础学习(三)封装继承多态
    vsftpd+nginx搭建图片服务器的一些问题
    1003. 我要通过!(20)(两种语言的运行时间差异)
    acm 1108 java做法
    acm 2020 用java实现
    acm 2519 java做法
    acm 2040 java做法
    acm 2003 java做法
    acm 2041 java的做法
  • 原文地址:https://www.cnblogs.com/Jeely/p/11950304.html
Copyright © 2020-2023  润新知