zoukankan      html  css  js  c++  java
  • Web MVC 注解驱动

    Web MVC 注解驱动

    版本要求Spring Framework 3.1 +

    基本配置步骤

    • 注解配置: @Configuration ( Spring 范式注解 )
    • 组件激活: @EnableWebMvc (Spring 模块装配)
    • 自定义组件 : WebMvcConfigurer (Spring Bean)

    原理

    在@EnableWebMvc注解中导入了DelegatingWebMvcConfiguration配置类,其父类WebMvcConfigurationSupport配置了许多HandlerMapping和HandlerAdapter以及ViewResolver类

    实现注解驱动

    • 开启xml包扫描
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:component-scan base-package="com.imooc.web"/>
    </beans>
    
    • 编写配置类,添加@Configuration和@EnableWebMvc注解,配置ViewResolverBean
    @Configuration
    @EnableWebMvc
    public class WebMvcConfig{
        @Bean
        public ViewResolver viewResolver(){
            InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
            viewResolver.setViewClass(JstlView.class);
            viewResolver.setPrefix("/WEB-INF/jsp/");
            viewResolver.setSuffix(".jsp");
            return viewResolver;
        }
    }
    
    • 上面的配置类也可以选择继承WebMvcConfigurer接口,里面提供了默认方法都是空实现,所以里面的方法不不必都实现,一下示例重写添加拦截器的方法添加拦截器
    @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("拦截中...");
                    return true;
                }
            });
        }
    }
    
    • 上述方法添加拦截器底层实现
      @EnableWebMvc注解中导入的DelegatingWebMvcConfiguration中有以下所示成员变量和方法
    public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
    	private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
    	@Autowired(required = false)
    	public void setConfigurers(List<WebMvcConfigurer> configurers) {
    		if (!CollectionUtils.isEmpty(configurers)) {
    			this.configurers.addWebMvcConfigurers(configurers);
    		}
    	}
    

    它将所有实现WebMvcConfigurer接口的类注入到configurers(WebMvcConfigurerComposite)成员变量中,此变量是个组合对象,WebMvcConfigurerComposite类中如下变量

    private final List<WebMvcConfigurer> delegates = new ArrayList<>();
    

    WebMvcConfigurerComposite将调用如下方法注册拦截器

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	for (WebMvcConfigurer delegate : this.delegates) {
    		delegate.addInterceptors(registry);
    	}
    }
    
  • 相关阅读:
    MapReduce教程(一)基于MapReduce框架开发<转>
    postgresql with递归
    mysql中递归树状结构<转>
    java获取上周任意一天的日期
    IBatis批量插入数据
    UI控件篇——UIPageControl及其自定义
    Android 3.0开始引入fragments(碎片、片段)类
    APACHE LOG4J™ 2
    java 反射
    PreparedStatement用途
  • 原文地址:https://www.cnblogs.com/fjf3997/p/13041431.html
Copyright © 2011-2022 走看看