1. Spring MVC 全注解开发
文章目录
- [1. Spring MVC 全注解开发](#1. Spring MVC 全注解开发)
- [2. web.xml 文件 的替代](#2. web.xml 文件 的替代)
-
- [2.1 Servlet3.0新特性](#2.1 Servlet3.0新特性)
- [2.2 编写 WebAppInitializer](#2.2 编写 WebAppInitializer)
- [3. Spring MVC的配置](#3. Spring MVC的配置)
-
- [3.1 Spring MVC的配置:开启注解驱动](#3.1 Spring MVC的配置:开启注解驱动)
- [3.2 Spring MVC的配置:视图解析器](#3.2 Spring MVC的配置:视图解析器)
- [3.3 Spring MVC的配置:开启默认Servlet处理](#3.3 Spring MVC的配置:开启默认Servlet处理)
- [3.4 Spring MVC的配置:视图控制器 view-controller](#3.4 Spring MVC的配置:视图控制器 view-controller)
- [3.5 Spring MVC的配置:异常处理器](#3.5 Spring MVC的配置:异常处理器)
- [3.6 Spring MVC 的配置:拦截器](#3.6 Spring MVC 的配置:拦截器)
- [4. 运行测试:](#4. 运行测试:)
- [5. 总结:](#5. 总结:)
- [6. 最后:](#6. 最后:)
2. web.xml 文件 的替代
2.1 Servlet3.0新特性
Servlet3.0新特性:web.xml文件可以不写了。
在Servlet3.0的时候,规范中提供了一个接口:
服务器在启动的时候,会自动从容器中找 ServletContainerInitializer
接口的实现类,自动调用它的 onStratup()
方法来完成 Servlet 上下文的初始化。
在Spring3.1版本的时候,提供了这样一个类,实现以上的接口:
它的核心方法如下:
可以看到在服务器启动的时候,它会去加载所有实现 WebApplicationInitializer
接口的类:
这个接口下有一个子类是我们需要的 : AbstractAnnotationConfigDispatcherServletInitializer
当我们编写类继承AbstractAnnotationConfigDispatcherServletInitializer
之后,web服务器在启动的时候会根据它来初始化Servlet上下文。
2.2 编写 WebAppInitializer
以下这个类就是用来代替web.xml文件的:
注意:加上 @Configuration 注解表示:
标记该类是配置类注意:加上 @Configuration 注解表示:标记该类是配置类
java
package com.rainbow.springmvc.config;
import jakarta.servlet.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
// 在这个配置类当中编写的其实就是 web.xml 文件中的配置
// 用来标注这个类当中的配置文件
@Configuration // 表示该类是配置类
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* Spring 的配置
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
/**
* 配置过滤器
* @return
*/
@Override
protected Filter[] getServletFilters() {
// 配置字符编码过滤器
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceRequestEncoding(true);
characterEncodingFilter.setForceRequestEncoding(true);
// 配置 HiddenHttpMethodFilter ???
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};
}
/**
* Spring MVC 的配置
*
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
/**
* 用来配置 DispatcherServlet 的 <url-pattern></url-pattern>
*用于配置 DispatcherServlet 的映射路径
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
3. Spring MVC的配置
命名一个名为 SpringMvcConfig 的类,作为 Spring MVC 的配置类。
java
// 指定该类是一个配置类,可以当配置文件使用
@Configuration
// 开启组件扫描
@ComponentScan("com.rainbow.springmvc.controller")
public class SpringMVCConfig {
}
java在springmvc.xml 文件中都可以配置什么? * 1.组件扫描 * 2.视图解析器 * 3.静态资源处理 default-servlet-handler * 4.视图控制器 view-controller * 5.开启注解驱动 * 6.异常处理器 * 7.拦截器
3.1 Spring MVC的配置:开启注解驱动
在类上,使用 @EnableWebMvc
注解表示:开启注解驱动。
java
// 以下相当于是 Springmvc.xml 的配置文件
@Configuration // 表示该类是配置类, 指定该类是一个配置类,可以当配置文件使用
// 开启组件扫描
@ComponentScan("com.rainbow.springmvc.controller")
// 开启注解驱动
@EnableWebMvc
public class SpringMvcConfig {
3.2 Spring MVC的配置:视图解析器
java
import com.rainbow.springmvc.interceptors.MyInterceptor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring6.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;
import java.util.List;
import java.util.Properties;
// 以下相当于是 Springmvc.xml 的配置文件
@Configuration // 表示该类是配置类, 指定该类是一个配置类,可以当配置文件使用
// 开启组件扫描
@ComponentScan("com.rainbow.springmvc.controller")
// 开启注解驱动
@EnableWebMvc
public class SpringMvcConfig {
// 以下三个方法合并起来就是开启视图解析器
@Bean
public ThymeleafViewResolver getViewResolver(SpringTemplateEngine springTemplateEngine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(springTemplateEngine);
resolver.setCharacterEncoding("UTF-8");
resolver.setOrder(1);
return resolver;
}
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(iTemplateResolver);
return templateEngine;
}
@Bean
public ITemplateResolver templateResolver(ApplicationContext applicationContext) {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/thymeleaf/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setCharacterEncoding("UTF-8");
resolver.setCacheable(false);//开发时关闭缓存,改动即可生效。发布的时候,则将其开启即可
return resolver;
}
}
3.3 Spring MVC的配置:开启默认Servlet处理
让SpringMVCConfig类实现这个接口:WebMvcConfigurer
并且重写以下的方法:
java
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
java
import com.rainbow.springmvc.interceptors.MyInterceptor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring6.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;
import java.util.List;
import java.util.Properties;
// 以下相当于是 Springmvc.xml 的配置文件
@Configuration // 表示该类是配置类, 指定该类是一个配置类,可以当配置文件使用
// 开启组件扫描
@ComponentScan("com.rainbow.springmvc.controller")
// 开启注解驱动
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
// 以下三个方法合并起来就是开启视图解析器
@Bean
public ThymeleafViewResolver getViewResolver(SpringTemplateEngine springTemplateEngine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(springTemplateEngine);
resolver.setCharacterEncoding("UTF-8");
resolver.setOrder(1);
return resolver;
}
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(iTemplateResolver);
return templateEngine;
}
@Bean
public ITemplateResolver templateResolver(ApplicationContext applicationContext) {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/thymeleaf/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setCharacterEncoding("UTF-8");
resolver.setCacheable(false);//开发时关闭缓存,改动即可生效。发布的时候,则将其开启即可
return resolver;
}
// 开启静态资源处理,开启默认的 Servlet 处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
3.4 Spring MVC的配置:视图控制器 view-controller
view-controller : 不写对应的 Controller 只需要 html页面就可以访问的配置 。只需要重写 WebMvcConfigurer
接口中的 addViewControllers(ViewControllerRegistry registry)
方法即可。
java
import com.rainbow.springmvc.interceptors.MyInterceptor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring6.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;
import java.util.List;
import java.util.Properties;
// 以下相当于是 Springmvc.xml 的配置文件
@Configuration // 表示该类是配置类, 指定该类是一个配置类,可以当配置文件使用
// 开启组件扫描
@ComponentScan("com.rainbow.springmvc.controller")
// 开启注解驱动
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
// 以下三个方法合并起来就是开启视图解析器
@Bean
public ThymeleafViewResolver getViewResolver(SpringTemplateEngine springTemplateEngine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(springTemplateEngine);
resolver.setCharacterEncoding("UTF-8");
resolver.setOrder(1);
return resolver;
}
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(iTemplateResolver);
return templateEngine;
}
@Bean
public ITemplateResolver templateResolver(ApplicationContext applicationContext) {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/thymeleaf/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setCharacterEncoding("UTF-8");
resolver.setCacheable(false);//开发时关闭缓存,改动即可生效。发布的时候,则将其开启即可
return resolver;
}
// 开启静态资源处理,开启默认的 Servlet 处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
// 不写对应的 Controller 只需要 html页面就可以访问的配置
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/test").setViewName("test");
}
}
3.5 Spring MVC的配置:异常处理器
Spring MVC 的配置:异常处理器只需要,重写 WebMvcConfigurer
接口中的 configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers)
方法即可。
java
// 配置异常处理器
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
// 可以配置多个异常处理器,这是其中的一个
SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();
// 将异常处理器添加到List集合中
resolvers.add(simpleMappingExceptionResolver);
// 配置异常信息,跳转的内容
// 设置其中的 exceptionMapping 属性
Properties properties = new Properties();
properties.setProperty("java.lang.Exception","tip");
simpleMappingExceptionResolver.setExceptionMappings(properties);
// 设置其中的 exceptionAttribute 属性,将错误信息添加到请求域当中
simpleMappingExceptionResolver.setExceptionAttribute("e");
// 将异常处理器添加到 List 集合中
resolvers.add(simpleMappingExceptionResolver);
}
java
import com.rainbow.springmvc.interceptors.MyInterceptor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring6.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;
import java.util.List;
import java.util.Properties;
// 以下相当于是 Springmvc.xml 的配置文件
@Configuration // 表示该类是配置类, 指定该类是一个配置类,可以当配置文件使用
// 开启组件扫描
@ComponentScan("com.rainbow.springmvc.controller")
// 开启注解驱动
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
// 以下三个方法合并起来就是开启视图解析器
@Bean
public ThymeleafViewResolver getViewResolver(SpringTemplateEngine springTemplateEngine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(springTemplateEngine);
resolver.setCharacterEncoding("UTF-8");
resolver.setOrder(1);
return resolver;
}
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(iTemplateResolver);
return templateEngine;
}
@Bean
public ITemplateResolver templateResolver(ApplicationContext applicationContext) {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/thymeleaf/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setCharacterEncoding("UTF-8");
resolver.setCacheable(false);//开发时关闭缓存,改动即可生效。发布的时候,则将其开启即可
return resolver;
}
// 开启静态资源处理,开启默认的 Servlet 处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
// 不写对应的 Controller 只需要 html页面就可以访问的配置
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/test").setViewName("test");
}
// 配置异常处理器
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
// 可以配置多个异常处理器,这是其中的一个
SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();
// 将异常处理器添加到List集合中
resolvers.add(simpleMappingExceptionResolver);
// 配置异常信息,跳转的内容
// 设置其中的 exceptionMapping 属性
Properties properties = new Properties();
properties.setProperty("java.lang.Exception","tip");
simpleMappingExceptionResolver.setExceptionMappings(properties);
// 设置其中的 exceptionAttribute 属性,将错误信息添加到请求域当中
simpleMappingExceptionResolver.setExceptionAttribute("e");
// 将异常处理器添加到 List 集合中
resolvers.add(simpleMappingExceptionResolver);
}
}
3.6 Spring MVC 的配置:拦截器
Spring MVC 的配置:拦截器只需要,重写 WebMvcConfigurer
接口中的 addInterceptors(InterceptorRegistry registry)
方法即可。
java
package com.rainbow.springmvc.config;
import com.rainbow.springmvc.interceptors.MyInterceptor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import org.thymeleaf.spring6.SpringTemplateEngine;
import org.thymeleaf.spring6.templateresolver.SpringResourceTemplateResolver;
import org.thymeleaf.spring6.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;
import java.util.List;
import java.util.Properties;
// 以下相当于是 Springmvc.xml 的配置文件
@Configuration // 表示该类是配置类, 指定该类是一个配置类,可以当配置文件使用
// 开启组件扫描
@ComponentScan("com.rainbow.springmvc.controller")
// 开启注解驱动
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {
// 以下三个方法合并起来就是开启视图解析器
@Bean
public ThymeleafViewResolver getViewResolver(SpringTemplateEngine springTemplateEngine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(springTemplateEngine);
resolver.setCharacterEncoding("UTF-8");
resolver.setOrder(1);
return resolver;
}
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(iTemplateResolver);
return templateEngine;
}
@Bean
public ITemplateResolver templateResolver(ApplicationContext applicationContext) {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/thymeleaf/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setCharacterEncoding("UTF-8");
resolver.setCacheable(false);//开发时关闭缓存,改动即可生效。发布的时候,则将其开启即可
return resolver;
}
// 开启静态资源处理,开启默认的 Servlet 处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
// 不写对应的 Controller 只需要 html页面就可以访问的配置
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/test").setViewName("test");
}
// 配置异常处理器
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
// 可以配置多个异常处理器,这是其中的一个
SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();
// 将异常处理器添加到List集合中
resolvers.add(simpleMappingExceptionResolver);
// 配置异常信息,跳转的内容
// 设置其中的 exceptionMapping 属性
Properties properties = new Properties();
properties.setProperty("java.lang.Exception","tip");
simpleMappingExceptionResolver.setExceptionMappings(properties);
// 设置其中的 exceptionAttribute 属性,将错误信息添加到请求域当中
simpleMappingExceptionResolver.setExceptionAttribute("e");
// 将异常处理器添加到 List 集合中
resolvers.add(simpleMappingExceptionResolver);
}
// 配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
MyInterceptor myInterceptor = new MyInterceptor();
// 除了 /test 请求路径,不拦截,其他的路径都进行拦截处理
registry.addInterceptor(myInterceptor).addPathPatterns("/**").excludePathPatterns("/test");
}
/**
* 在springmvc.xml 文件中都可以配置什么?
* 1.组件扫描
* 2.视图解析器
* 3.静态资源处理 default-servlet-handler
* 4.视图控制器 view-controller
* 5.开启注解驱动
* 6.异常处理器
* 7.拦截器
*/
}
4. 运行测试:
编写对应测试的 Controller 类
编写对应测试的 Interceptor 类,拦截器类
编写对应测试的 html 前端页面展示:
测试拦截器
测试异常处理器
5. 总结:
定义配置类,用 @Configuration 注解进行标注,表示:标记该类是配置类
WebAppInitializer 这个类就是用来代替 web.xml文件的:
SpringMvcConfig 的类,作为 Spring MVC 的配置类。
让SpringMVCConfig类实现这个接口:
WebMvcConfigurer
,同时重写其中的方法可以,配置(默认 Servlet 处理,以及异常处理器,拦截器)在springmvc.xml 文件中都可以配置什么?
java- 1.组件扫描 - 2.视图解析器 - 3.静态资源处理 default-servlet-handler - 4.视图控制器 view-controller - 5.开启注解驱动 - 6.异常处理器 - 7.拦截器
- 进行了异常处理后,拦截器就不起作用了。
6. 最后:
"在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。"