Thymeleaf 模板引擎原理

Thymeleaf 的模板文件,本質上是標準的 HTML 文件,只是“加了標記(?th:的屬性”,讓模板引擎在服務端渲染時能 識別并處理 這些屬性,從而完成數據(model) 的填充。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>用戶注冊</title>
</head>
<body><h1>用戶注冊</h1><!-- 注冊表單 -->
<form action="#" th:action="@{/register}" th:object="${user}" method="post"><p>姓名: <input type="text" th:field="*{name}" /></p><p>郵箱: <input type="email" th:field="*{email}" /></p><p><input type="submit" value="提交"/></p>
</form><!-- 已注冊用戶列表 -->
<h2>已注冊用戶</h2>
<ul><li th:if="${#lists.isEmpty(users)}">暫無用戶</li><li th:each="user : ${users}">[[${user.name}]] - [[${user.email}]]</li>
</ul></body>
</html>

?這個就是前后沒有完全分離的項目,雖然畫頁面可以和前端分開做,但是頁面的跳轉還是靠后端的SpringMVC 的controller 實現控制的,頁面的調試渲染數據還是需要后端返回model,這種強依賴性影響開發效率。于是后面出現一種架構? MVVM, 拆開就是? V(前端)?<=== VM(頁面數據代理) ===> M(后端)

也就是說前端要的模型數據直接找代理(vm)要,通過數據雙向綁定自己模擬所需數據,不用直接找后端要,如果真要就發送Ajax請求到后端。基于這樣的思想前端開源框架代表有?Vue 。加上組件模塊化開發的思想,最終前后迎來分離項目的發展? 。

下面這個demo 是沒有使用Thymeleaf 寫的html,并且靜態資源還是在后臺服務器上,屬于純靜態資源展示。?

<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>歡迎光臨</title></head><body><!-- 如果請求的是根目錄(/)Spring Boot 會自動查找以下文件作為歡迎頁:index.html 或 index.htm 或 index.jsp --><div class="welcome-container"><h1>歡迎來到我們的網站!</h1><p>探索我們為您精心準備的內容</p><div class="image-gallery"><img src="/images/wandou.jpg" alt="Wandou Image"/></div></div><!-- 樣式寫在 body 底部 --><style>/* 重置默認樣式 */* {margin: 0;padding: 0;box-sizing: border-box;}body {font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%);min-height: 100vh;display: flex;justify-content: center;align-items: center;padding: 20px;color: #333;}.welcome-container {text-align: center;background: white;padding: 30px 20px;border-radius: 16px;box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);max-width: 90%;width: 100%;max-width: 800px;}h1 {font-size: 2.2rem;color: #2c3e50;margin-bottom: 12px;}p {font-size: 1.2rem;color: #7f8c8d;margin-bottom: 24px;}.image-gallery {display: flex;flex-wrap: wrap;justify-content: center;gap: 16px;margin-top: 20px;}.image-gallery img {width: 100%;max-width: 300px; /* 限制最大寬度 */height: auto;border-radius: 12px;box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);transition: transform 0.3s ease;}.image-gallery img:hover {transform: translateY(-5px);}/* 小屏幕優化 */@media (max-width: 600px) {h1 {font-size: 1.8rem;}p {font-size: 1rem;}.welcome-container {padding: 20px 15px;}}/* 平板適配 */@media (min-width: 601px) and (max-width: 1024px) {.image-gallery {gap: 20px;}}</style></body>
</html>

?直接訪問ip和端口

??

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

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

相關文章

5、生產Redis高并發分布式鎖實戰

一、核心問題與解決方案 問題本質 #mermaid-svg-W1SnVWZe1AotTtDy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-W1SnVWZe1AotTtDy .error-icon{fill:#552222;}#mermaid-svg-W1SnVWZe1AotTtDy .error-text{fill:#5…

CS231n-2017 Lecture8深度學習框架筆記

深度學習硬件&#xff1a;CPU:CPU有數個核心&#xff0c;每個核心可以獨立工作&#xff0c;同時進行多個線程&#xff0c;內存與系統共享GPU&#xff1a;GPU有上千個核心&#xff0c;但每個核心運行速度很慢&#xff0c;適合并行做類似的工作&#xff0c;不能獨立工作&#xff…

以ros的docker鏡像為例,探討docker鏡像的使用

標題以ros的docker鏡像為例&#xff0c;探討docker鏡像的使用&#xff08;待完善&#xff09; 1. docker介紹&#xff08;以ros工程距離&#xff09; &#xff08;1&#xff09;個人理解&#xff1a;docker就是一個容器&#xff0c;主要的作用就是將環境打包好&#xff0c;方…

Android Audio實戰——TimeCheck機制解析(十三)

上一篇文章我們雖然通過 tombstoned Log 推斷出 audioserver 崩潰的原因就是系統調用內核接口時發生阻塞,導致 TimeCheck 檢測超時異常而崩潰,但并沒有實質性的證據證明是 kernel 層出現問題導致的崩潰,因此這里我們繼續看一下 TimeCheck 的檢測原理。 一、TimeCheck機制 T…

飛機大戰小游戲

1.視覺設計&#xff1a;采用柔和的藍紫色漸變背景&#xff0c;營造夢幻感飛機、敵機和子彈使用柔和的糖果色調添加了粒子爆炸效果&#xff0c;增強視覺反饋星星收集物增加游戲趣味性2.游戲機制&#xff1a;玩家使用左右方向鍵控制飛機移動空格鍵發射子彈P鍵暫停游戲擊落敵機獲得…

Linux 啟動服務腳本

1. 創建命令文件# 創建可執行文件 touch 文件名稱 例&#xff1a; touch stopServer.sh2. 命令文件授權# 授權文件可執行權限 chmod 777 文件名稱 例&#xff1a; chmod 777 stopServer.sh3. 停止服務命令編寫#!/bin/bash# 獲取進程號 pidps -ef | grep -- /mnt/apache-tomcat-…

【華為機試】34. 在排序數組中查找元素的第一個和最后一個位置

文章目錄34. 在排序數組中查找元素的第一個和最后一個位置描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;解題思路算法分析問題本質分析雙重二分查找詳解左邊界查找過程右邊界查找過程算法流程圖邊界情況分析各種解法對比二分查找變種詳解時間復…

【網絡編程】WebSocket 實現簡易Web多人聊天室

一、實現思路 Web端就是使用html JavaScript來實現頁面&#xff0c;通過WebSocket長連接和服務器保持通訊&#xff0c;協議的payload使用JSON格式封裝 服務端使用C配合第三方庫WebSocket和nlonlohmann庫來實現 二、Web端 2.1 界面顯示 首先&#xff0c;使用html來設計一個…

AI 驅動、設施擴展、驗證器強化、上線 EVM 測試網,Injective 近期動態全更新!

作為一個專注于金融應用、且具有高度可互操作性的高性能 Layer-1 區塊鏈&#xff0c;Injective 自誕生以來便為開發者提供有即插即用的技術模塊&#xff0c;以便開發者能夠更好地搭建新一代 Web3 金融類應用。談及項目發展的愿景和基本定位&#xff0c;創始團隊曾提到希望 Inje…

Qt-----初識

1. 什么是Qt定義&#xff1a;Qt是一個跨平臺的應用程序和用戶界面框架&#xff0c;主要用于開發具有圖形用戶界面的應用程序&#xff0c;同時也支持非GUI程序的開發。 編程語言&#xff1a;主要使用C&#xff0c;但也提供了對Python&#xff08;PyQt&#xff09;、JavaScript&a…

理解微信體系中的 AppID、OpenID 和 UnionID

前言: 在開發微信相關的服務(如小程序,公眾號,微信開放平臺等)時,很多人都會接觸到幾個看起來相似但實際用途不同的額ID: AppiD, OpenID,UnionID. 搞清楚這三者的區別,是微信生態開發中的基本功,本文將從開發者視角觸發,深入淺出地解釋它們的關系,區別以及實際應用場景一.什么是…

FFmpeg,如何插入SEI自定義數據

FFmpeg&#xff0c;如何插入SEI自定義數據 一、什么是SEI&#xff1f; SEI&#xff08;Supplemental Enhancement Information&#xff0c;補充增強信息&#xff09;是H.264/H.265視頻編碼標準中的一種元數據載體&#xff0c;它允許在視頻流中嵌入額外的信息&#xff0c;如時…

為什么分類任務偏愛交叉熵?MSE 為何折戟?

在機器學習的世界里&#xff0c;損失函數是模型的“指南針”——它定義了模型“好壞”的標準&#xff0c;直接決定了參數優化的方向。對于分類任務&#xff08;比如判斷一張圖片是貓還是狗&#xff09;&#xff0c;我們通常會選擇交叉熵作為損失函數&#xff1b;而在回歸任務&a…

[echarts]橫向柱狀圖

前言 接到一個需求&#xff0c;需要展示一個橫向的柱狀圖&#xff0c;按數量從大到小排序&#xff0c;并定時刷新 使用react配合echarts進行實現。 react引入echarts import React, { useEffect, useRef } from react; import * as echarts from echarts; import DeviceApi fro…

【開源項目】輕量加速利器 HubProxy 自建 Docker、GitHub 下載加速服務

??引言?? 如果你經常被 Docker 鏡像拉取、GitHub 文件下載的龜速折磨&#xff0c;又不想依賴第三方加速服務&#xff08;擔心穩定性或隱私&#xff09;&#xff0c;今天分享的 ??HubProxy?? 可能正是你需要的。這個開源工具用一行命令就能部署&#xff0c;以極低資源消…

java web jsp jstl練習

JSP 的學習。 核心功能模塊 1. 源代碼層 &#xff08; src &#xff09; HelloWorld &#xff1a;主程序入口領域模型 &#xff1a; domain 包含User.java和ceshi.java控制器 &#xff1a; servlet 包含登錄驗證和驗證碼相關ServletWeb表現層 &#xff08; web &#xff09; JS…

VSCode 完全指南:釋放你的編碼潛能

零、簡介 在當今的軟件開發領域&#xff0c;代碼編輯器的選擇至關重要&#xff0c;它就像是工匠手中的工具&#xff0c;直接影響著工作效率和成果質量。Visual Studio Code&#xff08;簡稱 VSCode&#xff09;自問世以來&#xff0c;迅速在全球開發者社區中嶄露頭角&#xff…

《n8n基礎教學》第一節:如何使用編輯器UI界面

在本課中&#xff0c;你將學習如何操作編輯器界面。我們將瀏覽畫布&#xff0c;向您展示每個圖標的含義&#xff0c;以及在 n8n 中構建工作流程時在哪里可以找到您需要的東西。本課程基于 n8n 最新版本 。在其他版本中&#xff0c;某些用戶界面可能有所不同&#xff0c;但這不會…

gcc g++ makefile CMakeLists.txt cmake make 的關系

gcc&#xff1a;C語言編譯器g&#xff1a;C編譯器makefile&#xff1a;定義編譯規則、依賴關系和構建目標。可以手動編寫&#xff0c;也可以由CMakeLists.txt生成cmake&#xff1a;讀取CMakeLists.txt文件&#xff0c;生成Makefilemake&#xff1a;構建工具&#xff0c;執行Mak…

SFT 訓練器

SFT 訓練器 “訓練時間到!” 我們現在終于可以創建一個監督微調訓練器的實例了: trainer = SFTTrainer( model=model, processing_class=tokenizer, args=sft_config, train_dataset=dataset, )SFTTrainer 已經對數據集進行了預處理,因此我們可以深入查看,了解每個小批次…