SpringMVC_day02

news/2025/4/1 18:36:26/

一、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.ppmy.cn/news/1583608.html

相关文章

Oracle数据库服务器地址变更与监听配置修改完整指南

一、前言 在企业IT运维中&#xff0c;Oracle数据库服务器地址变更是常见的运维操作。本文将详细介绍如何安全、高效地完成Oracle数据库服务器地址变更及相关的监听配置修改工作&#xff0c;确保数据库服务在迁移后能够正常运行。 二、准备工作 1. 环境检查 确认新旧服务器I…

基于javaweb的SSM+Maven电脑公司财务管理系统设计与实现(源码+文档+部署讲解)

​ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、…

vue 封装 Axios菜鸟教程

1、Axios依赖下载 $ npm install axios 2、以下链接为Axios 的api Axios 实例 | Axios中文文档 | Axios中文网 3、 项目新建request.js&#xff0c;文件名称按照驼峰命名法就可以 4、封装request.js代码如下 import axios from "axios"//创建axios实例&#xff0…

QOpenGLWidget视频画面上绘制矩形框

一、QPainter绘制 在QOpenGLWidget中可以绘制,并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后,解锁资源,再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bind();//绘制视频数据// 解绑VAOg…

windows下面nginx配置及测试

1&#xff09;下载解压 目录是&#xff1a;E:\tools\nginx-1.26.3 2&#xff09;在E:\tools\nginx-1.26.3下面建目录website 放置index2.html 内容如下 &#xff1a; <!DOCTYPE html> <html> <head><title>My Personal Website</title> &…

PDF处理控件Aspose.PDF教程:通过C#、Java 和 Python删除 PDF中的水印

Aspose.PDF 是一个功能强大的库&#xff0c;旨在以编程方式处理 PDF 文档&#xff0c;提供创建、编辑、转换和操作的广泛功能。它支持 C#、Java 和 Python 等多种编程语言&#xff0c;使开发人员能够精确高效地自动处理 PDF。 对于开发人员来说&#xff0c;由于自动化和定制化…

架构思维:如何设计一个支持海量数据存储的高扩展性架构_数据分片、存储、复制与一致性的原理性问题

文章目录 PRE引言1. 数据分片策略Hash取模分片一致性Hash分片Range分片分片设计原理核心设计模块分片规则定义动态分片调整路由与负载均衡 应对热点的关键技术多级分片&#xff08;Hierarchical Sharding&#xff09;副本分散策略缓存层配合 典型应用场景优缺点分析 2. 应对热点…

Servlet、HttpServletRequest、HttpServletResponse、静态与动态网页、jsp、重定向与转发

DAY15.2 Java核心基础 JavaWeb 要想通过浏览器或者客户端来访问java程序&#xff0c;必须通过Servlet来处理 没有Servlet&#xff0c;java是无法处理web请求的 Web交互&#xff1a; 接收请求HttpServletRequest&#xff1a;可以获取到请求的信息&#xff0c;比如uri&#…