新闻详情

新闻详情

首页 / 资讯中心 / 详情

第四十九天学习心得

发布时间:2026/11/3 17:46:26来源:尧图网络
第四十九天学习心得
SpringMVC异常处理、拦截器与SSM整合学习心得体会日期2026年9月22日昨天完成了SpringMVC的基础和进阶内容今天继续深入学习了异常处理、拦截器、日期格式处理最后还完成了一个重要的实战项目——用聚合工程整合SSM框架。今天的知识让我真正体会到了企业级项目开发的完整流程。一、统一异常处理在之前的开发中每个方法都要写try-catch代码又乱又重复。今天学习的RestControllerAdvice注解彻底解决了这个问题。先自定义一个业务异常public class ApiException extends RuntimeException {private AxiosStatus axiosStatus;public ApiException(AxiosStatus axiosStatus) {this.axiosStatus axiosStatus;}public AxiosStatus getAxiosStatus() {return axiosStatus;}}然后创建一个全局异常处理器RestControllerAdvicepublic class MyExceptionHandler {ExceptionHandler(ApiException.class)public AxiosResult handler(ApiException apiException) {return AxiosResult.error(apiException.getAxiosStatus());}ExceptionHandler(ArithmeticException.class)public String handler2(ArithmeticException arithmeticException) {return / by zero;}}这样只要Controller里抛出ApiException就会被自动拦截并转换成统一的JSON响应格式。RestControllerAdvice配合ExceptionHandler可以针对不同类型的异常做不同的处理代码非常清晰。我的理解是这套机制本质上是SpringMVC在Controller方法外层包了一层代理当方法抛出异常时代理捕获异常并交给匹配的异常处理方法。二、拦截器拦截器属于SpringMVC体系会拦截所有匹配的Mapping请求。这和之前的Filter不同Filter属于Servlet规范拦截范围更广而拦截器是SpringMVC提供的更灵活可以精确控制哪些请求被拦截。创建一个拦截器需要实现HandlerInterceptor接口有三个方法preHandleController方法执行之前执行返回true放行返回false拦截。postHandleController方法执行完毕后、视图渲染之前执行。afterCompletion整个请求全部结束、视图渲染完成后执行。课程上展示了两个拦截器来测试执行顺序public class FirstInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(first preHandle);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(first postHandle);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(first afterCompletion);}}然后在配置类中注册Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new FirstInterceptor()).addPathPatterns(/**).excludePathPatterns(/login, /aa/**);registry.addInterceptor(new SecondInterceptor()).addPathPatterns(/**).excludePathPatterns(/login, /aa/**);}多个拦截器的执行顺序是先注册的preHandle先执行后注册的postHandle先执行。有点像栈的结构。拦截器最典型的应用场景就是登录校验在preHandle里判断session中是否有用户信息没有就拦截并跳转到登录页。三、日期格式处理日期格式的处理是Web开发中很常见的需求。SpringMVC提供了多种方式来处理前端传来的日期字符串。普通参数用DateTimeFormat注解PostMapping(add)public void add(String uname, DateTimeFormat(pattern yyyy-MM-dd) Date ctime) {System.out.println(uname);System.out.println(ctime);}实体类参数也一样在属性上加注解Datapublic class User {private Integer id;private String username;DateTimeFormat(pattern yyyy-MM-dd)private Date utime;}但如果前端传的日期格式不固定比如有时候是yyyy-MM-dd有时候是yyyy/MM/dd就需要自定义类型转换器public class StringToDate implements ConverterString, Date {private static final String[] PATTERNS {yyyy-MM-dd HH:mm:ss,yyyy-MM-dd HH:mm,yyyy-MM-dd,yyyy/MM/dd HH:mm:ss,yyyy/MM/dd};Overridepublic Date convert(String source) {if (source null || source.trim().isBlank()) {return null;}for (String pattern : PATTERNS) {SimpleDateFormat sdf new SimpleDateFormat(pattern);try {return sdf.parse(source.trim());} catch (ParseException e) {continue;}}throw new IllegalArgumentException(无法解析日期格式 source);}}然后在配置类中注册Overridepublic void addFormatters(FormatterRegistry registry) {registry.addConverter(new StringToDate());registry.addConverter(new StringToDateTime());}对于JSON格式的日期还需要引入jackson-datatype-jsr310依赖让Jackson能够正确处理Java 8的日期类型。四、SSM聚合工程整合今天最重要的内容是整合SSM框架。之前学的Spring、SpringMVC、MyBatis都是单独使用的今天要把它们整合到一个项目里。首先是项目结构用Maven的聚合工程分成四个模块父工程统一管理依赖版本。entity模块存放实体类。mapper模块存放MyBatis的Mapper接口和XML文件。service模块存放业务逻辑代码。web模块存放Controller是war项目。父工程的pom中用dependencyManagement统一管理版本propertiesspring-version6.2.12/spring-versionmybatis-version3.5.19/mybatis-versiondruid-version1.2.28/druid-versionmybatis-spring-version4.1.0/mybatis-spring-version/propertiesdependencyManagementdependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion${spring-version}/version/dependency!-- 其他依赖 --/dependencies/dependencyManagement这样各个子模块引用依赖时就不需要写版本号了统一由父工程管理。各个模块的配置类Mapper模块的配置类负责数据源、SqlSessionFactory和Mapper扫描Configurationpublic class MapperConfig {Beanpublic DataSource dataSource() {DruidDataSource dataSource new DruidDataSource();dataSource.setDriverClassName(com.mysql.cj.jdbc.Driver);dataSource.setUrl(jdbc:mysql:///ssm);dataSource.setUsername(root);dataSource.setPassword(root);return dataSource;}Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean() {SqlSessionFactoryBean factoryBean new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource());return factoryBean;}Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer configurer new MapperScannerConfigurer();configurer.setBasePackage(cn.javasm.mapper);return configurer;}}Service模块的配置类负责包扫描和AOPConfigurationComponentScan(cn.javasm.service)EnableAspectJAutoProxypublic class ServiceConfig {}Web模块的配置类负责Controller扫描和MVC注解开启ConfigurationComponentScan(cn.javasm.controller)EnableWebMvcpublic class ControllerConfig {}最关键的是父子容器的配置。SpringMVC中DispatcherServlet对应一个子容器而ContextLoaderListener对应一个父容器。父容器管理Service和Mapper子容器管理Controller。public class MyWebAppInit extends AbstractAnnotationConfigDispatcherServletInitializer {Overrideprotected Class?[] getRootConfigClasses() {return new Class[]{MapperConfig.class, ServiceConfig.class};}Overrideprotected Class?[] getServletConfigClasses() {return new Class[]{ControllerConfig.class};}Overrideprotected String[] getServletMappings() {return new String[]{/};}}这样Controller可以注入ServiceService可以注入Mapper整个链路就打通了。五、今日总结今天的内容非常充实是SSM框架学习的收官之战。异常处理让代码更干净拦截器让权限控制更优雅日期处理解决了实际开发中的常见问题SSM整合让我看到了企业级项目的完整结构。几点深刻感悟第一统一异常处理是项目规范化的标志。以前每个方法都要try-catch现在只需要定义好异常类型和处理器代码清爽了很多。第二拦截器和过滤器的区别要分清楚。过滤器属于Servlet规范拦截器属于SpringMVC过滤器在DispatcherServlet之前执行拦截器在Controller之前执行。做登录校验用拦截器更合适因为可以精确控制拦截路径。第三聚合工程是企业开发的标配。通过父子工程的依赖管理各模块各司其职代码结构清晰。父容器和子容器的设计也很巧妙Controller层只关心Web逻辑Service和Mapper层由父容器统一管理。第四整合SSM的过程虽然繁琐但理解了每个配置类的作用之后就清晰了。MapperConfig管数据层ServiceConfig管业务层ControllerConfig管Web层各司其职。明天也继续加油
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/3 7:07:39

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/3 12:09:35

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/3 12:09:38

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/3 12:09:41

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/4 1:25:31

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/4 3:51:11

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉