21.web
spring MVC
基于瀏覽器的 B/S 結構應用十分流行。Spring Boot 非常適合 Web 應用開發。可以使用嵌入式 Tomcat、Jetty、 Undertow 或 Netty 創建一個自包含的 HTTP 服務器。一個 Spring Boot 的 Web 應用能夠自己獨立運行,不依賴需 要安裝的 Tomcat,Jetty 等。
Spring Boot 可以創建兩種類型的 Web 應用
-
基于 Servlet 體系的 Spring Web MVC 應用
-
使用 spring-boot-starter-webflux 模塊來構建響應式,非阻塞的 Web 應用程序
Spring MVC 是“model view controller”的框架。專注 web 應用開發。我們快速的創建控制器(Controller),
接受來自瀏覽器或其他客戶端的請求。并將業務代碼的處理結果返回給請求方。
spring MVC 工作圖
創建web應用
創建 Web 應用,Lession12-quick-web。 依賴選擇 spring-web 包含了 Spring MVC , Restful, Tomcat 這些功能。 再選擇 Thymeleaf(視圖技術,代替 jsp),Lombok 依賴。
項目結構
html視圖
- 創建控制器
package com.yanyu.demo1.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;import java.time.LocalDateTime;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/19 17:21* @description:* @Controller:創建控制器對象,控制器能夠接收請求,響應結果給瀏覽器* * 控制器也叫做處理器*/
@Controllerpublic class Hello {
// 導入import org.springframework.ui.Model;@GetMapping("/hello")public String hello(Model model){
// 定義方法處理請求, 方法叫做控制器方法(處理器方法)//Model表示模型,存儲數據。 這個數據最后是放在request作用域。//HttpServletRequest放在的作用域中
//數據存放到模型model.addAttribute("title","第一個請求");//model.addAttribute("date", LocalDateTime.now());//獲取當前時間// 指定顯示到 hello 視圖,接下來創建 hello 視圖return "hello";}}
- 創建視圖
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>視圖技術</title>
</head>
<body>
<!--取出 Model 中 存放的 資源model.addAttribute("info","第一個web全球");"info" 該資源在 Model 叫什么 "第一個web全球" : 資源model.addAttribute("date", LocalDate.now());-->
<!-- 取出 Model 中 資源的格式--><div style="margin-left: 300px"><div th:text="${title}"></div><div th:text="${date}"></div></div>
</body>
</html>
tomcat 8 bin 目錄文件沖突
根據您提供的錯誤信息,問題的根本原因是嘗試在 64 位平臺上加載 32 位的 tcnative-1.dll
文件。這是一個典型的架構不匹配問題。以下是詳細的解決方法:
java.lang.UnsatisfiedLinkError: D:\dev\apache-tomcat-8.5.100\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platformat java.base/jdk.internal.loader.NativeLibraries.load(Native Method) ~[na:na]at java.base/jdk.internal.loader.NativeLibraries$NativeLibraryImpl.open(NativeLibraries.java:384) ~[na:na]at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:228) ~[na:na]at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:170) ~[na:na]at java.base/jdk.internal.loader.NativeLibraries.findFromPaths(NativeLibraries.java:311) ~[na:na]at java.base/jdk.internal.loader.NativeLibraries.loadLibrary(NativeLibraries.java:283) ~[na:na]
- 確認系統架構
- 檢查您的操作系統和 JVM 的架構。確保它們都是 64 位的。
- 在 Windows 上,可以通過“系統屬性”查看系統架構。
- 在命令行中運行
java -version
,確認 JVM 是否為 64 位。
- 下載正確的
tcnative-1.dll
- 訪問 Apache Tomcat Native Library 頁面,下載與您的系統架構(64 位)匹配的
tcnative-1.dll
文件。 - 確保下載的版本與您的 Tomcat 版本兼容。
- 替換錯誤的
tcnative-1.dll
- 找到錯誤的
tcnative-1.dll
文件位置(根據錯誤信息,它位于D:\dev\apache-tomcat-8.5.100\bin\
)。 - 將下載的正確版本的
tcnative-1.dll
替換掉現有的文件。
- 檢查環境變量
- 確保
PATH
環境變量中包含 Tomcat 的bin
目錄。- 在 Windows 上,可以通過“系統屬性”中的“環境變量”進行檢查和修改。
- 驗證依賴關系
- 使用工具(如 Dependency Walker)檢查新的
tcnative-1.dll
文件是否依賴于其他 32 位的 DLL 文件。 - 如果存在依賴問題,確保所有依賴的 DLL 文件也替換為 64 位版本。
- 重啟 Tomcat
- 替換文件后,重啟 Tomcat 以確保更改生效。
- 其他注意事項
- 如果問題仍然存在,可以嘗試將
tcnative-1.dll
文件放置在系統的其他標準庫路徑中(如%PATH%
或%JAVA_HOME%\bin
),并確保這些路徑在java.library.path
中。 - 確保您的 JVM 和 Tomcat 都是 64 位版本,避免架構不匹配。
通過以上步驟,您應該能夠解決 java.lang.UnsatisfiedLinkError
錯誤并成功運行 Tomcat。
JSON視圖
自己寫JSON
上面的例子以 Html 文件作為視圖,可以編寫復雜的交互的頁面,CSS 美化數據。除了帶有頁面的數據,還 有一種只需要數據的視圖。比如手機應用 app,app 的數據來自服務器應用處理結果。app 內的數據顯示和服務器 無關,只需要數據就可以了。主流方式是服務器返回 json 格式數據給手機 app 應用。
我們可以通過原始的 HttpServletResponse 應該數據給請求方。 借助 Spring MVC 能夠無感知的處理 json。
- 控制器
package com.yanyu.demo1.controller;import jakarta.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import java.io.IOException;
import java.io.PrintWriter;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/19 18:07* @description:*/
@Controller
public class JSONController {@RequestMapping("/json")// 暫時先拋出響應異常public void responseTest(HttpServletResponse response) throws IOException {
// 準備 json 格式數據/** {* user:"",* age:"";* }** */String json = "{\"user\":\"yanyu\",\"age\":20}";
// 設置在瀏覽器的響應類型response.setContentType("application/json;charset=utf-8");
// 響應對象PrintWriter out = response.getWriter();out.print(json);
// 刷新管道out.flush();
// 關閉流out.close();}}
利用jackson轉為json
SpringMVC支持控制器方法返回對象, 由框架將對象使用jackson轉為json,并輸出
User–Jackson工具庫的ObjectMapper對象,—user轉為json格式字符串–HttpServletResponse輸出
接受請求的注解
@GetMapping:接收get請求 , 簡化的@RequestMapping(method=RequestMethod.GET)
@PostMapping 接收post請求
@PutMapping: 接收put請求
@DeleteMapping:接收delete請求
- 準備映射實體
package com.yanyu.demo1.vo;import lombok.Data;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/19 18:25* @description:json 映射實體*/
//使用Lombok 簡化 bean規范public class User {private String name;private Integer age;private String major;public User() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getMajor() {return major;}public void setMajor(String major) {this.major = major;}
}
package com.yanyu.demo1.controller;import com.yanyu.demo1.vo.User;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;/*** @Author yanyu666_508200729@qq.com* @Date 2025/4/19 18:28* @description:*/
@Controller
public class JacksonController {//設置請求方式 調用 Jackson 工具庫@RequestMapping("/jackson")@ResponseBody
// 自動將 對象 轉為 jsonpublic User getJsonUser(){User user = new User();user.setAge(20);user.setName("yanyu666");user.setMajor("軟件技術");return user;}}
加 favicon圖標
我們自己的網站定制 logo。首先找一個在線工具創建 favicon.ico。比如
https://quanxin.org/favicon
圖片生成我們需要的內容。生成的 logo 文件名稱是 favicon.ico
step1:將生成的 favicon.ico 拷貝項目的 resources/ 或 resources/static/ 目錄。
step2:在你的視圖文件,加入對 favicon.ico 的引用。
在視圖的
<head>部分加入 <link rel="icon" href="../favicon.ico" type="image/x-icon"/>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8">
<!-- 添加自己定制的圖標--><link rel="shortcut icon" href="../favicon_32x32.ico" type="image/x-icon"><title>視圖技術</title>
</head>
<body><div style="margin-left: 300px"><div th:text="${title}"></div><div th:text="${date}"></div></div>
</body>
</html>