Java高級 | 【實驗三】Springboot 靜態資源訪問

隸屬文章:?Java高級 | (二十二)Java常用類庫-CSDN博客

系列文章:?Java高級 | 【實驗一】Spring Boot安裝及測試 最新-CSDN博客

? ? ? ? ? ? ? ? ? ?Java高級 | 【實驗二】Springboot 控制器類+相關注解知識-CSDN博客

目錄

一、Thymeleaf

1.1 是什么?

1.2?Thymeleaf機制說明

1.3?優點VS缺點

1.4?使用Thymeleaf

(1)jar包依賴

(2)在application.properties中配置thymeleaf

二、Thymeleaf語法

2.1 chongyoth屬性

①文本替換(th:text)

②HTML 替換(th:utext)

2.2 其他th 屬性

三、spring?boot使用Thymeleaf

3.1 創建spring?boot工程并默認使用thymeleaf模板引擎

3.2 編寫控制器類及數據對象類

3.3 編寫前端視圖頁面

(1)編寫test1.html

(2)編寫test2.html

(3)編寫test3.html

(4)編寫test4.html

?四、練習題

【問題】

【答案】


? ? ? ? ?Web 開發離不開動態頁面的開發,很早以前企業主要使用JSP技術來開發網頁,隨著技術的升級更替,目前來說主流的方案是Thymeleaf

? ? ? ??Thymeleaf 是一個模板框架,它可以支持多種格式的內容動態渲染,功能非常強大,它天然和 HTML是相融合的,所以對于前端工程師來說它也是易于理解的。

? ? ? ?Springboot默認是不支持JSP的,默認使用Thymeleaf模板引擎

官方文檔:Tutorial: Using Thymeleaf

一、Thymeleaf

1.1 是什么?

  1. 是一個跟 Velocity、FreeMarker 類似的模板引擎可完全替代 JSP
  2. 是一個 java 類庫,它是一個 xml/xhtml/html5 的模板引擎,可以作為mvc的web應用的view層

1.2?Thymeleaf機制說明

? ? ? ? ?Thymeleaf 是服務器渲染技術,頁面數據是在服務器端進行渲染的

? ? ? ? 因此,在開發中使用Thymeleaf,并不是前后端分離

1.3?優點VS缺點

  1. 開箱即用,它提供標準和spring標準兩種方言,可以直接套用模板實現JSTL、 OGNL表達式效果,避免每天套模板、改jstl、改標簽的困擾。同時開發人員也可以擴展和創建自定義的方言;
  2. Thymeleaf模板頁面無需服務器渲染,也可以被瀏覽器運行,頁面簡潔SpringBoot支持 Thymeleaf、Velocity、FreeMarker
  • 并不是一個高性能的引擎,適用于單體應用如果要做一個高并發的應用,選擇前后端分離更好,但是作為SpringBoot推薦的模板引擎,還是需要了解一下

1.4?使用Thymeleaf

(1)jar包依賴

在pom.xml中添加如下依賴:?

//這個配置是必須的,事實上,spring?boot項目創建好后,已自動添加該依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>

(2)在application.properties中配置thymeleaf

//這個配置不是必須的
//但是spring.thymeleaf.mode的默認值是HTML5,其實是一個很嚴格的檢查,改為LEGACYHTML5可以得到一個可能更友好親切的格式要求。
spring.thymeleaf.mode?=?LEGACYHTML5

二、Thymeleaf語法

2.1 chongyoth屬性

? ? html有的屬性,Thymeleaf基本都有,而常用的屬性大概有七八個。其中th屬性執行的優先級從1~8,數字越低優先級越高。

屬性

作用描述

相關屬性

優先級(order)

說明

th:insert

代碼塊引入

th:replace, th:include

1

優先級最高,常用于公共代碼塊提取

三者的區別較大,若使用不恰當會破壞html結構

th:each

遍歷循環元素

與 th:text、th:value 一起使用

2

優先級很高,注意修飾標簽位置

th:if

條件判斷

th:unless, th:switch, th:case

3

優先級較高

th:object

聲明變量,配合 *{} 使用,達到偷懶的效果

-

4

優先級一般,用于簡化表達

th:attr

修改任意屬性

th:attrappend, th:attrprepend

5

優先級一般,實際開發中用的較少,因為有豐富的其他th屬性幫忙,類似的還有th:attrappend,th:attrprepend

th:value

設置當前元素的 value 值,類似修改指定屬性

th:src, th:href

6

優先級不高

th:text

設置當前元素的文本內容

th:utext

7

優先級不高,th:text會轉義HTML標簽,th:utext不會

th:fragment

定義代碼塊,供 th:insert 引用

-

8

優先級最低

文本替換(th:text

文本替換是指直接將變量的值替換到 HTML 標簽的文本內容中。

在 Thymeleaf 中,可以使用th:text屬性來實現文本替換。

<p th:text="${user.name}">Default Text</p>

在這個例子中,${user.name}?的值會替換?<p>?標簽中的文本內容,如果user.name存在,則其值會顯示在頁面上;如果不存在,則顯示默認文本"Default Text"。

HTML 替換(th:utext

HTML 替換是指將變量的值作為 HTML 內容插入到 HTML 標簽中。在 Thymeleaf 中,可以使用th:utext屬性來實現 HTML 替換。

<div th:utext="${user.description}">Default HTML</div>

在這個例子中,${user.description}?的值會被作為 HTML 內容插入到?<div>?標簽中,不會被轉義處理。這意味著,如果${user.description}的值包含 HTML 標簽,它們會被正確地解析并顯示在頁面上。

2.2 其他th 屬性

Thymeleaf 還提供了大量的 th 屬性,這些屬性可以直接在 HTML 標簽中使用,其中常用 th 屬性及其示例如下表。

屬性

描述

示例

th:id

替換 HTML 的?id 屬性

<input id="html-id" th:id="thymeleaf-id" />

th:text

文本替換,轉義特殊字符

<h1 th:text="hello,bianchengbang" >hello</h1>

th:utext

文本替換,不轉義特殊字符

<div th:utext="<h1>歡迎來到編程幫!</h1>" >歡迎你</div>

th:object

在父標簽選擇對象,子標簽使用 *{…} 選擇表達式選取值。
沒有選擇對象,那子標簽使用選擇表達式和 ${…} 變量表達式是一樣的效果。
同時即使選擇了對象,子標簽仍然可以使用變量表達式。

<div th:object="${session.user}" >

<p th:text="*{fisrtName}">firstname</p>

</div>

th:value

替換 value 屬性

  • <input th:value = "${user.name}" />

th:with

局部變量賦值運算

  • <div th:with="isEvens = ${prodStat.count}%2 == 0" th:text="${isEvens}"></div>

th:style

設置樣式

  • <div th:style="'color:#F00; font-weight:bold'">編程幫 www.biancheng.net</div>

th:onclick

點擊事件

  • <td th:onclick = "'getInfo()'"></td>

th:each

遍歷,支持 Iterable、Map、數組等。
?

  • <table>
  • <tr th:each="m:${session.map}">
  • <td th:text="${m.getKey()}"></td>
  • <td th:text="${m.getValue()}"></td>
  • </tr>
  • </table>

th:if

根據條件判斷是否需要展示此標簽

  • <a th:if ="${userId == collect.userId}">

th:unless

和 th:if 判斷相反,滿足條件時不顯示

  • <div th:unless="${m.getKey()=='name'}" ></div>

th:switch

與 Java 的?switch case語句類似
通常與 th:case 配合使用,根據不同的條件展示不同的內容

  • <div th:switch="${name}">
  • <span th:case="a">編程幫</span>
  • <span th:case="b">www.biancheng.net</span>
  • </div>

th:fragment

模板布局,類似 JSP 的 tag,用來定義一段被引用或包含的模板片段

  • <footer th:fragment="footer">插入的內容</footer>

th:insert

布局標簽;
將使用 th:fragment 屬性指定的模板片段(包含標簽)插入到當前標簽中。

  • <div th:insert="commons/bar::footer"></div>

th:replace

布局標簽;
使用 th:fragment 屬性指定的模板片段(包含標簽)替換當前整個標簽。

  • <div th:replace="commons/bar::footer"></div>

th:selected

select 選擇框選中

  • <select>
  • <option>---</option>
  • <option th:selected="${name=='a'}">
  • 編程幫
  • </option>
  • <option th:selected="${name=='b'}">
  • www.biancheng.net
  • </option>
  • </select>

th:src

替換 HTML 中的 src 屬性?

  • <img th:src="@{/asserts/img/bootstrap-solid.svg}" src="asserts/img/bootstrap-solid.svg" />

th:inline

內聯屬性;
該屬性有 text,none,javascript 三種取值,
在 <script> 標簽中使用時,js 代碼中可以獲取到后臺傳遞頁面的對象。

  • <script type="text/javascript" th:inline="javascript">
  • var name = /*[[${name}]]*/ 'bianchengbang';
  • alert(name)
  • </script>

th:action

替換表單提交地址

  • <form th:action="@{/user/login}" th:method="post"></form>

三、spring?boot使用Thymeleaf

3.1 創建spring?boot工程并默認使用thymeleaf模板引擎

? ? File->New->Project

至此,一個基于spring?boot的web工程已創建完畢,該工程默認的前端模板是Thymeleaf

運行工程,如果能運行成功。則編寫控制器類。

如果不能正常運行,請根據提示信息修改工程的配置,可能修改pom.xml,可能修改工程的結構(快捷鍵shift+ctrl+alt+s)等。

3.2 編寫控制器類及數據對象類

在當前包com.example.thymeleaftest中創建控制器類及數據對象類。

(1)創建 ?MyData1類?

//存放數據對象
package com.example.thymeleaftest;public class MyData1 {private int id = 0;private String username="";private String password="";public MyData1() {}public MyData1(int id, String username, String password) {this.id = id;this.username = username;this.password = password;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "MyData1{" +"id=" + id +", username='" + username + '\'' +", password='" + password + '\'' +'}';}
}

(2)編寫控制器類?TestController

用于跳轉到視圖層并傳遞相關數據給指定的視圖層。

package com.example.thymeleaftest;import jakarta.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.ArrayList;
import java.util.List;@Controller//該注解表明TestController類是一個控制器
@RequestMapping("/test")//注解TestController類所有方法訪問的url是http://localhost8080/test
public class TestController {@RequestMapping("/test1")//該方法處理的url是http://localhost8080/test/test1public String test1() {return "test1";//轉發給視圖test1.html}@RequestMapping("/test2")//該方法處理的url是http://localhost8080/test/test2public String test2(Model model) {//參數model為模型,用來存放轉發到視圖的數據String name = "Jack";model.addAttribute("name", name);//模型中填充數據,該數據在視圖的中名稱為namereturn "test2";}@RequestMapping("/test3")//該方法處理的url是http://localhost8080/test/test3public String test3(Model model) {List<MyData1> myList = new ArrayList<>();myList.add(new MyData1(1, "laisc", "lai1203"));myList.add(new MyData1(2, "admin", "admin888"));myList.add(new MyData1(3, "root", "root9812"));model.addAttribute("userlist", myList);return "test3";}@RequestMapping("/test4")//該方法處理的url是http://localhost8080/test/test4public String test4(Model model) {MyData1 mydata1 = new MyData1(1, "admin", "admin1234");model.addAttribute("data123", mydata1);return "test4";}@RequestMapping("/test5")//該方法處理的url是http://localhost8080/test/test2public String test5(HttpServletRequest request) {String name = "張三";request.setAttribute("name", name);return "test2";}
}

上面的控制類一個定義了5個方法,每個方法都定義了其前端訪問的url,以及返回到視圖的數據。

3.3 編寫前端視圖頁面

前端視圖用的是thymeleaf模板,而thymeleaf模板默認的路徑是/resources/templates。因此,我們在templates文件夾中創建4個html頁面,分別是test1.html、test2.html、test2.html和test4.html,即4個視圖頁面。如圖4所示:

(1)編寫test1.html

? ? ? ? 該視圖對應TestController控制器類的test1()方法,該方法沒有傳遞任何數據到test1.html視圖。test1.html視圖直接輸出“Hello, world!”,其代碼如下所示。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
Hello, world!
</body>
</html>

?

說明:由于該視圖沒有輸出變量的值,因此可以使用傳統的html代碼。

(2)編寫test2.html

該視圖對應TestController控制器類的test2()方法,該方法傳遞一個“name”變量到test2.html視圖。test2.html視圖輸出“name”變量的值。其代碼如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<p th:text="'Hello, ' + ${name} + '!'"></p>
</body>
</html>
  • <html xmlns:th="http://www.thymeleaf.org">---導入thymeleaf資源說明:由于該視圖要輸出變量的值,因此必須使用thymeleaf+html代碼。
  • <p th:text="'Hello, ' + ${name} + '!'">3333</p>----輸出變量。?

(3)編寫test3.html

? ? 該視圖對應TestController控制器類的test3()方法,該方法傳遞一個list集合到 test3.html視圖,視圖循環輸出集合的值。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<table><tr><th>ID</th><th>username</th><th>password</th></tr><tr th:each="user : ${userlist}"><td th:text="${user.id}">-1</td><td th:text="${user.username}">abc</td><td th:text="${user.password}">555</td></tr>
</table>
</body>
</html>

(4)編寫test4.html

? ? ? 該視圖對應TestController控制器類的test3()方法,該方法傳遞一個model對象到test4.html視圖.該視圖把對象的值輸出到超鏈接的參數值。

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<a href="details.html" th:href="@{http://localhost:8080/gtvg/order/details(orderId=${data123.username})}">鏈接1</a>
<a href="details.html" th:href="@{/order/details(orderId=${data123.username})}">鏈接2</a>
<a href="abc.html" th:href="'order/'+${data123.id}+'/details?orderId='+${data123.username} ">鏈接3</a>
<a href="abc.html" th:href="@{'/details/'+${data123.id}(orderId=${data123.username})}">鏈接4</a>
<a href="abc.html" th:href="@{'/details/'+${data123.id}+'/aaa'(orderId=${data123.username})}">鏈接5</a>
</body>
</html>


四、練習題

【問題】

編寫一個控制器,產生100個學生對象,并把這些對象在html中以表格的形式輸出。

【答案】

package com.example.thymeleaftest;public class Student {private int id;private String name;private int age;public Student(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}// Getter方法public int getId() { return id; }public String getName() { return name; }public int getAge() { return age; }
}
package com.example.thymeleaftest;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.ArrayList;
import java.util.List;@Controller
@RequestMapping("/student")
public class StudentController {@RequestMapping("/list")public String listStudents(Model model) {List<Student> students = new ArrayList<>();// 生成100個簡單學生數據for (int i = 1; i <= 100; i++) {students.add(new Student(i, "學生" + i, 18 + (i % 7)));}model.addAttribute("students", students);return "studentList";}
}
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>學生列表</title>
</head>
<body>
<h1>學生列表</h1>
<table border="1"><tr><th>ID</th><th>姓名</th><th>年齡</th></tr><tr th:each="student : ${students}"><td th:text="${student.id}"></td><td th:text="${student.name}"></td><td th:text="${student.age}"></td></tr>
</table>
</body>
</html>

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

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

相關文章

12、企業應收賬款(AR)全流程解析:從發票開具到回款完成

在商業活動中&#xff0c;現金流如同企業的命脈&#xff0c;而應收管理則是維系這條命脈正常運轉的重要保障。許多企業由于對應收賬款缺乏有效管理&#xff0c;常常面臨資金周轉困難的問題。實踐證明&#xff0c;建立科學的應收管理體系能夠顯著提升資金回籠效率&#xff0c;為…

Python訓練營打卡Day46(2025.6.6)

知識點回顧&#xff1a; 不同CNN層的特征圖&#xff1a;不同通道的特征圖什么是注意力&#xff1a;注意力家族&#xff0c;類似于動物園&#xff0c;都是不同的模塊&#xff0c;好不好試了才知道。通道注意力&#xff1a;模型的定義和插入的位置通道注意力后的特征圖和熱力圖 i…

ASP.NET MVC添加視圖示例

ASP.NET MVC高效構建Web應用- 商品搜索 - 京東 視圖&#xff08;V&#xff09;是一個動態生成HTML頁面的模板&#xff0c;它負責通過用戶界面展示內容。本節將修改HelloWorldController類&#xff0c;并使用視圖模板文件&#xff0c;以干凈地封裝生成對客戶端的HTML響應的過程…

12.6Swing控件4 JSplitPane JTabbedPane

JSplitPane JSplitPane 是 Java Swing 中用于創建分隔面板的組件&#xff0c;支持兩個可調整大小組件的容器。它允許用戶通過拖動分隔條來調整兩個組件的相對大小&#xff0c;適合用于需要動態調整視圖比例的場景。 常用方法&#xff1a; setLeftComponent(Component comp)&a…

Spark 單機模式部署與啟動

&#x1f680; Spark 單機模式部署與啟動教程&#xff08;適配 Hadoop 3.1.1&#xff09; 本文記錄了在 Linux 環境中部署 Spark 的完整過程&#xff0c;使用 Standalone 單機模式&#xff0c;適配 Hadoop 3.1.1&#xff0c;最終可通過 Web 頁面訪問 Spark Master 狀態界面。 …

JAVA學習 DAY2 java程序運行、注意事項、轉義字符

本系列可作為JAVA學習系列的筆記&#xff0c;文中提到的一些練習的代碼&#xff0c;小編會將代碼復制下來&#xff0c;大家復制下來就可以練習了&#xff0c;方便大家學習。 點贊關注不迷路&#xff01;您的點贊、關注和收藏是對小編最大的支持和鼓勵&#xff01; 系列文章目錄…

Visual Studio 中的 MD、MTD、MDD、MT 選項詳解

在Visual Studio中開發C++項目時,正確選擇運行時庫(runtime library)對于確保應用程序的性能、穩定性和兼容性至關重要。本文將詳細介紹/MD, /MT, /MDd, 和 /MTd這些編譯器選項的意義、應用場景及其區別。 MSVCRT.dll MSVCRT.dll 是 Microsoft Visual C++ Runtime Library …

EasyRTC嵌入式音視頻通信SDK助力物聯網/視頻物聯網音視頻打造全場景應用

一、方案概述? 隨著物聯網技術的飛速發展&#xff0c;視頻物聯網在各行業的應用日益廣泛。實時音視頻通信技術作為視頻物聯網的核心支撐&#xff0c;其性能直接影響著系統的交互體驗和信息傳遞效率。EasyRTC作為一款成熟的音視頻框架&#xff0c;具備低延遲、高畫質、跨平臺等…

棧的概念以及實現

目錄: 一、棧的概念 二、棧的實現 1.棧的初始化 2.棧的銷毀 3.入棧 4.出棧 5.獲取棧頂數據 6.判斷棧是否為空 7.獲取棧的個數 三、代碼 一、棧的概念 棧是一種特殊的線性表&#xff0c;其只允許在固定的一端進行插入和刪除元素操作。 進行數據插入和刪除操作的一端…

【Bluedroid】藍牙啟動之 SMP_Init 源碼解析

藍牙(安全管理協議,Security Management Protocol)是藍牙設備安全通信的核心協議,負責配對、密鑰協商和安全等級管理。本文圍繞 Bluedroid SMP 協議的初始化流程展開,系統解析其核心控制塊(tSMP_CB)的狀態管理、與 L2CAP 層的接口注冊,以及 P-256 橢圓曲線參數的初始化…

C++課設:考勤記錄系統

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 專欄介紹&#xff1a;《編程項目實戰》 目錄 一、項目背景與需求分析1. 傳統考勤管理…

前端面試題之ES6保姆級教程

ES6 核心特性深度解析&#xff1a;現代 JavaScript 開發基石 2015 年發布的 ECMAScript 2015&#xff08;ES6&#xff09;徹底改變了 JavaScript 的編程范式&#xff0c;本文將全面剖析其核心特性及最佳實踐 一、ES6 簡介與背景 ECMAScript 6.0&#xff08;簡稱 ES6&#xff0…

CTF:網絡安全的實戰演練場

文章目錄 每日一句正能量前言一、CTF簡介&#xff08;一&#xff09;什么是CTF&#xff1f;&#xff08;二&#xff09;CTF的歷史 二、CTF比賽形式&#xff08;一&#xff09;線上賽&#xff08;Online CTF&#xff09;&#xff08;二&#xff09;線下賽&#xff08;Offline CT…

如何自定義一個 Spring Boot Starter?

導語&#xff1a; 在后端 Java 面試中&#xff0c;Spring Boot 是繞不開的重點&#xff0c;而“如何自定義一個 Starter”作為進階開發能力的體現&#xff0c;常被面試官用于考察候選人的工程架構思維與 Spring Boot 底層掌握程度。本文將帶你深入理解自定義 Starter 的實現邏輯…

大學課程:計算機科學與技術專業主要課程,是否落伍了?

計算機科學與技術 計算機科學與技術&#xff08;CS&#xff09;是一門涵蓋理論、系統、應用的綜合學科&#xff0c;其課程體系圍繞“計算機的底層原理、開發方法、技術創新”展開&#xff0c;既包含數學與理論基礎&#xff0c;也涉及工程實踐與前沿技術。以下是主要課程的分類…

docker-部署Nginx以及Tomcat

一、docker 部署Nginx 1、搜索鏡像&#xff08;nginx&#xff09; [rootlocalhost /]# docker search nginx Error response from daemon: Get "https://index.docker.io/v1/search?qnginx&n25": dial tcp 192.133.77.133:443: connect: connection refused 簡…

服務器信任質詢

NSURLSession 與 NSURLAuthenticationMethodServerTrust —— 從零開始的“服務器信任質詢”全流程 目標讀者&#xff1a;剛接觸 iOS 網絡開發、準備理解 HTTPS 與證書校驗細節的同學 出發點&#xff1a;搞清楚為什么會有“質詢”、質詢的觸發時機、以及在 delegate 里怎么正確…

MCP協議重構AI Agent生態:萬能插槽如何終結工具孤島?

前言 在人工智能技術快速發展的2025年&#xff0c;MCP(Model Context Protocol&#xff0c;模型上下文協議)正逐漸成為AI Agent生態系統的關鍵基礎設施。這一由Anthropic主導的開放協議&#xff0c;旨在解決AI模型與外部工具和數據源之間的連接難題&#xff0c;被業界形象地稱…

測試 FreeSWITCH 的 mod_loopback

bgapi originate loopback/answer,park/default/inline park inline show channels as xml show calls as xml 有 2 個 channels 有 2 個 calls 比較有意思 在 loopback-a 是播放 wav 在 loopback-b 上可以錄音 這就是回環 有什么用呢&#xff1f; 除了做測試&#x…

三維GIS開發cesium智慧地鐵教程(4)城市白模加載與樣式控制

一、添加3D瓦片 <!-- 核心依賴引入 --> <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"><!-- 模型數據路徑 --> u…