新闻详情

新闻详情

首页 / 资讯中心 / 详情

SpringMVC_03_进阶功能

发布时间:2026/9/28 21:01:32来源:尧图网络
SpringMVC_03_进阶功能
【Spring MVC】进阶功能拦截器、文件上传与全局异常处理关键词Java、Spring MVC、拦截器、HandlerInterceptor、文件上传、全局异常处理、ControllerAdvice一、拦截器HandlerInterceptor1.1 什么是拦截器拦截器用于在请求到达 Controller之前和之后执行预处理或后处理逻辑。常见场景登录验证、权限检查、日志记录、请求耗时统计。1.2 拦截器生命周期请求进入 ↓ preHandle() ──→ 返回 false请求终止 ↓ (返回 true) Controller 方法执行 ↓ postHandle() ──→ 可以修改 ModelAndView ↓ 视图渲染 ↓ afterCompletion() ──→ 最终回调可获取异常信息1.3 代码示例登录验证拦截器publicclassLoginInterceptorimplementsHandlerInterceptor{OverridepublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{Objectuserrequest.getSession().getAttribute(loginUser);if(usernull){response.sendRedirect(/login);returnfalse;// 拦截}returntrue;// 放行}OverridepublicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex){if(ex!null){System.out.println(请求异常ex.getMessage());}}}1.4 注册拦截器ConfigurationpublicclassWebMvcConfigimplementsWebMvcConfigurer{OverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry.addInterceptor(newLoginInterceptor()).addPathPatterns(/**)// 拦截所有.excludePathPatterns(/login,/register,/static/**);}}1.5 拦截器 vs Filter对比项拦截器Interceptor过滤器Filter规范Spring MVC 提供Servlet 规范作用范围只拦截 Controller 请求拦截所有请求含静态资源使用依赖依赖 Spring 容器不依赖 Spring粒度可获取 Handler 信息无法获取 Controller 信息二、文件上传2.1 Controller 处理ControllerpublicclassFileController{PostMapping(/upload)publicStringupload(RequestParam(file)MultipartFilefile,HttpServletRequestrequest)throwsIOException{if(file.isEmpty()){return上传失败文件为空;}StringfileNamefile.getOriginalFilename();StringuploadDirrequest.getServletContext().getRealPath(/uploads/);FiledirnewFile(uploadDir);if(!dir.exists()){dir.mkdirs();}file.transferTo(newFile(dir,fileName));return上传成功fileName;}// 多文件上传PostMapping(/uploadBatch)publicStringuploadBatch(RequestParam(files)MultipartFile[]files){for(MultipartFilefile:files){if(!file.isEmpty()){// 处理每个文件}}return批量上传成功;}}配置Spring Boot 内嵌 Tomcat 默认支持文件上传只需在 yml 中限制大小spring:servlet:multipart:max-file-size:10MBmax-request-size:50MB三、文件下载GetMapping(/download)publicResponseEntitybyte[]download(StringfileName)throwsIOException{StringfilePath/uploads/fileName;byte[]bytesnewFileInputStream(filePath).readAllBytes();HttpHeadersheadersnewHttpHeaders();headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);headers.setContentDispositionFormData(attachment,URLEncoder.encode(fileName,UTF-8));returnnewResponseEntity(bytes,headers,HttpStatus.OK);}四、全局异常处理4.1 为什么要全局异常处理避免每个 Controller 方法都写 try-catch统一异常返回格式区分业务异常和系统异常4.2 ControllerAdvice ExceptionHandlerRestControllerAdvicepublicclassGlobalExceptionHandler{ExceptionHandler(BusinessException.class)publicResulthandleBusinessException(BusinessExceptione){returnResult.error(e.getCode(),e.getMessage());}ExceptionHandler(MethodArgumentNotValidException.class)publicResulthandleValidException(MethodArgumentNotValidExceptione){Stringmessagee.getBindingResult().getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.joining(, ));returnResult.error(400,message);}ExceptionHandler(Exception.class)publicResulthandleException(Exceptione){e.printStackTrace();returnResult.error(500,服务器内部错误);}}4.3 自定义业务异常publicclassBusinessExceptionextendsRuntimeException{privateintcode;publicBusinessException(intcode,Stringmessage){super(message);this.codecode;}publicintgetCode(){returncode;}}// 使用ServicepublicclassUserService{publicUserfindById(Longid){UseruseruserMapper.selectById(id);if(usernull){thrownewBusinessException(404,用户不存在);}returnuser;}}4.4 ExceptionHandler 优先级优先级说明1精确匹配ExceptionHandler(BusinessException.class)2父类匹配ExceptionHandler(RuntimeException.class)3兜底匹配ExceptionHandler(Exception.class)五、SSM 整合配置总结配置文件职责web.xml配置 DispatcherServlet、ContextLoaderListenerspring-context.xmlService、DAO、事务、数据源spring-mvc.xmlController 扫描、视图解析器、拦截器mybatis-config.xmlMyBatis 配置、Mapper 扫描整合要点Spring 管理 Service/DAOSpring MVC 管理 Controller两个容器通过ContextLoaderListener建立父子关系。六、面试高频问题Q1Spring MVC 拦截器的执行顺序答preHandleController 前→ Controller 方法 → postHandleController 后、视图前→ 视图渲染 → afterCompletion最后执行。如果 preHandle 返回 false后续方法不执行但 afterCompletion 仍会执行。Q2ControllerAdvice 的作用答全局增强注解配合 ExceptionHandler全局异常处理、InitBinder参数绑定、ModelAttribute全局模型数据使用。配合 ResponseBody 变成 RestControllerAdvice直接返回 JSON。Q3Spring MVC 如何处理文件上传答通过 MultipartResolver 解析 multipart 请求。Spring 提供 CommonsMultipartResolver基于 commons-fileupload和 StandardServletMultipartResolver基于 Servlet 3.0。Controller 中用 MultipartFile 接收文件调用 transferTo() 保存。七、总结功能核心类/注解要点拦截器HandlerInterceptorpreHandle / postHandle / afterCompletion文件上传MultipartFile配置 multipart transferTo 保存文件下载ResponseEntity设置 Content-Disposition全局异常ControllerAdvice ExceptionHandler统一异常处理避免重复代码
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

AI批量重写存量代码:GitHub三周128个PR的工程实践拆解 2026/9/28 21:53:55

AI批量重写存量代码:GitHub三周128个PR的工程实践拆解

1. 一个反直觉的工程选择:让 AI 修改自己的源码先说一个可能和多数人直觉相悖的事实:GitHub 这个承载了全球数亿个代码仓库的平台,其自身的代码库也面临着所有老系统都会遇到的麻烦——技术债堆叠、依赖版本过于陈旧、核心服务之间的耦合越来…

阅读更多 →
辉芒微FT62F28X烧录与调试避坑指南 2026/9/28 21:53:49

辉芒微FT62F28X烧录与调试避坑指南

1. 项目概述:为什么辉芒微FT62F28X的烧录与调试值得专门拆解FMD IDE、辉芒微、FT62F28X、烧录、调试——这五个词组合在一起,不是泛泛而谈的“单片机开发入门”,而是指向一个非常具体、非常真实、也相当容易踩坑的工程现场:一款国…

阅读更多 →
AI自主提交128个PR重构83万行代码的工程方法论 2026/9/28 21:53:49

AI自主提交128个PR重构83万行代码的工程方法论

前几天看到 GitHub 那波"AI 自己给自己提交了128个PR、改了83万行代码"的消息时,我第一反应是:又来了个噱头。但把三周时间线、PR列表和自动化验证的细节翻了一遍之后,我发现真正值得聊的其实不是"AI 重写自己"这个标题&…

阅读更多 →
Superpowers实战:给Codex与Claude Code装上结构化技能库 2026/9/28 21:53:49

Superpowers实战:给Codex与Claude Code装上结构化技能库

最近一段时间我几乎逢人就推荐一个东西:给手头的 Codex(或者 Claude Code,看你习惯用哪个)装上 superpowers。你第一次听到这个名字可能会觉得夸张,但它解决的事情非常具体——默认状态下,AI 编码代理更像一…

阅读更多 →
STM32串口调试5分钟闭环:USB转TTL驱动与硬件连接全指南 2026/9/28 21:52:54

STM32串口调试5分钟闭环:USB转TTL驱动与硬件连接全指南

1. 为什么“5分钟搞定”不是口号,而是可复现的操作节奏STM32串口通信,是每个嵌入式新手跨出开发板点亮LED后的第一道真实门槛。它不像GPIO那样只写寄存器就能看到结果,而是一条需要两端协同、软硬咬合、信号精准对齐的“数据通道”。你手里的…

阅读更多 →
校园POS消费数据清洗与行为建模实战指南 2026/9/28 21:52:54

校园POS消费数据清洗与行为建模实战指南

简介:本资源是一份面向本科生与Python初学者的校园消费行为分析实战项目,适用于毕业设计、期末大作业及课程设计场景,聚焦学生群体消费偏好、时段规律与食堂就餐结构等现实问题,助力掌握从数据清洗到建模可视化的完整分析链路。压…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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