Spring MVC WebMvcConfigurer


WebMvcConfigurer 配置類其實是Spring內部的一種配置方式,采用JavaBean的形式來代替傳統的xml配置文件形式進行針對框架個性化定制。

基於 java-based 方式的 spring mvc 配置,需要創建一個配置類並實現 WebMvcConfigurer 接口,WebMvcConfigurerAdapter 抽象類是對WebMvcConfigurer接口的簡單抽象(增加了一些默認實現),但在在SpringBoot2.0及Spring5.0中WebMvcConfigurerAdapter已被廢棄 。官方推薦直接實現 WebMvcConfigurer 或者直接繼承 WebMvcConfigurationSupport,方式一實現WebMvcConfigurer接口(推薦),方式二繼承WebMvcConfigurationSupport類.

 

常用的方法:

 /* 攔截器配置 */
void addInterceptors(InterceptorRegistry var1);
/* 視圖跳轉控制器 */
void addViewControllers(ViewControllerRegistry registry);
/* 靜態資源處理 */
void addResourceHandlers(ResourceHandlerRegistry registry);
/* 默認靜態資源處理器 */
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
/* 視圖解析器 */
void configureViewResolvers(ViewResolverRegistry registry);
/* 配置內容裁決的一些選項*/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/** 解決跨域問題 **/
public void addCorsMappings(CorsRegistry registry) ;

 

 

1 addInterceptors:攔截器

  • addInterceptor:需要一個實現HandlerInterceptor接口的攔截器實例
  • addPathPatterns:用於設置攔截器的過濾路徑規則;addPathPatterns("/**")對所有請求都攔截
  • excludePathPatterns:用於設置不需要攔截的過濾規則
  • 攔截器主要用途:進行用戶登錄狀態的攔截,日志的攔截等。
@Override
public void addInterceptors(InterceptorRegistry registry) {
    super.addInterceptors(registry);
    registry.addInterceptor(new TestInterceptor()).addPathPatterns("/**").excludePathPatterns("/emp/toLogin","/emp/login","/js/**","/css/**","/images/**");
}

 

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle,ok,假設給你一個true,運行去吧");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle,ok,看看我什么時候運行的。");
    }
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterCompletion,ok,看完不點個贊再走嗎?");
    }
}
@Configuration
public class MyConfigurer implements WebMvcConfigurer {
    @Bean
    public MyInterceptor getMyInterceptor(){
        return  new MyInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(this.getMyInterceptor())
        .addPathPatterns("/abc","/configurePathMatch");
    }
}

 

2 addViewControllers:頁面跳轉

以前寫SpringMVC的時候,如果需要訪問一個頁面,必須要寫Controller類,然后再寫一個方法跳轉到頁面,感覺好麻煩,其實重寫WebMvcConfigurer中的addViewControllers方法即可達到效果了.

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/toLogin").setViewName("login");
    }
@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");
}

 

3 addResourceHandlers:靜態資源

比如,我們想自定義靜態資源映射目錄的話,只需重寫addResourceHandlers方法即可。

@Configuration
public class MyWebMvcConfigurerAdapter implements WebMvcConfigurer {
    /**
     * 配置靜態訪問資源
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/");
    }
}
  • addResoureHandler:指的是對外暴露的訪問路徑
  • addResourceLocations:指的是內部文件放置的目錄
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    super.addResourceHandlers(registry);
    // 通過 "/home.html" 請求, 來訪問 /resource/static/home.html 靜態資源
    registry.addResourceHandler("/home.html").addResourceLocations("classpath:/static/home.html");
}

 

4 configureDefaultServletHandling:默認靜態資源處理器

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

此時會注冊一個默認的Handler:DefaultServletHttpRequestHandler,這個Handler也是用來處理靜態文件的,它會嘗試映射/。當DispatcherServelt映射/時(/ 和/ 是有區別的),並且沒有找到合適的Handler來處理請求時,就會交給DefaultServletHttpRequestHandler 來處理。注意:這里的靜態資源是放置在web根目錄下,而非WEB-INF 下。

 

5 configureViewResolvers:視圖解析器

這個方法是用來配置視圖解析器的,該方法的參數ViewResolverRegistry 是一個注冊器,用來注冊你想自定義的視圖解析器等。

 

/**
 * 配置請求視圖映射
 * @return
 */
@Bean
public InternalResourceViewResolver resourceViewResolver()
{
    InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
    //請求視圖文件的前綴地址
    internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
    //請求視圖文件的后綴
    internalResourceViewResolver.setSuffix(".jsp");
    return internalResourceViewResolver;
}
 
/**
 * 視圖配置
 * @param registry
 */
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
    super.configureViewResolvers(registry);
    registry.viewResolver(resourceViewResolver());
    /*registry.jsp("/WEB-INF/jsp/",".jsp");*/
}

 

import org.springframework.web.servlet.config.annotation.ViewResolverRegistry; //導入依賴的package包/類
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
    super.configureViewResolvers(registry);
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/pages/");
    viewResolver.setSuffix(".jsp");
    registry.viewResolver(viewResolver);
}

 

 

REF
https://blog.csdn.net/zhangpower1993/article/details/89016503

 

 

 

 

 

@Configuration
@PropertySource("classpath:ignoreUrl.properties")
//等同於<context:component-scan base-package="com.itheima.controller"/>
@ComponentScan({"com.itheima.controller"})
/*@Import({MyWebMvcConfig.class})*/
@EnableWebMvc
public abstract class SpringMvcConfig implements WebMvcConfigurer {
  @Value("#{'${ignoreUrl}'.split(',')}")
    private List<String> ignoreUrl;
    @Bean
    public ResourcesInterceptor resourcesInterceptor(){
        return new ResourcesInterceptor(ignoreUrl);
    }
    /*
     * 在注冊的攔截器類中添加自定義攔截器
     * addPathPatterns()方法設置攔截的路徑
     * excludePathPatterns()方法設置不攔截的路徑
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor( resourcesInterceptor()).addPathPatterns("/**").excludePathPatterns("/css/**","/js/**","/img/**");
    }

    /*
     *開啟對靜態資源的訪問
     * 類似在Spring MVC的配置文件中設置<mvc:default-servlet-handler/>元素
     */
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override /* 配置視圖解析器的,該方法的參數 ViewResolverRegistry 是一個注冊器,用來注冊你想自定義的視圖解析器等。 */
    public void configureViewResolvers(ViewResolverRegistry registry) {
        registry.jsp("/admin/",".jsp"); /*   前綴為 /admin/ 后綴為 .jsp  */
    }

}

 

 

 ===========================================

@Result(id = true

id=true 對應於主鍵
@Select("select * from user")
@Results({
        @Result(id = true,property = "id",column = "id"),//id=true 對應於主鍵
        @Result(property = "uid",column = "uid"),
        @Result(property = "user",column = "uid",javaType = User.class,
        one = @One(select = "com.example.dao.UserDao.findUserByid",fetchType = FetchType.DEFAULT))
        //user 對應實體類中一對一的實體類名字,uid表示通過uid外鍵查詢User,JavaType表示查詢結果
        //映射成User類型對象,one=表示一對xx fetchType.default默認是立即加載全部查詢,使用lazy懶加載需要才查詢
})
List<User> selectUserList();

 

 

REF:https://blog.csdn.net/fmwind/article/details/81235401

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM