SpringMVC_day02

一、SSM 整合

核心步骤
  1. 依赖管理

    • 包含 SpringMVC、Spring JDBC、MyBatis、Druid 数据源、Jackson 等依赖。
    • 注意点:确保版本兼容性(如 Spring 5.x 与 MyBatis 3.5.x)。
  2. 配置类

    • SpringConfig:扫描 Service 层、启用事务管理、导入 JdbcConfig 和 MyBatisConfig。
    • JdbcConfig:配置 Druid 数据源和事务管理器。
    • MyBatisConfig:配置 SqlSessionFactory 和 Mapper 扫描。
    • SpringMvcConfig:扫描 Controller 层、开启注解驱动。
  3. Web 初始化

    • 通过AbstractAnnotationConfigDispatcherServletInitializer配置 DispatcherServlet 和字符编码过滤器。
查漏补缺
  • 事务管理:确保 Service 层方法添加@Transactional注解。
  • Mapper 接口代理:确认MapperScannerConfigurer扫描 Dao 层接口。
  • 静态资源放行:在SpringMvcConfig中配置addResourceHandlers

二、统一结果封装

实现要点
  1. Result 类:封装返回数据(data)、状态码(code)和消息(msg)。
  2. Code 类:定义统一状态码(如 20011 表示新增成功,20010 表示失败)。
  3. Controller 调整:所有接口返回Result对象,根据业务逻辑设置状态码。
查漏补缺
  • 异常处理:确保所有业务逻辑分支都返回 Result(如查询结果为空时返回 GET_ERR)。
  • 状态码规范:建议将状态码按业务模块划分(如 200xx 为业务操作,500xx 为系统错误)。

三、统一异常处理

实现步骤
  1. 自定义异常类

    • BusinessException:用户行为导致的异常(如参数错误)。
    • SystemException:系统层面的异常(如数据库连接失败)。
  2. 全局异常处理器

    • 使用@RestControllerAdvice@ExceptionHandler捕获异常并返回统一 Result。
查漏补缺
  • 异常日志:在异常处理器中添加日志记录(如使用SLF4J)。
  • 敏感信息处理:避免将堆栈信息直接返回给前端。
  • 异常包装:在 Service 层捕获原始异常并包装为自定义异常。

四、前后台联调

前端实现
  1. 异步请求:使用 Axios 发送 POST/PUT/DELETE 请求,处理 JSON 响应。
  2. 页面交互:通过 ElementUI 组件实现模态框、表单验证和数据展示。
查漏补缺
  • 表单重置:新增 / 修改操作后清空表单数据。
  • 错误提示:根据后端返回的 msg 字段展示具体错误信息。
  • 数据刷新:操作完成后重新加载列表数据。

五、拦截器

核心功能
  1. 预处理:在preHandle中进行权限校验、参数校验等。
  2. 后处理:在postHandle中修改响应内容(如添加响应头)。
  3. 资源清理:在afterCompletion中释放资源。
配置要点
  • 拦截路径:使用addPathPatternsexcludePathPatterns控制拦截范围。
  • 拦截器链:多个拦截器按配置顺序执行,preHandle返回 false 会中断后续流程。
查漏补缺
  • 静态资源放行:确保拦截器不拦截 CSS/JS 等静态资源。
  • 性能监控:在拦截器中统计请求耗时并记录日志。

六、常见问题与优化

  1. 中文乱码:确认字符编码过滤器配置正确(CharacterEncodingFilter)。
  2. JSON 转换:确保 Jackson 依赖正确引入,使用@RequestBody@ResponseBody
  3. 事务传播:理解@Transactional的传播行为(如REQUIREDREQUIRES_NEW)。
  4. 单元测试:使用@RunWith(SpringJUnit4ClassRunner)@ContextConfiguration测试 Service 层。

七、总结

SSM 整合需关注配置类的正确性,统一结果和异常处理提升接口规范性,拦截器增强系统功能。实际开发中需结合日志、缓存等优化系统性能,并通过 Swagger 等工具完善接口文档。

过滤器(Filter)

1. 概念

过滤器是 Java Servlet 规范中的一部分,它可以在请求到达 Servlet 之前对请求进行预处理,也可以在响应返回客户端之前对响应进行后处理。过滤器可以拦截所有的请求,包括静态资源(如图片、CSS、JavaScript 等)。

2. 工作原理

过滤器的工作原理基于 Java 的 Servlet 规范,当客户端发送请求时,请求会先经过过滤器链,过滤器链中的每个过滤器可以对请求进行处理,处理完成后再将请求传递给下一个过滤器或者 Servlet。响应返回时,也会按照相反的顺序经过过滤器链。

3. 实现步骤
  • 创建过滤器类:实现javax.servlet.Filter接口,并重写initdoFilterdestroy方法。
  • 配置过滤器:在web.xml文件中配置过滤器,或者使用注解进行配置。
4. 示例代码

以下是一个简单的字符编码过滤器示例:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;// 使用注解配置过滤器,拦截所有请求
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {private String encoding;@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 从过滤器配置中获取字符编码encoding = filterConfig.getInitParameter("encoding");if (encoding == null) {encoding = "UTF-8";}}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 设置请求和响应的字符编码request.setCharacterEncoding(encoding);response.setCharacterEncoding(encoding);// 将请求传递给下一个过滤器或Servletchain.doFilter(request, response);}@Overridepublic void destroy() {// 过滤器销毁时的操作}
}
5. web.xml配置方式

如果不使用注解,也可以在web.xml中进行配置:

<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>com.example.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

拦截器(Interceptor)

1. 概念

拦截器是 Spring MVC 框架中的一个组件,它可以在请求处理的前后进行一些额外的处理,如权限验证、日志记录等。拦截器只能拦截 Spring MVC 处理的请求,不能拦截静态资源。

2. 工作原理

拦截器基于 Spring 的 AOP(面向切面编程)思想,通过实现HandlerInterceptor接口来定义拦截器逻辑。当请求到达 Spring MVC 的控制器时,会先经过拦截器链,拦截器可以对请求进行预处理、后处理和完成处理。

3. 实现步骤
  • 创建拦截器类:实现org.springframework.web.servlet.HandlerInterceptor接口,并重写preHandlepostHandleafterCompletion方法。
  • 配置拦截器:在 Spring MVC 的配置文件中配置拦截器。
4. 示例代码

以下是一个简单的权限验证拦截器示例:

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class AuthInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {// 在请求处理之前进行权限验证Object user = request.getSession().getAttribute("user");if (user == null) {// 未登录,重定向到登录页面response.sendRedirect(request.getContextPath() + "/login");return false;}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// 在请求处理之后,视图渲染之前执行}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) throws Exception {// 在请求处理完成后执行,通常用于资源清理等操作}
}
5. Spring MVC 配置拦截器
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 注册拦截器registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/**") // 拦截所有请求.excludePathPatterns("/login", "/register"); // 排除登录和注册请求}
}

过滤器和拦截器的比较

1. 拦截范围
  • 过滤器:可以拦截所有请求,包括静态资源。
  • 拦截器:只能拦截 Spring MVC 处理的请求,不能拦截静态资源。
2. 实现机制
  • 过滤器:基于 Java Servlet 规范,是 Servlet 容器的一部分。
  • 拦截器:基于 Spring 的 AOP 思想,是 Spring MVC 框架的一部分。
3. 执行顺序
  • 过滤器在请求到达 Servlet 之前执行,拦截器在请求到达 Spring MVC 的控制器之前执行。
  • 过滤器的doFilter方法执行顺序在拦截器的preHandle方法之前。
4. 使用场景
  • 过滤器:主要用于请求和响应的预处理和后处理,如字符编码处理、日志记录、权限验证等。
  • 拦截器:主要用于 Spring MVC 的请求处理前后的额外处理,如权限验证、日志记录、性能监控等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41447.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 ADMM算法 4.2 最大似然ML检测算法 4.3 最小均方误差&#xff08;MMSE&#xff09;检测算法 4.4 迫零&#xff08;ZF&#xff09;检测算法 4.5 OCD_MMSE 检测算法 4.6 LAMA检测算法 …

CSS动画

目录 一、核心概念与语法 1. keyframes 关键帧 2. animation 属性 二、动画调速函数&#xff08;animation-timing-function&#xff09; 1. 预设值 2. 贝塞尔曲线 3. 步进函数&#xff08;steps()&#xff09; 三、动画控制与交互 1. 暂停与恢复 2. JavaScript 控制…

架构思维:预约抢茅子架构设计

文章目录 案例&#xff1a;预约抢茅子复杂度分析商品预约阶段等待抢购阶段商品抢购阶段订单支付阶段 技术方案商品预约阶段一、基于 Redis 单节点的分布式锁方案1. 核心流程2. 关键设计点 二、Redis 单节点方案的局限性1. 单点故障风险2. 主从切换问题 三、多节点 Redis 实现高…

PHP大马的使用

BestShell/best_php_shell.php at master Kevil-hui/BestShell 这里用到的是这位师傅的大马&#xff08;主要是从头开始写一个大马实在太麻烦了&#xff09; 用pikachu靶场进行上传的测试 在这里传马&#xff0c;这个是简单的前端校验&#xff0c;bp抓包改后缀就好了 上传成…

HCI 清除 SCP纳管残留信息

项目场景&#xff1a; 一台测试HCI主机&#xff0c;之前有连接了SCP&#xff0c;由于环境变更&#xff0c;无法与SCP连通&#xff0c;HCI残留了SCP纳管信息 问题描述 集群管理中没有脱离SCP的选项 点击vmware 虚拟机 显示被接管 云安全中心也显示被接管 原因分析&#xff1a; …

【算法day22】两数相除——给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

29. 两数相除 给你两个整数&#xff0c;被除数 dividend 和除数 divisor。将两数相除&#xff0c;要求 不使用 乘法、除法和取余运算。 整数除法应该向零截断&#xff0c;也就是截去&#xff08;truncate&#xff09;其小数部分。例如&#xff0c;8.345 将被截断为 8 &#x…

顺序表(C语言源码详解,附加测试代码)

目录 顺序表的基本实现 顺序表结构 顺序表的初始化 检查顺序表容量空间 顺序表的头插 顺序表的打印 顺序表的头删 顺序表的尾插 顺序表的尾删 顺序表的查找 ​编辑指定位置之前插入数据 指定位置删除数据 顺序表的销毁 顺序表的基本实现 顺序表结构 对顺序表的数…

draw.io费的思维导图软件、支持ProcessOn无水印导出。

draw.io的官方网址是 https://www.drawio.com/ 通过官方下载&#xff0c;本文只是安装及使用教程。 一、从别的思维导图软件导出并导入到Draw.io&#xff0c;&#xff08;ProcessOn为例&#xff09; 选择要付费下载流程图&#xff0c;并以ViSio格式导出&#xff08;后缀名…

springboot启动事件CommandLineRunner使用

什么是CommandRunner CommandRunner是springboot启动完成时会调用的一个runner 启动参数会传递到这个runner 我们能用来做一些初始化工作和缓存预热等工作 ApplicationRunner VS CommandRunner? 这两个Runner作用一样 只是得到的启动参数格式不一样 前者是一个Argument对象…

能源革命新突破:虚拟电厂赋能微电网智能调控,构建低碳生态新格局

在“双碳”目标的引领下&#xff0c;中央一号文件明确提出了“推进农村能源革命&#xff0c;深化绿色低碳技术应用”。作为能耗集中区域&#xff0c;产业园区如何实现清洁能源高效消纳与碳减排的目标成为了难题&#xff0c;中电国为推出的虚拟电厂与风光储充柴多能互补的微电网…

LabVIEW FPGA与Windows平台数据滤波处理对比

LabVIEW在FPGA和Windows平台均可实现数据滤波处理&#xff0c;但两者的底层架构、资源限制、实时性及应用场景差异显著。FPGA侧重硬件级并行处理&#xff0c;适用于高实时性场景&#xff1b;Windows依赖软件算法&#xff0c;适合复杂数据处理与可视化。本文结合具体案例&#x…

智慧高速,安全护航:视频监控平台助力高速公路高效运营

随着我国高速公路里程的不断增长&#xff0c;交通安全和运营效率面临着前所未有的挑战。传统的监控方式已难以满足现代化高速公路管理的需求&#xff0c;而监控视频平台的出现&#xff0c;则为高速公路的安全运营提供了强有力的技术支撑。高速公路视频监控联网解决方案 高速公路…

聚焦能源数字化转型,遨游通讯携智能化防爆手机亮相cippe2025

2025年3月26日&#xff0c;第二十五届中国国际石油石化技术装备展览会在北京中国国际展览中心&#xff08;新馆&#xff09;盛大开幕。作为全球石油石化行业的年度盛会&#xff0c;cippe2025北京石油展汇聚了来自全球75个国家和地区的近2000家企业&#xff0c;共同展示最新的石…

【银河麒麟系统常识】需求:安装.NET SDK

前提 网络状态正常(非离线安装)&#xff1b; 终端命令如下所示 根据不同系统的版本&#xff0c;自行选择&#xff0c;逐行执行即可&#xff1b; # 基于 Ubuntu/Debian 的银河麒麟系统 wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O…

K8S学习之基础五十:k8s中pod时区问题并通过kibana查看日志

k8s中pod默认时区不是中国的&#xff0c;挂载一个时区可以解决 vi pod.yaml apiVersion: v1 kind: Pod metadata:name: counter spec:containers:- name: countimage: 172.16.80.140/busybox/busybox:latestimagePullPolicy: IfNotPresentargs: [/bin/sh,-c,i0;while true;do …

创新前沿 | 接管主机即刻增量CDP备份,高效保障接管期间业务安全!

科力锐创新前沿系列 接管主机增量CDP备份 高效保障接管业务安全 当核心系统遭遇系统故障或误操作导致数据逻辑损毁等&#xff0c;往往需要将生产业务主机接管起来&#xff0c;继续对外提供服务&#xff0c;保障业务连续性。 然而&#xff0c;你的接管主机真的安全吗?一旦接…

Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现

一、前言 在移动互联网蓬勃发展的今天&#xff0c;视频播放功能已成为众多Android应用的核心特性之一。面对多样化的视频格式和传输协议&#xff0c;开发一款高效、稳定的视频播放器是许多开发者追求的目标。FLV&#xff08;Flash Video&#xff09;格式&#xff0c;尽管随着H…

STL之list

1. list的介绍和使用 1.1 list的介绍 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是带头双向循环链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其…

26考研——查找_树形查找_二叉排序树(BST)(7)

408答疑 文章目录 三、树形查找二叉排序树&#xff08;BST&#xff09;二叉排序树中结点值之间的关系二叉树形查找二叉排序树的查找过程示例 向二叉排序树中插入结点插入过程示例 构造二叉排序树的过程构造示例 二叉排序树中删除结点的操作情况一&#xff1a;被删除结点是叶结点…