Spring的WebMvcConfigurer
接口提供了很多方法讓我們來定制SpringMVC的配置望伦。而且Spring還提供了WebMvcConfigurerAdapter
讓我們更加優(yōu)化的去進行配置。我們的配置類可以直接繼承WebMvcConfigurerAdapter
來進行配置披泪。
configurePathMatch:匹配路由請求規(guī)則
- setUseSuffixPatternMatch : 設(shè)置是否是后綴模式匹配羽峰,如“/user”是否匹配/user.*氛濒,默認為true
- setUseTrailingSlashMatch : 設(shè)置是否自動后綴路徑模式匹配枚钓,如“/user”是否匹配“/user/”哟忍,默認為true
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
super.configurePathMatch(configurer);
/*
* 1.ServletMappings 設(shè)置的是 "/" 2.setUseSuffixPatternMatch默認設(shè)置為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,例如, 對于日期類型,枚舉類型的轉(zhuǎn)化.
* 不過對于日期類型,使用更多的是使用
*
* @DateTimeFormat(pattern = "yyyy-MM-dd")
* private Date createTime;
*/
@Override
public void addFormatters(FormatterRegistry registry) {
super.addFormatters(registry);
registry.addConverterFactory(enumConverterFactory());
}
/**
* SpringMVC支持綁定枚舉值參數(shù)狡门。
* 匹配規(guī)則 :
* 字符串則嘗試根據(jù)Enum#name()轉(zhuǎn)換。
* 如果找不到匹配的則返回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:添加自定義方法參數(shù)處理器
需求:想要在Controller的參數(shù)列表中注入當(dāng)前回話的自定義PlatformSession對象锅很。
@Getter
@Setter
public class PlatformSession<T> {
private T id;
private String username;
private int expireTime;
}
解決方法:創(chuàng)建自定義參數(shù)處理器其馏,通過addArgumentResolvers添加到SpringMVC中。
自定義參數(shù)處理器
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 狀態(tài)
registry.addStatusController("/admin/**", HttpStatus.NOT_FOUND);
// 將 "/home" 的 請求響應(yīng)為返回 "home" 的視圖
registry.addViewController("/home").setViewName("home");
}
addResourceHandlers:添加靜態(tài)資源處理器
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
// 通過 "/home.html" 請求, 來訪問 /resource/static/home.html 靜態(tài)資源
registry.addResourceHandler("/home.html").addResourceLocations("classpath:/static/home.html");
}