一、SSM 整合
核心步驟
-
依賴管理
- 包含 SpringMVC、Spring JDBC、MyBatis、Druid 數據源、Jackson 等依賴。
- 注意點:確保版本兼容性(如 Spring 5.x 與 MyBatis 3.5.x)。
-
配置類
- SpringConfig:掃描 Service 層、啟用事務管理、導入 JdbcConfig 和 MyBatisConfig。
- JdbcConfig:配置 Druid 數據源和事務管理器。
- MyBatisConfig:配置 SqlSessionFactory 和 Mapper 掃描。
- SpringMvcConfig:掃描 Controller 層、開啟注解驅動。
-
Web 初始化
- 通過
AbstractAnnotationConfigDispatcherServletInitializer
配置 DispatcherServlet 和字符編碼過濾器。
- 通過
查漏補缺
- 事務管理:確保 Service 層方法添加
@Transactional
注解。 - Mapper 接口代理:確認
MapperScannerConfigurer
掃描 Dao 層接口。 - 靜態資源放行:在
SpringMvcConfig
中配置addResourceHandlers
。
二、統一結果封裝
實現要點
- Result 類:封裝返回數據(data)、狀態碼(code)和消息(msg)。
- Code 類:定義統一狀態碼(如 20011 表示新增成功,20010 表示失敗)。
- Controller 調整:所有接口返回
Result
對象,根據業務邏輯設置狀態碼。
查漏補缺
- 異常處理:確保所有業務邏輯分支都返回 Result(如查詢結果為空時返回 GET_ERR)。
- 狀態碼規范:建議將狀態碼按業務模塊劃分(如 200xx 為業務操作,500xx 為系統錯誤)。
三、統一異常處理
實現步驟
-
自定義異常類
BusinessException
:用戶行為導致的異常(如參數錯誤)。SystemException
:系統層面的異常(如數據庫連接失敗)。
-
全局異常處理器
- 使用
@RestControllerAdvice
和@ExceptionHandler
捕獲異常并返回統一 Result。
- 使用
查漏補缺
- 異常日志:在異常處理器中添加日志記錄(如使用
SLF4J
)。 - 敏感信息處理:避免將堆棧信息直接返回給前端。
- 異常包裝:在 Service 層捕獲原始異常并包裝為自定義異常。
四、前后臺聯調
前端實現
- 異步請求:使用 Axios 發送 POST/PUT/DELETE 請求,處理 JSON 響應。
- 頁面交互:通過 ElementUI 組件實現模態框、表單驗證和數據展示。
查漏補缺
- 表單重置:新增 / 修改操作后清空表單數據。
- 錯誤提示:根據后端返回的 msg 字段展示具體錯誤信息。
- 數據刷新:操作完成后重新加載列表數據。
五、攔截器
核心功能
- 預處理:在
preHandle
中進行權限校驗、參數校驗等。 - 后處理:在
postHandle
中修改響應內容(如添加響應頭)。 - 資源清理:在
afterCompletion
中釋放資源。
配置要點
- 攔截路徑:使用
addPathPatterns
和excludePathPatterns
控制攔截范圍。 - 攔截器鏈:多個攔截器按配置順序執行,
preHandle
返回 false 會中斷后續流程。
查漏補缺
- 靜態資源放行:確保攔截器不攔截 CSS/JS 等靜態資源。
- 性能監控:在攔截器中統計請求耗時并記錄日志。
六、常見問題與優化
- 中文亂碼:確認字符編碼過濾器配置正確(
CharacterEncodingFilter
)。 - JSON 轉換:確保 Jackson 依賴正確引入,使用
@RequestBody
和@ResponseBody
。 - 事務傳播:理解
@Transactional
的傳播行為(如REQUIRED
、REQUIRES_NEW
)。 - 單元測試:使用
@RunWith(SpringJUnit4ClassRunner)
和@ContextConfiguration
測試 Service 層。
七、總結
SSM 整合需關注配置類的正確性,統一結果和異常處理提升接口規范性,攔截器增強系統功能。實際開發中需結合日志、緩存等優化系統性能,并通過 Swagger 等工具完善接口文檔。
過濾器(Filter)
1. 概念
過濾器是 Java Servlet 規范中的一部分,它可以在請求到達 Servlet 之前對請求進行預處理,也可以在響應返回客戶端之前對響應進行后處理。過濾器可以攔截所有的請求,包括靜態資源(如圖片、CSS、JavaScript 等)。
2. 工作原理
過濾器的工作原理基于 Java 的 Servlet 規范,當客戶端發送請求時,請求會先經過過濾器鏈,過濾器鏈中的每個過濾器可以對請求進行處理,處理完成后再將請求傳遞給下一個過濾器或者 Servlet。響應返回時,也會按照相反的順序經過過濾器鏈。
3. 實現步驟
- 創建過濾器類:實現
javax.servlet.Filter
接口,并重寫init
、doFilter
和destroy
方法。 - 配置過濾器:在
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
接口,并重寫preHandle
、postHandle
和afterCompletion
方法。 - 配置攔截器:在 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 的請求處理前后的額外處理,如權限驗證、日志記錄、性能監控等。