• 【SpringMVC 从 0 开始】使用注解方式配置 SpringMVC


    使用配置类和注解代替 web.xml 和 SpringMVC配置文件 的功能。

    一、创建初始化类

    在 Servlet3.0 环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置 Servlet 容器。

    Spring 提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。

    Spring3.2 引入了一个便利的WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletInitializer
    当我们的类扩展了AbstractAnnotationConfigDispatcherServletInitializer并将其部署到 Servlet3.0 容器的时候,容器会自动发现它,并用它来配置 Servlet 上下文。

    这里新建一个工程来演示。

    pom.xml里的依赖可以复制之前的内容,web.xml 和 SpringMVC 已经不需要再进行创建了。

    package com.pingguo.mvc.config;
    
    import org.springframework.web.filter.CharacterEncodingFilter;
    import org.springframework.web.filter.HiddenHttpMethodFilter;
    import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
    
    import javax.servlet.Filter;
    
    
    public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
        /**
         * 指定spring的配置类
         * @return
         */
        @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class[]{SpringConfig.class};
        }
    
        /**
         * 指定SpringMVC的配置类
         * @return
         */
        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class[]{WebConfig.class};
        }
    
        /**
         * 指定DispatcherServlet的映射规则,即url-pattern
         * @return
         */
        @Override
        protected String[] getServletMappings() {
            return new String[]{"/"};
        }
    
        /**
         * 添加过滤器
         * @return
         */
        @Override
        protected Filter[] getServletFilters() {
            CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
            encodingFilter.setEncoding("UTF-8");
            encodingFilter.setForceRequestEncoding(true);
            HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
            return new Filter[]{encodingFilter, hiddenHttpMethodFilter};
        }
    }
    
    

    初始化类里面要指定 spring的配置类、SpringMVC的配置类,给创建出来即可,记得带上@Configuration注解,标记为配置类。

    其实就是把之前各种配置文件里的内容转到配置类里了,这些都会在项目启动时候初始化。另外,返回的都是数组,所以每个类里都可以返回多个配置。

    二、spring的配置类

    当使用ssm整合之后,spring的配置信息写在spring的配置类中,这里暂时用不到,写出来无妨。

    package com.pingguo.mvc.config;
    
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class SpringConfig {
    }
    

    三、WebConfig 配置类

    这个配置类是代替之前 springMVC.xml 配置文件里的内容:

    • 扫描组件
    • 视图解析器
    • view-controller
    • default-servlet-handler
    • mvc注解驱动
    • 文件上传解析器
    • 异常处理
    • 拦截器
    // 标识当前类为配置类
    @Configuration
    // 扫描组件
    @ComponentScan("com.pingguo.mvc")
    // mvc 注解驱动
    @EnableWebMvc
    public class WebConfig {
    
        //配置生成模板解析器
        @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;
        }
    }
    

    有了这几样,就可以写一个index页面测试一下了,写出页面和controller类。

    <!DOCTYPE html>
    <html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>index首页</title>
    </head>
    <body>
    <h1>首页</h1>
    </body>
    </html>
    

    控制器:

    @Controller
    public class TestController {
    
        @RequestMapping("/")
        public String index() {
            return "index";
        }
    }
    

    设置下部署,启动可以打开首页。

    剩余配置

    接下来,需要 WebConfig 类实现一个接口WebMvcConfigurer,来重写里面的方法。

    配置 default-servlet-handler

    @EnableWebMvc
    public class WebConfig implements WebMvcConfigurer {
    
        //使用默认的servlet处理静态资源 default-servlet-handler
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    ... ...
    

    配置 拦截器

    继续增加。

    ... ... 
        //配置拦截器
        public void addInterceptors(InterceptorRegistry registry) {
            TestInterceptor firstInterceptor = new TestInterceptor();
            registry.addInterceptor(firstInterceptor).addPathPatterns("/**");
        }
    ... ...
    

    拦截器还是要像之前的那样创建,这里就创建了一个拦截器 TestInterceptor :

    public class TestInterceptor implements HandlerInterceptor {
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            return true;
        }
    
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    
        }
    
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    
        }
    }
    

    配置 view-controller

    当仅做视图跳转时候可以使用这个配置。

        //配置视图控制
        public void addViewControllers(ViewControllerRegistry registry) {
            registry.addViewController("/").setViewName("index");
        }
    

    配置文件上传解析器

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

    配置异常处理

        //配置异常映射
        public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
            SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
            Properties prop = new Properties();
            prop.setProperty("java.lang.ArithmeticException", "error");
            //设置异常映射
            exceptionResolver.setExceptionMappings(prop);
            //设置共享异常信息的键
            exceptionResolver.setExceptionAttribute("ex");
            resolvers.add(exceptionResolver);
        }
    

    里面的功能与之前使用配置文件实现的一样,可以逐一测试一下。

    --不要用肉体的勤奋,去掩盖思考的懒惰--
  • 相关阅读:
    zoj 1033 与其说是搜索,不如说是枚举
    hdu 4294 数学分析+搜索
    新的篇章
    Silverlight 利用DataGrid行加载事件动态控制行列显示
    (转)Excel中“不同的单元格格式太多”问题解决方法
    EasyUI tree的三种选中状态
    JS监听手机返回键
    Silverlight ComBox获取当前选中项的值
    DataGrdid 利用结果集反向转换成数据List
    silverlight 动态设置下拉框选中值
  • 原文地址:https://www.cnblogs.com/pingguo-softwaretesting/p/15172073.html
Copyright © 2020-2023  润新知