• 后端——框架——视图层框架——spring_mvc——《官网》阅读笔记——第一章节41(mvc配置,WebMvcConfigurer)


    1、类型转换

      添加自定义的校验器,转换器,格式化器。

      注册校验器的方式是重写getValidator方法,它获取的是Spring框架自身的Validator接口,而我们常用的是Hibernate validator。

      注册转换器的方式是重写addFormatter方法,注册格式化器的方式也是重写addFormatter方法,在概念上格式化本质是对象转换之间的一个过程。

    2、拦截器

      添加拦截器实现Interceptor接口,注册拦截器的方式是重写addInterceptor方法,具体细节参考拦截器章节。

    3、内容类型

      设置响应的内容类型,最常使用的一种方式是设置@RequestMapping, @PostMapping等同类型注解的produces属性,它的值为MediaType,是一个枚举类。

      这种方式只是给单个handler方法设置,若要全局设置,需要重写configureContentNegotiation方法。

      Mvc判断响应内容类型的依据有三个

    1. 根据请求url的后缀,例如test/xxx.pdf,此时响应内容的类型为application-pdf
    2. 根据请求url的参数,默认情况下参数的名称为mediaType, 下述内容会介绍它是可以修改的。例如test/xx? mediaType=pdf
    3. 根据请求头中的信息。

      若三者都无法判断响应的内容类型,会使用默认值。

      重写configureContentNegotiation方法等价于自定义规则。示例如下

    @Override
    public void 
    configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    	// 是否支持url中的后缀做为判断依据,false时会禁用
    	configurer.favorPathExtension(true)
    	// 请求Url参数的名称,或者是请求头中的参数名称
    	.parameterName("mediatype")
    	// 是否忽略请求头信息,true会忽略,此时相当于禁用根据请求头信息判断内容类型
    	.ignoreAcceptHeader(false)
    	.useJaf(false)
    	// 设置默认的响应类型,此时设置为Application_json
    	.defaultContentType(MediaType.APPLICATION_JSON_UTF8)
    	// 建立参数值或者是后缀值与响应类型MediaType之间的关系,例如请求url后缀为xx.json,此时根据json,响应类型为Application_JSON
    	.mediaType("json", MediaType.APPLICATION_JSON)
    	// xml表示Application_xml
    	.mediaType("xml", MediaType.APPLICATION_XML);
    }
    

    4、Message Converter

      Message Converter的功能是将handler方法的返回值根据响应内容的类型转换为特定的数据类型。假设响应内容类型为json时,此时handler方法的返回值为实体对象时,message Converter会将实体对象转换为JSON字符串。

      在之前介绍当响应类型为JSON时可以使用@JsonView注解,为Xml时,返回MarshallingView。此时无需message converter。

      使用message converter的前提有两个

    1. 响应内容的类型是已知的,例如xml, json等。
    2. Handler方法的返回值为实体对象。

      重写configureMessageConverters等价于注册HttpMessageConverter接口的实现类,示例如下:

    /**
     * 
     * 配置messageConverter
     */
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    	// 创建ObjectMapperBuilder对象
    	Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().indentOutput(true)
    			  .dateFormat(new SimpleDateFormat("yyyy-MM-dd"));
    	// 将对象转换为JSON
    	converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
    	// 将对象转换为XML
    	converters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build()));
    }
    

    5、ViewController

      它是直接建立请求URL与视图View对象之间的关系。以往情况是请求URL建立与handler方法之间的关系,而后根据handler的返回值来生成View对象。

      整个过程省略了handler方法,所以只适用于无任何处理逻辑的请求。示例如下:

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        // 直接跳转到登陆页面,login对应WEB-INF/view/login.jsp
        registry.addViewController("/login").setViewName("login");
    }
    

    6、ViewResolvers

      视图解析器,在之前已编写过很多示例。具体参考视图解析器部分。

    7、静态资源

      静态资源的访问,关键点有两个,

    1. 第一个是建立静态资源请求与静态资源文件存放路径的映射关系
    2. 第二个是设置缓存。下述示例中创建了CacheControl对象,保存10天。 
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    	// 创建CacheControl对象
    	CacheControl cacheControl = CacheControl.maxAge(10, TimeUnit.DAYS).noTransform();
    	// 设置静态资源的请求
    	registry.addResourceHandler("/resources/**")
    	// 静态资源存放的物理路径
    	.addResourceLocations("/WEB-INF/js/**","WEB-INF/images/**")
    	// 设置浏览器缓存静态资源的时间
    	.setCacheControl(cacheControl);
    }
    

    8、DefaultServlet

      DefaultServlet是将/映射为默认的欢迎页面,学习过Servlet的知道,配置默认的欢迎页面是在web.xml中配置welcome-file-list子标签,打开Tomcat服务器的web.xml, 发现它的配置项是index.html, index.jsp, index.htm。

      本质是将/映射为index.html或index.jsp或index.htm。

      mvc它没有默认的defaultServlet,而是使用Web Server默认的servlet。mvc在其中的作用只是指定默认的servlet为Web server的默认servlet。

      示例代码如下:

    @Override
    public void 
    configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    	configurer.enable();
    }
    

      enable的参数为servlet的名称,可以将自定义的servlet作为默认的servlet,例如TestServlet的名称为testServlet,之后将testServlet作为enable方法的参数。

      Enable方法参数指定的servlet必须是存在的,否则会抛出错误。

  • 相关阅读:
    hibernate 字段名最好不要使用数据库的保留字
    Tomcat Java内存溢出 PermGen space 解决方案
    jsp关于include html、jsp等文件出现乱码问题的解决方案
    hibernate annotation注解 columnDefinition用法
    hibernate annotation注解 主键ID自增长
    Java将整个文件夹里的文本中的字符串替换成另外一个字符串(可用于项目复制,变成另一个项目)
    FreeMarker 乱码解决方案 生成静态html文件
    Java发送post请求
    编程式导航
    vue-router 的重定向-redirect
  • 原文地址:https://www.cnblogs.com/rain144576/p/12902878.html
Copyright © 2020-2023  润新知