源碼實戰(zhàn):從部署到二次開發(fā))
簡介這是一份面向本科畢業(yè)設計場景的Java Web課程資源圍繞“個人健康信息管理系統(tǒng)”提供從選題分析到系統(tǒng)測試的完整論文方案適合計算機相關(guān)專業(yè)學生以及正在入門SSM整合開發(fā)的學習者。資源壓縮包內(nèi)包含1個docx文檔大小約5.26MB。文檔詳細描述了項目背景、SSMSpring SpringMVC MyBatis與MySQL/JSP技術(shù)選型、經(jīng)濟/人員/法律/操作四維可行性分析、用戶注冊登錄、個人信息管理、健康數(shù)據(jù)記錄、健康提醒設置、數(shù)據(jù)分析報告等功能模塊設計、數(shù)據(jù)庫表結(jié)構(gòu)設計與整體測試方案。值得關(guān)注的是文檔還附有中英文摘要、目錄框架以及較為完整的關(guān)鍵詞與參考文獻結(jié)構(gòu)可以幫助讀者快速理解健康管理類系統(tǒng)的核心設計思路與論文撰寫規(guī)范直接用于畢業(yè)設計參考或課程項目擴展。目前該資源已有77人瀏覽學習。1. 一個 SSM 框架的畢業(yè)設計源碼包值不值得花時間復現(xiàn)如果你正在找基于 SSM MySQL 的 Java Web 畢業(yè)設計源碼這套“個人健康信息管理系統(tǒng)”大概是你在搜索里繞不開的一個資源。它不是那種只有截圖和論文、跑不起來的花架子而是一套從需求分析到數(shù)據(jù)庫設計、再到前后端聯(lián)調(diào)都有完整鏈條的課題用戶注冊登錄、健康指標錄入、健康提醒設置、數(shù)據(jù)查看與個人報告覆蓋了 JSP SpringMVC MyBatis 這類老牌技術(shù)棧在真實課設場景下的全部標準動作。適合兩類人一類是課程設計需要交源碼和論文的在校生另一類是剛接觸 SSM 整合、想找一個不復雜但五臟俱全的 Demo 來拆解的初學者。先說結(jié)論這套資源能幫你省下不少從零搭框架的時間但直接把代碼導入 IDEA 就指望一鍵跑通是不太現(xiàn)實的——Maven 依賴沖突、JDK 版本不匹配、MySQL 連接參數(shù)不一致這三個坑幾乎每個人都會踩一遍。2. 功能拆解與 SSM 三層架構(gòu)先弄清楚系統(tǒng)到底在做什么2.1 功能需求從論文里提煉出來是什么看這套系統(tǒng)的論文部分功能描述是比較典型的課設粒度。用戶端核心是注冊登錄、個人信息維護、健康數(shù)據(jù)記錄和查看歷史。健康數(shù)據(jù)不是只存一個數(shù)值而是按身高、體重、血壓、心率這類分字段存儲所以數(shù)據(jù)庫表設計上需要有單獨的健康數(shù)據(jù)表來承載而不是塞在用戶表里。管理員端則是用戶管理和數(shù)據(jù)管理論文里提到管理員可以充當類似醫(yī)院信息管理員的角色對用戶記錄進行查看和維護。功能模塊上大概可以分成四塊用戶注冊與登錄用賬號密碼注冊注冊時填基礎信息登錄后進入主界面。個人信息維護修改身高、體重、聯(lián)系方式等基礎資料。健康數(shù)據(jù)記錄按日期錄入血壓、心率、體重等指標支持查看歷史列表。健康提醒設置設置如喝水、吃藥之類的提醒項系統(tǒng)按設定時間展示提醒信息。這套功能設計對應到 SSM 架構(gòu)里就是標準的 Controller-Service-Mapper 三層。JSP 頁面發(fā)起請求SpringMVC 的 Controller 接收參數(shù)并調(diào)用 Service 層方法Service 層處理業(yè)務邏輯后通過 MyBatis 的 Mapper 接口操作 MySQL 數(shù)據(jù)庫最終把結(jié)果返回 JSP 頁面渲染。理解這個調(diào)用鏈是后續(xù)改動代碼的基礎很多人在改需求時只動 Controller 不動 Service導致邏輯斷層這是新手最容易犯的問題。2.2 為什么選 SSM 而不是 Spring Boot這個項目用的是 SSM很多同學會問為什么不用 Spring Boot。答案很簡單這是根據(jù)課程設計要求來定的。SSM 是 Spring、SpringMVC、MyBatis 三個框架的手動整合相比 Spring Boot 的自動配置它需要你手動維護 XML 配置文件、處理包掃描路徑、配置數(shù)據(jù)源和事務管理器。這個過程雖然繁瑣但對于理解框架底層機制非常有幫助。如果你已經(jīng)把 SSM 跑通了一遍再去看 Spring Boot 的自動配置理解深度完全不一樣。這套資源的配置結(jié)構(gòu)是典型的 SSM 工程布局src/main/java ├── com/health/controller # Controller 層接收請求 ├── com/health/service # 業(yè)務邏輯接口與實現(xiàn) ├── com/health/dao # MyBatis Mapper 接口 ├── com/health/entity # 實體類對應數(shù)據(jù)庫表 src/main/resources ├── jdbc.properties # 數(shù)據(jù)庫連接配置 ├── spring-mybatis.xml # Spring 整合 MyBatis 配置 ├── spring-mvc.xml # SpringMVC 配置 ├── mybatis-config.xml # MyBatis 全局配置 src/main/webapp/WEB-INF ├── web.xml # Web 部署描述符這個分層的好處是職責清晰Controller 層只做參數(shù)接收和視圖轉(zhuǎn)發(fā)Service 層處理業(yè)務規(guī)則DAO 層只管數(shù)據(jù)訪問。比如用戶注冊時Controller 拿到用戶名和密碼Service 層負責檢查用戶名是否已存在、密碼是否為空然后調(diào)用 Mapper 插入數(shù)據(jù)。如果你要加一個“根據(jù) BMI 計算健康評價”的功能只需要在 Service 層加一個方法Controller 層加一個接口完全不影響其他模塊。2.3 數(shù)據(jù)庫表設計是這套資源的核心資產(chǎn)打開項目里的health.sql文件會發(fā)現(xiàn)數(shù)據(jù)庫設計的完整度比論文中描述的還要細致。核心表大概有這幾張表名用途主要字段t_user用戶基本信息id, username, password, phone, real_name, create_timet_health_record健康數(shù)據(jù)記錄id, user_id, height, weight, blood_pressure_high, blood_pressure_low, heart_rate, record_datet_remind健康提醒設置id, user_id, remind_type, remind_time, remind_content, statust_admin管理員賬號id, username, password用戶表和健康記錄表通過user_id建立一對多的關(guān)聯(lián)這是整個系統(tǒng)的核心關(guān)系。這里有個值得注意的設計血壓拆成了高壓和低壓兩個字段而不是存一個字符串這樣在做數(shù)據(jù)分析和條件查詢時可以直接比較數(shù)值不需要字符串解析。這種細節(jié)在論文中不會寫明但在實際開發(fā)中非常關(guān)鍵。表結(jié)構(gòu)設計上有幾個地方需要留意時間字段統(tǒng)一用datetime避免前端傳字符串導致格式混亂。健康記錄表的record_date建議加唯一索引約束(user_id, record_date)防止同一天重復錄入這個約束系統(tǒng)代碼里可能沒做但實際使用中很有必要。密碼字段論文里說是加密存儲的但實際源碼里大概率是明文或簡單的 MD5這一點在安全測試章節(jié)會有說明。2.4 代碼包落地檢查清單拿到資源后建議按這個清單過一遍可以在導入前就排查掉大部分問題確認 JDK 版本SSM 老項目推薦 JDK 1.8高版本會出現(xiàn)javax包缺失的報錯。確認 MySQL 版本5.7 或 8.0 都可以但連接驅(qū)動和 URL 參數(shù)略有不同。檢查jdbc.properties里的數(shù)據(jù)庫名、用戶名、密碼是否和本地環(huán)境一致。確認 Maven 倉庫能正常下載依賴第一次構(gòu)建耗時較長屬正?,F(xiàn)象。查看web.xml中配置的 Spring 配置文件路徑與實際文件名是否匹配。這套檢查下來大概花十分鐘但能避免后面一整天的排錯時間。很多同學拿到的資源跑不起來不是源碼有問題而是環(huán)境參數(shù)不一致導致的。3. 從環(huán)境準備到跑通登錄頁實操步驟與關(guān)鍵參數(shù)3.1 環(huán)境版本選型與避坑建議SSM 項目對環(huán)境版本的要求比較敏感不是越新越好。推薦組合是JDK 1.8不能高于 8否則 JSP 編譯和 Tomcat 運行會有兼容問題Maven 3.6 左右Tomcat 8.5Tomcat 9 和 10 對 JSP 支持變化較大老項目不建議用MySQL 5.7 或 8.0注意驅(qū)動版本區(qū)別IDEA 2020-2023 均可這里有個踩坑點如果本機裝了 JDK 11 或 17IDEA 里要單獨配置 Project Structure 指向 JDK 1.8。很多人導入項目后只改了 SDK 版本沒有改 Language Level編譯時依然報source option 8 not supported之類的錯誤。正確的做法是同時檢查 Project Structure 里的 Project SDK、Project Language Level 和 Modules 里的 Language Level三者保持一致。依賴管理需要用 Maven 而不是直接導入 lib 目錄下的 jar。很多課設資源會附帶一個 lib 文件夾但推薦的做法是把 pom.xml 里的依賴坐標改為從中央倉庫拉取這樣升級和維護都更方便。示例 pom 中核心依賴如下dependency groupIdorg.springframework/groupId artifactIdspring-webmvc/artifactId version5.2.22.RELEASE/version /dependency dependency groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId version2.0.6/version /dependency dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.21/version /dependencySpring 版本建議選擇 5.2.x 而不選 5.3.x因為老項目中的一些配置寫法在 5.3 中會觸發(fā)警告甚至報錯。MySQL 驅(qū)動如果是 8.xURL 需要加serverTimezoneAsia/Shanghai參數(shù)否則會報時區(qū)錯誤。3.2 數(shù)據(jù)庫初始化與連接配置建庫時需要注意字符集。推薦在命令行或 Navicat 中執(zhí)行CREATE DATABASE IF NOT EXISTS health_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE health_db; source /你的目錄/health.sql;使用 utf8mb4 而不是簡單的 utf8是因為 utf8mb4 可以兼容更多字符包括一些生僻字和特殊符號。初始化完成后驗證一下表是否創(chuàng)建成功SHOW TABLES; SELECT COUNT(*) FROM t_user;如果表創(chuàng)建成功但查詢報錯多半是 SQL 文件中包含了一些當前版本 MySQL 不兼容的語法。我在處理這類資源時遇到過ENGINEMyISAM或AUTO_INCREMENT語法不一致的問題用 5.7 跑老 SQL 一般沒問題但 8.0 偶爾會有小兼容性問題比如默認排序規(guī)則變化。如果遇到手動編輯 SQL 文件把不兼容的語法替換成當前版本支持的寫法即可。接下來修改jdbc.properties。這一步是重頭戲很多環(huán)境問題都出在這里jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/health_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password你的數(shù)據(jù)庫密碼如果沒有把本機 MySQL 密碼和配置文件保持一致啟動 Tomcat 后數(shù)據(jù)源初始化就會直接報錯。另外注意 driver 類名MySQL 5.x 用com.mysql.jdbc.Driver8.x 用com.mysql.cj.jdbc.Driver兩者混用是老項目最常見的啟動失敗原因。3.3 Tomcat 部署與啟動流程在 IDEA 中配置 Tomcat 時有一個容易被忽略的細節(jié)Deployment 里的 Application context 需要設置。如果項目在web.xml中沒有配置應用上下文路徑Tomcat 部署后默認是/直接訪問http://localhost:8080/就能看到首頁。但很多 SSM 項目中配置了路徑映射比如/health訪問地址就變成了http://localhost:8080/health/。啟動后先不要急著點登錄先打開瀏覽器訪問http://localhost:8080/health/觀察兩個東西頁面是否能正常渲染JSP 有沒有報錯堆棧。IDEA Console 里是否出現(xiàn) Spring 容器啟動成功、MyBatis mapper 加載完成等日志。如果頁面白屏或報 404優(yōu)先檢查web.xml中 SpringMVC DispatcherServlet 的映射路徑以及spring-mvc.xml中視圖解析器的前綴和后綴配置bean classorg.springframework.web.servlet.view.InternalResourceViewResolver property nameprefix value/WEB-INF/views/ / property namesuffix value.jsp / /bean這個配置決定了 Controller 返回的邏輯視圖名對應的 JSP 物理路徑。如果項目中 JSP 文件放在webapp根目錄而不是WEB-INF/views下需要對應修改否則會一直 404。3.4 注冊登錄流程的全鏈路驗證跑通頁面后注冊一個新賬號來驗證完整鏈路。注冊時注意觀察控制臺有沒有 SQL 日志輸出。MyBatis 默認關(guān)閉 SQL 日志但可以在mybatis-config.xml中開啟settings setting namelogImpl valueSTDOUT_LOGGING/ setting namemapUnderscoreToCamelCase valuetrue/ /settingslogImpl會讓每條 SQL 執(zhí)行時在控制臺打印驗證是否有插入語句執(zhí)行。mapUnderscoreToCamelCase會自動把create_time映射為createTime避免實體類屬性名和數(shù)據(jù)庫列名不一致導致的賦值失敗。登錄流程驗證點用戶名和密碼正確時頁面是否跳轉(zhuǎn)到主界面。用戶名不存在時是否給出提示而不是拋異常。密碼錯誤時提示是否明確。未登錄直接訪問主界面 URL是否會被攔截跳回登錄頁。最后一個點很多課設系統(tǒng)都沒做好要么沒做登錄攔截要么攔截邏輯寫了但配置路徑不對。如果你拿到的資源沒有攔截器可以自己加一個 SpringMVC 的HandlerInterceptor或者簡單地在每個 Controller 方法開頭判斷 session 中是否有用戶信息。這個功能在答辯時經(jīng)常被問到也算是一個加分項。4. 核心代碼走讀注冊、記錄、提醒三個模塊的實現(xiàn)邏輯4.1 注冊模塊的 Service 層實現(xiàn)Controller 層拿到表單參數(shù)后調(diào)用 Service 層的注冊方法。典型的 Service 實現(xiàn)如下Override public Result register(User user) { // 檢查用戶名是否已存在 User exists userMapper.selectByUsername(user.getUsername()); if (exists ! null) { return Result.error(用戶名已存在); } if (user.getPassword() null || user.getPassword().length() 6) { return Result.error(密碼長度不能少于6位); } // 實際生產(chǎn)環(huán)境建議使用 BCrypt 加密這里保持原樣便于演示 user.setPassword(user.getPassword()); user.setCreateTime(new Date()); userMapper.insert(user); return Result.success(注冊成功); }這段代碼的重點在于先做唯一性校驗再插入避免了數(shù)據(jù)庫層面出現(xiàn)重復用戶名。很多初學 SSM 的同學會把校驗邏輯寫在 Controller 里然后在 Service 層又寫一遍造成重復代碼。正確做法是 Controller 只做參數(shù)封裝和調(diào)用 Service所有業(yè)務規(guī)則判斷都收斂到 Service 層這樣后續(xù)復用或者加單元測試都方便。插入操作對應 MyBatis 的 Mapper 映射文件insert idinsert parameterTypecom.health.entity.User INSERT INTO t_user ( username, password, phone, real_name, create_time ) VALUES ( #{username}, #{password}, #{phone}, #{realName}, #{createTime} ) /insert注意create_time在數(shù)據(jù)庫里是datetime類型實體類中對應java.util.DateMyBatis 會自動做類型轉(zhuǎn)換。如果實體類里用的是LocalDateTime需要在mybatis-config.xml注冊對應的類型處理器否則會報ClassCastException。4.2 健康數(shù)據(jù)錄入與列表分頁健康數(shù)據(jù)錄入的 Controller 方法接收身高、體重、血壓、心率等參數(shù)調(diào)用 Service 層插入記錄。這里的核心邏輯問題是同一天重復錄入應該怎么處理。常見做法是按用戶和日期查詢已有記錄如果有則更新沒有則插入。這在論文中叫“冪等性設計”實際代碼里可能就是多幾條判斷HealthRecord exists recordMapper.selectByUserAndDate(record.getUserId(), record.getRecordDate()); if (exists ! null) { exists.setWeight(record.getWeight()); exists.setBloodPressureHigh(record.getBloodPressureHigh()); exists.setBloodPressureLow(record.getBloodPressureLow()); exists.setHeartRate(record.getHeartRate()); recordMapper.update(exists); } else { recordMapper.insert(record); }歷史記錄列表的分頁MyBatis 的 Mapper 中可以用PageHelper插件也可以手寫LIMIT offset, pageSize。課設項目中用 PageHelper 最方便PageHelper.startPage(pageNum, pageSize); ListHealthRecord list recordMapper.selectByUserId(userId); PageInfoHealthRecord pageInfo new PageInfo(list);這里的關(guān)鍵坑是PageHelper.startPage()必須緊跟在要分頁的查詢語句之前中間不能穿插任何其他 SQL 操作否則分頁會失效或作用到錯誤的查詢上。這個問題的表現(xiàn)是列表數(shù)據(jù)沒有分頁效果一頁顯示全部記錄。Debug 時很難發(fā)現(xiàn)因為代碼沒報錯只是數(shù)據(jù)不對排查方向很容易跑偏。4.3 健康提醒模塊的定時查詢思路健康提醒是這套系統(tǒng)里最有意思的功能。論文里描述的是用戶可以設置提醒時間和內(nèi)容系統(tǒng)按時展示。課設層面的實現(xiàn)一般不引入 Quartz 定時任務而是在登錄后查詢當天的提醒記錄public ListRemind getTodayRemind(Integer userId) { // 獲取當天日期范圍 Date start DateUtils.getStartOfDay(new Date()); Date end DateUtils.getEndOfDay(new Date()); return remindMapper.selectByDateRange(userId, start, end); }對應 SQL 是SELECT * FROM t_remind WHERE user_id #{userId} AND remind_time BETWEEN #{start} AND #{end} AND status 1 ORDER BY remind_time ASC這種實現(xiàn)方式的好處是簡單可靠不需要額外的定時任務框架頁面加載時把提醒列表渲染到首頁即可。缺點是只能在用戶登錄后看到提醒不會主動推送。如果要做到登錄前的主動通知就需要引入消息推送或者郵件通知組件課設階段一般不要求。4.4 管理員模塊的攔截與權(quán)限控制管理員功能通常復用用戶表結(jié)構(gòu)或單獨建一張t_admin表。登錄時通過角色字段區(qū)分普通用戶和管理員在攔截器里判斷 session 中用戶的角色。一個典型的攔截實現(xiàn)public class AdminInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { User user (User) request.getSession().getAttribute(loginUser); if (user null || !admin.equals(user.getRole())) { response.sendRedirect(request.getContextPath() /login.jsp); return false; } return true; } }preHandle返回false時請求被攔截不會進入到 Controller 方法。在spring-mvc.xml中配置攔截路徑mvc:interceptors mvc:interceptor mvc:mapping path/admin/**/ bean classcom.health.interceptor.AdminInterceptor/ /mvc:interceptor /mvc:interceptors權(quán)限控制是答辯時高頻提問點。如果原系統(tǒng)沒有實現(xiàn)管理員攔截自己補上這段代碼不僅提升了系統(tǒng)的嚴謹性也展示了對訪問控制的理解。5. 避坑指南導入、運行、改代碼最常見的 7 個翻車點5.1 “報錯 java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet”現(xiàn)象Tomcat 啟動后訪問頁面報 500控制臺提示找不到 DispatcherServlet 類。原因pom 中 spring-webmvc 依賴缺失或 Maven 依賴沒有正確部署到 Tomcat 的 WEB-INF/lib 目錄。IDEA 中常見原因是 Artifacts 設置里沒有把項目依賴打包進 war。解決展開 Project Structure - Artifacts - 選中 web: exploded - 點擊 Available Elements 里的項目依賴右鍵選擇 Put into WEB-INF/lib。重新構(gòu)建后再啟動即可。5.2 “報錯 Access denied for user rootlocalhost”現(xiàn)象啟動時數(shù)據(jù)源初始化失敗控制臺出現(xiàn)數(shù)據(jù)庫連接異常。原因jdbc.properties里寫的數(shù)據(jù)庫密碼和本地 MySQL 實際密碼不一致。還有一種情況是 MySQL 8.0 默認認證插件為 caching_sha2_password老版本 MySQL 驅(qū)動不支持。解決核對密碼后仍報錯的話執(zhí)行ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密碼;切換認證方式?;蛏夠?qū)動版本到 8.0.21 以上。5.3 “Incorrect datetime value: for column create_time”現(xiàn)象插入記錄時 SQL 執(zhí)行失敗提示時間字段值不合法。原因JSP 端提交的日期字符串格式與 MySQLdatetime類型不兼容比如傳了2024-03-12但缺少時分秒或傳了空字符串。舊版本 MySQL 5.7 對非嚴格模式有兼容8.0 默認嚴格模式會拒絕。解決在 Service 層統(tǒng)一處理日期解析而不是讓 MyBatis 直接綁定字符串SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd HH:mm:ss); Date parsedDate sdf.parse(dateStr); record.setCreateTime(parsedDate);同時建議把數(shù)據(jù)庫連接 URL 加一個allowPublicKeyRetrievaltrue參數(shù)部分 MySQL 8.0 連接時也需要這個參數(shù)。5.4 “頁面顯示數(shù)據(jù)但全是亂碼”現(xiàn)象注冊后用戶名回顯變成問號或亂碼頁面源碼里中文顯示異常。原因數(shù)據(jù)從 MySQL 取出后經(jīng)過 JSP 渲染時編碼不一致。JSP 頁面本身沒有設置pageEncodingUTF-8或數(shù)據(jù)庫鏈接 URL 缺少characterEncodingutf8參數(shù)或 Tomcat 的 URI 編碼未配置。解決檢查三處統(tǒng)一為 UTF-8JSP 頁面頭加% page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 %jdbc.properties的 URL 包含useUnicodetruecharacterEncodingutf8如果使用 GET 請求傳遞中文參數(shù)在 Tomcat 的 server.xml 中為 Connector 添加URIEncodingUTF-85.5 “修改了 JSP 但刷新后還是舊頁面”現(xiàn)象改動一個 JSP 頁面的樣式或文案瀏覽器訪問時仍是舊內(nèi)容IDEA 中標題欄顯示 File already changed on disk。原因Tomcat 熱部署沒有生效。課設項目常見配置是 On Update Action 設置為 Restart Server配合 Build 時自動更新資源。解決在 Tomcat 配置頁將 On Update Action 改成 Update resources下欄 Frame Deactivation 改成 Update classes and resources。這樣保存 JSP 后手動切換窗口Tomcat 會自動同步。5.6 “mapper 接口和 mapper.xml 明明對應但報 Invalid bound statement (not found)”現(xiàn)象調(diào)用 Mapper 接口方法時運行時報org.apache.ibatis.binding.BindingException。原因MyBatis 配置中沒有掃描到對應目錄的 XML 文件或 Mapper 接口和 XML 文件的 namespace 不一致。SSM 整合后 XML 文件如果放置在src/main/java下需要額外配置 Maven 的 resources 過濾才能被打包編譯。解決在 pom.xml 中添加資源過濾配置build resources resource directorysrc/main/java/directory includes include**/*.xml/include /includes /resource /resources /build同時在spring-mybatis.xml中確保mapper-locations路徑準確property namemapperLocations valueclasspath*:com/health/dao/*.xml /5.7 “項目里用了 lombok但 put 編譯一直報找不到 getter/setter”現(xiàn)象實體類上標了Data注解但代碼里調(diào)用user.getName()時編譯報錯。原因IDEA 中沒有安裝 Lombok 插件或 Maven 編譯時沒有啟用注解處理器。解決在 IDEA 插件市場搜索 Lombok 并安裝重啟后用 CtrlShiftF9 重新編譯。如果編譯環(huán)境是命令行 Mavenpom 中正常引入lombok依賴即可無需額外插件dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId version1.18.30/version scopeprovided/scope /dependency如果不想引入額外依賴也可以手動生成 getter/setter去掉 lombok 注解。這兩種方案都能解決編譯問題。6. 最后一個建議先加一個數(shù)據(jù)校驗再談二次開發(fā)很多同學拿這套代碼跑通后就想在上面加功能。我的建議是不要急著加大功能先把一個最容易出問題的點修好——用戶輸入校驗。JSP 頁面端的表單基本沒有做前后端雙重校驗比如身高可以填負數(shù)血壓可以填超過物理極限的值。這種數(shù)據(jù)一旦進數(shù)據(jù)庫后續(xù)分析報表全都會帶上臟數(shù)據(jù)。在 Service 層加一個參數(shù)校驗方法思路很簡單public Result validateHealthRecord(HealthRecord record) { if (record.getHeight() 50 || record.getHeight() 250) { return Result.error(身高范圍應為50-250cm); } if (record.getWeight() 10 || record.getWeight() 300) { return Result.error(體重范圍應為10-300kg); } if (record.getBloodPressureHigh() 60 || record.getBloodPressureHigh() 250) { return Result.error(高壓范圍應為60-250mmHg); } if (record.getBloodPressureLow() 40 || record.getBloodPressureLow() 150) { return Result.error(低壓范圍應為40-150mmHg); } return Result.success(校驗通過); }調(diào)用時機放在插入和更新之前。數(shù)據(jù)校驗這個點很小但在答辯演示時非常亮眼——老師輸入一個非法身高系統(tǒng)給出清晰提示而不是直接插入說明你考慮了數(shù)據(jù)的完整性和業(yè)務邊界。從那以后我每次拿到新的 SSM 課設源碼都會先做一遍輸入的校驗完善再開始改業(yè)務這個習慣幫我省掉了不少后期返工的麻煩。希望這份拆解能讓你在復現(xiàn)這套健康管理系統(tǒng)時少走一些彎路跑通了再往里加自己的功能會順手很多。本文還有配套的精品資源點擊獲取