框架学习07 - SpringMVC 其他功能实现
一. 拦截器实现HandlerInterceptor 接⼝
SpringMVC 中的 Interceptor 拦截器也是相当重要和相当有⽤的,它的主要作⽤是拦截⽤户的请求并进⾏相应的处理。⽐如通过它来进⾏权限验证,或者是来判断⽤户是否登陆等操作。对于 SpringMVC 拦截器的定义⽅式有两种:
实现接⼝:org.springframework.web.servlet.HandlerInterceptor
继承适配器:org.springframework.web.servlet.handler.HandlerInterceptorAdapter
1.拦截器实现HandlerInterceptor 接⼝
/**1. 2. 拦截器实现 HandlerInterceptor 接⼝ */public class MyInterceptor01 implements HandlerInterceptor {/**3. 在 ⽬标Handler(⽅法)执⾏前 执⾏ 4. 返回 true:执⾏handler⽅法5. 返回 false:阻⽌⽬标handler⽅法执⾏6. @param request7. @param response8. @param handler9. @return10. @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {System.out.println("⽬标Handler执⾏前执⾏MyInterceptor01 --> preHandle⽅法...");/**11. 返回 true:执⾏handler⽅法12. 返回 false:阻⽌⽬标handler⽅法执⾏*/return true;}/**13. 在 ⽬标Handler(⽅法)执⾏后,视图⽣成前 执⾏14. @param request15. @param response16. @param handler17. @param modelAndView18. @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {System.out.println("⽬标Handler执⾏后,视图⽣成前执⾏MyInterceptor01 -->
postHandle⽅法...");}/**19. 在 ⽬标Handler(⽅法)执⾏后,视图⽣成后 执⾏20. @param request21. @param response22. @param handler23. @param ex24. @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse
response, Object handler, Exception ex) throws Exception {
System.out.println("⽬标Handler执⾏后,视图⽣成后执⾏MyInterceptor01 -->
afterCompletion⽅法...");}}
2.拦截器xml配置
<mvc:interceptors><!-定义在 mvc:interceptor 下⾯,可以⾃定义需要拦截的请求如果有多个拦截器满⾜拦截处理的要求,则依据配置的先后顺序来执⾏--><mvc:interceptor><!-- 通过 mvc:mapping 配置需要拦截的资源。⽀持通配符。可配置多个。 --><mvc:mapping path="/**"/> <!-- "/**"表示拦截所有的请求。 --><!-- 通过 mvc:mapping 配置不需要被拦截的资源。⽀持通配符。可配置多个。 --><mvc:exclude-mapping path="/url/*"/> <!-- "/url/*"表示放⾏url路径下的请求。 --><bean class="com.xxxx.springmvc.interceptor.MyInterceptor01"/></mvc:interceptor></mvc:interceptors>
二.继承 HandlerInterceptorAdapter
实际上最终还是 HandlerInterceptor 接⼝实现。
- ⼦类实现类
/**1. 拦截器实现 2. 继承 HandlerInterceptorAdapter 适配器*/public class MyInterceptor02 extends HandlerInterceptorAdapter {/**3. 在 ⽬标Handler(⽅法)执⾏前 执⾏ 4. 返回 true:执⾏handler⽅法 5. 返回 false:阻⽌⽬标handler⽅法执⾏6. @param request7. @param response8. @param handler9. @return10. @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {System.out.println("⽬标Handler执⾏前执⾏MyInterceptor02 --> preHandle⽅法...");/**11. 返回 true:执⾏handler⽅法12. 返回 false:阻⽌⽬标handler⽅法执⾏*/return true;}}
- 拦截器xml配置
<mvc:interceptors><mvc:interceptor><!-- 拦截的资源 --><mvc:mapping path="/**"/><!-- 放⾏的资源 --><mvc:exclude-mapping path="/url/test01"/><mvc:exclude-mapping path="/url/test02"/><bean class="com.xxxx.springmvc.interceptor.MyInterceptor02"/></mvc:interceptor></mvc:interceptors>
- 多个拦截器实现
<mvc:interceptors><!-拦截器链(多个拦截器)如果有多个拦截器满⾜拦截处理的要求,则依据配置的先后顺序来执⾏先配置的拦截器的 preHandle ⽅法先执⾏先配置的拦截器的 postHandle、afterCompletion ⽅法后执⾏--><mvc:interceptor><!-- 拦截所有请求 --><mvc:mapping path="/**" /><bean class="com.xxxx.springmvc.interceptor.MyInterceptor01" /></mvc:interceptor><mvc:interceptor><!-- 拦截所有请求 -->
<mvc:mapping path="/**" /><bean class="com.xxxx.springmvc.interceptor.MyInterceptor02" /></mvc:interceptor></mvc:interceptors>
三. ⽂件上传
- pom.xml⽂件修改
<!-- 添加 commons-fileupload 依赖 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.2</version></dependency>
- servlet-context.xml修改
<!-- ⽂件上传 --><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 允许⽂件上传的最⼤尺⼨ --><property name="maxUploadSize"><value>104857600</value></property><!--
设置⽂件放⼊临时⽂件夹的最⼤⼤⼩限制。
此值是阈值,低于此值,则保存在内存中,如⾼于此值,则⽣成硬盘上的临时⽂件。--><property name="maxInMemorySize"><value>4096</value></property></bean>
四.RestFul URL
Restful ⻛格的 API 是⼀种软件架构⻛格,设计⻛格⽽不是标准,只是提供了⼀组设计原则和约束条件。它主要⽤于客户端和服务器交互类的软件。基于这个⻛格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
在Restful ⻛格中,⽤户请求的 url 使⽤同⼀个 url,⽤请求⽅式:get,post,delete,put…等⽅式对请求的处理⽅法进⾏区分,这样可以在前后台分离式的开发中使得前端开发⼈员不会对请求的资源地址产⽣混淆和⼤量的检查⽅法名的麻烦,形成⼀个统⼀的接⼝。
在 Restful ⻛格中,现有规定如下:
GET(SELECT):从服务器查询,可以在服务器通过请求的参数区分查询的⽅式。
POST(CREATE):在服务器端新建⼀个资源,调⽤ insert 操作。
PUT(UPDATE):在服务器端更新资源,调⽤ update 操作。
PATCH(UPDATE):在服务器端更新资源(客户端提供改变的属性)。(⽬前 jdk7 未实现,tomcat7 不⽀持)。
DELETE(DELETE):从服务器端删除资源,调⽤ delete 语句。
- Get 请求配置
/*** restful --> get 请求,执⾏查询操作
* @param id* @return*/@GetMapping("account/{id}")@ResponseBodypublic Account queryAccountById(@PathVariable Integer id){return accountService.selectById(id);}
- Delete 请求配置
/* restful-->delete 请求 执⾏删除操作* @param id* @return*/
@DeleteMapping("account/{id}")@ResponseBodypublic Map<String,Object> deleteAccount(@PathVariable Integer id){int result = accountService.delAccount(id);Map<String,Object> map=new HashMap<String,Object>();if(result == 1 ){
map.put("msg","success");map.put("code",200); }
else {map.put("msg","error");map.put("code",500);}return map;}
- Post 请求配置
/* restful --> post 请求,执⾏添加操作* @return*/@PostMapping("account")@ResponseBodypublic Map<String,Object> saveAccount(@RequestBody Account account){int result = accountService.saveAccount(account);Map<String,Object> map=new HashMap<String,Object>();if(result == 1 ){
map.put("msg","success");map.put("code",200); }
else {map.put("msg","error");map.put("code",500);}return map;}
- Put 请求配置
/* restful-->put 请求执⾏更新操作* @param id* @param account* @return*/@PutMapping("account")@ResponseBodypublic Map<String,Object> updateAccount(@RequestBody Account account){int result = accountService.updateAccount(account);Map<String,Object> map=new HashMap<String,Object>();if(result == 1 ){
map.put("msg","success");map.put("code",200); }
else {map.put("msg","error");map.put("code",500);}return map;}
五.全局异常统⼀处理
在 JavaEE 项⽬的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异常需要处理。每个过程都单独处理异常,系统的代码耦合度⾼,⼯作量⼤且不好统⼀,维护的⼯作量也很⼤。
SpringMVC 对于异常处理这块提供了⽀持,通过 SpringMVC 提供的全局异常处理机制,能够将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单⼀,也实现了异常信息的统⼀
处理和维护。
全局异常实现⽅式 Spring MVC 处理异常有 3 种⽅式:
- 使⽤ Spring MVC 提供的简单异常处理器 SimpleMappingExceptionResolver
- 实现 Spring 的异常处理接⼝ HandlerExceptionResolver ⾃定义⾃⼰的异常处理器
- 使⽤ @ExceptionHandler 注解实现异常处理
-
全局异常处理⽅式⼀
- 配置简单异常处理器
可以在处理异常的⻚⾯获取异常信息 使用 ${ex}<!-- 配置全局异常统⼀处理的 Bean (简单异常处理器) --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- ⻚⾯在转发时出现异常,设置默认的错误⻚⾯ (error代表的是⼀个视图) --><property name="defaultErrorView" value="error"></property><!-- 异常发⽣时,设置异常的变量名 --><property name="exceptionAttribute" value="ex"></property></bean>
- 使⽤⾃定义异常
使⽤ SimpleMappingExceptionResolver 进⾏异常处理,具有集成简单、有良好的扩展性、对已有代码没有⼊侵性等优点,但该⽅法仅能获取到异常信息,若在出现异常时,对需要获取除异常以外的数据的/*** ⾃定义异常:参数异常 */public class ParamsException extends RuntimeException {private Integer code = 300;private String msg = "参数异常!";public ParamsException() {super("参数异常!");}public ParamsException(String msg) {super(msg);this.msg = msg;}public ParamsException(Integer code) {super("参数异常!");this.code = code;}
情况不适⽤。
- 配置简单异常处理器
-
全局异常处理⽅式⼆(推荐)
-
实现 HandlerExceptionResolver 接⼝
/*** 全局异常统⼀处理 */@Componentpublic class GlobalExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception ex) {ModelAndView mv = new ModelAndView("error");mv.addObject("ex","默认错误信息");return mv;}}
-
⾃定义异常处理
/*** 全局异常统⼀处理 */@Componentpublic class GlobalExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception ex) {ModelAndView mv = new ModelAndView("error");mv.addObject("ex","默认错误信息");// 判断是否是⾃定义异常 if (ex instanceof ParamsException) {mv.setViewName("params_error");ParamsException e = (ParamsException) ex;mv.addObject("ex", e.getMsg());}if (ex instanceof BusinessException) {mv.setViewName("business_error");BusinessException e = (BusinessException) ex;mv.addObject("ex", e.getMsg());}return mv;}}
使⽤实现 HandlerExceptionResolver 接⼝的异常处理器进⾏异常处理,具有集成简单、有良好的扩展性、对已有代码没有⼊侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提供更详细的异常处理信息。
-
-
全局异常处理⽅式三
-
⻚⾯处理器继承 BaseController
public class BaseController {@ExceptionHandlerpublic String exc(HttpServletRequest request,HttpServletResponse response,Exception ex){request.setAttribute("ex", ex);if(ex instanceof ParamsException){return "error_param";}if(ex instanceof BusinessException){return "error_business";}return "error";}}
使⽤ @ExceptionHandler 注解实现异常处理,具有集成简单、有扩展性好(只需要将要异常处理的 Controller 类继承于 BaseController 即可)、不需要附加Spring 配置等优点,但该⽅法对已有代码存在⼊侵性(需要修改已有代码,使相关类继承于 BaseController),在异常处理时不能获取除异常以外的数据
-
-
未捕获异常的处理
对于 Unchecked Exception ⽽⾔,由于代码不强制捕获,往往被忽略,如果运⾏期产⽣了Unchecked Exception,⽽代码中⼜没有进⾏相应的捕获和处理,则我们可能不得不⾯对尴尬的 404、 500……等服务器内部错误提示⻚⾯。此时需要⼀个全⾯⽽有效的异常处理机制。⽬前⼤多数服务器也都⽀持在 web.xml 中通过(Websphere/Weblogic)或者(Tomcat)节点配置特定异常情况的显示⻚⾯。修改 web.xml ⽂件,增加以下内容:
<!-- 出错⻚⾯定义 --><error-page><exception-type>java.lang.Throwable</exception-type><location>/500.jsp</location></error-page><error-page><error-code>500</error-code><location>/500.jsp</location></error-page><error-page><error-code>404</error-code><location>/404.jsp</location></error-page>
相关文章:
框架学习07 - SpringMVC 其他功能实现
一. 拦截器实现HandlerInterceptor 接⼝ SpringMVC 中的 Interceptor 拦截器也是相当重要和相当有⽤的,它的主要作⽤是拦截⽤户的请求并进⾏相应的处理。⽐如通过它来进⾏权限验证,或者是来判断⽤户是否登陆等操作。对于 SpringMVC 拦截器的定义⽅式有两…...

NAT:连接私有与公共网络的关键技术(4/10)
一、NAT 的工作原理 NAT 技术的核心功能是将私有 IP 地址转换为公有 IP 地址,使得内部网络中的设备能够与外部互联网通信。其工作原理主要包括私有 IP 地址到公有 IP 地址的转换、端口号映射以及会话表维护这几个步骤。 私有 IP 地址到公有 IP 地址的转换࿱…...

RabbitMQ2:介绍、安装、快速入门、数据隔离
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...

衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录
1.创建新文件夹,用来存放SDK包(其实本质就是路径要对就ok了),右键鼠标通过Open Git Bash here来打开git 输入命令 git clone --depth1 https://gitee.com/lcsc/luban-lite.git 来拉取,如下所示:࿰…...

【Spring MVC】如何获取cookie/session以及响应@RestController的理解,Header的设置
前言 🌟🌟本期讲解关于SpringMVC的编程之参数传递~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 🎆那么废…...

C++设计模式行为模式———策略模式
文章目录 一、引言二、策略模式三、总结 一、引言 策略模式是一种行为设计模式, 它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。与模板方法模式类似,都是以扩展的方式来支持未来的变化。…...
Spring Cloud 中 bootstrap.yml 配置文件详解
Spring Cloud 中 bootstrap.yml 配置文件详解 1. 什么是 bootstrap.yml? bootstrap.yml 是 Spring Cloud 提供的一个特殊配置文件,主要用于初始化 Spring Cloud 应用程序的环境。与常见的 application.yml 不同,bootstrap.yml 在 Spring 应用…...

Java项目实战II基于SpringBoot前后端分离的网吧管理系统(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着互联网技术的不断发展…...
ASP网络安全讲述
一 前言 Microsoft Active Server Pages(ASP)是服务器端脚本编写环境,使用它可以创建和运行动态、交互的 Web 服务器应用程序。使用 ASP 可以组合 HTML 页 、脚本命令和 ActiveX 组件以创建交互的 Web 页和基于 Web 的功能强大的应用程序…...

DFS 创建分级菜单
菜单级别不确定,想要自适应,且可以折叠的菜单。 数据是一个数组。 <template><div class"Level" ref"Level"></div> </template>import {ref} from vue export default{data(){Level:ref(null),menuData…...

HDU Go Running(最小点覆盖 + 网络流优化)
题目大意:有一条无限长跑道,每个人可以规定自己跑步的方向,起点,跑步起止时间。每个人跑步的速度都是1m/s。最后从监控人员哪里得到了n个报告,每个报告给出了某人在某一时候所在的位置,问跑步的最少可能人数…...

C++设计模式-中介者模式
动机(Motivation) 多个对象相互关联的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。在这种情况下,可以使用一种”中介对象“来管理对象间的关联关系,避免…...
文件上传与下载服务 | Flask 实战
之前介绍了 droppy 文件共享服务的搭建。但在一些场景中,我们需要在命令行或在 Python 代码中,临时上传和下载文件。这时可以用一个更简单的策略:使用 flask 编写一个临时的 API。 服务端配置 以下是一个简单的 Flask 应用程序代码示例&…...
MySQL 中的排序:索引排序与文件排序
文章目录 MySQL 中的排序:索引排序与文件排序全解析一、引言二、索引排序(一)原理(二)示例 三、文件排序(一)单路排序(二)双路排序(三)归并排序 四…...
深入理解React Hooks:使用useState和useEffect
引言 React Hooks是React 16.8引入的一项强大功能,它使函数组件能够使用状态和其他React特性。本文将深入探讨两个最常用的Hooks:useState和useEffect,并通过实际代码示例展示它们的使用方法。 1. 什么是React Hooks? React Ho…...

AWS codebuild + jenkins + github 实践CI/CD
前文 本文使用 Jenkins 结合 CodeBuild, CodeDeploy 实现 Serverless 的 CI/CD 工作流,用于自动化发布已经部署 lambda 函数。 在 AWS 海外区,CI/CD 工作流可以用 codepipeline 这项产品来方便的实现, CICD 基本概念 持续集成( Continuous…...

Android PMS(Package Manager Service)源码介绍
文章目录 前言一、PMS 启动流程二、APK 安装流程三、APK 卸载流程四、权限管理静态权限动态权限 五、 数据存储与一致性六、 PMS 的安全性策略1、权限检查2、签名认证3、动态权限管理4、应用安装验证5、保护系统目录 七、PMS 调试方法总结 前言 PackageManagerService…...

运维面试整理总结
面试题可以参考:面试题总结 查看系统相关信息 查看系统登陆成功与失败记录 成功:last失败:lastb 查看二进制文件 hexdump查看进程端口或连接 netstat -nltp ss -nltp补充:pidof与lsof命令 pidof [进程名] #根据 进程名 查询进程id ls…...

图数据库 Cypher语言
图数据库 属性图 属性图(Property Graph)概述 属性图是一种广泛用于建模关系数据的图数据结构,它将**顶点(节点)和边(关系)**进行结构化存储,并为它们附加属性以提供丰富的语义信…...

阿里云oss转发上线-实现不出网钓鱼
本地实现阿里云oss转发上线,全部代码在文末,代码存在冗余 实战环境 被钓鱼机器不出网只可访问内部网络包含集团oss 实战思路 若将我们的shellcode文件上传到集团oss上仍无法上线,那么就利用oss做中转使用本地转发进行上线,先发送…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

【堆垛策略】设计方法
堆垛策略的设计是积木堆叠系统的核心,直接影响堆叠的稳定性、效率和容错能力。以下是分层次的堆垛策略设计方法,涵盖基础规则、优化算法和容错机制: 1. 基础堆垛规则 (1) 物理稳定性优先 重心原则: 大尺寸/重量积木在下…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...
CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14
什么是 Pattern Matching(模式匹配) ❝ 模式匹配就是一种“描述式”的写法,不需要你手动判断、提取数据,而是直接描述你希望的数据结构是什么样子,系统自动判断并提取。❞ 你给的定义拆解: ✴ Instead of …...