SpringMVC二次学习

46 阅读2分钟

SpringMVC的执行流程

  1. DispatcherServlet接收用户请求

  2. 调用HandlerMapping处理器映射器,找到用于处理Request的handler和Interceptors,构成HandlerExecutionChain执行链

  3. 找到handler相对应的HandlerAdapter

  4. 执行所有注册拦截器的preHandler方法

  5. 调用HandlerAdapter的Handler()方法处理请求,返回ModelAndView

  6. 倒序执行所有注册拦截器的postHandler

  7. 请求视图解析和视图渲染

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


}