摘要

Spring的WebMvcConfigurer接口提供了很多方法让我们来定制SpringMVC的配置。而且Spring还提供了WebMvcConfigurerAdapter让我们更加优化的去进行配置。我们的配置类可以直接继承WebMvcConfigurerAdapter来进行配置

configurePathMatch:匹配路由请求规则

  • setUseSuffixPatternMatch : 设置是否是后缀模式匹配,如“/user”是否匹配/user.*,默认为true
  • setUseTrailingSlashMatch : 设置是否自动后缀路径模式匹配,如“/user”是否匹配“/user/”,默认为true
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
super.configurePathMatch(configurer);
/*
* 1.ServletMappings 设置的是 "/" 2.setUseSuffixPatternMatch默认设置为true,
* 那么,"/user" 就会匹配 "/user.*",也就是说,"/user.html" 的请求会被 "/user" 的 Controller所拦截.
* 3.如果该值为false,则不匹配
*/
configurer.setUseSuffixPatternMatch(false); /*
* setUseTrailingSlashMatch的默认值为true
* 也就是说, "/user" 和 "/user/" 都会匹配到 "/user"的Controller
*/
configurer.setUseTrailingSlashMatch(true);
}

addFormatters:注册自定义的Formatter和Convert

@Bean
public EnumConverterFactory enumConverterFactory() {
return new EnumConverterFactory();
} /**
* 注册自定义的Formatter和Convert,例如, 对于日期类型,枚举类型的转化.
* 不过对于日期类型,使用更多的是使用
*
* @DateTimeFormat(pattern = "yyyy-MM-dd")
* private Date createTime;
*/
@Override
public void addFormatters(FormatterRegistry registry) {
super.addFormatters(registry);
registry.addConverterFactory(enumConverterFactory());
} /**
* SpringMVC支持绑定枚举值参数。
* 匹配规则 :
* 字符串则尝试根据Enum#name()转换。
* 如果找不到匹配的则返回null
*/
public class EnumConverterFactory implements ConverterFactory<String, Enum> { @Override
public <T extends Enum> Converter<String, T> getConverter(Class<T> targetType) {
return new String2EnumConverter(targetType);
} class String2EnumConverter<T extends Enum<T>> implements Converter<String, T> { private Class<T> enumType; private String2EnumConverter(Class<T> enumType) {
this.enumType = enumType;
} @Override
public T convert(String source) {
if (source != null && !source.isEmpty()) {
try {
return Enum.valueOf(enumType, source);
} catch (Exception e) {
}
}
return null;
}
}
}

addArgumentResolvers:添加自定义方法参数处理器

需求:想要在Controller的参数列表中注入当前回话的自定义PlatformSession对象。

@Getter
@Setter
public class PlatformSession<T> {
private T id;
private String username;
private int expireTime;
}

解决方法:创建自定义参数处理器,通过addArgumentResolvers添加到SpringMVC中。

自定义参数处理器

public class PlatformSessionArgumentResolvers implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
return PlatformSession.class.equals(methodParameter.getClass());
} @Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
return PlatformSessionUtil.getSession(request);
}
}

配置类

@Bean
PlatformSessionArgumentResolvers platformSessionArgumentResolvers() {
return new PlatformSessionArgumentResolvers();
} @Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
super.addArgumentResolvers(argumentResolvers);
argumentResolvers.add(platformSessionArgumentResolvers());
}

addViewControllers:添加自定义视图控制器

@Override
public void addViewControllers(ViewControllerRegistry registry) {
super.addViewControllers(registry);
// 对 "/hello" 的 请求 redirect 到 "/home"
registry.addRedirectViewController("/hello", "/home");
// 对 "/admin/**" 的请求 返回 404 的 http 状态
registry.addStatusController("/admin/**", HttpStatus.NOT_FOUND);
// 将 "/home" 的 请求响应为返回 "home" 的视图
registry.addViewController("/home").setViewName("home");
}

addResourceHandlers:添加静态资源处理器

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
// 通过 "/home.html" 请求, 来访问 /resource/static/home.html 静态资源
registry.addResourceHandler("/home.html").addResourceLocations("classpath:/static/home.html");
}

作者:土豆了解一下
链接:https://www.jianshu.com/p/52f39b799fbb
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

webMvcConfigurer的详情的更多相关文章

  1. SpringBoot——配置类实现WebMvcConfigurer接口来配置拦截器、view-controller、视图解析器等

    目的:为了保留SpringBoot对SpringMVC自动配置,另外我们还想要做一些自己拓展的功能 如何做扩展? 以配置view-controller实现跳转为例: 原先在SpringMvc中我们写v ...

  2. Java豆瓣电影爬虫——抓取电影详情和电影短评数据

    一直想做个这样的爬虫:定制自己的种子,爬取想要的数据,做点力所能及的小分析.正好,这段时间宝宝出生,一边陪宝宝和宝妈,一边把自己做的这个豆瓣电影爬虫的数据采集部分跑起来.现在做一个概要的介绍和演示. ...

  3. Android开发案例 - 淘宝商品详情

    所有电商APP的商品详情页面几乎都是和淘宝的一模一样(见下图): 采用上下分页的模式 商品基本参数 & 选购参数在上页展示 商品图文详情等其他信息放在下页展示 知识要点 垂直方向的ViewPa ...

  4. 使用django开发博客过程记录2——博客首页及博客详情的实现

    1.什么是CBV(Class-based views) 2.博客首页及博客详情实现 1.什么是CBV 什么是CBV?说白了就是以前是视图为处理请求返回响应的函数,有了cbv之后我们就可以用类处理请求和 ...

  5. [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析

    [WebKit内核] JavaScript引擎深度解析--基础篇(一)字节码生成及语法树的构建详情分析 标签: webkit内核JavaScriptCore 2015-03-26 23:26 2285 ...

  6. 从零开始,搭建博客系统MVC5+EF6搭建框架(5),博客详情页、留言、轮播图管理、右侧统计博文

    一.博客系统进度回顾 上一遍博客介绍到,系统已经实现到了发布以及前台布局展示,接下来就是实现一些,详情页,留言.轮播图管理.右侧博文统计信息实现. 二.博客系统详情页实现 2.1先来看看详情页展示的效 ...

  7. webapi filter过滤器中获得请求的方法详情(方法名,Attributes)

    public class GlobalActionFilter : ActionFilterAttribute { private string _requestId; public override ...

  8. 11月10日下午 ajax做显示信息以后用ajax、Bootstrp做弹窗显示信息详情

    1.用ajax做弹窗显示信息详情 nation.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  9. 这交互炸了:饿了么是怎么让Image变成详情页的

    这交互炸了:饿了么是怎么让Image变成详情页的 晚上叫外卖,打开饿了么,发现推了一个版本,更新以后,点开了个鸡腿,哇,交互炫炸了. 本文同步自wing的地方酒馆 不过还是有槽点.我是无意中才发现可以 ...

随机推荐

  1. shell专题(四):Shell中的变量

    4.1 系统变量 1. 常用系统变量 $HOME.$PWD.$SHELL.$USER等 2.案例实操 (1)查看系统变量的值 [atguigu@hadoop101 datas]$ echo $HOME ...

  2. web 部署专题(八):Nginx 反向代理中cookie相关问题

    问题3:认证问题 Domino服务器中,通过写了一些接口代码,提供RESTful的服务,来对手机端进行提供服务.但是由于原来的环境,没有SSO,而且不通过认证,没法访问到Domino里面的接口代码. ...

  3. CMDB02/ 单例模式、资产采集参考命令、日志处理

    CMDB02/单例模式.资产采集参考命令.日志处理 目录 CMDB02/单例模式.资产采集参考命令.日志处理 1. 单例模式 1.1 多例模式 1.2 单例模式 1.2.1 单例模式/错误 1.2.2 ...

  4. 让 axios 支持 finally

    当我们执行一个promise操作时,往往伴随的是要做各种状态的修改(如请求开始时显示loading,结束时隐藏 loading), 这个状态修改,如果没有finally函数,我们需要在then和cat ...

  5. 通过代理模块拦截网页应用程序流量 - Intercept Web Application Traffic Using Proxy Modules

    测试网站: http://testphp.vulnweb.com/login.php 浏览器代理设置为:127.0.0.1:8080 查看拦截流量: 方式1:通Proxy - Intercept 方式 ...

  6. 评测Loki日志工具

    评测Loki日志工具 目录 评测Loki日志工具 部署Loki 配置grafana 总结: 优势: 劣势: 本文仅对Loki进行简单评测,不涉及原理和细节. 部署Loki Loki是grafana团队 ...

  7. antd踩坑:日期选择器的可选日期控制的问题

    有一个需求是日期选择需要加一个日期限制. 于是我兴高采烈的加上去了. // 日期可选判断方法 disabledDateFunc = current => { const { disabledDa ...

  8. MySQL数据库---前言

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下公司.MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS ...

  9. jspang 做个那个pos系统--学习笔记

    /为什么不能使用Object.assign() //使用Object.assign之后数据会发生改变,但是试图没有跟新 <template> <div class="pos ...

  10. 前端css 同级元素 设置不同样式 :first-child :nth-child() 的操作收藏

    说明:最近在写前端vue  调样式的时候遇到了一个问题 同一个div下对多个同级别的<span>标签进行 边距设置 <div class="shuju-div"& ...