WebMvc装配扩展

简介

WebMvcConfigurer配置类其实是Spring内部的一种配置方式,采用JavaBean的形式来代替传统的xml配置文件形式进行针对框架个性化定制,可以自定义一些Handler,Interceptor,ViewResolver,MessageConverter。基于java-based方式的spring mvc配置,需要创建一个配置类并实现**WebMvcConfigurer** 接口;

WebMvcAutoConfiguration是WebMvc的自动配置类,配置关于web项目的一些文件,而WebMvcConfigurer是一个接口,该接口用于补充WebMvcAutoConfiguration自动配置类,也就是说如果在WebMvcAutoConfiguration有没有考虑到的地方,可以通过WebMvcConfigurer接口扩展。

WebMvcConfigurer接口

public interface WebMvcConfigurer {
    default void configurePathMatch(PathMatchConfigurer configurer) {
    }
    default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
    }
    default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
    }
    default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
    }
    default void addFormatters(FormatterRegistry registry) {
    }
    default void addInterceptors(InterceptorRegistry registry) {
    }
    default void addResourceHandlers(ResourceHandlerRegistry registry) {
    }
    default void addCorsMappings(CorsRegistry registry) {
    }
    default void addViewControllers(ViewControllerRegistry registry) {
    }
    default void configureViewResolvers(ViewResolverRegistry registry) {
    }
    default void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    }
    default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
    }
    default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    }
    default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    }
    default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }
    default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
    }
    @Nullable
    default Validator getValidator() {
        return null;
    }
    @Nullable
    default MessageCodesResolver getMessageCodesResolver() {
        return null;
    }
}

常用的方法:

 /* 拦截器配置 */
void addInterceptors(InterceptorRegistry var1);
/* 视图跳转控制器 */
void addViewControllers(ViewControllerRegistry registry);
/**
     *静态资源处理
**/
void addResourceHandlers(ResourceHandlerRegistry registry);
/**
     * 这里配置视图解析器
 **/
void configureViewResolvers(ViewResolverRegistry registry);
/** 解决跨域问题 **/
public void addCorsMappings(CorsRegistry registry) ;

addInterceptors:拦截器

首先需要写一个拦截器类如下图

在这里插入图片描述

然后需要在springmvc扩展类中的addInterceptors方法中写一段代码,如下图

在这里插入图片描述

最后是测试阶段:

在这里插入图片描述

  • addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
  • addPathPatterns:用于设置拦截器的过滤路径规则;addPathPatterns("/**")对所有请求都拦截
  • excludePathPatterns:用于设置不需要拦截的过滤规则
  • 拦截器主要用途:进行用户登录状态的拦截,日志的拦截等。

addResourceHandlers:静态资源

springboot中默认的静态目录有四个:classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public

这四个静态目录对外面暴露的路径都是/**,也即是访问这四个静态目录里面的东西时可以直接用localhost:8080/这个接口。

现在我们可以通过addResourceHandlers定制我们需要的静态目录,并且此过程不会影响已经存在的四个静态资源目录。

具体代码如下图:

在这里插入图片描述

addViewControllers:页面跳转

页面跳转指的是templates文件夹下的html文件不能够直接访问,比如templates文件夹下有一个login.html文件,如果直接访问如

localhost:8080/login.html这样是访问不到的,解决办法可以用上面的addResourceHandlers指定静态资源来解决;当然也可以通过控制器来解决,就是比如你想访问templates目录下的login.html文件,可以在控制器中写一个RequestMapping(path="/toLogin")的方法,让此方法return “login”;这样就可以通过控制器访问templates目录中的login.html文件了,即通过localhost:8080/toLogin接口访问。但是写控制器代码太麻烦了,我们可有直接在addViewControllers方法中写一段代码,如下

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
    
    
        registry.addViewController("/toLogin").setViewName("login");
    }

这样就能和上面的写一个控制器实现的效果相同,也可以通过localhost:8080/toLogin接口访问templates模板中的login.html文件

并且此中方式不会影响已经在controller控制器包中写的控制器。

configureViewResolvers:视图解析器

在这里插入图片描述

需要注意的一个细节是:如果springboot中存在thymeleaf引擎模板,那么默认的视图解析器是prefix:classpath:/templates/,

suffix:.html 并且此优先级最高,只要有它其它的视图解析器即便配置了也没有用。

addCorsMappings:跨域

在这里插入图片描述
springboot中配置的解决跨域问题的文件如下图:
在这里插入图片描述
记住allowedOrigins方法的参数不是springboot自身的URL而是别人的url就行了。

猜你喜欢

转载自blog.csdn.net/qq_45950109/article/details/110878953