)
簡介這是一套基于 Eclipse、JDK8、JSP、MySQL 并在 Tomcat 下運行的宿舍寢室管理系統(tǒng)完整源碼面向 Java Web 課程設計、畢業(yè)設計以及入門練手的學習者將其導入 IDE 后即可運行調(diào)試。管理員端支持學生信息管理學號、姓名、性別、年齡、政治面貌、班級、登錄賬號與密碼、宿舍信息維護房間號、住宿人數(shù)、班級、樓號及公告管理可設置靜校與熄燈時間學生端提供各宿舍衛(wèi)生排名查詢。壓縮包共 248 個文件、約 6.99MB以 24 個 JSP 頁面、24 個 Java 源文件及編譯后的 class、79 個 JS 腳本、19 個 CSS 樣式和若干圖片資源為主并附 SQL 建庫腳本與 jar 依賴Servlet 與 DAO 分層清晰便于按模塊閱讀和二次開發(fā)。已有 1341 人學習下載適合借此理清 JSP 渲染、數(shù)據(jù)庫增刪改查與分層設計的完整鏈路也可作為課設改造的基礎工程。1. 環(huán)境先對齊JDK8 Tomcat 8.5 MySQL 5.7這套宿舍寢室管理系統(tǒng)為什么不能隨手升版本拿到一份 JSP 寫的宿舍寢室管理系統(tǒng)很多人的第一反應是去官網(wǎng)拉最新版Tomcat 10、MySQL 8.4、JDK 17 一把梭。裝完啟動控制臺先甩一堆 jakarta.servlet 找不到再甩 MySQL 認證插件不匹配最后 JSP 頁面白屏人就開始懷疑源碼是壞的。這套 JDK 8 Tomcat 8.5 MySQL 5.7 的組合不是保守是被 Servlet 命名空間和 JDBC 驅(qū)動版本掐住的Tomcat 10 之后包名從 javax 換成 jakarta老 JSP 里import javax.servlet.*全部失效改回來的工作量比重新裝一遍環(huán)境還大。所以下面按「環(huán)境對齊、分件安裝、工程導入、建庫連庫、排錯、驗證」的順序走一遍適合剛拿到源碼、想在自己機器上把宿舍寢室管理系統(tǒng)完整跑起來的人。2. JDK8 與 Tomcat 8.5 的安裝從解壓到 startup 正常啟動這一章解決兩個東西JDK 裝哪兒、Tomcat 怎么配。它們倆的關系是 Tomcat 啟動時要去JAVA_HOME找 JVM找不到就閃退找錯了就加載到別的版本上后面編譯 JSP 時一堆Unsupported class file major version就是這么來的。我一般把運行環(huán)境統(tǒng)一放到一個短路徑下比如C:\env\絕不放桌面、不放「我的文檔」、不放帶中文或空格的目錄因為 Tomcat 的啟動腳本、JSP 編譯臨時目錄對空格和中文的處理在老版本上并不友好出了問題日志還很難看出來。2.1 JDK8 的安裝路徑與 JAVA_HOME 配置JDK8 現(xiàn)在官方主推的是 8u202 之后的更新版商用授權規(guī)則有變化本地學習跑項目用 8u202 或者 OpenJDK 的 8 系列都行裝完只要java -version輸出1.8.0_xxx就夠。安裝包雙擊一路下一步也行但我更推薦用解壓版好處是路徑可控、卸載干凈、多版本共存時隨時切。解壓到統(tǒng)一目錄后先配兩個環(huán)境變量。用管理員權限打開 CMD逐條執(zhí)行# 設置 JAVA_HOME注意路徑結(jié)尾不要帶反斜杠 setx JAVA_HOME C:\env\jdk1.8.0_202 /M # 把 JDK 的 bin 追加到系統(tǒng) PATH setx PATH %PATH%;%JAVA_HOME%\bin /Msetx是永久寫環(huán)境變量的命令/M表示寫到系統(tǒng)級而不是當前用戶級不加的話換個終端窗口就失效。這里有個必須提醒的點setx對 PATH 有 1024 字符截斷風險如果你的 PATH 已經(jīng)很長先把原值復制到記事本備份一份再執(zhí)行不然截斷之后一堆命令全找不到只能進注冊表救。另外%JAVA_HOME%\bin最好放在 PATH 靠前的位置因為有些機器上裝過 Oracle 客戶端會自動塞一個C:\ProgramData\Oracle\Java\javapath進去那個目錄優(yōu)先級更高結(jié)果你配了 JAVA_HOMEjava -version顯示的還是另一個版本這種玄學問題排查起來特別費時間。配完關掉所有 CMD 窗口重新開一個驗證java -version javac -version echo %JAVA_HOME%三條輸出里的版本號必須一致。如果java -version是 1.8 但javac -version是 17說明 PATH 里有多個 JDK 在搶回到 PATH 里把多余的刪掉。javac尤其重要Eclipse 編譯 JSP 生成 Servlet 時用的就是它只裝 JRE 不裝 JDK 會報Unable to find a javac compiler。2.2 Tomcat 8.5 解壓版部署端口、編碼、內(nèi)存三個參數(shù)Tomcat 選 8.5.x 系列任意一個小版本都行別用 9 以上的大版本去做老 JSP 項目雖然 9 還保留 javax 命名空間但部分老標簽庫和web.xml的 schema 版本對不上會出現(xiàn)啟動正常、頁面一訪問就 500 的情況。解壓到C:\env\apache-tomcat-8.5.xx目錄結(jié)構(gòu)和 JDK 平級方便統(tǒng)一管理。第一個要改的是conf/server.xml里的 Connector 節(jié)點!-- conf/server.xml找到 8080 那個 Connector 整段替換 -- Connector port8080 protocolHTTP/1.1 connectionTimeout20000 URIEncodingUTF-8 maxThreads200 redirectPort8443 /port是訪問端口如果本機已經(jīng)跑著別的 Web 服務改成 8081、9090 都行改完記得同步改后面訪問地址。URIEncodingUTF-8決定 GET 請求參數(shù)的解碼方式宿舍管理系統(tǒng)里「按樓棟名稱查詢」這種帶中文的 GET 請求如果這里不是 UTF-8后端request.getParameter()拿到的就是亂碼而且 POST 請求不受這個參數(shù)影響很容易誤判成頁面編碼問題。maxThreads默認 200本地開發(fā)不用動寫出來是讓你知道這個位置在哪將來并發(fā)壓測要調(diào)的時候別滿文件找。第二個要改的是 JVM 內(nèi)存參數(shù)正確做法是在bin目錄下新建setenv.batTomcat 啟動時會自動讀它# bin/setenv.batWindows 下用 set 語法等號兩邊不要加空格 set JAVA_OPTS-Xms256m -Xmx512m -XX:MetaspaceSize128m -XX:MaxMetaspaceSize256m -Dfile.encodingUTF-8-Xms是初始堆-Xmx是最大堆本地跑一個宿舍管理系統(tǒng)512m 完全夠。MetaspaceSize是 JDK8 才有的參數(shù)JDK8 已經(jīng)徹底移除了永久代如果你從網(wǎng)上抄來的配置里還寫著-XX:PermSize128mTomcat 會直接啟動失敗報Unrecognized VM option PermSize然后窗口一閃而過什么都看不到——這是 JDK7 時代的老配置流傳最廣的一個坑。-Dfile.encodingUTF-8保證日志和 JSP 編譯時的默認編碼是 UTF-8省掉后面一半的亂碼排查。第三個是確認 Tomcat 用對了 JDK。在bin目錄下開 CMD 執(zhí)行catalina.bat version輸出里會有一行JVM Version必須是 1.8.0_xxx。如果顯示的不是你剛配的那個版本檢查是不是 Tomcat 的setclasspath.bat里硬編碼了JRE_HOME或者系統(tǒng)里殘留了JRE_HOME環(huán)境變量搶在JAVA_HOME前面生效。2.3 首次啟動與基礎驗證雙擊bin/startup.bat會彈出一個黑色窗口正常啟動的最后幾行是Server startup in xxx ms。這個窗口不能關關了服務就停了。瀏覽器訪問http://localhost:8080能看到 Tomcat 的歡迎頁說明 JDK、端口、目錄權限這一層全通了。如果窗口一閃就沒了別急著重新雙擊用 CMD 進到bin目錄執(zhí)行startup.bat錯誤信息會留在當前窗口里這是看啟動失敗原因最直接的方式。另一種方式是看logs/catalina.YYYY-MM-DD.logTomcat 的啟動異常基本都落在里面相當于一個黑匣子閃退之后第一件事就是翻它。常見的是Address already in use: JVM_Bind說明 8080 被占了用netstat -ano | findstr :8080找到 PID再taskkill /PID xxx /F干掉或者直接改端口更省事。3. Eclipse 工程導入讓 JSP 項目在 IDE 里能編譯、能部署環(huán)境裝好只是地基真正讓新手卡住的是 Eclipse 里那個紅叉——明明 Tomcat 單獨跑得好好的一導入工程就滿屏報錯。原因是 JSP 工程依賴三樣東西JDK、Servlet API由 Tomcat 提供、項目自己的 jar 包Eclipse 需要你把這三樣顯式告訴它它不會自動猜。這一章把工程導入、運行時綁定、編譯級別、編碼四件事一次配齊。3.1 Eclipse 版本選擇與 Tomcat 運行時綁定Eclipse 版本別追新。2022-06 之后的版本要求用 JDK 11 以上啟動 IDE 本身你機器上只裝了 JDK8 的話雙擊直接報「必須使用 1.11 或更高版本」然后開始懷疑人生。穩(wěn)妥的選擇是 Eclipse IDE for Enterprise Java Developers 2020-06 或 2021-03這兩個版本用 JDK8 就能啟動同時內(nèi)置的 Web 工具鏈足夠完整。下載頁面上一定要選名字里帶 Enterprise 的那個包普通 Java 版沒有 Server 視圖也沒有 Dynamic Web Project。裝好之后先綁定 TomcatWindow Preferences Server Runtime Environments Add Apache Apache Tomcat v8.5 Tomcat installation directory: C:\env\apache-tomcat-8.5.xx JRE: 選擇 jdk1.8.0_202不要選 jre 目錄這里JRE那一欄默認會讓你選 JRE一定要點「Installed JREs」手動指到 JDK 根目錄。選成tomcat/jre或者系統(tǒng)里的獨立 JRE編譯 JSP 時就沒有 javac報錯信息還挺隱蔽。綁定完成之后Servers視圖里會出現(xiàn)一個 Tomcat 8.5 的服務器實例雙擊它能打開配置頁Server Locations建議選「Use Tomcat installation」讓 Eclipse 直接往你的 Tomcat 目錄里部署這樣 IDE 里跑出來的效果和單獨啟動 Tomcat 完全一致如果選默認的「Use workspace metadata」工程會被扔到.metadata里一個很深的臨時目錄手動去webapps找 war 包會找不到。3.2 導入工程與 Project Facets 校準拿到源碼先看目錄結(jié)構(gòu)。有.project和.classpath的直接File Import General Existing Projects into Workspace選根目錄導入沒有這兩個文件的用File New Dynamic Web Project建一個同名工程再把src、WebContent或web、WebRoot的內(nèi)容拷進去注意別把.settings一起拷。導入之后第一步不是急著運行是校準 Project Facets這是整個 Eclipse 里最容易出錯的地方右鍵工程 Properties Project Facets Dynamic Web Module 勾選版本 3.1 Java 勾選版本 1.8 Java Build Path Libraries 確認 JRE System Library 是 jdk1.8.0_xxx Add Library Server Runtime Apache Tomcat v8.5 Targeted Runtimes 勾選 Apache Tomcat v8.5 Java Compiler Compiler compliance level 設為 1.8Dynamic Web Module 的版本必須和 Tomcat 對上3.0 對應 Servlet 3.0Tomcat 73.1 對應 Servlet 3.1Tomcat 8/8.54.0 對應 Servlet 4.0Tomcat 9。這個版本號會直接寫進web.xml的根節(jié)點版本寫高了 Tomcat 啟動時報The required Server component failed to start寫低了有些注解式 Servlet 又掃不到。Java 版本和 Compiler compliance level 兩處必須都是 1.8只改一處的話Eclipse 會用 1.8 語法檢查但按別的版本編譯lambda或者try-with-resources就會出現(xiàn)莫名其妙的紅波浪線。Targeted Runtimes這一項經(jīng)常被漏掉。它決定 Eclipse 部署時把哪個 Tomcat 的 jar 加進 classpath不勾的話JSP 里所有javax.servlet.*下面的類在編輯器里全是紅的但項目其實能跑——這種「紅著能跑」的狀態(tài)最誤導人會讓人誤刪代碼。3.3 JSP 編碼、編譯級別與部署目錄確認編碼要一次配三處缺一處就會有中文亂碼Window Preferences General Workspace Text file encoding UTF-8 Window Preferences Web JSP Files Encoding ISO 10646/Unicode(UTF-8) Window Preferences General Content Types Text JSP Default encoding UTF-8第一處管 Java 源文件讀寫第二處管 JSP 文件本身第三處管新建 JSP 時的默認編碼。三處統(tǒng)一之后工程里每個 JSP 文件頭部的% page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 %才有意義。很多老項目里pageEncoding寫的是GBK文件本身是 GBK 存的你在 Eclipse 里改成 UTF-8 之后原有中文注釋全變問號頁面輸出也跟著亂——這種情況不要全局改先把文件用文本編輯器轉(zhuǎn)碼保存成 UTF-8再統(tǒng)一聲明順序反了就是白干。部署驗證走一遍Servers視圖右鍵 Tomcat 實例 Add and Remove把工程加進去啟動服務器。啟動日志里會打出工程的 Context Path通常是工程名。瀏覽器訪問http://localhost:8080/工程名/首頁.jsp。如果訪問根路徑http://localhost:8080/工程名/報 404但帶文件名能打開說明web.xml里沒配welcome-file-list老項目常見補上index.jsp就行!-- WebContent/WEB-INF/web.xml -- welcome-file-list welcome-fileindex.jsp/welcome-file welcome-filelogin.jsp/welcome-file /welcome-file-listwelcome-file是按順序找的第一個不存在才找第二個所以把登錄頁放前面更符合這個系統(tǒng)的實際入口。補完記得在Servers視圖里右鍵 Tomcat Clean讓 Eclipse 重新發(fā)布不然改的web.xml還在舊副本里。4. MySQL 5.7 建庫與 JDBC 連接字符集、認證插件、驅(qū)動三件事宿舍寢室管理系統(tǒng)的數(shù)據(jù)模型通常不復雜無非是樓棟、寢室、床位、學生、入住記錄這幾張表真正費時間的是連不上、亂碼、字段超長這三類問題。它們?nèi)紒碜匀齻€地方數(shù)據(jù)庫的字符集、root 的認證插件、JDBC 驅(qū)動 jar 的位置。逐個說。4.1 MySQL 5.7 安裝與 root 認證方式調(diào)整裝 MySQL 5.7 的時候安裝器會問端口、root 密碼、服務名端口保持 3306密碼記牢服務名默認MySQL57就行裝完在服務列表里能看到自動啟動。這一步?jīng)]什么坑坑在裝完之后MySQL 8.0 開始默認認證插件是caching_sha2_password而大量 JSP 老工程配的是mysql-connector-java-5.1.4x驅(qū)動這個驅(qū)動根本不認識新插件連上去會直接拋Unable to load authentication plugin caching_sha2_password。反過來你在 5.7 上跑認證插件是mysql_native_password但如果驅(qū)動 jar 用的是 8.0 版本類名從com.mysql.jdbc.Driver變成了com.mysql.cj.jdbc.DriverClass.forName就會找不到類。版本對齊比什么都重要。確認并統(tǒng)一認證插件用 root 登錄 MySQL 命令行執(zhí)行-- 查看當前 root 的認證插件 SELECT user, host, plugin FROM mysql.user WHERE user root; -- 如果是 caching_sha2_password改成 native 方式 ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密碼; FLUSH PRIVILEGES;mysql_native_password是 5.7 時代的默認值5.1.x 驅(qū)動只認它。FLUSH PRIVILEGES刷新權限表讓改動立刻生效不加的話有時候要重啟服務才認。如果你不想動 root也可以給項目單獨建個賬號權限只給到dorm這一個庫這在實際部署里是更規(guī)范的做法CREATE USER dorm_applocalhost IDENTIFIED WITH mysql_native_password BY App123456; GRANT SELECT, INSERT, UPDATE, DELETE ON dorm_db.* TO dorm_applocalhost; FLUSH PRIVILEGES;只給增刪改查不給 DDL 權限防止程序里某段建表語句把線上表結(jié)構(gòu)改壞。4.2 建庫、導入 SQL 腳本與字符集選擇建庫這一步的字符集必須一次定死中途改代價很大CREATE DATABASE dorm_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE dorm_db;utf8mb4而不是utf8因為 MySQL 里的utf8其實是utf8mb3最多 3 字節(jié)存不下 emoji 和部分生僻字。宿舍管理系統(tǒng)里學生姓名如果出現(xiàn)生僻字用utf8會插入失敗或者變成問號。utf8mb4_general_ci里的ci是不區(qū)分大小寫登錄賬號查詢、樓棟名匹配都用得上除非你的業(yè)務明確要求區(qū)分大小寫否則別選_bin。導入工程自帶的.sql腳本用命令行而不是圖形工具方便看報錯# 先建空庫再導入導入時顯式指定字符集 mysql -uroot -p --default-character-setutf8mb4 dorm_db C:\env\sql\dorm.sql--default-character-setutf8mb4是關鍵。如果你的 sql 腳本是 UTF-8 編碼但客戶端連接默認字符集是 GBK導進去的中文會全部變成亂碼而且導完不報錯等到頁面上顯示出來才發(fā)現(xiàn)那時候數(shù)據(jù)已經(jīng)臟了只能刪庫重導。導入完成后一定抽查一張表SELECT table_name, table_collation FROM information_schema.tables WHERE table_schema dorm_db;所有表的 collation 都應該是utf8mb4_general_ci。如果腳本里寫了ENGINEInnoDB DEFAULT CHARSETutf8表會被建成 utf8mb3和庫級字符集不一致后面 join 或者存生僻字都會出問題穩(wěn)妥的做法是把腳本里的CHARSETutf8批量替換成CHARSETutf8mb4再導。4.3 JDBC 驅(qū)動放置與連接串參數(shù)驅(qū)動 jar 放哪兒是 JSP 項目翻車率最高的一步。放的位置有兩個選擇工程的WebContent/WEB-INF/lib目錄或者 Eclipse 的Java Build Path。正確答案是必須放WEB-INF/libBuild Path只是讓編譯器不報錯部署的時候 Eclipse 不會把 Build Path 里的第三方 jar 復制到 Tomcat 的WEB-INF/lib下運行期自然找不到類報java.lang.ClassNotFoundException: com.mysql.jdbc.Driver。我踩過這個坑不止一次編輯器里一路綠燈一訪問頁面就 500。操作上把mysql-connector-java-5.1.4x.jar直接復制到WebContent/WEB-INF/lib然后右鍵工程 RefreshEclipse 會自動把它加到 Web App Libraries 里不需要手動 Add to Build Path。接著寫連接工具類// src/com/dorm/util/DBUtil.java public class DBUtil { // 5.1.x 驅(qū)動的類名8.0 驅(qū)動是 com.mysql.cj.jdbc.Driver private static final String DRIVER com.mysql.jdbc.Driver; // useUnicode characterEncoding 管中文useSSL 關掉省掉證書警告 private static final String URL jdbc:mysql://127.0.0.1:3306/dorm_db ?useUnicodetruecharacterEncodingutf8useSSLfalse allowPublicKeyRetrievaltrue; private static final String USER dorm_app; private static final String PWD App123456; public static Connection getConn() throws Exception { Class.forName(DRIVER); // 加載驅(qū)動只需一次放在這里夠用 return DriverManager.getConnection(URL, USER, PWD); } }useUnicodetruecharacterEncodingutf8告訴驅(qū)動用 UTF-8 和數(shù)據(jù)庫通信和庫的utf8mb4是兼容的不用改成utf8mb4因為 5.1 驅(qū)動不認這個值。useSSLfalse關掉 SSL 握手本地開發(fā)沒證書不關會打一堆警告日志。allowPublicKeyRetrievaltrue是給 8.0 驅(qū)動準備的5.1 驅(qū)動會忽略它留著不礙事將來換驅(qū)動不用再改連接串。如果你非要用 8.0 驅(qū)動類名和連接串都要換com.mysql.cj.jdbc.Driver再加上serverTimezoneAsia/Shanghai否則時間字段取出來會差 8 小時入住登記時間全部對不上。5. 常見問題排查JSP 能啟動但跑不通的幾類坑這一章記的是實際裝這套東西時反復出現(xiàn)的故障每一條都按「現(xiàn)象、原因、解決」寫清楚遇到時對號入座就行。5.1 啟動與頁面訪問類故障現(xiàn)象一Tomcat 窗口一閃而過手工執(zhí)行 startup.bat 報Unrecognized VM option PermSize。原因setenv.bat或者catalina.bat里殘留了 JDK7 時代的內(nèi)存參數(shù)。JDK8 移除了永久代PermSize、MaxPermSize全部作廢JVM 啟動時直接拒絕。解決把-XX:PermSize和-XX:MaxPermSize刪掉換成-XX:MetaspaceSize128m -XX:MaxMetaspaceSize256m。改完先用catalina.bat version驗證 JVM 能起來再startup.bat。現(xiàn)象二訪問項目路徑報 404但http://localhost:8080的 Tomcat 歡迎頁正常。原因工程沒有真正部署到 Tomcat或者 Context Path 和你以為的不一樣。Eclipse 默認用工程名作為上下文路徑如果Servers視圖里沒執(zhí)行Add and Remove工程根本沒發(fā)布。解決打開Servers視圖雙擊 Tomcat看Modules標簽頁里有沒有你的工程、Path 是不是/工程名。沒有就Add and Remove加進去。也可以反過來在工程上右鍵Run As Run on ServerEclipse 會自動完成注冊?,F(xiàn)象三JSP 頁面里javax.servlet.http.HttpServletRequest報紅或者運行時報NoClassDefFoundError: javax/servlet/http/HttpServlet。原因兩種情況。一是Targeted Runtimes沒勾Eclipse 沒把 Tomcat 的 jar 加進編輯期 classpath二是你誤用了 Tomcat 10它的包名是jakarta.servlet.*javax下的類一個都沒有。解決前者進Properties Targeted Runtimes勾上 Tomcat 8.5后者最省事的就是把 Tomcat 換成 8.5 或 9別在老 JSP 工程上折騰 jakarta 遷移改一遍 import 還要重配web.xml的 schema性價比極低。5.2 數(shù)據(jù)庫與中文編碼類故障現(xiàn)象四訪問登錄頁直接 500堆棧里是java.lang.ClassNotFoundException: com.mysql.jdbc.Driver。原因驅(qū)動 jar 只加到了Java Build Path沒放WEB-INF/lib編譯期能找到、運行期找不到。解決把 jar 復制進WebContent/WEB-INF/libRefresh工程Servers視圖里Clean一次重新發(fā)布。判斷標準很簡單去 Tomcat 的webapps/工程名/WEB-INF/lib目錄下看一眼jar 在不在不在就是沒配對。現(xiàn)象五登錄不進去日志里Access denied for user dorm_applocalhost但密碼明明是對的。原因賬號的 host 不匹配或者認證插件不對。dorm_applocalhost和dorm_app%是兩個不同賬號從 127.0.0.1 連過來時 MySQL 的匹配規(guī)則有時候會讓你以為用的是同一個。認證插件不對的話報錯信息會是Unable to load authentication plugin不是 access denied注意區(qū)分。解決先SELECT user, host, plugin FROM mysql.user;把賬號全列出來確認 host 和 plugin。缺dorm_app127.0.0.1就補一個插件是caching_sha2_password就ALTER USER ... IDENTIFIED WITH mysql_native_password BY ...?,F(xiàn)象六頁面能打開但插入的寢室名、學生姓名在數(shù)據(jù)庫里全是問號。原因鏈路上有任意一環(huán)不是 UTF-8。可能的點包括 JSP 的pageEncoding、request.setCharacterEncoding(UTF-8)沒調(diào)、連接串缺characterEncoding、庫表是 utf8mb3、MySQL 服務端character_set_server是 latin1。五處任何一處不一致都會亂而且表現(xiàn)為「有的頁面亂有的不亂」特別迷惑。解決別一處一處猜直接查服務端變量定位SHOW VARIABLES LIKE character_set%;character_set_server、character_set_database、character_set_connection三個都應該是utf8mb4。不是的話在my.ini的[mysqld]段加上character-set-serverutf8mb4和collation-serverutf8mb4_general_ci重啟服務。程序側(cè)再補一個過濾器統(tǒng)一設編碼比在每個 Servlet 里寫一行setCharacterEncoding靠譜// src/com/dorm/filter/EncodingFilter.java public class EncodingFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { req.setCharacterEncoding(UTF-8); // 只管 POST 體GET 靠 Tomcat 的 URIEncoding resp.setCharacterEncoding(UTF-8); chain.doFilter(req, resp); } }過濾器要在web.xml里注冊并且filter-mapping放最前面保證它在所有 Servlet 之前執(zhí)行。GET 請求的中文在 Tomcat 8 之后默認就是 UTF-8但如果server.xml里顯式寫了別的URIEncoding會被覆蓋回頭查一遍第 2 章那段配置。6. 裝完怎么驗證從登錄到宿舍分配走一遍完整鏈路環(huán)境裝完、工程跑起來不代表這套宿舍寢室管理系統(tǒng)就通了。我習慣做一次端到端驗證把「讀」和「寫」都覆蓋到因為只打開登錄頁看不出連接池、事務、字符集這些問題。驗證按下面這張表逐項過每項都有明確的通過標準驗證項操作路徑通過標準JSP 編譯訪問登錄頁頁面正常渲染Tomcat 日志無 JasperException數(shù)據(jù)庫連接輸入正確賬號密碼登錄跳轉(zhuǎn)首頁不出現(xiàn) 500查詢功能寢室列表按樓棟篩選列表有數(shù)據(jù)中文樓棟名不亂碼寫入功能新增一條寢室記錄數(shù)據(jù)庫里能查到字段值完整中文往返新增帶中文的寢室名再查出來頁面顯示與輸入一致時間字段查看入住登記時間與系統(tǒng)時間一致不差 8 小時第六項最容易被忽略。如果用的是 8.0 驅(qū)動又沒配serverTimezone時間會整體偏 8 小時本地測試看不太出來一上線就出問題。驗證時直接往數(shù)據(jù)庫插一條記錄對比SELECT NOW()和頁面顯示的時間差 8 小時就回去補連接串參數(shù)。寫入驗證之后一定要回數(shù)據(jù)庫確認別只看頁面提示「保存成功」-- 驗證寫入同時確認中文沒有變成問號 SELECT id, room_no, building, capacity, create_time FROM dorm_room ORDER BY id DESC LIMIT 5;room_no和building如果是???或者空串說明寫入鏈路上還有編碼問題回第 5 章第 6 條排查。如果create_time是0000-00-00檢查表字段有沒有設默認值以及 Java 側(cè)傳的是java.util.Date還是LocalDateTime——5.1 驅(qū)動對LocalDateTime支持不好會靜默失敗這種不報錯的問題最難查。最后一步是把工程打成 war 包脫離 Eclipse 單獨部署一次# 在工程根目錄執(zhí)行產(chǎn)物丟到 Tomcat 的 webapps 下 jar -cvf dorm.war -C WebContent .然后用startup.bat啟動 Tomcat訪問http://localhost:8080/dorm/能正常登錄就說明這個工程不依賴 Eclipse 的元數(shù)據(jù)可以交付了。這一步是很多人的盲區(qū)IDE 里跑得好好的war 包一部署就 500八成是WEB-INF/lib漏了 jar或者classes目錄沒打進去。有一條血淚經(jīng)驗——從那以后我每次拿到一份 JSP 源碼都先把 JDK 小版本、Tomcat 大版本、驅(qū)動版本這三行寫在便簽上貼屏幕邊上裝一步核一步再也不敢「先跑起來再說」。版本這種看起來最枯燥的東西往往就是那個讓你折騰一整晚的坑。希望幫到你。本文還有配套的精品資源點擊獲取