SpringMVC的执行流程
DispatcherServlet接收用户请求
调用HandlerMapping处理器映射器,找到用于处理Request的handler和Interceptors,构成HandlerExecutionChain执行链
找到handler相对应的HandlerAdapter
执行所有注册拦截器的preHandler方法
调用HandlerAdapter的Handler()方法处理请求,返回ModelAndView
倒序执行所有注册拦截器的postHandler
请求视图解析和视图渲染
DispatcherServlet相应用户
WebMvcConfigurer
package org.doc.learn.webServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.FormatterRegistry;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.validation.MessageCodesResolver;
import org.springframework.validation.Validator;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
import java.util.List;
/**
* @author 请求控制器
*/
@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {
@Autowired
private Interceptors interceptors;
@Autowired
private ArgumentResolvers argumentResolvers;
/**
* @deprecated 跨域配置
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
/**
* addMapping 接口
* allowedOrigins 请求源(基础地址)
* allowedMethods 请求方法
* allowedHeaders 请求头
* exposedHeaders 对外暴露响应头
*/
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("Authorization", "Content-Type","Cookie","accept-language")
.exposedHeaders()
.allowCredentials(true).maxAge(354);
}
/**
* @deprecated 资源配置
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/**
* addResourceHandler 对外暴露访问路径
* addResourceLocations 内部存放路径
*/
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
/**
* @deprecated 扩展异常处理器
* @param resolvers
*/
@Override
public void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
WebMvcConfigurer.super.extendHandlerExceptionResolvers(resolvers);
}
/**
* @deprecated 路径匹配规则
* @param configurer
*/
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
/**
* setUseSuffixPatternMatch 是否区分大小写
* setUseTrailingSlashMatch 是否忽略路径后缀
*/
configurer.setUseSuffixPatternMatch(false).setUseTrailingSlashMatch(true);
}
/**
* @deprecated 内容协商机制
* @param configurer
*/
@Override
public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
/**
* 自定义媒体类型,不常用,常用有以下三种(JSON,urlencode,formData)
*/
configurer.mediaType("application/json", MediaType.parseMediaType("application/json;charset=UTF-8"));
}
/**
* @deprecated 异步任务执行器
* @param configurer
*/
@Override
public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
WebMvcConfigurer.super.configureAsyncSupport(configurer);
}
/**
* @deprecated Servlet静态资源配置
* @param configurer
*/
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
configurer.enable("defaultServletName");
}
/**
* @deprecated 格式化器
* @param registry
*/
@Override
public void addFormatters(FormatterRegistry registry) {
WebMvcConfigurer.super.addFormatters(registry);
}
/**
* @deprecated 拦截器配置
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptors);
}
/**
* @deprecated 视图控制器
* @param registry
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
/**
* addViewController 路径
* setViewName 重定向页面,必须是html或者jsp的后缀名的页面(移动端具有兼容性)
*/
registry.addViewController("/").setViewName("forward:/index.html");
}
/**
* @deprecated 视图解析
* @param registry
*/
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.enableContentNegotiation(new MappingJackson2JsonView());
registry.jsp();
}
/**
* @deprecated 请求参数处理器
* @param resolvers
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(argumentResolvers);
}
/**
* @deprecated 添加支持个性化处理Controller返回数据类型的处理器
* @param handlers
*/
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
WebMvcConfigurer.super.addReturnValueHandlers(handlers);
}
/**
* @deprecated 信息转换器
* @param converters
*/
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
WebMvcConfigurer.super.configureMessageConverters(converters);
}
/**
* @deprecated 扩展消息转换器
* @param converters
*/
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
WebMvcConfigurer.super.extendMessageConverters(converters);
}
/**
* @deprecated 配置异常处理器
* @param resolvers
*/
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
WebMvcConfigurer.super.configureHandlerExceptionResolvers(resolvers);
}
/**
*
* @return
*/
@Override
public Validator getValidator() {
return WebMvcConfigurer.super.getValidator();
}
/**
*
* @return
*/
@Override
public MessageCodesResolver getMessageCodesResolver() {
return WebMvcConfigurer.super.getMessageCodesResolver();
}
}
HandlerInterceptor
package org.doc.learn.webServer;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @deprecated 拦截器的配置文件
*/
@Component
public class Interceptors implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
HandlerMethodArgumentResolver
package org.doc.learn.webServer;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
/**
* @deprecated 参数处理器的配置文件
*
*/
@Component
public class ArgumentResolvers implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return false;
}
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
return null;
}
}
ControllerAdvice
package org.doc.learn.webServer;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
@ControllerAdvice
public class GlobalController {
/**
* @deprecated 全局异常处理
* @return
*/
@ExceptionHandler
public String ExceptionHandler(){
return "ExceptionHandler";
}
/**
* @deprecated 全局初始化
* @return
*/
@InitBinder
public String InitBinder(){
return "InitBinder";
}
}