首页/新闻资讯/正文详情

第四十九天学习心得

发布时间:2026/9/23 9:32:40 来源:云帆数科 栏目:资讯中心
第四十九天学习心得
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层各司其职。明天也继续加油

相关推荐

Flutter音乐播放器App主框架设计与实现
Flutter音乐播放器App主框架设计与实现

1. 主框架设计与实现思路音乐播放器App的主框架是整个应用的基础架构,它决定了用户如何在不同功能模块间导航和交互。在Flutter中实现一个高效、流畅的主框架需要考虑以下几个关键点:1.1 导航模式选择音乐类App通常采用底部标签导航(Bottom N… · 2026/9/23 9:32:40

禁足手写实现:新手避坑指南,3个技巧解决项目卡死难题
禁足手写实现:新手避坑指南,3个技巧解决项目卡死难题

禁足手写实现:新手避坑指南,3个技巧解决项目卡死难题 看了一堆教程还是不会写项目?别急,这很正常。很多新手在写并发代码时,一遇到性能瓶颈就抓瞎,以为多写几个循环就能解决,结果把CPU干冒烟了。今天咱们就聊聊 禁足… · 2026/9/23 9:32:40

电动汽车HESS优化与MSSA算法实践指南
电动汽车HESS优化与MSSA算法实践指南

1. 电动汽车HESS优化与MSSA算法概述在电动汽车能量管理领域,混合能量存储系统(HESS)正成为提升整车性能的关键技术。作为一名长期从事电动汽车控制系统开发的工程师,我见证了HESS从实验室走向量产车的全过程。HESS通过整合超级电容… · 2026/9/23 9:32:34

TEN Framework 实战指南:从 Agent Examples 快速启动到 Docker 自托管部署实时多模态语音助手
TEN Framework 实战指南:从 Agent Examples 快速启动到 Docker 自托管部署实时多模态语音助手

TEN Framework 实战指南:从 Agent Examples 快速启动到 Docker 自托管部署实时多模态语音助手 【免费下载链接】ten-framework Open-source framework for conversational voice AI agents 项目地址: https://gitcode.com/TEN-framework/ten-framework 导读… · 2026/9/23 10:27:36

高级大数据应用工程师怎么考证?从报名学习到考试拿证,报考全攻略
高级大数据应用工程师怎么考证?从报名学习到考试拿证,报考全攻略

高级大数据应用工程师是网络安全与防护领域与大数据交叉的高级技术岗位。随着大数据技术在各行业广泛应用,高级大数据应用工程师需求持续增长。如果你正在考虑考取高级大数据应用工程师证书,本文将从报名学习到考试拿证,做一份完整的报考攻略… · 2026/9/23 10:27:30

3招搞定x23vivo环境,告别性能优化焦虑
3招搞定x23vivo环境,告别性能优化焦虑

3招搞定x23vivo环境,告别性能优化焦虑 配置环境就卡半天?别急,这不仅仅是手速问题,更是底层逻辑没理顺。很多同学在准备面试或搞项目时,盯着终端报错信息发呆,明明照着文档敲命令,结果还是卡在最后一步。这时候, 性能优化… · 2026/9/23 10:27:23

OpenClaw中级到高级教程:用TaoToken统一Key打通多模型配置链路
OpenClaw中级到高级教程:用TaoToken统一Key打通多模型配置链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 10:27:17

2026最新纸的拼音源码解析与面试避坑指南
2026最新纸的拼音源码解析与面试避坑指南

2026最新纸的拼音源码解析与面试避坑指南 面试被问原理答不上来,这大概是很多开发者最尴尬的时刻。尤其是当面试官盯着你,追问“纸的拼音”这种看似简单实则涉及底层编码逻辑的细节时,你往往只能支支吾吾。别慌,今天咱们就用 2026最新… · 2026/9/23 10:27:11

Apache Druid InfluxDB Emitter 扩展实战:将 Druid 服务指标实时写入 InfluxDB
Apache Druid InfluxDB Emitter 扩展实战:将 Druid 服务指标实时写入 InfluxDB

数据库OLAP大数据后端 【免费下载链接】druid Apache Druid: a high performance real-time analytics database. 项目地址: https://gitcode.com/gh_mirrors/druid6/druid 点击查看 免费下载 本篇技术指南以 Apache Druid 仓库中的社区扩展 druid-influxdb-emitte… · 2026/9/23 10:27:11

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码