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.pswp.cn/news/899181.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899181.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899181.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android14 原生PackageInstaller安裝某些apk報錯問題

最近遇到Android14安裝客戶一個大型app的時候&#xff0c;執行到開始安裝的時候就直接閃退了&#xff0c;查看log發現下面報錯&#xff1a; 03-25 18:01:29.531 3085 3085 E AndroidRuntime: java.lang.RuntimeException: Could not copy bitmap to parcel blob. 03-25 18:01:2…

SQLAlchemy關鍵詞搜索技術深度解析:從基礎過濾到全文檢索

在數據驅動的應用開發中&#xff0c;基于關鍵詞的模糊查詢是常見的業務需求。SQLAlchemy作為Python生態中最流行的ORM框架&#xff0c;提供了多種實現關鍵詞搜索的技術方案。本文將從性能、適用場景和技術復雜度三個維度&#xff0c;系統對比分析SQLAlchemy中關鍵詞搜索的最佳實…

基于 ffmpeg 實現合并視頻

ffmpeg是一個強大的多媒體處理工具&#xff0c;支持視頻文件的合并。 列出目錄下所有MP4文件 import os import glob# 當前目錄 directory os.getcwd() directory "/directory/to/mp4/*"# 列出目錄下所有MP4文件 files glob.glob(directory)# 排序 files.sort(…

算法每日一練 (20)

&#x1f4a2;歡迎來到張翊塵的技術站 &#x1f4a5;技術如江河&#xff0c;匯聚眾志成。代碼似星辰&#xff0c;照亮行征程。開源精神長&#xff0c;傳承永不忘。攜手共前行&#xff0c;未來更輝煌&#x1f4a5; 文章目錄 算法每日一練 (20)不同路徑 II題目描述解題思路解題代…

【銀河麒麟系統常識】命令:uname -m(查看系統架構)

命令&#xff1a; uname -m 功能 常用的 Linux/Unix 終端命令&#xff0c;用于顯示當前系統的硬件架構&#xff1b; 返回 返回系統的CPU架構類型&#xff0c;用于判斷軟件兼容性&#xff1b; 輸出結果架構說明常見設備x86_64Intel/AMD 64位 CPU主流 PC、服務器aarch64ARM 64位 …

sql結尾加刷題

找了一下mysql對extractvalue()、updatexml()函數的官方介紹https://dev.mysql.com/doc/refman/5.7/en/xml-functions.html#function_extractvalue ExtractValue(xml_frag, xpath_expr) 知識點 解釋一下這兩個參數xml_frag&#xff0c;是xml標記片段&#xff0c;第二個參數…

JVM類加載過程詳解

文章目錄 前言1.加載2.鏈接驗證文件格式驗證元數據驗證字節碼驗證符號引用驗證 準備解析 3.初始化4.類卸載 前言 類從被加載到虛擬機內存中開始到卸載出內存為止&#xff0c;它的整個生命周期可以簡單概括為 7 個階段&#xff1a;加載&#xff08;Loading&#xff09;、驗證&a…

el-select 可搜索下拉框 在ios、ipad 無法喚出鍵盤,造成無法輸入

下一篇&#xff1a;el-select 可搜索下拉框&#xff0c;選中選項后&#xff0c;希望立即失去焦點&#xff0c;收起鍵盤&#xff0c;執行其他邏輯 【效果圖】&#xff1a;分組展示選項 >【去界面操作體驗】 首先&#xff0c;通過 夸克瀏覽器的搜索: el-select 在 ipad 輸入框…

前端框架的定制化:滿足項目獨特需求

hello寶子們...我們是艾斯視覺擅長ui設計和前端數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩! 在數字化轉型浪潮中&#xff0c;前端技術體系已成為企業構建數字競爭力的核心戰場。當標準化前端框架…

Flutter網絡請求封裝:高效、靈活、易用的Dio工具類

在Flutter開發中&#xff0c;網絡請求是必不可少的功能。為了簡化代碼、提高開發效率&#xff0c;我們通常會封裝一個網絡請求工具類。本文基于Dio庫&#xff0c;詳細介紹如何封裝一個高效、靈活、易用的網絡請求工具類&#xff0c;支持以下功能&#xff1a; 單例模式&#xf…

MyBatis-Plus(SpringBoot版)學習第一講:簡介入門案例

目錄 1. MyBatis-Plus簡介 1.1 簡介 1.2 特性 1.3 支持的數據庫 1.4 框架結構 1.5 代碼及文檔地址 2. 入門案例 2.1 開發環境 2.2 創建數據庫及表 1. 創建表 2. 添加數據 2.3 創建SpringBoot工程 1. 初始化工程 2. 引入依賴 3. IDEA中安裝lombok插件 ?編輯 2.4 編…

k8s高可用集群安裝

一、安裝負載均衡器 k8s負載均衡器 官方指南 1、準備三臺機器 節點名稱IPmaster-1192.168.1.11master-2192.168.1.12master-3192.168.1.13 2、在這三臺機器分別安裝haproxy和keepalived作為負載均衡器 # 安裝haproxy sudo dnf install haproxy -y# 安裝Keepalived sudo yum …

【PPO】小白的強化學習算法筆記

參考視頻 零基礎學習強化學習算法&#xff1a;ppo 基礎概念 environment環境agent&#xff1a;智能體&#xff0c;玩游戲的你state&#xff1a;當前狀態&#xff0c;observation看到的部分&#xff0c;有的游戲只能看見state的一部分action&#xff1a;agent做出的動作reward…

Flink介紹與安裝

Apache Flink是一個在有界數據流和無界數據流上進行有狀態計算分布式處理引擎和框架。Flink 設計旨在所有常見的集群環境中運行&#xff0c;以任意規模和內存級速度執行計算。 一、主要特點和功能 1. 實時流處理: 低延遲: Flink 能夠以亞秒級的延遲處理數據流&#xff0c;非常…

深入解析 JVM 內存區域及核心概念

深入解析 JVM 內存區域及核心概念 Java 虛擬機&#xff08;JVM&#xff09;內部劃分了多個內存區域&#xff0c;每個區域存儲不同類型的數據并承擔不同的職責。本文將詳細介紹以下內容&#xff1a; 程序計數器&#xff1a;記錄當前線程正在執行的字節碼指令及其“行號”信息&a…

Java操作RabbitMQ

文章目錄 Spring集成RabbitMQ1. AMQP&SpringAMQP2. SpringBoot集成RabbitMQ3. 模型work模型 4.交換機Fanout交換機Direct交換機Topic交換機 5.聲明式隊列和交換機基于API聲明基于注解聲明 6.消息轉換器 Spring集成RabbitMQ 1. AMQP&SpringAMQP AMQP&#xff08;高級消…

Kotlin泛型: 協變|逆變|不變

引言 無論java 通配符上限還是下限&#xff0c;都多少存在缺陷&#xff0c;要么存不安全&#xff0c;要么取不安全。而kotlin就解決這個問題。讓out 純輸出&#xff0c; 讓in純輸入。 java這塊知識&#xff1a; java泛型的協變、逆變和不變-CSDN博客 協變 生產者out T 協變…

【Excel使用技巧】某列保留固定字段或內容

目錄 ? 方法一&#xff1a;使用 Excel 公式提取 body 部分 &#x1f50d; 解釋&#xff1a; ? 方法二&#xff1a;批量處理整列數據 &#x1f6a8; 注意事項 &#x1f6a8; 處理效果 我想保留Excel某一列的固定內容&#xff0c;比如原內容是&#xff1a; thread entry i…

C# System.Text.Encoding 使用詳解

總目錄 前言 在C#編程中&#xff0c;處理字符串和字節數組之間的轉換是一個常見的任務。System.Text.Encoding類及其派生類提供了豐富的功能&#xff0c;幫助開發者實現不同字符編碼之間的轉換。本文將詳細講解System.Text.Encoding類的使用方法&#xff0c;包括常用編碼的介紹…

Pre-flash和Main flash

在相機拍照過程中&#xff0c;Pre-flash&#xff08;預閃光&#xff09; 和 Main flash&#xff08;主閃光&#xff09; 是常見的兩種閃光燈使用模式&#xff0c;通常用于提高低光環境下的拍攝質量&#xff0c;尤其在自動曝光&#xff08;AE&#xff09;和自動對焦&#xff08;…