院預(yù)約掛號(hào)系統(tǒng)部署實(shí)戰(zhàn):從環(huán)境配置到二次開(kāi)發(fā))
簡(jiǎn)介一份基于JspServlet技術(shù)棧的醫(yī)院預(yù)約掛號(hào)系統(tǒng)項(xiàng)目源碼面向Java初學(xué)者及課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)需求演示了經(jīng)典JSPServletMySQL的開(kāi)發(fā)流程與分層思路。壓縮包共1451個(gè)文件以jsp頁(yè)面、java類、servlet控制器和JavaScript腳本為主另含sql數(shù)據(jù)庫(kù)腳本、jar依賴庫(kù)、XML配置文件以及部署工具資源總大小31.95MB。系統(tǒng)前端提供首頁(yè)展示、用戶注冊(cè)、醫(yī)生查詢和公告瀏覽等基礎(chǔ)功能后端管理模塊則涵蓋醫(yī)院信息、科室信息、醫(yī)生信息、會(huì)員信息以及系統(tǒng)公告的維護(hù)功能結(jié)構(gòu)清晰具備開(kāi)箱即用的完整度。包內(nèi)同步附有部署教程和軟件工具說(shuō)明針對(duì)Eclipse/IDEA、JDK1.8、MySQL5.7及Tomcat7/8/9給出搭配方式能有效降低環(huán)境配置門(mén)檻。目前已有134人學(xué)習(xí)下載適合需要快速搭建預(yù)約掛號(hào)演示項(xiàng)目、理解傳統(tǒng)ServletJSP分層結(jié)構(gòu)的開(kāi)發(fā)者參考使用。1. 這套 JspServlet 醫(yī)院預(yù)約掛號(hào)系統(tǒng)為什么值得你花半小時(shí)跑起來(lái)JspServlet 這套組合放到今天看確實(shí)有點(diǎn)老但在課程設(shè)計(jì)、畢業(yè)設(shè)計(jì)和中小型公司內(nèi)部系統(tǒng)里它依然是出現(xiàn)頻率最高的一套技術(shù)棧。這套醫(yī)院預(yù)約掛號(hào)系統(tǒng)正是標(biāo)準(zhǔn)的 JSPServlet 三層結(jié)構(gòu)前端覆蓋首頁(yè)展示、用戶注冊(cè)、醫(yī)生查詢、公告信息后端把醫(yī)院、科室、醫(yī)生、會(huì)員、公告五類信息的增刪改查全部做全功能齊全拿下來(lái)改一改就能當(dāng)課設(shè)或畢設(shè)交。適合有 Java 基礎(chǔ)、想在最短時(shí)間內(nèi)看到一套完整 Web 項(xiàng)目跑起來(lái)的人也適合想復(fù)用后臺(tái)管理端代碼的從業(yè)者。項(xiàng)目自帶數(shù)據(jù)庫(kù)腳本、部署說(shuō)明和開(kāi)發(fā)工具配置指引不用自己從頭拼環(huán)境這也是我推薦你先從這套入手的原因。2. 環(huán)境選型JDK 1.8、MySQL 5.7、Tomcat 8 是這套代碼的最優(yōu)解2.1 為什么鎖定這三個(gè)版本而不是追求新版很多第一次拿到 JSP 項(xiàng)目的人第一反應(yīng)是裝最新版 JDK 和 Tomcat結(jié)果編譯不過(guò)去或者啟動(dòng)直接報(bào) ClassNotFound。這不是代碼的問(wèn)題是版本組合的問(wèn)題算是 JSP 老項(xiàng)目最常見(jiàn)的翻車現(xiàn)場(chǎng)之一。這套代碼是基于 javax.servlet 包寫(xiě)的傳統(tǒng) Servlet沒(méi)有用 Spring Boot 那套內(nèi)嵌容器。Tomcat 8 對(duì)應(yīng) Servlet 3.1 規(guī)范對(duì) JSP 2.3 的支持非常完整和 JDK 1.8 配合最穩(wěn)。MySQL 5.7 這層向下兼容 5.5、5.6 的項(xiàng)目向上不兼容 MySQL 8 的驅(qū)動(dòng)和 URL 參數(shù)所以項(xiàng)目說(shuō)明里特別標(biāo)注了 MySQL 5.7這個(gè)標(biāo)注不是隨便寫(xiě)的。我一般建議直接用 Tomcat 8 JDK 1.8 MySQL 5.7 這個(gè)組合IDE 用 Eclipse 或 IDEA 都行。Tomcat 7 也能跑但部分新特性不支持Tomcat 9 默認(rèn)走 Servlet 4.0遇到老項(xiàng)目偶爾會(huì)在 EL 表達(dá)式和 JSTL 標(biāo)簽上踩坑。以下是我在實(shí)際部署中推薦的版本組合組件推薦版本原因JDK1.8Servlet 編譯兼容性最好javax.servlet 包完整MySQL5.7驅(qū)動(dòng)為 5.1.xURL 參數(shù)與 8.x 差異大Tomcat8.5對(duì)應(yīng) Servlet 3.1 規(guī)范穩(wěn)定且資料多IDEEclipse / IDEA都能直接導(dǎo)入項(xiàng)目無(wú)特殊依賴2.2 數(shù)據(jù)庫(kù)腳本導(dǎo)入一條命令搞定核心表結(jié)構(gòu)項(xiàng)目里自帶數(shù)據(jù)庫(kù)腳本通常是 .sql 文件。導(dǎo)入之前先確認(rèn) MySQL 服務(wù)已經(jīng)啟動(dòng)然后打開(kāi)命令行執(zhí)行mysql -u root -p hospital.sql mysql -u root -p -e show tables;第一行命令中-u指定用戶名-p表示交互輸入密碼把 .sql 文件內(nèi)容作為輸入喂給 mysql 客戶端hospital.sql是項(xiàng)目自帶的建庫(kù)建表腳本。第二行用來(lái)驗(yàn)證導(dǎo)入結(jié)果-e后面直接跟 SQL 語(yǔ)句show tables會(huì)列出當(dāng)前庫(kù)里的所有表看到醫(yī)院信息表、科室表、醫(yī)生表、會(huì)員表、公告表這五張核心表就算成功了。如果腳本文件不在當(dāng)前目錄用絕對(duì)路徑mysql -u root -p /path/to/hospital.sqlWindows 下路徑里是反斜杠注意對(duì)引號(hào)的轉(zhuǎn)義。導(dǎo)入前還要確認(rèn)建庫(kù)語(yǔ)句里的字符集建議建庫(kù)時(shí)直接用DEFAULT CHARACTER SET utf8mb4否則后面 JSP 頁(yè)面顯示中文極易亂碼。這一步是很多人事后后悔的地方因?yàn)閹?kù)已經(jīng)建好、數(shù)據(jù)已經(jīng)錄入之后再回頭改字符集非常痛苦。3. 看懂這個(gè)項(xiàng)目的骨架從表結(jié)構(gòu)到 Servlet 路由3.1 數(shù)據(jù)庫(kù)核心表五張表怎么關(guān)聯(lián)不用急著進(jìn)代碼先把表結(jié)構(gòu)看明白。這個(gè)系統(tǒng)的核心是科室、醫(yī)生、會(huì)員這三張業(yè)務(wù)表加一張醫(yī)院信息表做基礎(chǔ)配置一張公告表做內(nèi)容發(fā)布總共五張表彼此關(guān)聯(lián)不復(fù)雜??剖冶砗歪t(yī)生表是典型的主從關(guān)系科室表的 id 被醫(yī)生表的 department_id 引用。會(huì)員表存注冊(cè)用戶的基礎(chǔ)信息公告表是后臺(tái)發(fā)布的通知公告醫(yī)院信息表更多是配置級(jí)的比如醫(yī)院名稱、地址、聯(lián)系電話這類展示在前臺(tái)頁(yè)腳的數(shù)據(jù)。以科室表和醫(yī)生表為例CREATE TABLE department ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 科室ID, name VARCHAR(50) NOT NULL COMMENT 科室名稱, intro TEXT COMMENT 科室介紹, create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 創(chuàng)建時(shí)間 ); CREATE TABLE doctor ( id INT PRIMARY KEY AUTO_INCREMENT COMMENT 醫(yī)生ID, name VARCHAR(30) NOT NULL COMMENT 醫(yī)生姓名, department_id INT NOT NULL COMMENT 所屬科室ID, title VARCHAR(30) COMMENT 職稱, good_at VARCHAR(255) COMMENT 擅長(zhǎng)領(lǐng)域, FOREIGN KEY (department_id) REFERENCES department(id) );邏輯說(shuō)明doctor 表的 department_id 外鍵指向 department 表的 id這是整個(gè)系統(tǒng)里最關(guān)鍵的一對(duì)關(guān)聯(lián)。你要實(shí)現(xiàn)“按科室找醫(yī)生”這個(gè)功能SQL 就是關(guān)聯(lián)這兩張表查詢。注意建表語(yǔ)句里沒(méi)有寫(xiě)庫(kù)名所以導(dǎo)入之前一定要先執(zhí)行USE hospital;否則表會(huì)建到默認(rèn)庫(kù)里。3.2 Servlet 路由web.xml 里的映射關(guān)系這個(gè)項(xiàng)目沒(méi)有用任何 MVC 框架請(qǐng)求怎么走全靠 web.xml 里的 servlet-mapping。比如你訪問(wèn)/doctorListweb.xml 里配的是 DoctorServlet然后 Servlet 根據(jù) action 參數(shù)決定調(diào)用哪個(gè)業(yè)務(wù)方法。這是 JSPServlet 項(xiàng)目最經(jīng)典的寫(xiě)法搞清楚這一層整個(gè)項(xiàng)目代碼就能看懂了。servlet servlet-nameDoctorServlet/servlet-name servlet-classcom.hospital.servlet.DoctorServlet/servlet-class /servlet servlet-mapping servlet-nameDoctorServlet/servlet-name url-pattern/doctorList/url-pattern /servlet-mapping參數(shù)說(shuō)明servlet-name 是邏輯名稱servlet-class 是 Servlet 類的全限定名url-pattern 是前端頁(yè)面訪問(wèn)的路徑。以后要加新功能先在這里加一條映射別自己在頁(yè)面里亂寫(xiě)請(qǐng)求路徑否則 Tomcat 啟動(dòng)時(shí)不會(huì)報(bào)錯(cuò)但請(qǐng)求一過(guò)去就是 404。Servlet 里常見(jiàn)的做法是根據(jù) action 參數(shù)分發(fā)請(qǐng)求這樣的寫(xiě)法在老項(xiàng)目里是標(biāo)配protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String action request.getParameter(action); if (query.equals(action)) { // 跳轉(zhuǎn)到醫(yī)生查詢邏輯 listDoctors(request, response); } else if (addDoctor.equals(action)) { // 跳轉(zhuǎn)到新增醫(yī)生邏輯 addDoctor(request, response); } else if (updateDoctor.equals(action)) { // 跳轉(zhuǎn)到修改醫(yī)生邏輯 updateDoctor(request, response); } request.getRequestDispatcher(/doctorList.jsp).forward(request, response); }這段代碼里的 action 參數(shù)來(lái)自前端表單里的隱藏字段你看到 JSP 頁(yè)面里有input typehidden nameaction valueaddDoctor這樣的寫(xiě)法就是往這個(gè)分發(fā)邏輯走的。這種寫(xiě)法代碼集中但也容易讓一個(gè) Servlet 越來(lái)越臃腫所以看完這個(gè)項(xiàng)目的結(jié)構(gòu)后你會(huì)對(duì)“為什么要用 Spring MVC 做路由”有更具體的體感。3.3 前端頁(yè)面調(diào)用鏈從首頁(yè)展示到會(huì)員個(gè)人信息展示頁(yè)前端的調(diào)用鏈路是這個(gè)項(xiàng)目的另一條主線。以用戶注冊(cè)為例用戶在注冊(cè)頁(yè)面填寫(xiě)信息提交到 MemberServlet 的 register 分支Servlet 調(diào)用 DAO 層把數(shù)據(jù)寫(xiě)入 member 表成功后重定向到登錄頁(yè)或首頁(yè)。首頁(yè)的醫(yī)生查詢、公告列表也是同樣的鏈路只是沒(méi)有寫(xiě)操作。這里有一條血淚經(jīng)驗(yàn)JSP 項(xiàng)目里頁(yè)面跳轉(zhuǎn)有兩種方式轉(zhuǎn)發(fā)forward和重定向redirect。用 forward 的話URL 不會(huì)變刷新頁(yè)面會(huì)導(dǎo)致表單重復(fù)提交用 redirect 的話URL 變成新地址但 request 域里的屬性會(huì)丟失。這個(gè)項(xiàng)目里登錄成功一般用 redirect因?yàn)橐宓舯韱螀?shù)查詢展示用 forward把數(shù)據(jù)帶到 JSP 頁(yè)面渲染這兩者千萬(wàn)別搞反。會(huì)員個(gè)人信息展示頁(yè)就是典型的 forward 場(chǎng)景。查詢出會(huì)員對(duì)象后放進(jìn) request 域再轉(zhuǎn)發(fā)到個(gè)人信息 JSP 頁(yè)面Member member memberDao.selectById(id); request.setAttribute(member, member); request.getRequestDispatcher(/memberInfo.jsp).forward(request, response);參數(shù)說(shuō)明selectById返回會(huì)員對(duì)象request.setAttribute把對(duì)象綁定到請(qǐng)求域JSP 頁(yè)面再用${member.username}這類 EL 表達(dá)式取出來(lái)展示。你需要改個(gè)人信息頁(yè)面的展示字段時(shí)就改 JSP 里的 EL 表達(dá)式不需要?jiǎng)?Servlet 代碼。4. 把項(xiàng)目跑起來(lái)從導(dǎo)入到看到首頁(yè)的完整流程4.1 Eclipse 導(dǎo)入與 Tomcat 配置以 Eclipse 為例File → Import → General → Existing Projects into Workspace選擇項(xiàng)目目錄注意勾選 Search for nested projects避免目錄層級(jí)嵌套過(guò)深導(dǎo)致導(dǎo)入后是個(gè)空殼。導(dǎo)入之后先找到數(shù)據(jù)庫(kù)配置文件一般是 db.properties 或 jdbc.properties改成你自己的 MySQL 賬號(hào)密碼jdbc.drivercom.mysql.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/hospital?characterEncodingUTF-8 jdbc.usernameroot jdbc.password123456參數(shù)說(shuō)明characterEncodingUTF-8必須保留否則中文亂碼數(shù)據(jù)庫(kù)名 hospital 要和第 2 章導(dǎo)入時(shí)保持一致用戶名密碼改成你自己 MySQL 的實(shí)際配置。這一步改完先保存確認(rèn)文件放在 src 目錄下能被編譯到 classes 里。接著在 Eclipse 里配置 TomcatWindow → Preferences → Server → Runtime Environments → Add選擇 Tomcat 8填 Tomcat 安裝目錄。然后在 Servers 視圖右鍵 → New → Server選擇已經(jīng)配置好的 Tomcat 8。這個(gè)項(xiàng)目的 Servlet 路由本身就是一份可以當(dāng) servlet demo 抄的樣例建議把 WEB-INF 下 web.xml 完整瀏覽一遍后續(xù)所有前后端聯(lián)調(diào)都依賴這里。4.2 啟動(dòng)與功能驗(yàn)證路徑啟動(dòng) Tomcat 之后訪問(wèn)http://localhost:8080/hospital/用這條路徑走一遍驗(yàn)證流程首頁(yè)能看到公告信息和醫(yī)院基本信息注冊(cè)一個(gè)新會(huì)員用注冊(cè)的賬號(hào)登錄按科室查詢醫(yī)生列表點(diǎn)進(jìn)醫(yī)生詳情后臺(tái)登錄在地址欄輸入對(duì)應(yīng)的后臺(tái)管理員路徑看后臺(tái)管理界面能否正常加載后臺(tái)管理端就是醫(yī)院信息管理、科室信息管理、醫(yī)生信息管理、會(huì)員信息管理、系統(tǒng)公告信息管理五個(gè)模塊每個(gè)模塊都是標(biāo)準(zhǔn)的列表 新增 修改 刪除。不需要每個(gè)按鈕都點(diǎn)一遍驗(yàn)證兩條鏈路足夠一條是前臺(tái)用戶鏈路注冊(cè)會(huì)員、查醫(yī)生、看公告一條是后臺(tái)管理員鏈路登錄、修改公告、查看會(huì)員列表。兩條鏈路都能走通這個(gè)項(xiàng)目在你的機(jī)器上就算完全跑起來(lái)了。4.3 首頁(yè)一直打不開(kāi)或 404 怎么辦先看 Tomcat 啟動(dòng)日志有沒(méi)有異常重點(diǎn)找Caused by那行。最常見(jiàn)的是數(shù)據(jù)庫(kù)連不上報(bào)Communications link failure那就是第 4.1 里的 URL 寫(xiě)錯(cuò)了或 MySQL 服務(wù)沒(méi)啟動(dòng)。另一個(gè)常見(jiàn)問(wèn)題是項(xiàng)目沒(méi)有真正部署到 Tomcat 的 webapps 目錄Eclipse 里右鍵項(xiàng)目 → Run As → Run on Server 的時(shí)候要選擇剛才配置好的 Tomcat 8不要選默認(rèn)的 J2EE Preview 服務(wù)器那不是一個(gè)完整的 Servlet 容器。5. 部署避坑這五個(gè)問(wèn)題讓我白折騰了兩天5.1 注冊(cè)頁(yè)中文全部變成問(wèn)號(hào)現(xiàn)象頁(yè)面輸入中文提交后數(shù)據(jù)庫(kù)里存的全是??前臺(tái)的公告標(biāo)題也是亂碼。原因數(shù)據(jù)庫(kù)連接 URL 沒(méi)有指定characterEncodingUTF-8或者建庫(kù)時(shí)字符集還是默認(rèn)的 latin1。解決先改 jdbc.properties加上characterEncodingUTF-8然后重建數(shù)據(jù)庫(kù)建庫(kù)語(yǔ)句用CREATE DATABASE hospital DEFAULT CHARACTER SET utf8mb4;重新導(dǎo)入腳本。順序不能反先改配置再重建庫(kù)否則數(shù)據(jù)還是要亂。5.2 Servlet 編譯報(bào)錯(cuò)找不到 javax.servlet 包現(xiàn)象Eclipse 里javax.servlet.http.HttpServlet下面直接畫(huà)紅叉項(xiàng)目無(wú)法編譯。原因項(xiàng)目沒(méi)有關(guān)聯(lián) Tomcat 運(yùn)行環(huán)境或者本地 JDK 版本過(guò)高JDK 11 以上把一部分 Java EE 模塊移除了。解決項(xiàng)目右鍵 → Properties → Java Build Path → Libraries → Add Library → Server Runtime → 選 Tomcat 8。這個(gè)操作做完基本能消掉編譯錯(cuò)誤。如果本地強(qiáng)行用 JDK 17還需要手動(dòng)把 Tomcat 目錄里 lib 下的 servlet-api.jar 加進(jìn)來(lái)但我不建議這么弄直接裝 JDK 1.8 最省事。5.3 Tomcat 啟動(dòng)報(bào)端口被占用現(xiàn)象啟動(dòng)時(shí)彈窗提示Port 8080 required by Tomcat 8 is already in use。原因系統(tǒng)上已經(jīng)有進(jìn)程占用 8080可能是另一個(gè) Tomcat也可能是別的開(kāi)發(fā)工具。解決Windows 下命令行執(zhí)行netstat -ano | findstr :8080 taskkill /F /PID 對(duì)應(yīng)PID第一行查到占用 8080 的進(jìn)程 PID第二行強(qiáng)制結(jié)束它。如果你不想動(dòng)那個(gè)進(jìn)程也可以改 Tomcat 的server.xml把 HTTP 端口從 8080 改成 8081改完記得重啟 Tomcat訪問(wèn)地址也要跟著改成http://localhost:8081/hospital/。5.4 數(shù)據(jù)庫(kù)連接失敗 Communications link failure現(xiàn)象啟動(dòng)日志出現(xiàn)com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure后端所有涉及數(shù)據(jù)庫(kù)的請(qǐng)求全部報(bào)錯(cuò)。原因MySQL 沒(méi)啟動(dòng)、IP 或端口寫(xiě)錯(cuò)、MySQL 8 驅(qū)動(dòng)差異。MySQL 8 已經(jīng)把驅(qū)動(dòng)類從com.mysql.jdbc.Driver換成了com.mysql.cj.jdbc.DriverURL 還要額外加serverTimezoneAsia/Shanghai所以這套項(xiàng)目直接鎖 MySQL 5.7 就是不想讓你踩這個(gè)坑。解決先用services.msc確認(rèn) MySQL 服務(wù)在運(yùn)行然后本機(jī)命令行執(zhí)行mysql -u root -p能登錄說(shuō)明服務(wù)正常。接著看 db.properties 里的 URL 有沒(méi)有把 localhost 寫(xiě)成別的地址。如果只有 MySQL 8必須換 cj 驅(qū)動(dòng)類并加時(shí)區(qū)參數(shù)。5.5 改了代碼刷新頁(yè)面還是舊內(nèi)容現(xiàn)象修改 JSP 或 Servlet 之后瀏覽器刷新還是看到舊頁(yè)面甚至重啟 Tomcat 都沒(méi)用。原因Tomcat 沒(méi)開(kāi)自動(dòng)熱部署或者瀏覽器緩存了靜態(tài)資源再或者 Tomcat 的 work 目錄里有編譯緩存。解決檢查server.xml里的reloadabletrue開(kāi)發(fā)階段建議打開(kāi)瀏覽器強(qiáng)制刷新Ctrl F5還不行就把 Tomcat 安裝目錄下 work 文件夾里的緩存文件清空再重啟 Tomcat。work 目錄的緩存偶爾會(huì)作妖這個(gè)問(wèn)題排查順序通常是瀏覽器緩存 → Tomcat 熱部署開(kāi)關(guān) → work 目錄。6. 二次開(kāi)發(fā)給系統(tǒng)加上預(yù)約時(shí)段選擇功能這個(gè)項(xiàng)目基礎(chǔ)信息管理做得很完整但“預(yù)約”這件事本身比較輕——用戶查完醫(yī)生沒(méi)有一個(gè)具體時(shí)段的概念前臺(tái)鏈路在醫(yī)生查詢之后就斷了。加一個(gè)預(yù)約時(shí)段選擇功能正好讓你把整條鏈路完整練一遍從表到 Servlet 到 JSP 全走一次這在答辯時(shí)也是很好的完整度加分項(xiàng)。第一步加字段。給預(yù)約記錄相關(guān)表加一個(gè)time_slot字段類型用 VARCHAR(20)存上午、下午、晚間這種文本也可以存具體時(shí)間段。SQL 示例如下ALTER TABLE appointment ADD COLUMN time_slot VARCHAR(20) DEFAULT 上午 COMMENT 預(yù)約時(shí)段;表名以你導(dǎo)入的腳本里實(shí)際存在的預(yù)約表為準(zhǔn)只是一條 ALTER 語(yǔ)句注意字段名不要和已有的列重名。第二步在 Servlet 新增一個(gè)分支。以 DoctorServlet 為例在 doPost 里加一段處理預(yù)約的邏輯讀取前端傳來(lái)的 doctorId、memberId、timeSlot 三個(gè)參數(shù)調(diào) DAO 方法插入預(yù)約記錄。在做插入之前至少要判斷這三個(gè)參數(shù)不能為空這是最基礎(chǔ)的非空校驗(yàn)也是能體現(xiàn)代碼嚴(yán)謹(jǐn)?shù)牡胤?。第三步改前端表單。在醫(yī)生列表或醫(yī)生詳情頁(yè)里加一個(gè)下拉框選項(xiàng)是上午、下午、晚間nametimeSlot表單提交路徑指向剛才的 Servlet 分支。提交之后讓頁(yè)面跳轉(zhuǎn)到個(gè)人信息展示頁(yè)用戶能在個(gè)人信息展示頁(yè)面看到自己的預(yù)約記錄這個(gè)頁(yè)面可以直接復(fù)用第 3 章說(shuō)的 forward 模式來(lái)渲染。測(cè)試時(shí)用一個(gè)真實(shí)用戶走完整流程注冊(cè)會(huì)員 → 查醫(yī)生 → 填時(shí)段提交 → 在個(gè)人信息展示頁(yè)看到預(yù)約記錄。走完這一圈這個(gè)系統(tǒng)的預(yù)約鏈路才算真正合上了。我以前接手這種老項(xiàng)目時(shí)總習(xí)慣拿到代碼就動(dòng)手改功能不先把運(yùn)行環(huán)境理順結(jié)果經(jīng)常在“跑起來(lái)”這一步卡半天很憋屈。從那以后我每次拿到 JSP 源碼都強(qiáng)制自己先看三樣?xùn)|西web.xml 里的 servlet-mapping、db.properties 里的連接 URL、建庫(kù)腳本的字符集。這三樣不出錯(cuò)項(xiàng)目基本能順利跑起來(lái)剩下才是功能層面的事。這個(gè)順序能幫你省下大量定位問(wèn)題的時(shí)間希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取