1. 程式人生 > >Servlet3.0——定製和接管SpringMVC

Servlet3.0——定製和接管SpringMVC

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...");
	}
}