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