使用纯注解替换Spring配置文件&SpringMVC配置文件

打印 上一主题 下一主题

主题 840|帖子 840|积分 2520

创建初始化类,替换web.xml


  • 在Servlet3.0环境中,Web容器(Tomcat)会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。
  • Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。
  • Spring3.2引入了一个便利的WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletInitializer,当我们的类扩展了AbstractAnnotationConfigDispatcherServletInitializer并将其部署到Servlet3.0容器的时候,容器会自动发现它,并用它来配置Servlet上下文。
  1. /**
  2. * @Author: lisong
  3. * @CreateTime: 2024-01-31 17:36 星期三
  4. * @Description: 当前类替换web.xml配置文件
  5. */
  6. public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
  7.     //设置spring配置类,替代spring.xml配置文件
  8.     @Override
  9.     protected Class<?>[] getRootConfigClasses() {
  10.         return new Class[]{SpringConfig.class};
  11.     }
  12.     //设置springmvc配置类,替代springmvc.xml配置文件
  13.     @Override
  14.     protected Class<?>[] getServletConfigClasses() {
  15.         return new Class[]{SpringMVCConfig.class};
  16.     }
  17.     //设置SpringMVC的前端控制器DispatcherServlet的url-patten
  18.     @Override
  19.     protected String[] getServletMappings() {
  20.         return new String[]{"/"};
  21.     }
  22.     //设置当前工程的过滤器
  23.     @Override
  24.     protected Filter[] getServletFilters() {
  25.         //创建字符编码过滤器对象
  26.         CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
  27.         //设置字符编码
  28.         characterEncodingFilter.setEncoding("UTF-8");
  29.         //设置请求和响应的编码
  30.         characterEncodingFilter.setForceEncoding(true);
  31.         //创建rest风格请求方式的过滤器对象
  32.         HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
  33.         return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};
  34.     }
  35. }
复制代码
创建Sping配置类,替换Spring的配置文件
  1. @Configurable
  2. @PropertySource("classpath:jdbc.properties")
  3. public class SpringConfig {
  4.     //声明成员属性
  5.     @Value("${jdbc.driver}") //将jdbc.properties中的信息初始化到属性中
  6.     private String driver;
  7.     @Value("${jdbc.url}")
  8.     private String url;
  9.     @Value("${jdbc.username}")
  10.     private String username;
  11.     @Value("${jdbc.password}")
  12.     private String password;
  13.     //配置数据源
  14.     @Bean
  15.     public DruidDataSource dataSource() {
  16.         DruidDataSource dataSource = new DruidDataSource();
  17.         dataSource.setDriverClassName(driver);
  18.         dataSource.setUrl(url);
  19.         dataSource.setUsername(username);
  20.         dataSource.setPassword(password);
  21.         return dataSource;
  22.     }
  23.     //配置jdbc模板,将数据源注入到模板中
  24.     @Bean
  25.     public JdbcTemplate jdbcTemplate(DruidDataSource dataSource) {
  26.         JdbcTemplate jdbcTemplate = new JdbcTemplate();
  27.         jdbcTemplate.setDataSource(dataSource);
  28.         return jdbcTemplate;
  29.     }
  30. }
复制代码
jdbc.properties
  1. jdbc.driver=com.mysql.cj.jdbc.Driver
  2. jdbc.url=jdbc:mysql://localhost:3306/dbtest1
  3. jdbc.username=root
  4. jdbc.password=123456
复制代码
创建SpringMVC配置类,替换SpringMVC配置文件
  1. @Configurable //标识为配置类
  2. @ComponentScan(basePackages = {"com.evan"})
  3. @EnableWebMvc //开启mvc注解
  4. public class WebConfig implements WebMvcConfigurer {
  5.     //配置Spring视图模板解析器的相关策略
  6.     @Bean
  7.     public ITemplateResolver templateResolver() {
  8.         //获取当前Web应用的上下文,即Web容器
  9.         WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
  10.         //创建ServletContext对象,注入当前Web应用的上下文
  11.         ServletContextTemplateResolver templateResolver =
  12.                 new ServletContextTemplateResolver(webApplicationContext.getServletContext());
  13.         //创建spring视图模板解析器对象
  14.         //SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver();
  15.         //设置视图字符集
  16.         templateResolver.setCharacterEncoding("UTF-8");
  17.         //设置视图优先级
  18.         templateResolver.setOrder(1);
  19.         //设置视图模式
  20.         templateResolver.setTemplateMode("HTML5");
  21.         //设置视图前缀
  22.         templateResolver.setPrefix("/WEB-INF/views/");
  23.         //设置视图后缀
  24.         templateResolver.setSuffix(".html");
  25.         return templateResolver;
  26.     }
  27.     //生成Spring的模板引擎,并为模板引擎注入模板解析器
  28.     @Bean
  29.     public TemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {
  30.         SpringTemplateEngine templateEngine = new SpringTemplateEngine();
  31.         templateEngine.setTemplateResolver(iTemplateResolver);
  32.         return templateEngine;
  33.     }
  34.     //生成Thymeleaf视图解析器,并为视图解析器注入spring的模板引擎
  35.     @Bean
  36.     public ViewResolver thymeleafViewResolver(SpringTemplateEngine templateEngine) {
  37.         ThymeleafViewResolver thymeleafViewResolver = new ThymeleafViewResolver();
  38.         thymeleafViewResolver.setCharacterEncoding("UTF-8");
  39.         thymeleafViewResolver.setOrder(1);
  40.         thymeleafViewResolver.setTemplateEngine(templateEngine);
  41.         return thymeleafViewResolver;
  42.     }
  43.     //配置文件上传解析器
  44.     @Bean
  45.     public CommonsMultipartResolver multipartResolver() {
  46.         return new CommonsMultipartResolver();
  47.     }
  48.     //配置拦截器
  49.     @Override
  50.     public void addInterceptors(InterceptorRegistry registry) {
  51.         //创建自定义拦截器实现类对象
  52.         FirstInterceptor firstInterceptor = new FirstInterceptor();
  53.         //配置拦截所有请求路径,排除/hello请求
  54.         registry.addInterceptor(firstInterceptor).addPathPatterns("/**")
  55.                 .excludePathPatterns("/hello");
  56.     }
  57.     //配置视图控制器
  58.     @Override
  59.     public void addViewControllers(ViewControllerRegistry registry) {
  60.         //设置视图控制器策略
  61.         registry.addViewController("/").setStatusCode(HttpStatus.OK).setViewName("index");
  62.     }
  63.     //配置默认的servlet处理静态资源
  64.     @Override
  65.     public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
  66.         //开启默认的servlet静态资源处理
  67.         configurer.enable();
  68.     }
  69.     //配置异常处理器
  70.     @Override
  71.     public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
  72.         //创建自定义异常处理器对象
  73.         SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
  74.         //创建属性对象
  75.         Properties properties = new Properties();
  76.         //注入全类名异常,并指定异常逻辑视图
  77.         properties.setProperty("java.lang.ArithmeticException","error");
  78.         //将异常属性注入到异常映射中
  79.         exceptionResolver.setExceptionMappings(properties);
  80.         //将异常信息注入到请求域中,浏览器可以通过请求域获取异常信息
  81.         exceptionResolver.setExceptionAttribute("ex");
  82.         //添加异常解析器
  83.         resolvers.add(exceptionResolver);
  84.     }
  85. }
复制代码
创建自定义拦截器
  1. @Component
  2. public class FirstInterceptor implements HandlerInterceptor {
  3.     @Override
  4.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  5.         System.out.println("FirstInterceptor->preHandle");
  6.         return HandlerInterceptor.super.preHandle(request,response,handler);
  7.     }
  8.     @Override
  9.     public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  10.         System.out.println("FirstInterceptor->postHandle");
  11.     }
  12.     @Override
  13.     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  14.         System.out.println("FirstInterceptor->after");
  15.     }
  16. }
复制代码
创建视图index.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>index.html</h1>
  9. <a th:target="_blank" href="https://www.cnblogs.com/@{/test/error}">测试异常处理器</a>
  10. </body>
  11. </html>
复制代码
创建视图error.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>error.html</h1>
  9. <hr>
  10. <p th:text="${ex}"/>
  11. </body>
  12. </html>
复制代码
测试
  1. @Controller
  2. public class TestController {
  3.     @GetMapping("/test/error")
  4.     public String testError() {
  5.         System.out.println(10 / 0);
  6.         return "success";
  7.     }
  8. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

曹旭辉

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

标签云

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