微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

【SpringMVC 框架自学】Day11(注解配置SpringMVC)--2022/4/23

十一、注解配置SpringMVC

Servlet3.0的环境中容器在类路径中查找实现javax.servlet.ServletContainerInitializer接口

如果找到的话,就会用它去配置Servlet容器

Spring提供了这个接口的实现,名为SpringServletContainerInitializer

这个类又会查找实现WebApplicationInitializer并将配置的任务交给它们完成


Spring3.2的环境中WebApplicationInitializer有一个的实现类

其名为:AbstractAnnotationConfigdispatcherServletinitializer

只要将其部署,那么spring容器自动发现,并用它来配置Servlet上下文


1 、创建初始化类(Web.xml)

首先创建一个类,实现初始化的功能,代替Web.xml,

继承AbstractAnnotationConfigdispatcherServletinitializer

实现它的四个方法

  • getRootConfigClasses():指定Spring的配置类
  • getServletConfigClasses():指定SpringMVC的配置类
  • getServletMappings():指定dispathcerServlet的映射规则
  • getServletFilters():注册过滤器
public class WebInit extends AbstractAnnotationConfigdispatcherServletinitializer{
    //继承这个实现类,并实现它所存在的方法
    
    /**
     * 指定Spring的配置类
     * @return
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[0];
    }

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

    /**
     * 指定dispathcerServlet的映射规则,即Url-pattern
     * @return
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
    
    //接着实现过滤器(getServletFilters)方法

    /**
     * 注册过滤器
     * @return
     */
    @Override
    protected Filter[] getServletFilters() {
        //设置Get、Post的字符集
        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceResponseEncoding(true);
        //设置Put、Delete、Update等字符集
        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
        return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};
    }
}

2 、创建SpringConfig类(Spring.xml)

@Configuration
public class SpringConfig {
    //因为是配置类:所以要用Configuration标识
    //还未整合到Spring 所以暂且不用配置
}

3 、 创建WebConfig类(SpringMVC.xml)

在SpringMVC的配置中,需要配置以下文件

  • 1 、组件扫描器(Compnent-Scan)
  • 2 、Thymeleaf视图解析器
  • 3 、MVC视图解析器(View-Controller)
  • 4 、 静态资源访问(Default-servlet-handler)
  • 5 、MVC注解驱动(annotation-driver)
  • 6 、文件上传解析器(CommonsMultiPartResolver)
  • 7 、异常处理器(SimpleMappingExceptionResolver)
  • 8 、拦截器(InterCeptor)
@Configuration//将当前类标识为配置类
@ComponentScan// 1 、组件扫描器
@EnableWebMvc// 5 、MVC注解驱动
public class implements WebMvcConfigurer{
    
    // 4 、配置静态资源访问 Ctrl+o,选择configureDefaultServletHandling
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        //enable开启静态资源访问
        configurer.enable();
    }
    
    // 8 、配置拦截器 Ctrl+o,选择addInterCeptor
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //new一个拦截器对象
        TestInterceptor testInterceptor = new TestInterceptor();
        //添加拦截器类().添加拦截的路径()
        //addInterceptor(handlerinterceptor interceptor)类型是拦截器
        //所以需要new一个拦截器对象
        registry.addInterceptor(testInterceptor).addpathPatterns("/**");
    }
    
    // 3 、配置mvc视图解析器 Ctrl+o,选择addViewControllers
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //添加路径("/hello").设置跳转的视图名("hello")
        registry.addViewController("/hello").setViewName("hello");
    }
    
    // 6 、配置文件上传解析器 Ctrl+o,选择MultipartResolver
    @Bean //要创建一个对象 用@Bean注解
    public MultipartResolver multipartResolver(){
        //MultipartResolver只是一个接口 所以要new它的实现类
        CommonsMultipartResolver commonsMultipartResolver 
            									= new CommonsMultipartResolver();
        return commonsMultipartResolver;
    }
    
    //另一种写法
//    @Bean
//    public CommonsMultipartResolver multipartResolver(){
//        return new CommonsMultipartResolver();
//    }
    
    // 7 、配置异常处理器 Ctrl+o,选择configureHandlerExceptionResolvers
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        //配置bean
        SimpleMappingExceptionResolver exceptionResolver 
            							= new SimpleMappingExceptionResolver();
        //创建两个属性exceptionMapping、exceptionAttribute;
        //new一个property文件,进行键值对的传参
        Properties prop = new Properties();
        //传入异常,因为键值对是String类型,所以不能用put方法(Object key,Object Value)
        prop.setProperty("java.lang.ArithmeticException","error");
        //将prop属性传给异常映射
        exceptionResolver.setExceptionMappings(prop);
        //将异常信息在请求域中进行共享
        exceptionResolver.setExceptionAttribute("exception");
        //添加异常处理器
        resolvers.add(exceptionResolver);
    }
    
    /**
    *  2 、配置Thymeleaf解析器
    */
    //配置生成模板解析器
    @Bean
    public SpringResourceTemplateResolver templateResolver() {
        SpringResourceTemplateResolver springResourceTemplateResolver = new SpringResourceTemplateResolver();
        springResourceTemplateResolver.setApplicationContext(ContextLoader.getCurrentWebApplicationContext());
        springResourceTemplateResolver.setPrefix("/WEB-INF/templates/");
        springResourceTemplateResolver.setSuffix(".html");
        springResourceTemplateResolver.setCharacterEncoding("UTF-8");
        springResourceTemplateResolver.setTemplateMode(TemplateMode.HTML);
        return springResourceTemplateResolver;
    }

    //生成模板引擎并为模板引擎注入模板解析器
    @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;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐