注解配置 SpringMVC

概述

1、使用配置类、注解,代替 web.xml、SpringMVC 配置文件

2、在 Servlet3.0 环境中,容器会在类路径(src、resource)中查找 javax.servlet.ServletContainerInitializer 接口的实现类

(1)如果找到,用实现类来配置 Servlet 容器,Spring 提供该接口的实现:SpringServletContainerInitializer

(2)SpringServletContainerInitializer 会查找实现 WebApplicationInitializer 接口的实现类,并由其实现类完成配置

3、Spring3.2 引入 WebApplicationInitializer 基础实现类:AbstractAnnotationConfigDispatcherServletInitializer

4、自定义实现类继承、扩展 AbstractAnnotationConfigDispatcherServletInitializer,并将其部署到 Servlet3.0 容器时,容器会自动识别自定义类,并用其配置 Servlet 上下文

 

web工程的初始化类,代替 web.xml

public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {

    //指定Spring配置类
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{SpringConfig.class};
    }

    //指定SpringMVC配置类
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMVCConfig.class};
    }

    //指定DispatcherServlet映射规则,即servlet-mapping、url-pattern
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    //注册过滤器
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceResponseEncoding(true);
        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
        return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};
    }
}

 

代替 SpringMVC 配置文件

1、方法中的形参,自动注入

//将当前类标识为一个配置类
@Configuration
//扫描组件
@ComponentScan("包路径")
//开启MVC注解驱动
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    //开放对静态资源的访问
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    //拦截器,
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //创建自定义拦截器
        CustomInterceptor customInterceptor = new CustomInterceptor();
        //addPathPatterns("/**")等价于<mvc:mapping path="/**"/>;excludePathPatterns("/")等价于<mvc:exclude-mapping path="/"/>
        registry.addInterceptor(customInterceptor).addPathPatterns("/**").excludePathPatterns("/");
    }

    //仅实现页面跳转
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //addViewController:处理的请求地址,即@RequestMapping的value;setViewName:请求地址对应的视图名称,即控制器方法返回的字符串
        registry.addViewController("请求地址").setViewName("视图名称");
    }

    //文件上传解析器
    @Bean
    public MultipartResolver multipartResolver(){
        CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
        return commonsMultipartResolver;
    }

    //异常处理器
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
        Properties properties = new Properties();
        //参数1:处理器方法执行过程中可能出现的异常;参数2:设置一个新的视图名称,若出现指定异常时,跳转到指定页面
        properties.setProperty("java.lang.ArithmeticException", "error");
        //异常处理器导入配置信息
        exceptionResolver.setExceptionMappings(properties);
        //设置一个属性名,将出现的异常信息在请求域中进行共享
        exceptionResolver.setExceptionAttribute("exception");
        //集合导入异常处理器
        resolvers.add(exceptionResolver);
    }

    //配置生成模板解析器
    @Bean
    public ITemplateResolver templateResolver() {
        WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
        //ServletContextTemplateResolver需要一个ServletContext作为构造参数,通过WebApplicationContext的方法获得
        ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(webApplicationContext.getServletContext());
        //视图前缀
        templateResolver.setPrefix("/WEB-INF/templates/");
        //视图后缀
        templateResolver.setSuffix(".html");
        //页面编码
        templateResolver.setCharacterEncoding("UTF-8");
        //模板模型
        templateResolver.setTemplateMode(TemplateMode.HTML);
        return templateResolver;
    }

    //生成模板引擎
    @Bean
    public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        //为模板引擎注入模板解析器
        templateEngine.setTemplateResolver(templateResolver);
        return templateEngine;
    }

    //生成视图解析器
    @Bean
    public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        //视图编码
        viewResolver.setCharacterEncoding("UTF-8");
        //为解析器注入模板引擎
        viewResolver.setTemplateEngine(templateEngine);
        return viewResolver;
    }
}
posted @   半条咸鱼  阅读(201)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示