Servlet3.0——定製和接管SpringMVC
阿新 • • 發佈:2018-12-21
1、使用@EnableWebMvc註解開啟SpringMVC定製配置功能,相當於<mvc:annotation-driven/>
①實現WebMvcConfigurer介面,並重寫該介面中的方法(高版本的Spring中該介面中的方法不一定必須實現)
@EnableWebMvc @ComponentScan(value = "com.bdm", useDefaultFilters = false, includeFilters = { @Filter(type = FilterType.ANNOTATION, classes = { Controller.class }) }) public class AppConfig implements WebMvcConfigurer { public void configurePathMatch(PathMatchConfigurer configurer) { } public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { } public void configureAsyncSupport(AsyncSupportConfigurer configurer) { } public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable();//相當於<mvc:default-servlet-handler/>,將SpringMVC處理不了的請求交給tomcat,比如靜態資源的訪問
} public void addFormatters(FormatterRegistry registry) { } public void addInterceptors(InterceptorRegistry registry) { } public void addResourceHandlers(ResourceHandlerRegistry registry) { } public void addCorsMappings(CorsRegistry registry) { } public void addViewControllers(ViewControllerRegistry registry) { } public void configureViewResolvers(ViewResolverRegistry registry) { } public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { } public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) { } public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { } public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { } public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { } public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { } @Nullable public Validator getValidator() { return null; } @Nullable public MessageCodesResolver getMessageCodesResolver() { return null; } }@ComponentScan(value = "com.bdm", useDefaultFilters = false, includeFilters = { @Filter(type = FilterType.ANNOTATION, classes = { Controller.class }) }) public class AppConfig implements WebMvcConfigurer { public void configurePathMatch(PathMatchConfigurer configurer) { } public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { } public void configureAsyncSupport(AsyncSupportConfigurer configurer) { } public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable();//相當於<mvc:default-servlet-handler/>,將SpringMVC處理不了的請求交給tomcat,比如靜態資源的訪問} public void addFormatters(FormatterRegistry registry) { } public void addInterceptors(InterceptorRegistry registry) { } public void addResourceHandlers(ResourceHandlerRegistry registry) { } public void addCorsMappings(CorsRegistry registry) { } public void addViewControllers(ViewControllerRegistry registry) { } public void configureViewResolvers(ViewResolverRegistry registry) { } public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) { } public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) { } public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { } public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { } public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { } public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) { } @Nullable public Validator getValidator() { return null; } @Nullable public MessageCodesResolver getMessageCodesResolver() { return null; } }
②繼承WebMvcConfigurerAdapter,高版本中已不建議使用這種方式,因為和實現WebMvcConfigurer介面一樣
@SuppressWarnings("deprecation")
@EnableWebMvc
@ComponentScan(value = "com.bdm", useDefaultFilters = false, includeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = { Controller.class }) })
public class AppConfig extends WebMvcConfigurerAdapter {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// 配置檢視解析器
// registry.jsp();//內部呼叫了jsp("/WEB-INF/", ".jsp");從/WEB-INF/中找jsp
registry.jsp("/WEB-INF/pages/", ".jsp");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();// 配置靜態資源訪問,不開啟則靜態資源無法訪問
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");// 新增自定義的攔截器和攔截的請求
}
}
@EnableWebMvc
@ComponentScan(value = "com.bdm", useDefaultFilters = false, includeFilters = {
@Filter(type = FilterType.ANNOTATION, classes = { Controller.class }) })
public class AppConfig extends WebMvcConfigurerAdapter {
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
// 配置檢視解析器
// registry.jsp();//內部呼叫了jsp("/WEB-INF/", ".jsp");從/WEB-INF/中找jsp
registry.jsp("/WEB-INF/pages/", ".jsp");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();// 配置靜態資源訪問,不開啟則靜態資源無法訪問
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");// 新增自定義的攔截器和攔截的請求
}
}
自定義的攔截器:
public class MyInterceptor implements HandlerInterceptor {
// 目標方法執行之前執行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle...");
return true;//return true才會繼續往下執行請求方法,否則請求方法得不到執行
}
// 目標方法執行正確之後執行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...");
}
// 頁面響應之後執行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
System.out.println("afterCompletion...");
}
}
return true才會繼續往下執行請求方法,否則請求方法得不到執行
}
// 目標方法執行正確之後執行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
System.out.println("postHandle...");
}
// 頁面響應之後執行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
System.out.println("afterCompletion...");
}
}