
簡介本資源是一套基于JavaEE平臺、采用SSHStrutsSpringHibernate框架與Oracle數據庫開發的健康管理系統完整項目面向計算機專業本科生及初學者適用于畢業設計、課程設計與Web開發實踐。項目包含經實測可穩定運行的全部源碼、詳細設計文檔及配套輔導視頻覆蓋用戶管理、健康檔案維護、體檢數據錄入與統計分析等核心功能模塊幫助學習者掌握企業級Java Web應用的分層架構設計與數據庫集成方法。壓縮包為ZIP格式共143.63MB內含Java源文件、JSP頁面、配置文件、SQL腳本及PDF/DOCX格式文檔各類文件協同支撐開發、部署與理解全流程。目前已有854人學習下載資源結構清晰、注釋完整附帶環境配置說明與常見問題排錯提示特別適合零基礎入門SSH整合開發并完成高質量畢設課題。1. 為什么還在用 JavaEE SSH Oracle 做健康管理系統不是過時而是穩得有道理你可能在招聘網站上看到“要求熟悉 Spring Boot、微服務、云原生”的崗位描述轉頭卻在高校課程設計、區縣級衛健信息平臺、基層醫院 HIS 擴展模塊里頻繁撞見JavaEE Struts2 Spring2.5 Hibernate3 Oracle10g/11g這套組合——它沒消失只是沉到了真實落地的毛細血管里。這套技術棧不是為炫技而存在Struts2 的 Action 鏈式攔截適合健康檔案錄入的多步驟表單校驗Spring2.5 的 XML 配置雖冗長但讓科室權限、角色菜單、數據脫敏規則全部可審計、可追溯Hibernate3 的.hbm.xml映射文件強制開發者直面 Oracle 表結構與字段約束比如VARCHAR2(18 CHAR)存身份證號、NUMBER(12,2)存醫保結算金額規避了 ORM 自動生成 SQL 時對 Oracle 分區索引、物化視圖、ROWNUM分頁的誤用。它適合三類人高校計算機專業做課程設計的學生文檔規范、源碼結構清晰、答辯易講清分層邏輯中小醫療信息化公司維護存量系統的工程師Oracle 數據庫已運行十年遷移成本遠高于功能迭代以及需要快速交付、不追求高并發但強依賴事務一致性的社區健康隨訪系統。本文不鼓吹復古而是帶你把這套“老樹”扎進當下開發環境——用 VS Code 替代 MyEclipse用 Oracle 11.2.0.4 兼容 JDK8用本地 SSH 端口轉發調試遠程 Oracle 監聽讓老架構跑出新效率。2. 搭建可運行的 JavaEESSHOracle 開發環境從 VS Code 配置到 Oracle 監聽驗證2.1 VS Code 中配置 JavaEE 語言環境與 SSH 遠程調試支持VS Code 默認不內置 JavaEE 容器支持需分三步補全安裝擴展、配置 JDK、啟用遠程 SSH 調試通道。首先安裝官方推薦組合Extension Pack for Java含 Language Support for Java、Debugger for Java、Test Runner for Java、Remote - SSH用于連接部署服務器、SQLTools連接 Oracle。注意若提示“此擴展在此工作區中被禁用因為其被定義為在遠程擴展主機中運行”說明你已在 SSH 連接狀態下打開項目需在遠程服務器端重新安裝SQLTools并重啟 VS Code 窗口。JDK 配置必須嚴格匹配 Oracle 版本——Oracle 11g R2 官方認證 JDK 范圍為 1.6–1.7但實測 JDK 1.8u202 可穩定運行避免使用 JDK 9因 Struts2 的xwork-core-2.3.32.jar內部反射調用sun.misc.Unsafe在 JDK 9 模塊化后失效。在 VS Code 設置中添加java.configuration.runtimes: [ { name: JavaSE-1.8, path: /opt/jdk1.8.0_202 } ]提示/opt/jdk1.8.0_202是 Linux 下典型路徑Windows 用戶需指向C:\Program Files\Java\jdk1.8.0_202。路徑錯誤會導致 Maven 編譯報Unsupported major.minor version 52.0即 JDK8 字節碼版本。2.2 Oracle 11.2.0.4 數據庫安裝與監聽服務啟動關鍵步驟Oracle 安裝最??ㄔ诒O聽服務無法啟動根源常是/etc/hosts配置或listener.ora端口沖突。以 Ubuntu 20.04 為例先確保127.0.0.1 localhost與本機 hostname如ubuntu-server同行否則lsnrctl start會報TNS-12537: TNS:connection closed。安裝完成后手動編輯$ORACLE_HOME/network/admin/listener.oraLISTENER (DESCRIPTION_LIST (DESCRIPTION (ADDRESS (PROTOCOL IPC)(KEY EXTPROC1521)) (ADDRESS (PROTOCOL TCP)(HOST ubuntu-server)(PORT 1521)(IP FIRST)) ) )關鍵點HOST必須填服務器 hostname非localhost或127.0.0.1且該 hostname 必須在/etc/hosts中解析到本機 IP。啟動監聽后用tnsping ORCL驗證連通性——若返回OK (10 msec)說明網絡層就緒若報TNS-03505: Failed to resolve name則檢查tnsnames.ora中ORCL服務名是否指向正確HOST和PORT。健康管理系統典型建庫語句如下-- 創建表空間避免 SYSTEM 表空間膨脹 CREATE TABLESPACE health_data DATAFILE /u01/app/oracle/oradata/ORCL/health_data01.dbf SIZE 500M AUTOEXTEND ON NEXT 100M MAXSIZE 2G; -- 創建用戶并授權最小權限原則 CREATE USER health_app IDENTIFIED BY H3lth2024 DEFAULT TABLESPACE health_data TEMPORARY TABLESPACE temp; GRANT CONNECT, RESOURCE TO health_app; GRANT CREATE VIEW, CREATE SYNONYM TO health_app; -- 關鍵授予執行存儲過程權限健康隨訪常需 PL/SQL 封裝業務邏輯 GRANT EXECUTE ANY PROCEDURE TO health_app;2.3 Maven 項目結構初始化與 SSH 框架核心依賴鎖定基于 JavaEE 規范項目必須分webappJSP/Servlet、src/main/java業務邏輯、src/main/resourcesSSH 配置三層。pom.xml中 SSH 依賴需嚴格對應版本兼容性Struts2.3.32 與 Spring2.5.6 共存時必須排除 Spring 自帶的commons-logging改用log4j否則運行時報NoSuchMethodError: org.apache.commons.logging.LogFactory.getLog。關鍵依賴片段如下properties spring.version2.5.6/spring.version struts2.version2.3.32/struts2.version hibernate.version3.6.10.Final/hibernate.version oracle.jdbc.version11.2.0.4/oracle.jdbc.version /properties dependencies !-- Spring 核心排除 commons-logging -- dependency groupIdorg.springframework/groupId artifactIdspring-core/artifactId version${spring.version}/version exclusions exclusion groupIdcommons-logging/groupId artifactIdcommons-logging/artifactId /exclusion /exclusions /dependency !-- Oracle JDBC 驅動必須用 ojdbc6.jarojdbc8 不兼容 Hibernate3 -- dependency groupIdcom.oracle.database.jdbc/groupId artifactIdojdbc6/artifactId version${oracle.jdbc.version}/version /dependency !-- Hibernate 連接池用 C3P0比默認 DriverManager 更穩定 -- dependency groupIdc3p0/groupId artifactIdc3p0/artifactId version0.9.1.2/version /dependency /dependencies注意ojdbc6.jar必須手動下載并mvn install:install-file到本地倉庫因 Oracle 官方未發布至 Maven Central。命令為mvn install:install-file -Dfileojdbc6.jar -DgroupIdcom.oracle.database.jdbc -DartifactIdojdbc6 -Dversion11.2.0.4 -Dpackagingjar3. 健康管理系統核心模塊實現從患者檔案錄入到 Oracle 分頁查詢優化3.1 Struts2 Action 層處理多步驟健康檔案錄入健康檔案錄入需校驗身份證號格式、血壓值范圍、過敏史關鍵詞等Struts2 的ValidationAware接口配合 XML 驗證文件可實現解耦。例如PatientAction-validation.xml!DOCTYPE validators PUBLIC -//Apache Struts//XWork Validator 1.0.3//EN http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd validators field nameidCard field-validator typeregex param nameexpression![CDATA[^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$]]/param message身份證號碼格式不正確/message /field-validator /field field namesystolicPressure field-validator typeint param namemin50/param param namemax200/param message收縮壓應在50-200mmHg之間/message /field-validator /field /validatorsAction 類繼承ActionSupport重寫validate()方法補充業務級校驗如“孕婦建檔需填寫末次月經日期”public class PatientAction extends ActionSupport { private String idCard; private int systolicPressure; private Date lastMenstrualDate; private boolean isPregnant; Override public void validate() { if (isPregnant (lastMenstrualDate null)) { addFieldError(lastMenstrualDate, 孕婦必須填寫末次月經日期); } } public String execute() throws Exception { // 調用 Service 層保存 patientService.savePatient(this); return SUCCESS; } }提示addFieldError()會自動將錯誤信息綁定到 JSP 表單的s:fielderror標簽無需手動傳參。3.2 Spring 管理 Hibernate SessionFactory 與 Oracle 特定配置applicationContext.xml中配置SessionFactory時必須顯式指定 Oracle 方言和連接池參數否則分頁、序列、LOB 處理會出錯bean idsessionFactory classorg.springframework.orm.hibernate3.LocalSessionFactoryBean property namedataSource refdataSource/ property namehibernateProperties props !-- 強制使用 Oracle10g 方言兼容 11g -- prop keyhibernate.dialectorg.hibernate.dialect.Oracle10gDialect/prop !-- 啟用二級緩存健康檔案查詢頻次高 -- prop keyhibernate.cache.use_second_level_cachetrue/prop prop keyhibernate.cache.provider_classorg.hibernate.cache.EhCacheProvider/prop !-- Oracle 分頁必須用 ROWNUM而非 LIMIT -- prop keyhibernate.jdbc.use_scrollable_resultsetfalse/prop !-- 關鍵解決身份證科學計數法問題見熱詞 -- prop keyhibernate.jdbc.use_get_generated_keysfalse/prop /props /property property namemappingResources list valuecom/health/pojo/Patient.hbm.xml/value /list /property /beanPatient.hbm.xml中身份證字段必須聲明為string類型并關閉length截斷class namecom.health.pojo.Patient tablePATIENT_INFO id nameid columnID generator classsequence param namesequenceSEQ_PATIENT_ID/param /generator /id !-- 關鍵身份證用 string 映射避免 Oracle NUMBER 類型導致科學計數 -- property nameidCard columnID_CARD typestring length18/ property namebloodType columnBLOOD_TYPE typestring length3/ /class3.3 Oracle 分頁查詢優化ROWNUM 與健康數據統計結合健康管理系統常需“按年齡段統計高血壓患者數”直接GROUP BY在大數據量下極慢。應利用 Oracle 物化視圖預計算-- 創建物化視圖日志必須先建 CREATE MATERIALIZED VIEW LOG ON PATIENT_INFO WITH SEQUENCE, ROWID (ID_CARD, BLOOD_PRESSURE, BIRTHDAY) INCLUDING NEW VALUES; -- 每日刷新的物化視圖統計各年齡段高血壓人數 CREATE MATERIALIZED VIEW mv_hypertension_age BUILD IMMEDIATE REFRESH FAST ON DEMAND START WITH SYSDATE NEXT SYSDATE 1 AS SELECT FLOOR(MONTHS_BETWEEN(SYSDATE, BIRTHDAY)/12) AS age_group, COUNT(*) AS hypertensive_count FROM PATIENT_INFO WHERE BLOOD_PRESSURE 140 GROUP BY FLOOR(MONTHS_BETWEEN(SYSDATE, BIRTHDAY)/12);Java 層分頁查詢采用ROWNUM嵌套寫法Hibernate3 不支持OFFSET/FETCH// HQL 無法生成正確 ROWNUM改用原生 SQL String sql SELECT * FROM ( SELECT a.*, ROWNUM rnum FROM ( SELECT ID, ID_CARD, NAME, SYSTOLIC_PRESSURE FROM PATIENT_INFO WHERE SYSTOLIC_PRESSURE ? ORDER BY CREATE_TIME DESC ) a WHERE ROWNUM ? ) WHERE rnum ?; Query query session.createSQLQuery(sql) .addEntity(Patient.class) .setParameter(0, 140) .setParameter(1, (pageNo * pageSize)) // 上限 .setParameter(2, ((pageNo - 1) * pageSize)); // 下限 ListPatient patients query.list();注意ROWNUM必須在ORDER BY后應用否則排序失效。參數pageNo從 1 開始pageSize20時第 2 頁的rnum 20 AND rnum 40。4. 生產環境排錯與性能加固解決 Oracle 監聽異常、SSH 連接超時及健康數據脫敏4.1 Oracle 監聽服務無法啟動的三大根因與修復命令監聽失敗 80% 源于配置文件語法錯誤、端口占用、權限不足。按順序執行以下診斷命令# 1. 檢查 listener.ora 語法無輸出即正確 $ORACLE_HOME/bin/lsnrctl status 21 | grep -i syntax error # 2. 查看 1521 端口是否被占用Ubuntu 常見于 snap 安裝的 lxd sudo ss -tuln | grep :1521 # 若被占釋放端口sudo kill -9 $(sudo lsof -t -i:1521) # 3. 檢查 Oracle 用戶對 $ORACLE_HOME/network/admin 的讀寫權限 ls -ld $ORACLE_HOME/network/admin # 修復權限sudo chown -R oracle:oinstall $ORACLE_HOME/network/admin # 4. 強制重載監聽不中斷現有連接 $ORACLE_HOME/bin/lsnrctl reload若仍失敗檢查$ORACLE_HOME/network/log/listener.log最后 20 行tail -20 $ORACLE_HOME/network/log/listener.log # 常見錯誤 TNS-01155: Incorrectly specified SID_LIST_LISTENER 對應 listener.ora 中 SID_LIST 缺失4.2 SSH 連接服務器時避免重復輸密碼密鑰登錄自動化配置健康管理系統部署服務器需頻繁 SSH 登錄如上傳 WAR、查看日志手動輸密碼低效且不安全。在開發機生成密鑰對并部署公鑰# 1. 生成 RSA 密鑰不設密碼便于腳本調用 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_health -N # 2. 將公鑰復制到目標服務器假設服務器 IP 10.0.0.47 ssh-copy-id -i ~/.ssh/id_rsa_health.pub oracle10.0.0.47 # 3. 配置別名簡化登錄寫入 ~/.ssh/config Host health-db HostName 10.0.0.47 User oracle IdentityFile ~/.ssh/id_rsa_health Port 22之后只需ssh health-db即可免密登錄。VS Code 的 Remote-SSH 擴展會自動讀取此配置連接時選擇health-db即可。4.3 健康數據敏感字段脫敏Oracle VPD虛擬私有數據庫策略患者身份證號、手機號在報表導出時需脫敏如110101199003072135→110101******2135傳統應用層處理易遺漏。Oracle VPD 可在數據庫層強制攔截-- 1. 創建策略函數只對非管理員用戶脫敏 CREATE OR REPLACE FUNCTION f_patient_mask ( p_schema VARCHAR2, p_object VARCHAR2 ) RETURN VARCHAR2 AS v_predicate VARCHAR2(2000); BEGIN IF SYS_CONTEXT(USERENV, SESSION_USER) ! HEALTH_APP THEN v_predicate : SUBSTR(ID_CARD, 1, 6) || ****** || SUBSTR(ID_CARD, -4) ID_CARD; ELSE v_predicate : 11; END IF; RETURN v_predicate; END; -- 2. 將策略綁定到 PATIENT_INFO 表 BEGIN DBMS_RLS.ADD_POLICY( object_schema HEALTH_APP, object_name PATIENT_INFO, policy_name patient_mask_policy, function_schema HEALTH_APP, policy_function f_patient_mask, statement_types SELECT ); END;提示VPD 策略僅對SELECT有效INSERT/UPDATE仍需應用層校驗。測試時用SELECT ID_CARD FROM PATIENT_INFO WHERE ROWNUM1普通用戶看到脫敏值HEALTH_APP用戶看到明文。5. VS Code 遠程開發實戰調試 SSH 連接的 Oracle 數據庫與健康業務邏輯5.1 VS Code 中配置 SQLTools 連接局域網 Oracle 數據庫PL/SQL Developer 連接局域網 Oracle 需配置tnsnames.ora而 VS Code 的 SQLTools 插件支持直接填寫連接參數更輕量。在 VS Code 命令面板CtrlShiftP輸入SQLTools: New Connection填寫Name:HealthDB-LocalDriver:OracleHost:10.0.0.47Oracle 服務器 IPPort:1521Database:ORCL服務名非 SIDUser:health_appPassword:H3lth2024Advanced:connectString10.0.0.47:1521/ORCL強制指定連接串連接成功后在 SQL 文件中右鍵Execute Query即可運行健康統計 SQL-- 查詢近 30 天新增糖尿病患者利用 Oracle TRUNC 函數 SELECT COUNT(*) AS new_diabetes_count FROM PATIENT_INFO WHERE DIAGNOSIS 糖尿病 AND CREATE_TIME TRUNC(SYSDATE) - 30;注意TRUNC(SYSDATE)返回當天零點時間比SYSDATE-30更精確避免時區偏差。5.2 遠程調試 Java Web 應用VS Code Attach 到 Tomcat 進程健康管理系統部署在遠程 Tomcat需實時調試PatientAction執行流程。在遠程服務器啟動 Tomcat 時添加 JPDA 參數# 修改 $CATALINA_HOME/bin/catalina.sh # 在 JAVA_OPTS 行追加 JAVA_OPTS$JAVA_OPTS -agentlib:jdwptransportdt_socket,address8000,servery,suspendn然后在 VS Code 中創建.vscode/launch.json{ version: 0.2.0, configurations: [ { type: java, name: Attach to Remote Tomcat, request: attach, hostName: 10.0.0.47, port: 8000, projectName: health-system } ] }啟動遠程 Tomcat 后在 VS Code 中按F5選擇Attach to Remote Tomcat即可在PatientAction.execute()方法打斷點觀察idCard、systolicPressure等參數值——這比日志排查快 10 倍。5.3 健康數據導出防錯解決身份證科學計數法與 Excel 兼容性Oracle 查詢結果導出到 Excel 時身份證號常顯示為1.10101E17科學計數法因 Excel 將長數字自動轉浮點。根本解法在 Java 層導出時設置單元格格式// 使用 Apache POI 導出 XSSFWorkbook workbook new XSSFWorkbook(); XSSFSheet sheet workbook.createSheet(患者檔案); XSSFRow headerRow sheet.createRow(0); headerRow.createCell(0).setCellValue(身份證號); headerRow.createCell(1).setCellValue(姓名); // 關鍵為身份證列設置文本格式避免 Excel 自動轉換 XSSFCellStyle idCardStyle workbook.createCellStyle(); idCardStyle.setDataFormat(workbook.createDataFormat().getFormat()); XSSFRow dataRow sheet.createRow(1); dataRow.createCell(0).setCellStyle(idCardStyle); dataRow.getCell(0).setCellValue(patient.getIdCard()); // 直接 setCellValue(String) dataRow.createCell(1).setCellValue(patient.getName()); // 輸出文件 try (FileOutputStream fileOut new FileOutputStream(health_export.xlsx)) { workbook.write(fileOut); }提示格式符強制 Excel 將單元格視為文本setCellValue(String)確保字符串不被轉數字。若用 CSV 導出則在身份證字段前后加雙引號\idCard\.本文還有配套的精品資源點擊獲取