:從數(shù)據(jù)庫設計到答辯全流程實戰(zhàn))
簡介這份答辯PPT圍繞基于JSP的服裝商城交易管理系統(tǒng)展開適合計算機相關專業(yè)畢業(yè)生用于畢業(yè)設計答辯展示也可供學習JSP開發(fā)的學習者參考。內(nèi)容涵蓋選題意義、課題背景、開發(fā)環(huán)境與核心技術等模塊重點講解JSP、Servlet、數(shù)據(jù)庫管理以及HTML、CSS、JavaScript等前端交互技術的配合應用并梳理了需求分析、系統(tǒng)設計、編碼實現(xiàn)、測試優(yōu)化與上線維護的完整開發(fā)流程能幫助讀者理解服裝電商平臺的功能架構與業(yè)務邏輯。資源共1個PPTX文件壓縮包大小約739KB內(nèi)容精煉、結構清晰便于直接修改和演示適合需要快速準備答辯材料或了解該課題設計思路的用戶。目前已有138人學習下載。1. 為什么“JSP服裝商城交易管理系統(tǒng)”仍是答辯臺和實訓課上的常青樹每年畢業(yè)季都能看到一批以“基于JSP的XX管理系統(tǒng)”為標題的答辯PPT其中服裝商城交易管理系統(tǒng)是出場率最高的那一類。原因很實際JSP上手曲線平緩ServletJSPMySQL這套組合能在一臺普通筆記本上完整跑通不用額外裝中間件不用寫復雜的前后端分離工程一個人從建表到答辯演示完全能控制住工作量。對做課設、畢業(yè)設計的人來說這不是“過時技術”而是一個能在有限時間內(nèi)把業(yè)務邏輯講清楚、把數(shù)據(jù)庫設計展示明白的最小可行方案。這套系統(tǒng)核心要回答的問題有三個服裝商品怎么錄入和展示用戶怎么把衣服放進購物車并完成下單訂單和庫存怎么保持一致。答得越具體答辯通過率越高。這篇筆記就按我實際帶課設項目的順序來寫從表和模塊拆到避坑細節(jié)再落到一份能直接照著講的答辯PPT結構。2. 先把業(yè)務邊界劃清楚服裝商城的模塊拆分與核心表設計2.1 從“買衣服”這個動作反推系統(tǒng)邊界不少同學拿到題目第一反應是去網(wǎng)上找一份代碼然后對著表結構反推功能。這其實把順序搞反了。正確的做法是先從“買衣服”這個動作出發(fā)把用戶會做的事列出來系統(tǒng)邊界自然會浮出來。用戶要注冊登錄要瀏覽服裝列表要按分類篩選要看商品詳情圖要把不同尺碼和顏色的衣服加入購物車要填收貨地址并提交訂單要查看訂單狀態(tài)甚至取消訂單。管理員要做的事情是另一條線登錄后臺、錄入服裝商品、維護庫存、處理訂單發(fā)貨、查看統(tǒng)計信息。把這兩條線畫成用例圖模塊就清楚了。這決定了系統(tǒng)的標準分層前臺用戶模塊、商品展示模塊、購物車模塊、訂單模塊后臺管理員模塊、商品管理模塊、訂單管理模塊。答辯PPT里最忌諱把“商城系統(tǒng)”寫成無限擴張的大平臺比如硬加秒殺、優(yōu)惠券、積分商城。那些功能不是不能提但放在“后期展望”里講一句就夠了放進核心設計里只會讓評委追問到你自己都圓不住。2.2 用戶-商品-訂單三張核心表的設計與字段取舍服裝商城和圖書商城最大的不同在規(guī)格上同一款衣服有顏色、尺碼、庫存三個維度。很多照著圖書商城寫的代碼在這地方翻車因為圖書不拆SKU訂單明細表里只存一個商品ID和數(shù)量遇到服裝就必須多存兩個字段。我一般建議核心表控制在五到六張用戶表、服裝商品表含款式與分類、商品規(guī)格表顏色尺碼庫存、購物車表、訂單表、訂單明細表。以下是一組可以直接用的建表SQLCREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL, nickname VARCHAR(50), receiver_name VARCHAR(30), receiver_phone VARCHAR(20), receiver_address VARCHAR(255), create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE clothing_product ( id INT PRIMARY KEY AUTO_INCREMENT, category_id INT NOT NULL, name VARCHAR(100) NOT NULL, description TEXT, main_image VARCHAR(255), price DECIMAL(10,2) NOT NULL, status TINYINT DEFAULT 1, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE product_sku ( id INT PRIMARY KEY AUTO_INCREMENT, product_id INT NOT NULL, color VARCHAR(30), size VARCHAR(10), stock INT NOT NULL DEFAULT 0, UNIQUE KEY uk_product_spec (product_id, color, size) );這段SQL有三個值得在答辯時主動講的點。第一個是UNIQUE KEY uk_product_spec它從數(shù)據(jù)庫層面保證同一個商品不會出現(xiàn)兩條顏色、尺碼完全相同的SKU記錄比單純在Java代碼里判斷更可靠。第二個是DECIMAL(10,2)而不是FLOAT存價格避免浮點誤差這也是評委喜歡聽的細節(jié)。第三是status字段做上下架邏輯而不是刪商品記錄因為訂單明細外鍵往往指著商品表物理刪除會導致歷史訂單變成殘缺數(shù)據(jù)。訂單表建議單獨設計不要把整個購物車內(nèi)容直接拼成一個字符串塞進訂單表。CREATE TABLE orders ( id INT PRIMARY KEY AUTO_INCREMENT, order_no VARCHAR(32) NOT NULL UNIQUE, user_id INT NOT NULL, total_amount DECIMAL(10,2) NOT NULL, status TINYINT NOT NULL DEFAULT 0, receiver_name VARCHAR(30), receiver_phone VARCHAR(20), receiver_address VARCHAR(255), create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE order_item ( id INT PRIMARY KEY AUTO_INCREMENT, order_id INT NOT NULL, product_id INT NOT NULL, product_name VARCHAR(100), color VARCHAR(30), size VARCHAR(10), price DECIMAL(10,2) NOT NULL, quantity INT NOT NULL DEFAULT 1 );order_item里冗余了product_name、color、size、price這幾個字段。這不是偷懶而是刻意做的反規(guī)范化設計商品名稱和價格可能調(diào)整用戶歷史訂單里的快照不應該跟著變。答辯時能說清“為什么冗余”和“為什么不能冗余”比背十條范式規(guī)則有用得多。2.3 用DBHelper加JSP跑通最小骨架設計完表下一步不是急著寫十幾個頁面而是先跑通一條最小鏈路首頁列出商品點詳情加入購物車提交訂單。這條鏈路通了剩下都是重復勞動。連接數(shù)據(jù)庫的公共類我習慣寫成靜態(tài)方法避免每個Servlet重復寫DriverManager代碼public class DBHelper { static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { String url jdbc:mysql://localhost:3306/fashion_mall ?useUnicodetruecharacterEncodingutf8 useSSLfalseserverTimezoneAsia/Shanghai; return DriverManager.getConnection(url, root, 123456); } public static void close(ResultSet rs, Statement stmt, Connection conn) { if (rs ! null) { try { rs.close(); } catch (SQLException e) {} } if (stmt ! null) { try { stmt.close(); } catch (SQLException e) {} } if (conn ! null) { try { conn.close(); } catch (SQLException e) {} } } }useUnicodetruecharacterEncodingutf8和serverTimezone這兩段參數(shù)是新手最容易漏的。漏掉前者JSP頁面上顯示的就是問號漏掉后者換裝新版MySQL驅(qū)動后連接會直接報時區(qū)錯誤。我在帶項目時要求所有人都把這串URL作為固定模板不要每次現(xiàn)敲。商品列表頁用JSTL循環(huán)輸出比在JSP里寫一堆Java腳本片段干凈很多% taglib prefixc urihttp://java.sun.com/jsp/jstl/core % table c:forEach items${productList} varp tr td${p.name}/td td${p.price}/td tda hrefproduct/detail?id${p.id}查看詳情/a/td /tr /c:forEach /table這里有個容易踩的坑${p.name}依賴Product類里的getName()方法如果屬性名和表字段不一致頁面上會直接空。比字段命名更隱蔽的是EL表達式取值的順序問題items${productList}里的productList必須是request或session域里的屬性名而不能是Servlet里的局部變量名。所以Servlet里一定要寫request.setAttribute(productList, list);少了這一行頁面會靜默地什么都不輸出。3. 購物車與下單從Session存儲到庫存扣減的完整實現(xiàn)3.1 購物車為什么不適合塞進Session但課設里還是要用它購物車放進Session是多數(shù)課設代碼的默認做法也是答辯時最容易被評委點名的點。Session購物車的好處是零額外表、代碼量小、用戶未登錄也能裝東西壞處是服務端內(nèi)存占用隨在線用戶數(shù)線性增長用戶關閉瀏覽器購物車數(shù)據(jù)就丟而且分布式環(huán)境下Session同步是個大麻煩。正規(guī)互聯(lián)網(wǎng)系統(tǒng)的做法是購物車數(shù)據(jù)落庫關聯(lián)用戶ID保存成購物車表或直接放Redis。但課設系統(tǒng)沒有并發(fā)量也沒有多臺服務器我一般建議折中購物車表落庫同時用Session做會話保持。下面是一個簡化的購物車Service方法public boolean addToCart(int userId, int skuId, int quantity, HttpSession session) { try (Connection conn DBHelper.getConnection()) { String checkStock SELECT stock FROM product_sku WHERE id?; PreparedStatement ps1 conn.prepareStatement(checkStock); ps1.setInt(1, skuId); ResultSet rs ps1.executeQuery(); if (rs.next() rs.getInt(stock) quantity) { return false; // 庫存不足提示用戶 } String sql INSERT INTO cart (user_id, sku_id, quantity) VALUES (?,?,?) ON DUPLICATE KEY UPDATE quantityquantity?; PreparedStatement ps conn.prepareStatement(sql); ps.setInt(1, userId); ps.setInt(2, skuId); ps.setInt(3, quantity); ps.setInt(4, quantity); ps.executeUpdate(); // 同步刷新Session中的購物車數(shù)量用于頁面角標 CartService service new CartService(); session.setAttribute(cartCount, service.getCartCount(userId)); return true; } catch (SQLException e) { e.printStackTrace(); return false; } }ON DUPLICATE KEY UPDATE依賴cart表里(user_id, sku_id)的唯一約束這個寫法比先查一次是否存在、再決定update還是insert要少一次數(shù)據(jù)庫交互。另一個細節(jié)是方法最后手動刷新session中的cartCount如果不刷新用戶添加商品后頁面角標還是舊數(shù)字得刷新整個頁面才變演示時會顯得很突兀。Session在這個方案里只承擔輕量級讀操作不再存整個購物車的商品明細這樣既保留了頁面間快速取值的好處又避免了Session內(nèi)存無限制增長。答辯被問到“為什么不用純Session購物車”時這個解釋能站住腳。3.2 庫存扣減的兩種寫法先查再改與原子更新商品下單涉及最核心的數(shù)據(jù)一致性場景庫存扣減和訂單生成必須放在同一個事務里。新手最常見的寫法是先查庫存判斷夠不夠夠就update然后insert訂單。這在單用戶測試時沒問題但被評委追問“兩個用戶同時買最后一件衣服怎么辦”時很容易卡殼。先查再改存在競態(tài)條件線程A查到庫存為1線程B也查到庫存為1A扣減成0并下單B也扣減成0并下單最后超賣一件。解決辦法是在update語句里直接帶上庫存條件讓數(shù)據(jù)庫來做原子判斷String deductSql UPDATE product_sku SET stock stock - ? WHERE id ? AND stock ?; PreparedStatement ps conn.prepareStatement(deductSql); ps.setInt(1, quantity); ps.setInt(2, skuId); ps.setInt(3, quantity); int affected ps.executeUpdate(); if (affected 0) { conn.rollback(); return 庫存不足下單失敗; }affected 0只可能是兩種原因SKU不存在或者庫存不夠。因為AND stock ?條件不滿足時update不會匹配到任何行返回影響行數(shù)為0。這個寫法不需要先select不需要加鎖還保證了并發(fā)安全是能在答辯現(xiàn)場直接講的亮點。下單時的整體事務控制建議用conn.setAutoCommit(false)包住三件事扣減SKU庫存、插入訂單主表、插入訂單明細表。任何一個環(huán)節(jié)失敗都回滾避免出現(xiàn)“訂單生成了但庫存沒扣”或“庫存扣了但訂單沒生成”的中間狀態(tài)。演示時不妨現(xiàn)場開兩個瀏覽器窗口同時下單驗證最終只有一單成功這是最有說服力的測試場景。3.3 訂單狀態(tài)流轉(zhuǎn)從待付款到已收貨的5個狀態(tài)服裝商城有別于虛擬商品訂單生命周期相對長狀態(tài)機設計得好答辯時能省很多口舌。我常用的是一個最小的五狀態(tài)模型狀態(tài)值狀態(tài)含義觸發(fā)動作頁面可見范圍0待付款用戶提交訂單用戶可取消1待發(fā)貨用戶付款/模擬支付成功管理員可見2已發(fā)貨管理員點擊發(fā)貨用戶可見物流提醒3已收貨用戶點擊確認收貨訂單完成4已取消用戶取消或超時未付款雙方可見這里建議不要把“已退款”放進核心狀態(tài)課設階段做退款容易牽扯到支付網(wǎng)關模擬和權限邊界一句話帶過即可。狀態(tài)字段用TINYINT而不是VARCHAR是讓排序和條件查詢更快也更符合數(shù)據(jù)庫設計習慣。訂單狀態(tài)變更的代碼要有一個統(tǒng)一入口我一般會在OrderService里寫一個updateStatus(orderNo, fromStatus, toStatus)方法必須傳入來源狀態(tài)做校驗。比如“已發(fā)貨”的訂單不能被直接改成“已取消”否則業(yè)務邏輯就亂套了。狀態(tài)機的好處是讓代碼里的if/else變成可預期的流轉(zhuǎn)表評審翻代碼時一眼能看懂。4. 答辯和調(diào)試現(xiàn)場最常碰到的5個避坑細節(jié)4.1 “JSP是不是已經(jīng)過時”的應對話術這是答辯時出現(xiàn)頻率最高的問題幾乎每個做JSP課設的學生都會被問到。最差的表現(xiàn)是慌張承認“是的是的這個技術老了”。最好的做法是把問題接住往課題目標上引。我常用的回答結構是先承認技術迭代的事實再強調(diào)課程設計的考察重點。可以這么說“JSP在后端渲染領域確實不如Spring BootVue這類前后端分離方案新但我選它的原因是課設周期內(nèi)需要把數(shù)據(jù)庫設計、Servlet原理、會話管理、MVC分層這些核心知識點完整走一遍。JSP能直接展示Java對象在頁面上的渲染過程比前后端分離更容易講清楚請求-處理-響應的完整鏈路?!边@個回答既沒有回避問題又把評委的關注點從“技術新舊”拉回“你學到了什么”。4.2 中文亂碼從頁面到數(shù)據(jù)庫的3層排查中文亂碼在JSP系統(tǒng)里幾乎是必現(xiàn)問題而且經(jīng)常是頁面顯示正常寫入數(shù)據(jù)庫變成問號。排查要按三層進行JSP頁面編碼、Servlet請求編碼、數(shù)據(jù)庫連接編碼。第一層在JSP文件頂部加% page pageEncodingUTF-8 contentTypetext/html; charsetUTF-8 %第二層在Servlet里對POST請求加request.setCharacterEncoding(UTF-8)第三層就是前面DBHelper里URL上的useUnicodetruecharacterEncodingutf8。MySQL表本身也要確認是utf8建庫時指定DEFAULT CHARSETutf8mb4。utf8mb4比utf8多支持emoji和生僻字JSP頁面里有些測試數(shù)據(jù)帶著特殊符號用utf8mb4能少一次返工。一個血淚經(jīng)驗是request.setCharacterEncoding(UTF-8)必須放在第一個讀取請求參數(shù)的語句之前否則已經(jīng)按默認編碼解析的參數(shù)無法被重新解碼放進數(shù)據(jù)庫照樣是亂碼。這個位置問題非??游乙娺^有人排查兩個晚上最后只是把這一行挪到getParameter前面就解決了。4.3 JSP圖片如何對坐標定位商品主圖與管理員上傳的預覽問題“JSP圖片如何對坐標定位”是服裝商城頁面里很實際的需求最常見的是商品列表頁圖片和文字對齊、詳情頁多圖輪播時的定位。JSP本身是個模板不負責圖片處理圖片路徑的解析才是核心問題。我一般把商品圖片上傳到項目的webapp/upload/目錄數(shù)據(jù)庫里只存相對路徑upload/xxx.jpg頁面用下面這種方式輸出img src${pageContext.request.contextPath}/upload/${product.mainImage} stylewidth:120px;height:160px;object-fit:cover;這個寫法解決了兩個經(jīng)典問題。${pageContext.request.contextPath}自動拼上項目上下文路徑避免圖片在部署到不同路徑時404object-fit:cover讓不同比例的服裝圖片在固定尺寸容器內(nèi)按比例裁剪居中而不是被拉伸變形。圖片坐標定位出現(xiàn)偏差時先檢查父容器的position屬性再檢查圖片自身的display屬性。服裝商品圖通常是豎長條如果容器高度沒設固定值多張圖會互相擠視覺上就像坐標跑了。4.4 刷新頁面后購物車丟了的排查“JSP頁面讓加載完后刷新一次”這個奇怪需求往往是購物車丟失問題被繞過式的解決辦法。刷新就丟購物車根因是Session中對象丟失通常是兩個原因Cookie失效導致Session ID變更或者頁面跳轉(zhuǎn)時URL里沒帶jsessionid。排查步驟很固定先看瀏覽器開發(fā)者工具里的Cookie確認JSESSIONID是否存在且沒有過期再檢查web.xml里的session超時時間session-timeout單位是分鐘默認30分鐘演示時如果長時間停在頁面不動再提交購物車超時后Session會被回收最后看跳轉(zhuǎn)方式如果用了response.sendRedirect跳轉(zhuǎn)到外部地址新的瀏覽器上下文可能丟失原會話改成request.getRequestDispatcher().forward()就能保住Session。另外要注意服務器重啟會清空內(nèi)存中的Session課設演示前一定要先重啟Tomcat再走流程否則會出現(xiàn)“明明代碼沒問題但購物車突然空了”的假象。4.5 前后端分離項目風格的頁面引入餓了么element圖標在JSP里的用法不少同學拿了個前后端分離的前端模板想直接套到JSP里結果發(fā)現(xiàn)Vue組件和Element UI圖標要么渲染不出來要么和JSP標簽沖突?!梆I了么elment圖標前端jsp”這種搜索詞背后就是想在新式UI和JSP之間找一條可行路徑。我試過的可行做法是不用Vue的單文件組件直接用Element UI的圖標字體文件。把iconfont.css和字體文件放進webapp/css和webapp/fonts在JSP頁面頂部link進來然后直接用i classel-icon-shopping-cart-full/i這類圖標類名。這類圖標本質(zhì)是字體不依賴Vue運行時JSP里完全能用。需要注意兩點一是檢查css里font-face的路徑是否正確默認相對路徑可能會指向項目根目錄以外的位置改成${pageContext.request.contextPath}/fonts/二是不要在同一個JSP頁面混用Vue的{{}}插值語法和JSTL的${}取值兩者都用了花括號會互相干擾實測時最容易在這里翻車。5. 把答辯PPT章節(jié)映射到系統(tǒng)模塊一份能閉環(huán)講述的講稿結構5.1 課題背景與意義怎么寫才不空答辯PPT的第一部分“選題背景”通常是重災區(qū)一眼看過去全是“隨著電子商務的發(fā)展人們對網(wǎng)上購物的需求日益增長”。這句話沒有錯但也沒有信息量。更好的寫法是把背景拆成兩個層面行業(yè)背景一句話帶過然后馬上落到問題導向。比如這樣寫“傳統(tǒng)服裝零售受時間和門店覆蓋限制線上商城成為服裝品牌拓展銷售渠道的重要方式。本課題從中小型服裝商戶的實際需求出發(fā)設計并實現(xiàn)一個支持商品展示、購物車、訂單流轉(zhuǎn)的B2C商城交易管理系統(tǒng)重點解決服裝多規(guī)格SKU管理與訂單狀態(tài)可視化問題。”這一段包含了行業(yè)背景、課題目的、技術難點既具體又能順勢引出后面的模塊設計。5.2 需求分析到功能模塊的映射表評委看PPT時會盯著需求分析和功能模塊是否對得上。需求說有用戶注冊、商品瀏覽、購物車、訂單管理、管理員后臺后面就必須出現(xiàn)對應的頁面截圖和核心代碼不能前面說了五條后面只做出來三條。建議用一張表格把功能需求、用例主角、頁面位置串起來功能編號功能名稱角色對應頁面/接口F01用戶注冊登錄普通用戶register.jsp / login.jspF02商品分類瀏覽普通用戶index.jsp / category_list.jspF03服裝詳情與SKU選擇普通用戶product_detail.jspF04購物車增刪改查普通用戶cart.jsp / CartServletF05提交訂單并模擬支付普通用戶order_confirm.jsp / OrderServletF06后臺商品管理管理員admin_product_list.jspF07后臺訂單發(fā)貨管理員admin_order_list.jsp這張表最大的用途不是給評委看而是給自己列出開發(fā)檢查清單。每一行都有頁面和Servlet對應開發(fā)時照著做答辯時照著講不會出現(xiàn)缺項。5.3 測試用例與演示數(shù)據(jù)的設計系統(tǒng)測試部分不能只寫“經(jīng)測試系統(tǒng)運行穩(wěn)定”評委追問第一個測試用例就能看出有沒有真正跑過。建議設計5到8條有業(yè)務含義的測試用例其中一定要覆蓋正常流程、邊界條件和異常分支。給出一組可以直接抄進PPT的測試用例表用例編號測試場景操作步驟預期結果T01用戶注冊提交空用戶名提示用戶名不能為空T02登錄失敗輸入錯誤密碼提示密碼錯誤并保留用戶名T03無庫存商品下單將庫存為0的商品加入購物車并結算提示庫存不足禁止下單T04超賣場景兩個會話同時購買同一SKU最后1件僅一個會話成功生成訂單T05訂單狀態(tài)流轉(zhuǎn)付款-發(fā)貨-確認收貨狀態(tài)依次從0變?yōu)?T06商品圖片預覽上傳同一文件名圖片兩次第二次文件名被重命名不覆蓋原圖T03和T04就是前面第3章庫存扣減邏輯的對應測試能夠直接證明“為什么用AND stock ?原子更新”。演示時跑通T04比任何口頭解釋都有說服力。5.4 答辯現(xiàn)場演示的數(shù)據(jù)準備與順序建議演示時最怕臨時造數(shù)據(jù)穿一件圖片沒上傳、庫存配錯、價格對不上的衣服點進購物車。我建議正式答辯前固定一套演示數(shù)據(jù)數(shù)量控制在6到8件服裝覆蓋兩個分類、不同顏色尺碼、一件庫存為0的商品、一件庫存為1的商品。這樣既能展示正常購買流程又能隨時演示庫存不足攔截。演示順序按業(yè)務主鏈路走游客瀏覽首頁分類商品注冊新用戶點開某件衣服選顏色尺碼加入購物車去結算模擬支付管理員登錄后臺看到新訂單點擊發(fā)貨用戶端確認收貨流程閉環(huán)。走完這套動作之后再補一個管理員新增商品的展示把錄入、圖片上傳、上下架也覆蓋到。最后如果時間允許再現(xiàn)場演示庫存超賣攔截這個場景最容易給評委留下“系統(tǒng)考慮過并發(fā)”的好印象。6. 用一份演示自檢清單給系統(tǒng)上最后一層保險答辯前夜我和所有做課設的同學一樣都會對著系統(tǒng)把整個流程走一遍。這里有一套我固定使用的自檢清單比臨時改代碼管用得多。第一步檢查數(shù)據(jù)。登錄后臺看商品列表確認每件衣服都有圖片、價格和有效庫存清空購物車把演示用的用戶賬號恢復到初始狀態(tài)訂單列表里不能殘留臟數(shù)據(jù)否則評委翻歷史訂單會看到“李四測試”“111111”這類隨手寫的記錄。第二步檢查環(huán)境。Tomcat啟動后先訪問一次首頁確認Session能正常創(chuàng)建數(shù)據(jù)庫服務要確認沒有自動關閉演示用的瀏覽器用無痕窗口避免舊Cookie污染登錄狀態(tài)。如果現(xiàn)場網(wǎng)絡不穩(wěn)定數(shù)據(jù)庫連接池的URL里配的serverTimezoneAsia/Shanghai在部分老版本MySQL驅(qū)動下會拋異常建議提前用Tomcat的lib目錄校驗驅(qū)動版本。第三步檢查頁面。重點看三個容易出洋相的地方第一是商品詳情頁圖片是否按預期比例顯示第二是點擊“加入購物車”后右上角角標是否同步刷新第三是訂單提交后頁面是否跳轉(zhuǎn)到訂單詳情而不是空白頁。這三個位置都是“JSP圖片如何對坐標定位”和“頁面加載完后刷新一次”這種奇怪需求背后的真實痛點問題不大但很毀演示效果。最后一步是降級預案。把核心頁面做成兩個入口一個從主頁鏈接進入一個直接輸入URL進入。萬一主頁某個分類查詢報錯直接改URL進商品頁演示流程可以繼續(xù)走。這套系統(tǒng)做到最后真正拉開差距的不是技術棧新不新而是有沒有把邊界處理干凈。把腳勤快一點多跑幾遍完整場景比答辯前翻書有用得多。希望這些從真實項目里踩出來的經(jīng)驗能幫你少走幾段彎路。本文還有配套的精品資源點擊獲取