14、SpringMVC之注解配置

打印 上一主题 下一主题

主题 934|帖子 934|积分 2802

14.1、概述


  • 在实际工作中,一般使用配置类和注解代替web.xml和SpringMVC配置文件的功能;
  • 在 Servlet3.0 环境中,容器会在类路径中查找实现了 javax.servlet.ServletContainerInitializer 接口的类,
    如果找到了的话,就会用它来配置 Servlet 容器;
  • Spring 提供了 ServletContainerInitializer  这个接口的实现,类名为 SpringServletContainerInitializer,
    这个类又会查找实现了 WebApplicationInitializer 接口的类,并将配置的任务交给它们来完成;
  • Spring3.2 引入了一个便利的 WebApplicationInitializer 基础实现,类名为 AbstractAnnotationConfigDispatcherServletInitializer;
  • 当自定义的类继承了 AbstractAnnotationConfigDispatcherServletInitializer 并将其部署到 Servlet3.0 容器的时候,
    容器会自动发现它,并用它来配置 Servlet 上下文。
14.2、环境搭建

14.2.1、在project创建新module


12.2.2、选择maven


14.2.3、设置module名称和路径



14.2.4、module初始状态


14.2.5、配置打包方式和引入依赖


注意:默认的打包方式为 jar,为了能配置web资源,需要将打包方式设置为 war
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4.          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5.     <modelVersion>4.0.0</modelVersion>
  6.     <groupId>online.liaojy</groupId>
  7.     <artifactId>spring_mvc_annotation</artifactId>
  8.     <version>1.0-SNAPSHOT</version>
  9.     <packaging>war</packaging>
  10.     <dependencies>
  11.         
  12.         <dependency>
  13.             <groupId>org.springframework</groupId>
  14.             <artifactId>spring-webmvc</artifactId>
  15.             <version>5.3.1</version>
  16.         </dependency>
  17.         
  18.         <dependency>
  19.             <groupId>ch.qos.logback</groupId>
  20.             <artifactId>logback-classic</artifactId>
  21.             <version>1.2.3</version>
  22.         </dependency>
  23.         
  24.         <dependency>
  25.             <groupId>javax.servlet</groupId>
  26.             <artifactId>javax.servlet-api</artifactId>
  27.             <version>3.1.0</version>
  28.             <scope>provided</scope>
  29.         </dependency>
  30.         
  31.         <dependency>
  32.             <groupId>org.thymeleaf</groupId>
  33.             <artifactId>thymeleaf-spring5</artifactId>
  34.             <version>3.0.12.RELEASE</version>
  35.         </dependency>
  36.         
  37.         <dependency>
  38.             <groupId>commons-fileupload</groupId>
  39.             <artifactId>commons-fileupload</artifactId>
  40.             <version>1.3.1</version>
  41.         </dependency>
  42.     </dependencies>
  43. </project>
复制代码
14.2.6、配置web资源目录


打开Project Structure,选择对应的module,并为该module创建一个web.xml文件

注意:web.xml文件需要放到web资源路径(工程路径\src\main\webapp)下

因为使用配置类和注解来配置 Servlet 上下文,所以 web.xml 不再需要配置。
14.2.7、创建拦截器

  1. package online.liaojy.interceptor;
  2. import org.springframework.web.servlet.HandlerInterceptor;
  3. import org.springframework.web.servlet.ModelAndView;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. /**
  7. * @author liaojy
  8. * @date 2023/11/15 - 7:22
  9. */
  10. public class AAAInterceptor implements HandlerInterceptor {
  11.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  12.         return true;
  13.     }
  14.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  15.     }
  16.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  17.     }
  18. }
复制代码
14.2.8、创建模板目录及页面模板


注意:html要引入thymeleaf的约束:xmlns:th="http://www.thymeleaf.org"
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>首页</title>
  6. </head>
  7. <body>
  8. <h1>index.html</h1>
  9. </body>
  10. </html>
复制代码
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:th="http://www.thymeleaf.org">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>错误页面</title>
  6. </head>
  7. <body>
  8. <h1>errorPage.html</h1>
  9. </body>
  10. </html>
复制代码
14.2.9、配置tomcat




14.3、web.xml的注解配置

14.3.1、创建Spring配置类

  1. package online.liaojy.config;
  2. /**
  3. * @author liaojy
  4. * @date 2023/11/16 - 23:59
  5. * 该类用于代替spring的配置文件
  6. */
  7. public class SpringConfig {
  8.     //ssm整合之后,spring的配置信息写在此类中
  9. }
复制代码
14.3.2、创建SpringMVC配置类

  1. package online.liaojy.config;
  2. /**
  3. * @author liaojy
  4. * @date 2023/11/17 - 0:02
  5. * 该类用于代替SpringMVC的配置文件
  6. */
  7. public class SpringMVCConfig {
  8. }
复制代码
14.3.3、创建代替web.xml的初始化类

  1. package online.liaojy.config;
  2. import org.springframework.web.filter.CharacterEncodingFilter;
  3. import org.springframework.web.filter.HiddenHttpMethodFilter;
  4. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  5. import javax.servlet.Filter;
  6. /**
  7. * @author liaojy
  8. * @date 2023/11/17 - 0:04
  9. */
  10. public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
  11.     // 指定代替 Spring 配置文件的配置类(可以按功能或需要来划分多个)
  12.     protected Class<?>[] getRootConfigClasses() {
  13.         return new Class[]{SpringConfig.class};
  14.     }
  15.     // 指定代替 SpringMVC 配置文件的配置类(可以按功能或需要来划分多个)
  16.     protected Class<?>[] getServletConfigClasses() {
  17.         return new Class[]{SpringMVCConfig.class};
  18.     }
  19.     // 设置 SpringMVC 的前端控制器 DispatcherServlet 需要处理的请求路径(即 url-pattern )
  20.     protected String[] getServletMappings() {
  21.         return new String[]{"/"};
  22.     }
  23.     // 设置过滤器
  24.     @Override
  25.     protected Filter[] getServletFilters() {
  26.         // 配置编码过滤器
  27.         CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
  28.         characterEncodingFilter.setEncoding("UTF-8");
  29.         characterEncodingFilter.setForceEncoding(true);
  30.         // 配置处理请求方式的过滤器
  31.         // 注意该过滤器所在的包路径为 org.springframework.web.filter.HiddenHttpMethodFilter
  32.         HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
  33.         // 配置要使用的过滤器
  34.         return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};
  35.     }
  36. }
复制代码
14.4、SpringMVC配置类的详细配置

14.4.1、将类标识为配置类

  1. // @Configurable 注解:将类标识为配置类
  2. @Configurable
复制代码
14.4.2、实现 WebMvcConfigurer 接口


14.4.3、配置扫描组件


先创建一个需要扫描的包及组件
  1. package online.liaojy.controller;
  2. import org.springframework.stereotype.Controller;
  3. /**
  4. * @author liaojy
  5. * @date 2023/11/19 - 16:56
  6. */
  7. @Controller
  8. public class TestController {
  9. }
复制代码
  1. // @ComponentScan 注解:用于扫描指定包的组件
  2. @ComponentScan("online.liaojy.controller")
复制代码
14.4.4、配置默认servlet处理器

  1.     // 配置默认servlet处理器
  2.     public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
  3.         configurer.enable();
  4.     }
复制代码
14.4.5、配置mvc注解驱动

  1. // @EnableWebMvc 注解:开启mvc的注解驱动
  2. @EnableWebMvc
复制代码
14.4.6、配置视图控制器

  1.     // 配置视图控制器
  2.     public void addViewControllers(ViewControllerRegistry registry) {
  3.         // addViewController 设置视图控制器要处理的请求路径,setViewName 设置匹配请求路径的逻辑视图
  4.         registry.addViewController("/").setViewName("index");
  5.     }
复制代码
14.4.7、配置文件上传解析器

  1.     // 配置文件上传解析器
  2.     // @Bean 注解:用于将所标识方法的返回值作为一个 bean 来进行管理,bean的id为方法名
  3.     @Bean
  4.     public CommonsMultipartResolver multipartResolver(){
  5.         return new CommonsMultipartResolver();
  6.     }
复制代码
14.4.8、配置拦截器

  1.     // 配置拦截器
  2.     public void addInterceptors(InterceptorRegistry registry) {
  3.         AAAInterceptor aaaInterceptor = new AAAInterceptor();
  4.         // addInterceptor 设置要使用的拦截器,
  5.         // addPathPatterns 设置该拦截器要拦截的请求路径( /** 表示所有路径),excludePathPatterns 设置要排除的拦截路径
  6.         registry.addInterceptor(aaaInterceptor).addPathPatterns("/**").excludePathPatterns("/abc");
  7.     }
复制代码
14.4.9、配置异常解析器

  1.     // 配置异常解析器
  2.     public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
  3.         // 创建 SimpleMappingExceptionResolver 异常解析器,来对控制器方法出现的异常进行自定义异常处理
  4.         SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();
  5.         // 设置异常和错误提示页面的映射关系
  6.         Properties properties = new Properties();
  7.         properties.setProperty("java.lang.ArithmeticException", "errorPage");
  8.         simpleMappingExceptionResolver.setExceptionMappings(properties);
  9.         // 设置共享到域对象中的异常信息的属性名
  10.         simpleMappingExceptionResolver.setExceptionAttribute("exceptionMessage");
  11.         // 添加要使用的异常解析器器
  12.         resolvers.add(simpleMappingExceptionResolver);
  13.     }
复制代码
14.4.10、配置视图解释器


配置视图解释器,无论是通过xml还是配置类都比较复杂;一般直接都是复制配置模板,然后根据实际修改视图前缀及后缀即可
  1.     //配置生成模板解析器
  2.     @Bean
  3.     public ITemplateResolver templateResolver() {
  4.         WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
  5.         // ServletContextTemplateResolver 需要一个 ServletContext 作为构造参数,可通过 WebApplicationContext 的方法获得
  6.         ServletContextTemplateResolver templateResolver =
  7.                 new ServletContextTemplateResolver(webApplicationContext.getServletContext());
  8.         templateResolver.setPrefix("/WEB-INF/templates/");
  9.         templateResolver.setSuffix(".html");
  10.         templateResolver.setCharacterEncoding("UTF-8");
  11.         templateResolver.setTemplateMode(TemplateMode.HTML);
  12.         return templateResolver;
  13.     }
  14.     //生成模板引擎并为模板引擎注入模板解析器
  15.     @Bean
  16.     public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
  17.         SpringTemplateEngine templateEngine = new SpringTemplateEngine();
  18.         templateEngine.setTemplateResolver(templateResolver);
  19.         return templateEngine;
  20.     }
  21.     //生成视图解析器并为解析器注入模板引擎
  22.     @Bean
  23.     public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
  24.         ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
  25.         viewResolver.setCharacterEncoding("UTF-8");
  26.         viewResolver.setTemplateEngine(templateEngine);
  27.         return viewResolver;
  28.     }
复制代码
14.4.11、全配置汇总
  1. package online.liaojy.config;import online.liaojy.interceptor.AAAInterceptor;import org.springframework.beans.factory.annotation.Configurable;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.web.context.ContextLoader;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.multipart.commons.CommonsMultipartResolver;import org.springframework.web.servlet.HandlerExceptionResolver;import org.springframework.web.servlet.ViewResolver;import org.springframework.web.servlet.config.annotation.*;import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;import org.thymeleaf.spring5.SpringTemplateEngine;import org.thymeleaf.spring5.view.ThymeleafViewResolver;import org.thymeleaf.templatemode.TemplateMode;import org.thymeleaf.templateresolver.ITemplateResolver;import org.thymeleaf.templateresolver.ServletContextTemplateResolver;import java.util.List;import java.util.Properties;/** * @author liaojy * @date 2023/11/17 - 0:02 * 该类用于代替SpringMVC的配置文件 */// @Configurable 注解:将类标识为配置类
  2. @Configurable// @ComponentScan 注解:用于扫描指定包的组件
  3. @ComponentScan("online.liaojy.controller")// @EnableWebMvc 注解:开启mvc的注解驱动
  4. @EnableWebMvcpublic class SpringMVCConfig implements WebMvcConfigurer {    // 配置默认servlet处理器
  5.     public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
  6.         configurer.enable();
  7.     }    // 配置视图控制器
  8.     public void addViewControllers(ViewControllerRegistry registry) {
  9.         // addViewController 设置视图控制器要处理的请求路径,setViewName 设置匹配请求路径的逻辑视图
  10.         registry.addViewController("/").setViewName("index");
  11.     }    // 配置文件上传解析器
  12.     // @Bean 注解:用于将所标识方法的返回值作为一个 bean 来进行管理,bean的id为方法名
  13.     @Bean
  14.     public CommonsMultipartResolver multipartResolver(){
  15.         return new CommonsMultipartResolver();
  16.     }    // 配置拦截器
  17.     public void addInterceptors(InterceptorRegistry registry) {
  18.         AAAInterceptor aaaInterceptor = new AAAInterceptor();
  19.         // addInterceptor 设置要使用的拦截器,
  20.         // addPathPatterns 设置该拦截器要拦截的请求路径( /** 表示所有路径),excludePathPatterns 设置要排除的拦截路径
  21.         registry.addInterceptor(aaaInterceptor).addPathPatterns("/**").excludePathPatterns("/abc");
  22.     }    // 配置异常解析器
  23.     public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
  24.         // 创建 SimpleMappingExceptionResolver 异常解析器,来对控制器方法出现的异常进行自定义异常处理
  25.         SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();
  26.         // 设置异常和错误提示页面的映射关系
  27.         Properties properties = new Properties();
  28.         properties.setProperty("java.lang.ArithmeticException", "errorPage");
  29.         simpleMappingExceptionResolver.setExceptionMappings(properties);
  30.         // 设置共享到域对象中的异常信息的属性名
  31.         simpleMappingExceptionResolver.setExceptionAttribute("exceptionMessage");
  32.         // 添加要使用的异常解析器器
  33.         resolvers.add(simpleMappingExceptionResolver);
  34.     }    //配置生成模板解析器
  35.     @Bean
  36.     public ITemplateResolver templateResolver() {
  37.         WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
  38.         // ServletContextTemplateResolver 需要一个 ServletContext 作为构造参数,可通过 WebApplicationContext 的方法获得
  39.         ServletContextTemplateResolver templateResolver =
  40.                 new ServletContextTemplateResolver(webApplicationContext.getServletContext());
  41.         templateResolver.setPrefix("/WEB-INF/templates/");
  42.         templateResolver.setSuffix(".html");
  43.         templateResolver.setCharacterEncoding("UTF-8");
  44.         templateResolver.setTemplateMode(TemplateMode.HTML);
  45.         return templateResolver;
  46.     }
  47.     //生成模板引擎并为模板引擎注入模板解析器
  48.     @Bean
  49.     public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
  50.         SpringTemplateEngine templateEngine = new SpringTemplateEngine();
  51.         templateEngine.setTemplateResolver(templateResolver);
  52.         return templateEngine;
  53.     }
  54.     //生成视图解析器并为解析器注入模板引擎
  55.     @Bean
  56.     public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
  57.         ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
  58.         viewResolver.setCharacterEncoding("UTF-8");
  59.         viewResolver.setTemplateEngine(templateEngine);
  60.         return viewResolver;
  61.     }}
复制代码
14.5、测试效果




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

去皮卡多

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表