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);
    	}
    }
    
  • 相关阅读:
    關於遍歷頁面所有控件的方法 空间
    Java中super的几种用法并与this的区别
    vs2010 未能正确加载方案中的一个或多个项目
    【ASP.NET】从服务器端注册客户端脚本
    sqlserver access 多数据库操作
    水晶報表中小寫變大寫的函數-VB
    RegularExpressionValidator 常用
    【转】改善C#程序的建议2:C#中dynamic的正确用法 空间
    转】VB中Set的用法
    C#索引器
  • 原文地址:https://www.cnblogs.com/fjf3997/p/13041431.html
Copyright © 2011-2022 走看看