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
4.0.0 online.liaojy spring_mvc_annotation 1.0-SNAPSHOT war org.springframework spring-webmvc 5.3.1 ch.qos.logback logback-classic 1.2.3 javax.servlet javax.servlet-api 3.1.0 provided org.thymeleaf thymeleaf-spring5 3.0.12.RELEASE commons-fileupload commons-fileupload 1.3.1
14.2.6、配置web资源目录
打开Project Structure,选择对应的module,并为该module创建一个web.xml文件
注意:web.xml文件需要放到web资源路径(工程路径\src\main\webapp)下
因为使用配置类和注解来配置 Servlet 上下文,所以 web.xml 不再需要配置。
14.2.7、创建拦截器
package online.liaojy.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * @author liaojy * @date 2023/11/15 - 7:22 */public class AAAInterceptor 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 { }}
14.2.8、创建模板目录及页面模板
注意:html要引入thymeleaf的约束:xmlns:th=”http://www.thymeleaf.org”
首页 index.html
错误页面 errorPage.html
14.2.9、配置tomcat
14.3、web.xml的注解配置14.3.1、创建Spring配置类
package online.liaojy.config;/** * @author liaojy * @date 2023/11/16 - 23:59 * 该类用于代替spring的配置文件 */public class SpringConfig { //ssm整合之后,spring的配置信息写在此类中}
14.3.2、创建SpringMVC配置类
package online.liaojy.config;/** * @author liaojy * @date 2023/11/17 - 0:02 * 该类用于代替SpringMVC的配置文件 */public class SpringMVCConfig {}
14.3.3、创建代替web.xml的初始化类
package online.liaojy.config;import org.springframework.web.filter.CharacterEncodingFilter;import org.springframework.web.filter.HiddenHttpMethodFilter;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;import javax.servlet.Filter;/** * @author liaojy * @date 2023/11/17 - 0:04 */public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer { // 指定代替 Spring 配置文件的配置类(可以按功能或需要来划分多个) protected Class[] getRootConfigClasses() { return new Class[]{SpringConfig.class}; } // 指定代替 SpringMVC 配置文件的配置类(可以按功能或需要来划分多个) protected Class[] getServletConfigClasses() { return new Class[]{SpringMVCConfig.class}; } // 设置 SpringMVC 的前端控制器 DispatcherServlet 需要处理的请求路径(即 url-pattern ) protected String[] getServletMappings() { return new String[]{"/"}; } // 设置过滤器 @Override protected Filter[] getServletFilters() { // 配置编码过滤器 CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceEncoding(true); // 配置处理请求方式的过滤器 // 注意该过滤器所在的包路径为 org.springframework.web.filter.HiddenHttpMethodFilter HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter(); // 配置要使用的过滤器 return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter}; }}
14.4、SpringMVC配置类的详细配置14.4.1、将类标识为配置类
// @Configurable 注解:将类标识为配置类@Configurable
14.4.2、实现 WebMvcConfigurer 接口
14.4.3、配置扫描组件
先创建一个需要扫描的包及组件
package online.liaojy.controller;import org.springframework.stereotype.Controller;/** * @author liaojy * @date 2023/11/19 - 16:56 */@Controllerpublic class TestController {}
// @ComponentScan 注解:用于扫描指定包的组件@ComponentScan("online.liaojy.controller")
14.4.4、配置默认servlet处理器
// 配置默认servlet处理器 public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); }
14.4.5、配置mvc注解驱动
// @EnableWebMvc 注解:开启mvc的注解驱动@EnableWebMvc
14.4.6、配置视图控制器
// 配置视图控制器 public void addViewControllers(ViewControllerRegistry registry) { // addViewController 设置视图控制器要处理的请求路径,setViewName 设置匹配请求路径的逻辑视图 registry.addViewController("/").setViewName("index"); }
14.4.7、配置文件上传解析器
// 配置文件上传解析器 // @Bean 注解:用于将所标识方法的返回值作为一个 bean 来进行管理,bean的id为方法名 @Bean public CommonsMultipartResolver multipartResolver(){ return new CommonsMultipartResolver(); }
14.4.8、配置拦截器
// 配置拦截器 public void addInterceptors(InterceptorRegistry registry) { AAAInterceptor aaaInterceptor = new AAAInterceptor(); // addInterceptor 设置要使用的拦截器, // addPathPatterns 设置该拦截器要拦截的请求路径( /** 表示所有路径),excludePathPatterns 设置要排除的拦截路径 registry.addInterceptor(aaaInterceptor).addPathPatterns("/**").excludePathPatterns("/abc"); }
14.4.9、配置异常解析器
// 配置异常解析器 public void configureHandlerExceptionResolvers(List resolvers) { // 创建 SimpleMappingExceptionResolver 异常解析器,来对控制器方法出现的异常进行自定义异常处理 SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver(); // 设置异常和错误提示页面的映射关系 Properties properties = new Properties(); properties.setProperty("java.lang.ArithmeticException", "errorPage"); simpleMappingExceptionResolver.setExceptionMappings(properties); // 设置共享到域对象中的异常信息的属性名 simpleMappingExceptionResolver.setExceptionAttribute("exceptionMessage"); // 添加要使用的异常解析器器 resolvers.add(simpleMappingExceptionResolver); }
14.4.10、配置视图解释器
配置视图解释器,无论是通过xml还是配置类都比较复杂;一般直接都是复制配置模板,然后根据实际修改视图前缀及后缀即可
//配置生成模板解析器 @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; }
14.4.11、全配置汇总
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 注解:将类标识为配置类@Configurable// @ComponentScan 注解:用于扫描指定包的组件@ComponentScan("online.liaojy.controller")// @EnableWebMvc 注解:开启mvc的注解驱动@EnableWebMvcpublic class SpringMVCConfig implements WebMvcConfigurer { // 配置默认servlet处理器 public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } // 配置视图控制器 public void addViewControllers(ViewControllerRegistry registry) { // addViewController 设置视图控制器要处理的请求路径,setViewName 设置匹配请求路径的逻辑视图 registry.addViewController("/").setViewName("index"); } // 配置文件上传解析器 // @Bean 注解:用于将所标识方法的返回值作为一个 bean 来进行管理,bean的id为方法名 @Bean public CommonsMultipartResolver multipartResolver(){ return new CommonsMultipartResolver(); } // 配置拦截器 public void addInterceptors(InterceptorRegistry registry) { AAAInterceptor aaaInterceptor = new AAAInterceptor(); // addInterceptor 设置要使用的拦截器, // addPathPatterns 设置该拦截器要拦截的请求路径( /** 表示所有路径),excludePathPatterns 设置要排除的拦截路径 registry.addInterceptor(aaaInterceptor).addPathPatterns("/**").excludePathPatterns("/abc"); } // 配置异常解析器 public void configureHandlerExceptionResolvers(List resolvers) { // 创建 SimpleMappingExceptionResolver 异常解析器,来对控制器方法出现的异常进行自定义异常处理 SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver(); // 设置异常和错误提示页面的映射关系 Properties properties = new Properties(); properties.setProperty("java.lang.ArithmeticException", "errorPage"); simpleMappingExceptionResolver.setExceptionMappings(properties); // 设置共享到域对象中的异常信息的属性名 simpleMappingExceptionResolver.setExceptionAttribute("exceptionMessage"); // 添加要使用的异常解析器器 resolvers.add(simpleMappingExceptionResolver); } //配置生成模板解析器 @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; }}
14.5、测试效果
本文来自博客园,作者:Javaer1995,转载请注明原文链接:https://www.cnblogs.com/Javaer1995/p/17833503.html