上花店系統(tǒng)畢設(shè):環(huán)境配置、代碼調(diào)試與答辯指南)
簡介一份基于SQLServer的JSP網(wǎng)上花店系統(tǒng)畢業(yè)論文與源代碼資源包面向計算機專業(yè)畢業(yè)生、JSP開發(fā)初學(xué)者及需要完成電商類畢設(shè)的讀者。資源圍繞網(wǎng)上花店核心業(yè)務(wù)展開涵蓋用戶注冊登錄、商品瀏覽、購物車管理、訂單處理、支付接口集成等模塊并串聯(lián)需求分析、系統(tǒng)設(shè)計、數(shù)據(jù)庫建模、編程實現(xiàn)與測試全過程有助于理解Web應(yīng)用從設(shè)計到上線的完整開發(fā)鏈路。整個壓縮包共1140個文件大小約8.67MB包含可直接還原的SQLServer數(shù)據(jù)庫文件mdf/ldf/SQL腳本、JSP頁面、Java源碼、CSS樣式、JS腳本以及論文章節(jié)文檔等兼具代碼與文檔雙重參考價值。論文正文12011字目錄結(jié)構(gòu)清晰可按數(shù)據(jù)庫、后端邏輯、前端頁面分區(qū)查閱。目前已有190人學(xué)習(xí)。從中既可獲得一套可運行的網(wǎng)上花店系統(tǒng)源碼也可學(xué)習(xí)JDBC操作、Servlet業(yè)務(wù)分層、購物車與訂單狀態(tài)管理等關(guān)鍵技術(shù)點的落地寫法適合作為畢業(yè)設(shè)計或JSPSQLServer項目實戰(zhàn)的參考資料。1. JSP網(wǎng)上花店系統(tǒng)這套畢設(shè)源碼到底是一份能跑的工程還是一堆文件最近總有人拿著“JSP網(wǎng)上花店系統(tǒng)”這個壓縮包來問我能不能直接改、答辯能不能過。這套東西在近十年的 JavaWeb 畢業(yè)設(shè)計里屬于出現(xiàn)頻率最高的一類JSP 頁面做展示、Servlet 做控制、SQL Server 當(dāng)數(shù)據(jù)庫包里的論文字?jǐn)?shù)是 12011 字配套材料已經(jīng)幫你省掉了大量從頭寫論文的時間。但真正值錢的不是論文而是那一套能跑通用戶注冊、登錄、鮮花瀏覽、購物車、下單、后臺管理的完整業(yè)務(wù)閉環(huán)。適合兩類人一類是開題很久還沒把系統(tǒng)跑起來的大四學(xué)生另一類是剛學(xué)完 JSP 和 Servlet、想拆解一份完整項目代碼的初學(xué)者。我的結(jié)論先放這這是一個傳統(tǒng)的 JavaWeb 三層項目不花哨但只要按順序把環(huán)境和數(shù)據(jù)庫搞定它不僅能跑結(jié)構(gòu)還足夠你答辯時講清楚。2. 環(huán)境搭建JDK、Tomcat 與 SQL Server 的版本搭配和驗證命令2.1 為什么 JSP 和 SQL Server 是老畢設(shè)的常見組合很多學(xué)校機房默認(rèn)教的就是 JSP SQL Server原因很簡單SQL Server 有 SSMS 這種現(xiàn)成的圖形化管理工具建庫、導(dǎo)數(shù)據(jù)、跑查詢都比 MySQL 的命令行更直觀JSP 又是 JavaWeb 課程里最早接觸的動態(tài)頁面技術(shù)。這個組合的完整鏈路是瀏覽器請求 JSP 頁面 - Tomcat 把 JSP 編譯成 Servlet - Java 代碼通過 JDBC 連到 SQL Server - 數(shù)據(jù)回填到頁面。鏈路本身不復(fù)雜但每個環(huán)節(jié)都有各自的版本講究這也是為什么同樣一份源碼有人半小時跑起來有人折騰一周還卡在啟動報錯。2.2 版本怎么選一份能避免多數(shù)啟動問題的搭配表組件推薦版本選擇理由JDK81.8.x老項目大量使用 JSP 腳本片段JDK 8 的兼容性最好JDK 17 上容易碰到模塊化限制Tomcat8.5.x 或 9.0.x對應(yīng) Servlet 3.1/4.0能覆蓋 JSP 2.3也支持注解方式配置 ServletSQL Server2012 / 2016 / 2019 均可高版本對老腳本基本向下兼容但 2012 以下很多新語法不能用JDBC 驅(qū)動sqljdbc4.jar 或 mssql-jdbc-6.2.2.jre8.jar與 JDK 8 匹配避免用太新的驅(qū)動反向踩兼容問題我見過不少人在第 1 步就翻車電腦里裝的是 JDK 21Tomcat 11然后拿一個 2015 年的 JSP 項目去跑報了各種莫名其妙的 ClassCastException。不是源碼有問題是版本跨度太大。老畢設(shè)項目不是越新越好JDK 8 是這套技術(shù)的舒適區(qū)。2.3 SQL Server 安裝后必須做的兩件事開 TCP/IP 和啟用混合認(rèn)證SQL Server 安裝完成并不代表 JDBC 能連上反而默認(rèn)配置下 JDBC 是連不上的。第一件事去開始菜單找“SQL Server 配置管理器”展開“SQL Server 網(wǎng)絡(luò)配置”把 MSSQLSERVER 的 TCP/IP 協(xié)議啟用然后重啟 SQL Server 服務(wù)。第二件事用 SSMS 登錄后右鍵服務(wù)器進入屬性在“安全性”里把身份驗證模式改成“SQL Server 和 Windows 身份驗證模式”再單獨給 sa 賬戶設(shè)一個密碼并啟用。這兩步不做后面你會在db.properties里配半小時連接串然后始終看到“無法連接”或者登錄失敗。命令行里想快速確認(rèn)服務(wù)有沒有起來可以用下面這段net start | findstr /i SQL Server ping localhost -n 1net start能看到“SQL Server (MSSQLSERVER)”這個服務(wù)名就說明實例在跑ping localhost只是確認(rèn)本機網(wǎng)絡(luò)棧正常和數(shù)據(jù)庫能不能連是兩回事。很多新手一看到 ping 通則以為數(shù)據(jù)庫沒問題實際數(shù)據(jù)庫軟件層面根本沒起來。2.4 JDBC 驅(qū)動確認(rèn) jar 包里有驅(qū)動類再放進 WEB-INF/lib驅(qū)動版本不對會直接造成ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver。下載驅(qū)動后第一步不是急著拷貝而是先確認(rèn) jar 包里的類名。用 jar 命令查看jar tf mssql-jdbc-6.2.2.jre8.jar | findstr SQLServerDriver如果輸出里有com/microsoft/sqlserver/jdbc/SQLServerDriver.class說明這個 jar 是對的。然后把 jar 文件復(fù)制到項目的WEB-INF/lib目錄下同時在 IDE 的 Project Structure 里把這個 jar 加入 Libraries。這兩個位置必須一致只放磁盤不放項目等于沒放。還要注意一個隱藏坑WEB-INF/lib里如果同時裝了多個版本的 sqljdbcTomcat 會隨機加載其中一個輕則連接串報錯重則 ClassCastException所以只保留一個。3. 導(dǎo)入工程與還原數(shù)據(jù)庫把 JSP 項目從壓縮包變成可訪問的站點3.1 用 IDEA 打開傳統(tǒng) JSP 項目的目錄結(jié)構(gòu)與編譯設(shè)置解壓壓縮包后先看目錄結(jié)構(gòu)。傳統(tǒng) JSP 項目通常長這樣src下面按包名放 Servlet 和 DAOWebContent或web下面直接放.jsp頁面WEB-INF里有web.xml和lib目錄。注意這個結(jié)構(gòu)沒有pom.xmlIDEA 不會把它識別成 Maven 項目你直接 Open 這個文件夾后要做三件事第一File - Project Structure - Modules把src目錄標(biāo)記為 Sources第二把WebContent標(biāo)記為 Web Resource Directory第三在 Artifacts 里新建一個 Web Application: Exploded把 WebContent 作為輸出目錄。這套配置對不熟悉 IDEA 的老 JavaWeb 開發(fā)者來說確實繁瑣所以如果你用的是 IDEA又不想折騰另一個選擇是用 Eclipse 導(dǎo)入。3.2 用 Eclipse 導(dǎo)入Existing Projects into Workspace 更省事Eclipse 處理傳統(tǒng) JSP 工程比 IDEA 順手。File - Import - General - Existing Projects into Workspace選擇解壓后的根目錄Eclipse 會自動識別項目結(jié)構(gòu)。導(dǎo)入后在 Project Facets 里確認(rèn) Dynamic Web Module 版本是 3.0 或 2.5Java 編譯級別選 1.8。這里要提醒一下如果你用的是 Maven 版 Eclipse導(dǎo)入時別選 Maven 相關(guān)選項否則會把一個普通 Web 工程當(dāng)成空目錄處理導(dǎo)完什么都看不到。這個環(huán)節(jié)最常見的報錯是“Project facet Java version 1.8 is not supported”把編譯級別統(tǒng)一成 1.8 再執(zhí)行一次 Maven - Update Project 就能解決。3.3 執(zhí)行 SQL 腳本sqlcmd 的最小命令和參數(shù)說明數(shù)據(jù)庫腳本一般是一個.sql文件里面包含建庫、建表、插入樣例數(shù)據(jù)。執(zhí)行方式有很多種我建議直接學(xué) sqlcmd因為它在排錯時能明確告訴你錯誤發(fā)生在第幾行。最小命令是這樣的sqlcmd -S localhost,1433 -U sa -P 你的密碼 -d master -i db.sql-S指定服務(wù)器地址和端口默認(rèn)端口 1433-U和-P是 SQL Server 登錄賬號-d master表示先連到 master 庫因為腳本里很可能有CREATE DATABASE flower_shop這樣的語句需要在一個沒有依賴的庫里執(zhí)行-i后面跟腳本文件路徑。如果提示sqlcmd 不是內(nèi)部或外部命令說明你只裝了 SSMS 沒裝命令行工具可以用 SSMS 的“打開文件 - 執(zhí)行”代替但記住 SSMS 默認(rèn)不是 SQLCMD 模式腳本里如果用了:r、:setvar這類專屬語法會報錯需要先到查詢菜單里打開 SQLCMD 模式。執(zhí)行完畢后強烈建議驗證一下表和樣例數(shù)據(jù)是否真的進去了SELECT TOP 5 name FROM sys.tables; SELECT COUNT(*) FROM 花店核心表名;第一句能列出當(dāng)前庫里的表第二句能看到數(shù)據(jù)行數(shù)。如果有表沒建出來回到db.sql里搜索CREATE TABLE把對應(yīng)那段單獨在 SSMS 里跑錯誤提示會變得更具體。3.4 修改 db.properties連接 URL、賬號、密碼四參數(shù)傳統(tǒng) JSP 項目通常把數(shù)據(jù)庫連接配置放在src下的db.properties或jdbc.properties里。打開后你會看到類似這樣的內(nèi)容jdbc.drivercom.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.urljdbc:sqlserver://localhost:1433;DatabaseNameflower_shop;characterEncodingUTF-8 jdbc.usernamesa jdbc.password123456DatabaseName必須和你腳本里創(chuàng)建的庫名完全一致大小寫不敏感但字母不能錯。localhost可以換成127.0.0.1效果一樣。如果你裝 SQL Server 時選的是命名實例而不是默認(rèn)實例URL 要寫成jdbc:sqlserver://主機名\\實例名;DatabaseName...或者追加;instanceName實例名這是“sqlserver安裝教程”相關(guān)搜索里最容易被忽略的一環(huán)。密碼如果有特殊字符比如、#建議先直連測試確認(rèn)能通再放配置文件里否則你很難判斷是配置文件轉(zhuǎn)義問題還是賬號問題。4. 關(guān)鍵代碼怎么改登錄、分頁與購物車金額的落地寫法4.1 登錄邏輯Session 保持登錄態(tài)與個人信息展示網(wǎng)上花店系統(tǒng)的用戶登錄邏輯很標(biāo)準(zhǔn)登錄表單把用戶名密碼提交到 LoginServletServlet 查庫查到了就把用戶對象放進 Session然后重定向到首頁查不到就返回錯誤提示。核心代碼長這樣WebServlet(/login) public class LoginServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding(UTF-8); String username request.getParameter(username); String password request.getParameter(password); String sql SELECT id, username, real_name, phone FROM user_info WHERE username? AND password?; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { User user new User(); user.setId(rs.getInt(id)); user.setUsername(rs.getString(username)); user.setRealName(rs.getString(real_name)); request.getSession().setAttribute(loginUser, user); response.sendRedirect(request.getContextPath() /index.jsp); } else { request.setAttribute(errorMsg, 用戶名或密碼錯誤); request.getRequestDispatcher(/login.jsp).forward(request, response); } } catch (Exception e) { e.printStackTrace(); response.sendRedirect(error.jsp); } } }這段代碼有幾個答辯時能講的點一是用PreparedStatement而不是字符串拼接 SQL能把 SQL 注入擋在外面二是登錄成功后只存User對象到 Session后續(xù)頁面需要用戶名時用${sessionScope.loginUser.username}取不用反復(fù)查庫三是失敗時用forward回登錄頁并帶錯誤消息而不是重定向因為重定向會丟失request里的屬性。登錄后的“jsp個人信息展示頁面”就是首頁右上角那段c:if test${not empty sessionScope.loginUser}判斷這也是 JSP 初學(xué)者最喜歡問的位置。4.2 商品分頁SQL Server 的 OFFSET-FETCH 與 PageBean 參數(shù)花店商品列表一般有幾十條數(shù)據(jù)分頁幾乎是必做的。JSP 項目分頁有幾種寫法老代碼里常見的是先拼一個row_number() over(ORDER BY id)子查詢MySQL 用戶習(xí)慣寫LIMIT ? OFFSET ?SQL Server 2012 之后的版本有更簡潔的 OFFSET-FETCH但必須配合 ORDER BY否則直接報語法錯誤String sql SELECT id, flower_name, price, image, description FROM flower_info ORDER BY id OFFSET ? ROWS FETCH NEXT ? ROWS ONLY; PreparedStatement ps conn.prepareStatement(sql); ps.setInt(1, (pageNo - 1) * pageSize); ps.setInt(2, pageSize);第一個參數(shù)(pageNo - 1) * pageSize是偏移量不是頁碼。如果當(dāng)前是第 1 頁、每頁 6 條偏移量就是 0第 2 頁就是 6。第二個參數(shù)是每頁條數(shù)。商品網(wǎng)格頁面我一般設(shè) 6 或 8三列兩行是 6四列兩行是 8別設(shè)一個 20 讓頁面拉很長。配套的總頁數(shù)計算需要單獨查一次SELECT COUNT(*) FROM flower_info然后用(totalCount pageSize - 1) / pageSize向上取整。PageBean 在答辯里是高頻問題你把“偏移量是行數(shù)不是頁數(shù)”這一句講清楚老師就知道你真懂分頁。4.3 購物車與訂單金額聚合 SQL 讓數(shù)字不被前端篡改購物車金額的合計新手常犯的錯誤是在 JSP 頁面里for循環(huán)遍歷商品然后本地累加。這個做法在答辯時會被老師一句話問住“前端算的總價你怎么保證用戶沒改過”正確做法是在數(shù)據(jù)庫里聚合SELECT ISNULL(SUM(price * quantity), 0) AS total FROM cart WHERE user_id ?;SUM(price * quantity)用數(shù)據(jù)庫算每行商品的小計再求和ISNULL把空購物車的情況從 NULL 變成 0這樣 JSP 頁面上永遠不會出現(xiàn)一個null大字。這里有一個訂單相關(guān)的細節(jié)值得順手改掉生成訂單時把商品名稱、單價、數(shù)量一并寫入order_detail表而不是只寫商品 ID。因為商品價格以后可能調(diào)整歷史訂單必須保留下單那一刻的快照這叫訂單快照。論文里加一段這個描述直接能湊成“數(shù)據(jù)庫設(shè)計”章節(jié)的一個亮點。5. 避坑篇JSPSQL Server 項目部署的 5 條踩坑記錄與自檢工具5.1 Tomcat 訪問報 500ClassNotFoundException 的根因與處理現(xiàn)象Tomcat 能正常啟動首頁靜態(tài)內(nèi)容也能打開一進入查詢數(shù)據(jù)庫的頁面就報 500控制臺最底部寫著ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver。原因驅(qū)動 jar 沒有進入WEB-INF/lib或者你在 IDE 里引了 jar但沒有把它添加到最終的 Artifacts 輸出里。解決把驅(qū)動 jar 復(fù)制到WEB-INF/lib然后在 IDE 的 Project Structure - Artifacts 里確認(rèn) Output Layout 的 WEB-INF/lib 下面出現(xiàn)了這個 jar。另一個經(jīng)常踩的是WEB-INF/lib里同時存在多個版本的 sqljdbc比如sqljdbc4.jar和mssql-jdbc-6.2.2.jre8.jar并存Tomcat 會隨機加載其中一個導(dǎo)致連接接口不一致最后拋出 ClassCastException。處理方法很粗暴只留一個其他全刪。5.2 SQL Server 無法導(dǎo)入數(shù)據(jù)報“數(shù)據(jù)無效”時的編碼和語法檢查現(xiàn)象拿到db.sql后雙擊用 SSMS 打開執(zhí)行時報“無法導(dǎo)入數(shù)據(jù) 數(shù)據(jù)無效”或者整個查詢窗口都是紅色波浪線。原因腳本文件的編碼和 SSMS 默認(rèn)解析方式不一致最常見的是 UTF-8 帶 BOM 的 sql 文件在中文版 SSMS 里被當(dāng)成 ANSI 解析中文字符全變亂碼SQL 解析直接失敗。解決不要雙擊改用 sqlcmd 命令行執(zhí)行它能按文件實際編碼讀取如果必須用 SSMS先拿記事本打開腳本另存為 ANSI 編碼再執(zhí)行。還有一種特殊情況腳本用了:setvar、:r這類 SQLCMD 擴展語法普通查詢窗口不認(rèn)需要到“查詢”菜單里勾選“SQLCMD 模式”。如果導(dǎo)入的是.bak備份文件錯誤原因可能變成備份文件來自更高版本的 SQL Server低版本實例恢復(fù)不了高版本備份這種情況只能找原作者要腳本或者裝一個同版本實例。5.3 中文亂碼JSP、Servlet、JDBC URL 三個環(huán)節(jié)一次調(diào)齊現(xiàn)象注冊頁面提交的中文用戶名存進數(shù)據(jù)庫后變成一串問號或者頁面上顯示亂碼。原因JSP 頁面編碼、Servlet 讀取參數(shù)編碼、JDBC 連接編碼三者不統(tǒng)一任何一個環(huán)節(jié)掉鏈子都會出現(xiàn)亂碼。解決一次調(diào)齊三處。JSP 頁面第一行寫% page contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 %Servlet 里在request.getParameter之前調(diào)用request.setCharacterEncoding(UTF-8)JDBC URL 末尾追加;characterEncodingUTF-8。這三處改完絕大多數(shù)亂碼問題都能消失。如果 SSMS 里看數(shù)據(jù)仍是問號但頁面顯示正常那是 SSMS 客戶端的顯示編碼問題不用管。如果數(shù)據(jù)庫表已經(jīng)建好且排序規(guī)則是Chinese_PRC_CI_AS也沒關(guān)系關(guān)鍵是寫入前編碼要正確。5.4 字符串轉(zhuǎn)數(shù)字失敗ISNUMERIC 和 TRY_CONVERT 的取舍現(xiàn)象后臺錄入商品價格時填了12.00沒事一旦輸入空字符串或者不小心帶了字母提交后直接報錯Conversion failed when converting the varchar value ... to data type int。原因SQL Server 的CONVERT和CAST對非法字符零容忍空字符串、中文、空格都會讓轉(zhuǎn)換直接拋異常這和 MySQL 的靜默處理方式完全不同。解決在 JSP 表單接收階段就做判斷空值給默認(rèn)值 0如果轉(zhuǎn)換發(fā)生在 SQL 內(nèi)部用 SQL Server 2012 之后的TRY_CONVERTSELECT TRY_CONVERT(int, price) FROM cart;TRY_CONVERT轉(zhuǎn)換失敗返回 NULL 而不是報錯程序再去處理 NULL 就行。沒有TRY_CONVERT的老版本數(shù)據(jù)庫可以用CASE WHEN PATINDEX(%[^0-9]%, price) 0 THEN CONVERT(int, price) ELSE 0 END。特別提醒不要迷信ISNUMERIC函數(shù)它判斷空字符串會返回 1但空字符串丟進CONVERT(int, )照樣報錯所以更穩(wěn)妥的辦法是優(yōu)先用TRY_CONVERT或長度判斷。5.5 打包 WAR 后訪問 404web.xml 版本和打包方式都要對現(xiàn)象在 IDEA 里使用 Build Artifacts 打出 war 包傳到另一臺機器的 Tomcat 上訪問根路徑 404或者在 Tomcat Manager 里部署報錯。原因war 包內(nèi)部結(jié)構(gòu)不對或者web.xml頭聲明的 Servlet 版本太老Tomcat 9 以上對 2.3/2.4 的兼容性變差。解決先用jar tf flower.war看看包里面第一層有沒有index.jsp和WEB-INF目錄如果看到的是src或者一堆.class說明打包點選錯了。正確姿勢是在 IDEA 里新建一個空的 Web Application: Archive把編譯好的 classes 和 WebContent 內(nèi)容塞進去。web.xml的根節(jié)點建議統(tǒng)一改成 Servlet 3.1 的聲明web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaee xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd version3.1順帶提醒一個很多人會問的點如果你習(xí)慣用 nginx 來跑網(wǎng)站nginx 本身不支持 JSP它只能把請求反向代理給后面的 Tomcat畢設(shè)階段直接讓 Tomcat 監(jiān)聽 8080 端口就夠了沒有必要先套一層 nginx。5.6 一個自檢 JSP 頁面30 秒定位是環(huán)境問題還是代碼問題出問題時與其在多個頁面試來試去不如放一個最原始的 JSP 頁面到 WebContent 根目錄專門測試 JDBC 連通性% page importjava.sql.* % % try { Class.forName(com.microsoft.sqlserver.jdbc.SQLServerDriver); Connection conn DriverManager.getConnection( jdbc:sqlserver://localhost:1433;DatabaseNameflower_shop, sa, 123456); out.println(connect ok); conn.close(); } catch (Exception e) { e.printStackTrace(response.getWriter()); } %把這個文件命名為check.jsp啟動 Tomcat 后訪問http://localhost:8080/工程名/check.jsp。如果你看到connect ok說明驅(qū)動、端口、賬號、庫名這一整條鏈路都是通的接下來的問題就一定出在業(yè)務(wù) SQL 或頁面代碼里如果報異常異常信息會直接打在頁面上你就不用再猜了。這個小工具我?guī)缀趺總€項目都會放一個排查完再刪掉干凈利落。6. 答辯前把系統(tǒng)補硬日志過濾、數(shù)據(jù)備份與演示路徑6.1 加一個統(tǒng)一的字符編碼與訪問日志過濾器亂碼問題雖然可以在每個 Servlet 里設(shè)置編碼但更省心的做法是加一個過濾器統(tǒng)一處理順便把訪問日志也打出來。傳統(tǒng) JSP 項目推薦用注解方式注冊過濾器WebFilter(/*) public class CharsetAndLogFilter implements Filter { public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(UTF-8); response.setCharacterEncoding(UTF-8); long start System.currentTimeMillis(); chain.doFilter(request, response); long cost System.currentTimeMillis() - start; System.out.println(URL ((HttpServletRequest) request).getRequestURI() cost cost ms); } }WebFilter(/*)會攔截所有請求先設(shè)置編碼再把請求放行給后面的 Servlet請求結(jié)束后打印耗時。這個過濾器能解決 5.3 里面提到的所有亂碼場景還順手給答辯演示時留了一個“系統(tǒng)運行日志”的截圖素材。如果你的 Tomcat 版本比較老不支持注解就在web.xml里聲明filter和filter-mapping效果一樣。6.2 答辯演示路徑表與現(xiàn)場數(shù)據(jù)復(fù)位論文有 12011 字系統(tǒng)功能也不少但現(xiàn)場演示時間通常只有七到十分鐘。千萬別臨時打開頁面亂點一定要準(zhǔn)備一條主流程從數(shù)據(jù)初始化講到訂單閉環(huán)。我建議的演示路徑是步驟操作涉及表和代碼1注冊一個新用戶展示用戶名回顯user_info注冊 ServletSession 取值2用剛注冊的賬號登錄進入首頁登錄 ServletsessionScope個人信息展示3翻到商品列表第 2 頁flower_infoOFFSET-FETCH 分頁4把頁面中的一件花加入購物車cart表購物車 Servlet5提交訂單并查看訂單詳情order_info、order_detail訂單快照6用管理員賬號登錄后臺查看這筆訂單admin表或角色字段后臺管理模塊演示前還要做一次數(shù)據(jù)復(fù)位把別人試出來的臟數(shù)據(jù)清掉。最穩(wěn)妥的是用 sqlcmd 備份和恢復(fù)sqlcmd -S localhost,1433 -U sa -P 123456 -d master -Q BACKUP DATABASE flower_shop TO DISKD:\flower_shop.bak答辯前跑一次備份萬一演示過程中數(shù)據(jù)被弄亂再用RESTORE DATABASE [flower_shop] FROM DISKD:\flower_shop.bak WITH REPLACE恢復(fù)現(xiàn)場。這既是備份技巧也是答辯時可以隨口講一句“系統(tǒng)支持定期備份”的功能點。6.3 拿到源碼后我自己的處理順序最后說一個我自己的習(xí)慣也是希望你能少走彎路的經(jīng)驗?zāi)玫竭@類 JSP 畢業(yè)設(shè)計源碼第一件事永遠是“跑通主流程”而不是改頁面樣式。先把用戶注冊、登錄、商品列表、購物車、下單、后臺看單這一圈走完確認(rèn)每個環(huán)節(jié)的數(shù)據(jù)流轉(zhuǎn)都清楚再回頭改代碼。每改一處就在原代碼上方加一行注釋標(biāo)注“這段在答辯時怎么講”這比寫一版新代碼更省時間。登錄密碼如果是明文哪怕只是改成 MD5 加鹽存儲論文里都能多出“系統(tǒng)安全性改進”這一節(jié)。希望你手里的這套 JSP 花店系統(tǒng)不再是解壓后就吃灰的壓縮包而是真能幫你順利通過答辯的完整作品。本文還有配套的精品資源點擊獲取