SpringBoot学习(五)重拾Spring Web MVC


目录
  • Web MVC核心组件
  • Web MVC注解驱动
    • xml与注解替换
    • @EnableWebMvc 注解
    • Web MVC 其他常用注解
  • Web MVC 自动装配

Web MVC核心组件

组件 说明
HandlerMapping 将请求与拦截器列表一起映射到处理程序,以进行预处理和后期处理。映射基于某些标准,具体标准因HandlerMapping 实现而异。两个主要HandlerMapping实现是RequestMappingHandlerMapping (支持带@RequestMapping注释的方法)和SimpleUrlHandlerMapping (将URI路径模式显式注册到处理程序)
HandlerAdapter 帮助DispatcherServlet调用映射到请求的处理程序,而不管实际如何调用该处理程序。主要目的HandlerAdapter是保护DispatcherServlet这些细节。
HandlerExceptionResolver 解析异常
ViewResolver String将从处理程序返回的基于逻辑的视图名称解析为实际的名称View ,以将其呈现给响应。
LocaleResolver,LocaleContextResolver 能够提供国际化的视图
ThemeResolver

<?xml version="1.0" encoding="UTF-8"?>










Web MVC注解驱动

  • 注解配置 @Configuration
  • 组件激活 @EnableWebMvc
  • 自定义组件 WebMvcConfigurer(接口,基于java1.8)

xml与注解替换

@Configuration
@EnableWebMvc
public class WebMvcConfig implements WebMvcConfigurer {
    @Bean
    public ViewResolver viewResolver(){
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new HandlerInterceptor() {
            @Override
            public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                System.out.println("addInterceptors.preHandle");
                return true;
            }
        });
    }
}

以上代码的@Configuration,@EnableWebMvc,@Bean相关代码替换以下xml配置

    

    

    
    
    
    
    

@EnableWebMvc 注解

  • 配置@EnableWebMvc注解则会自动加载@Configuration的配置类

  • DelegatingWebMvcConfiguration中无@Bean,@Bean在WebMvcConfigurationSupport类中

Web MVC 其他常用注解

  • 模型属性 @ModelAttribute
  • 请求头 @RequestHeader
  • Cookie @CookieValue
  • 切面通知 @ControllerAdvice
  • 异常处理
  • 校验参数

Web MVC 自动装配

@ComponentScan(basePackages = "com.webmvc")
public class DispatcherServletConfig {
}
public class
DefaultAnnotationConfigDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    // 对应web.xml
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

    // DispatcherServlet
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{DispatcherServletConfig.class};
    }

    // 映射
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

替换

  • web.xml


    
        app
        org.springframework.web.servlet.DispatcherServlet
        1
        
            contextConfigLocation
            /WEB-INF/app-context.xml
        
    

    
        app
        /
    


  • app-context.xml

相关代码

  • https://github.com/zhaimiya/springboot