SpringMVC實戰:動態時鐘

引言

在現代 Web 開發中,選擇一個合適的框架對于項目的成功至關重要。Spring MVC 作為 Spring 框架的核心模塊之一,以其清晰的架構、強大的功能和高度的可配置性,成為了 Java Web 開發領域的主流選擇。本文將通過一個“動態時鐘”的實戰項目,深入分析 Spring MVC 模式,并分享在開發過程中遇到的問題及解決方案。

Spring MVC 模式分析

什么是 Spring MVC?

Spring MVC 是一個基于 Java 的 Web 框架,它實現了著名的 模型-視圖-控制器 (Model-View-Controller, MVC) 設計模式。它旨在分離應用程序的不同職責,使得開發人員能夠更清晰地組織代碼,提高可維護性和可擴展性。

MVC 模式的核心概念

在深入 Spring MVC 之前,我們先回顧一下 MVC 模式的三個核心組件:

  • Model (模型): 負責封裝應用程序的數據和業務邏輯。它獨立于用戶界面,處理數據的存儲、檢索、更新和驗證。在 Web 應用中,模型通常是 Java Bean 或 POJO (Plain Old Java Object)。

  • View (視圖): 負責數據的展示,即用戶界面。它從模型中獲取數據,并以用戶友好的方式呈現出來。視圖通常不包含任何業務邏輯,只負責顯示。在 Java Web 中,JSP (JavaServer Pages)、Thymeleaf、FreeMarker 等都可以作為視圖技術。

  • Controller (控制器): 充當模型和視圖之間的協調者。它接收用戶的輸入(通常是 HTTP 請求),處理這些輸入,調用模型來執行相應的業務邏輯,然后選擇合適的視圖來顯示結果。控制器本身不處理業務邏輯,它只是將請求轉發給模型,并將模型的結果傳遞給視圖。

Spring MVC 在 MVC 模式中的實現

Spring MVC 對 MVC 模式進行了精巧的實現,其核心是一個名為 DispatcherServlet 的前端控制器。以下是 Spring MVC 請求處理的典型流程:

  1. DispatcherServlet (前端控制器):

    • 作為整個 Spring MVC 應用程序的入口點,它攔截所有(或特定模式的)進來的 HTTP 請求。

    • 它的作用類似于一個總調度員,將請求分發給合適的處理器。

  2. Handler Mapping (處理器映射):

    • DispatcherServlet 接收到請求后,會查詢 HandlerMapping

    • HandlerMapping 的職責是根據請求的 URL 路徑,找到能夠處理該請求的 處理器 (Handler),通常是帶有 @Controller@RequestMapping 注解的控制器方法。

  3. Controller (控制器):

    • 找到對應的控制器方法后,DispatcherServlet 會調用該方法。

    • 控制器方法執行業務邏輯(可能通過調用服務層或數據訪問層),處理請求參數,并準備需要展示給視圖的數據。

    • 控制器通常返回一個 ModelAndView 對象或一個邏輯視圖名,其中包含模型數據和視圖信息。

  4. ModelAndView (模型和視圖):

    • 這是一個封裝了模型數據和邏輯視圖名的對象。模型數據是鍵值對形式,視圖名是字符串,用于標識要渲染的視圖。

  5. View Resolver (視圖解析器):

    • DispatcherServlet 接收到控制器返回的邏輯視圖名后,會將其交給 ViewResolver

    • ViewResolver 的職責是將邏輯視圖名解析為實際的視圖資源(例如,一個 JSP 文件的路徑)。在我們的項目中,InternalResourceViewResolver 會將 "clock" 解析為 /WEB-INF/views/clock.jsp

  6. View (視圖):

    • 一旦 ViewResolver 找到實際的視圖資源,DispatcherServlet 就會將模型數據傳遞給該視圖。

    • 視圖負責渲染模型數據,生成最終的 HTML、XML 或其他格式的響應,并將其發送回客戶端瀏覽器。

Spring MVC 的優點

  • 職責分離清晰: 模型、視圖、控制器各司其職,代碼結構清晰,易于理解和維護。

  • 靈活性和可配置性: Spring MVC 提供了大量的可插拔組件(如 HandlerMappingViewResolver),允許開發人員根據需求進行高度定制。

  • 易于測試: 由于各層職責分離,控制器可以獨立于視圖和模型進行單元測試,提高了測試效率。

  • 強大的生態系統: 作為 Spring 框架的一部分,Spring MVC 可以無縫集成 Spring 的其他模塊,如 Spring Security、Spring Data 等,提供全面的企業級解決方案。

  • RESTful 支持: 內置對 RESTful Web 服務的強大支持,使得構建 API 變得簡單。

項目實戰:動態時鐘

項目目標

我們的目標是構建一個基于 Spring MVC 的 Web 應用程序,其中包含一個動態變化的模擬時鐘。時鐘的畫面將通過 JSP 頁面呈現,并利用前端技術(HTML、CSS、JavaScript)實現其動態效果和居中顯示。

技術棧

  • 后端框架: Spring MVC

  • 視圖技術: JSP (JavaServer Pages)

  • 前端樣式: Tailwind CSS (通過 CDN 引入)

  • 前端邏輯: JavaScript (實現指針動態旋轉)

  • 構建工具: Maven

  • 應用服務器: Apache Tomcat

項目結構概覽

一個典型的 Spring MVC Web 項目結構如下:

your-clock-project/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           └── controller/
│   │   │               └── ClockController.java  <-- Spring MVC 控制器
│   │   ├── resources/
│   │   │   └── spring-mvc-config.xml           <-- Spring MVC 配置文件
│   │   └── webapp/
│   │       ├── WEB-INF/
│   │       │   ├── web.xml                     <-- Web 應用部署描述符
│   │       │      └── views/
│   │       │       └── clock.jsp               <-- JSP 視圖頁面
│   │       └── ...
├── pom.xml                                     <-- Maven 項目對象模型文件

關鍵文件說明:

  • pom.xml Maven 項目配置文件,管理項目依賴(Spring MVC、JSP API、Servlet API 等)和構建插件(如 maven-war-plugintomcat8-maven-plugin)。我們通過 <finalName>web10</finalName> 將 WAR 包名稱設置為 web10.war

  • web.xml Web 應用程序部署描述符,配置 DispatcherServlet 作為前端控制器,并指定其 Spring MVC 配置文件的位置。

  • spring-mvc-config.xml Spring MVC 配置文件,啟用注解驅動的 MVC,配置組件掃描(掃描控制器),并定義 InternalResourceViewResolver 來解析 JSP 視圖。

  • ClockController.java Spring MVC 控制器,使用 @RequestMapping("/clock") 將 HTTP GET 請求映射到 showClockPage() 方法,該方法返回邏輯視圖名 "clock"

  • clock.jsp JSP 視圖頁面,包含動態時鐘的 HTML 結構、Tailwind CSS 樣式和 JavaScript 邏輯。前端 JavaScript 負責獲取當前時間并實時更新時針、分針、秒針的旋轉角度,實現動態效果。

部署與運行

  1. 構建 WAR 包: 在項目根目錄運行 mvn clean install 命令,將在 target/ 目錄下生成 web10.war 文件。

  2. 部署到 Tomcat:

    • 手動部署:web10.war 復制到 Tomcat 安裝目錄下的 webapps 文件夾。

    • 使用 Maven 插件:pom.xml 中配置 tomcat8-maven-plugin 并設置 settings.xml 中的 Tomcat 管理員憑據后,運行 mvn tomcat8:deploy (部署到外部 Tomcat) 或 mvn tomcat8:run (在嵌入式 Tomcat 中運行)。

  3. 訪問應用: 部署成功后,在瀏覽器中訪問 http://localhost:8080/web10/clock 即可看到動態時鐘。

項目效果截圖

動態時鐘效果

動態時鐘效果截圖

遇到的問題與解決方案

在項目開發和部署過程中,我們遇到了一些常見的問題:

  1. Missing artifact jakarta.servlet.jsp:jakarta.servlet.jsp-api:jar:2.3.3

    • 問題: Maven 無法找到或下載 jakarta.servlet.jsp-api2.3.3 版本依賴。這通常是由于本地倉庫緩存問題或遠程倉庫同步延遲導致。

    • 解決方案:

      • 首先嘗試運行 mvn clean install -U 強制更新依賴。

      • 如果無效,將 pom.xmljakarta.servlet.jsp.version 的版本號更新到更穩定和常用的版本,例如 3.0.0

  2. ClassFormatException: Invalid byte tag in constant pool: 19 (Tomcat 版本與依賴不兼容):

    • 問題: 當使用 tomcat7-maven-plugin (對應 Tomcat 7) 運行項目時,Tomcat 無法處理 jakarta.xml.bind-api 等較新 Jakarta EE 依賴中包含的 module-info.class 文件。這表明 Tomcat 7 的內部類加載器與這些新特性不兼容。

    • 解決方案:pom.xml 中的 tomcat7-maven-plugin 替換為 tomcat8-maven-plugin 并更新到兼容的版本(例如 3.2.2)。Tomcat 8.5+ 對 Java 8 和 Jakarta EE 8 的兼容性更好。

  3. HTTP Status 404 - Not Found (直接訪問 WEB-INF 目錄下的 JSP):

    • 問題: 嘗試直接在瀏覽器中訪問 http://localhost:8080/web10/WEB-INF/views/clock.jsp 時,Tomcat 返回 404 錯誤。

    • 解決方案: 這是 Java Web 應用程序的預期安全行為。WEB-INF 目錄是受保護的,其中的資源不能被客戶端直接訪問。正確的訪問方式是通過 Spring MVC 控制器映射的 URL,即 http://localhost:8080/web10/clockDispatcherServlet 會在服務器內部將請求轉發到 WEB-INF 下的 JSP 視圖。

總結

通過本次動態時鐘 Web 應用的開發,我不僅實踐了 Spring MVC 框架的基本配置和使用,更深入理解了其背后的 MVC 設計模式原理。從請求的攔截、分發到視圖的渲染,Spring MVC 提供了一套清晰且高效的機制來構建可維護、可擴展的 Web 應用程序。同時,解決實際開發中遇到的依賴沖突和部署問題,也進一步加深了對 Maven、Tomcat 和 Java Web 規范的理解。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81650.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81650.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

知行之橋如何將消息推送到釘釘群?

在釘釘平臺中&#xff0c;機器人主要分為企業機器人和自定義機器人兩類。本文將重點介紹如何通過自定義機器人&#xff0c;實現將知行之橋 EDI 系統的通知消息高效推送至釘釘群&#xff0c;幫助企業第一時間掌握業務動態。 一、在釘釘群中添加自定義機器人 在需要接收知行之橋…

哈工大計算機系統2024大作業——Hello的程序人生

計算機系統 大作業 題 目 程序人生-Hello’s P2P 專 業 人工智能 學   號 2022112040 班 級 2203601 學 生 郄東昕 指 導 教 師 吳銳 計算機科學與技術學院…

聯軟SDP+安渡:收斂暴露面 從生產網自動取數 安全高效

制造業作為國家經濟的基石&#xff0c;其網絡安全面臨著獨特的挑戰。出于合規和安全考慮&#xff0c;企業內部往往劃分出多個相互隔離的網絡區域&#xff0c;如辦公網、研發網等&#xff0c;以提升整體安全防護能力。然而&#xff0c;網絡隔離在保障安全的同時&#xff0c;也帶…

LeetCode 543 二叉樹的直徑

二叉樹的直徑&#xff1a;樹中任意兩個節點間最長路徑的長度。這個路徑可能經過根節點&#xff0c;也可能不經過。 算法思路 采用深度優先搜索(DFS)的后序遍歷方式&#xff0c;計算每個節點的左右子樹高度&#xff0c;并在過程中更新最大直徑。 代碼解析 var diameterOfBin…

構建安全與合規的Jenkins環境:全周期審計方案詳解

引言 Jenkins作為最流行的CI/CD工具之一&#xff0c;承載著企業核心的自動化構建與交付流程。然而&#xff0c;隨著其復雜性的增加&#xff0c;安全漏洞、權限濫用和合規風險也隨之而來。近期頻發的供應鏈攻擊&#xff08;如通過惡意插件入侵&#xff09;更是敲響警鐘。如何確…

PowerShell Install Sql Server 2025 beta

Sql Server 2025 Download 其它版本和系統自動化腳本下載SQL Server 2025SSMS sql命令行安裝ssms 命令行安裝網盤分享SQL2025 beta

【K8S】K8S基礎概念

一、 K8S組件 1.1 控制平面組件 kube-apiserver&#xff1a;公開 Kubernetes HTTP API 的核心組件服務器。 etcd&#xff1a;具備一致性和高可用性的鍵值存儲&#xff0c;用于所有 API 服務器的數據存儲。 kube-scheduler&#xff1a;查找尚未綁定到節點的 Pod&#xff0c;并將…

【C/C++】設計模式之工廠模式:從簡單到抽象的演進

文章目錄 設計模式之工廠模式&#xff1a;從簡單到抽象的演進1 “工廠”模式分類1.1 簡單工廠&#xff08;Simple Factory&#xff09;1.2 工廠方法&#xff08;Factory Method&#xff09;1.3 抽象工廠&#xff08;Abstract Factory&#xff09; 2 分析3 總結對比 設計模式之工…

HTTP 與 HTTPS 深度解析:原理、實踐與大型項目應用

1. HTTP 與 HTTPS 基礎概念 1.1 HTTP&#xff08;超文本傳輸協議&#xff09; 定義&#xff1a;應用層協議&#xff0c;基于 TCP/IP 通信&#xff0c;默認端口 80 特點&#xff1a; 無狀態協議&#xff08;需 Cookie/Session 維護狀態&#xff09; 明文傳輸&#xff08;易被…

【Excel 擴展正則的能力】工作中賦予處理單元格文本的強大正則表達提取能力

文本提取處理領域&#xff0c;正則表達式是最為強大的存在&#xff0c;工作中Excel 是常用的小型數據采集&#xff0c;處理&#xff0c;分析的工具但本身不具備正則的能力&#xff0c;讓Excel擁有正則的能力無疑是如虎添翼的能力。 方案 讓正則作為函數內容的一部分&#xff0c…

rabbitmq 使用過程中遇到的問題

1. 連接rabbitmq 地址寫法&#xff0c;5672 是連接的端口號&#xff0c;15672是頁面訪問的端口號 2. elasticsearch 的訪問端口是9200&#xff0c; 不是9300&#xff0c;9300 是后臺通信端口號 &#xff0c;這個頁面訪問的端口號是一樣&#xff0c; 3. rabbitmq 的5種交換接…

HTML實戰:響應式個人資料頁面

我將創建一個現代化的響應式個人資料頁面,展示HTML在實際應用中的強大功能。這個頁面將包含多個實戰元素:導航欄、個人簡介、技能展示、作品集和聯系表單。 設計思路 使用Flexbox和Grid布局實現響應式設計 添加CSS過渡效果增強交互體驗 實現深色/淺色模式切換功能 創建懸停動…

工業自動化實戰:基于 VisionPro 與 C# 的機器視覺 PLC 集成方案

一、背景介紹 在智能制造領域&#xff0c;機器視覺檢測與 PLC 控制的無縫集成是實現自動化生產線閉環控制的關鍵。本文將詳細介紹如何使用 C# 開發上位機系統&#xff0c;實現 Cognex VisionPro 視覺系統與西門子 S7 PLC 的數據交互&#xff0c;打造高效、穩定的工業檢測方案。…

如何處理 Python 入門難以進步的現象

Python 初學者難以進步的根本原因在于&#xff1a;缺乏項目實踐、學習路徑不清晰、沒有掌握編程思維、忽略調試與源碼閱讀、缺乏系統性目標驅動。其中&#xff0c;“沒有項目驅動導致學習孤島效應”最為常見且致命。許多初學者只停留在語法知識、刷題階段&#xff0c;無法構建可…

【后端高階面經:緩存篇】37、高并發系統緩存性能優化:從本地到分布式的全鏈路設計

一、緩存性能優化的核心價值與分層架構 (一)緩存的多維價值體系 延遲優化 內存訪問速度(100ns) vs 磁盤數據庫(10ms+),性能提升10萬倍+案例:電商詳情頁通過緩存將響應時間從500ms降至50ms吞吐提升 單機Redis可支撐10萬QPS,分擔數據庫壓力案例:秒殺系統通過緩存攔截9…

windows本地虛擬機上運行docker-compose案例

1、先構建鏡像文件dockerfile&#xff0c;使用docker build -t redis-demo:1.0 -f dockerfile .來構建: FROM openjdk:8-jdk-alpineMAINTAINER qini<nqqq.com>VOLUME /data/upload_filesWORKDIR /usr/local/nqADD ./redis-demo.jar app.jarENV profile prod ENV timezon…

WPF布局基礎

開頭存一個快速排版插件 使用 XAML 格式化工具:XAML Styler - dino.c - 博客園 快捷鍵 在 Visual Studio 2022 中,輸入類似 <Button ... /> 的自閉合 XAML 標簽時,可以通過以下方式快速生成結尾的 />: 方法 1:輸入 / 自動補全 輸入標簽名和屬性: 輸入 <B…

Electron 桌面程序讀取dll動態庫

序幕&#xff1a;被GFW狙擊的第一次構建 當我在工位上輸入npm install electron時&#xff0c;控制臺跳出的紅色警報如同數字柏林墻上的一道彈痕&#xff1a; Error: connect ETIMEDOUT 104.20.22.46:443 網絡問題不用愁&#xff0c;請移步我的另外文章進行配置&#xff1a;…

javascript中運算符的優先級

優先級運算類型關聯性運算符19圓括號n/a( … )18成員訪問從左到右… . …Computed Member Access從左到右… [ … ]new (帶參數列表)n/anew … ( … )17函數調用從左到右… ( … )new (無參數列表)從右到左new …16后置遞增(運算符在后)n/a… 后置遞減(運算符在后)n/a… –15邏…

Linux的交換區

Linux 交換區&#xff08;Swap&#xff09;詳解 交換區&#xff08;Swap&#xff09;是 Linux 系統用于擴展內存的一種機制&#xff0c;它將部分磁盤空間虛擬成內存使用。當物理內存&#xff08;RAM&#xff09;不足時&#xff0c;系統會將不活躍的內存頁移動到交換區&#xf…