1、创建Maven工程,pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.wexiao.mvc</groupId><artifactId>spring-annotation</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><dependencies><!-- SpringMVC --><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.1</version></dependency><!-- 日志 --><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.2.3</version></dependency><!-- ServletAPI --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope> <!-- provided --></dependency><!-- Spring5和Thymeleaf整合包 --><dependency><groupId>org.thymeleaf</groupId><artifactId>thymeleaf-spring5</artifactId><version>3.0.12.RELEASE</version></dependency></dependencies></project>
2、写一个WebInit类继承AbstractAnnotationConfigDispatcherServletInitializer,实现三个方法
//web工程的初始化类,用来代替web.xmlpublic class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {/*** 指定spring的配置类* @return*/protected Class<?>[] getRootConfigClasses() {return new Class[0];}/*** 指定springMVC的配置类* @return*/protected Class<?>[] getServletConfigClasses() {return new Class[0];}/*** 指定DispatcherServlet的映射规则,即url-pattern* @return*/protected String[] getServletMappings() {return new String[0];}}
3、创建SpringConfig、WebConfig类(使用@Configuration),修改上面方法的返回值
@Configurationpublic class SpringConfig {//ssm整合之后,spring的配置信息写在此类中}
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {/*** 指定spring的配置类* @return*/protected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}/*** 指定springMVC的配置类* @return*/protected Class<?>[] getServletConfigClasses() {return new Class[]{WebConfig.class};}/*** 指定DispatcherServlet的映射规则,即url-pattern* @return*/protected String[] getServletMappings() {return new String[]{"/"};}}
4、注册过滤器:在WebInit类中 按ctrl+o

/*** 注册过滤器* @return*/@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();characterEncodingFilter.setEncoding("UTF-8");characterEncodingFilter.setForceResponseEncoding(true);HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};}
5、编写WebConfig(SpringMVC.xml)
在WebConfig类实现WebMvcConfigurer接口,按Ctrl+o实现需要的方法
package com.wexiao.mvc.config;import com.wexiao.mvc.interceptor.TestInterceptor;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.web.context.ContextLoader;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.multipart.MultipartResolver;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;/*** Description: SpringMVC* Created by wexiao on 2022/3/25 19:56** @version 1.0*//*** 代替SpringMvc的配置文件* 1、扫描注解,2、视图解析器,3、view-controller,4、default-servlet-handler* 5、mvc注解驱动,6、文件上传解析器,7、异常处理,8、拦截器*/@Configuration //将当前类标识为一个配置类@ComponentScan("com.wexiao.mvc.controller") //扫描注解@EnableWebMvc //开启MVC注解驱动public class WebConfig implements WebMvcConfigurer {//default-servlet-handlerpublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}//拦截器public void addInterceptors(InterceptorRegistry registry) {TestInterceptor testInterceptor = new TestInterceptor();registry.addInterceptor(testInterceptor).addPathPatterns("/**"); //添加拦截路径//.addInterceptor(testInterceptor).excludePathPatterns(); //添加排除路径}//view-controllerpublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/hello").setViewName("hello");}//异常处理(也可以通过@Bean)public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();Properties prop = new Properties();prop.setProperty("java.long.ArithmeticException","error");exceptionResolver.setExceptionMappings(prop);exceptionResolver.setExceptionAttribute("exception"); //设置在请求域中信息的键,error.htmlresolvers.add(exceptionResolver);}//文件上传解析器 (运行时报错0.0)@Beanpublic MultipartResolver multipartResolver(){CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();return commonsMultipartResolver;}//Thymeleaf视图解析器/*<!--配置 thymeleaf 的视图解析器--><bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver"><property name="order" value="1"/><property name="characterEncoding" value="UTF-8"/><property name="templateEngine"><bean class="org.thymeleaf.spring5.SpringTemplateEngine"><property name="templateResolver"><bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"><!-- 视图前缀 --><property name="prefix" value="/WEB-INF/templates/"/><!-- 视图后缀 --><property name="suffix" value=".html"/><property name="templateMode" value="HTML5"/><property name="characterEncoding" value="UTF-8" /></bean></property></bean></property></bean>下面三个方法 从里到外创建 bean,然后调用*///配置生成模板解析器@Beanpublic 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;}//生成模板引擎并为模板引擎注入模板解析器@Beanpublic SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver);return templateEngine;}//生成视图解析器并未解析器注入模板引擎@Beanpublic ViewResolver viewResolver(SpringTemplateEngine templateEngine) {ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();viewResolver.setCharacterEncoding("UTF-8");viewResolver.setTemplateEngine(templateEngine);return viewResolver;}}
