記SpringBoot3.x + Thymeleaf 項目實現(MVC架構模式)

目錄

前言

一、創建SpringBoot項目

1. 創建項目

2. 運行項目

二、連接數據庫實現登錄

1. pom.xml文件引入依賴包

2. application.yml文件配置

3.?數據持久層,mybatis操作映射

4.?Service接口及實現

5.?Controller代碼

6.?Thymeleaf頁面登錄

7. 運行項目

8. 補充說明一下Controller中參數的接收

總結


前言

SpringBoot很多人都比較熟悉了,今天再從頭來一次項目創建及使用。順帶做一次文章記錄。


一、創建SpringBoot項目

1. 創建項目

IDEA 2021 創建:SpringBoot默認jar包格式、選擇JDK17往上才能匹配SpringBoot3.x。

點擊Next下一步后:選擇springboot3.0.2版本、勾選Spring Web起步依賴。

得到項目結構如下:(已經是一個基礎的MVC架構模式了)

2. 運行項目

應為項目目前已經是一個基礎的MVC架構模式了,所以不用多做什么就可以直接運行了。

yml文件配置:

BasicController控制器代碼:

SpringBoot項目是運行@SpringBootApplication注解的類(WqinfoApplication.java):

我們訪問地址:http://127.0.0.1:8080/html得到如下結果:

網頁結果:訪問BasicController控制器中的/html請求映射到了index.html頁面顯示。

相當的簡單就搭建運行起了一個項目。這就是SpringBoot。

二、連接數據庫實現登錄

1. pom.xml文件引入依賴包

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.4</version></dependency><dependency><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc8</artifactId><scope>runtime</scope></dependency><dependency><groupId>cn.easyproject</groupId><artifactId>orai18n</artifactId><version>12.1.0.2.0</version></dependency>

2. application.yml文件配置

3.?數據持久層,mybatis操作映射

package com.wq.wqinfo.persistence;import com.wq.wqinfo.domain.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;/*** @author lv* @date 2025年8月11日10點01分* 數據持久層,mybatis操作映射*/
@Mapper
public interface UserMapper {/*** 根據用戶名查詢* @param username 用戶名* @return*/@Select("select * from SYS_USER where USERNAME=#{username}")User findByUsername(String username);
}

4.?Service接口及實現

package com.wq.wqinfo.service;import com.wq.wqinfo.domain.User;/*** @author lv* @date 2025年8月11日10點22分* 業務層接口類*/
public interface UserService {/**** @param user* @return*/public String login(User user);
}
package com.wq.wqinfo.service.impl;import com.wq.wqinfo.domain.User;
import com.wq.wqinfo.persistence.UserMapper;
import com.wq.wqinfo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.UUID;/*** @author lv* @date 2025年8月11日10點22分* 業務層接口類*/
@Service
public class UserServiceImpl implements UserService {/*** 注入UserMapper獲取數據庫用戶信息*/@Autowiredprivate UserMapper userMapper;@Overridepublic String login(User user) {System.out.println("UserServiceImpl-login-----" + user);User user2=userMapper.findByUsername(user.getUsername());System.out.println("用戶查詢----用戶名:" + user2.getUsername()+",密碼:"+ user2.getPassword());if(user2!=null){ //省略了密碼對比環節//生成tokenString token= UUID.randomUUID().toString();return token;}return null;}}

5.?Controller代碼

package com.wq.wqinfo.controller;import com.wq.wqinfo.domain.User;
import com.wq.wqinfo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;/*** @author lv* @date 2025年8月11日16點10分* 業務層接口類*/
@Controller
@RequestMapping("/user")
public class UserController {//自動裝配@Autowiredprivate UserService userService;/*** 登錄* @param username* @param password* @param model* @return*/@PostMapping("/login")public String login(String username, String password, Model model){System.out.println("------login.............."+username+"---"+password);User user=new User();user.setUsername(username);user.setPassword(password);String token=  userService.login(user);System.out.println("....login...token:"+token);if(token!=null){model.addAttribute("msg",user.getUsername()+"登錄成功!");return "success";}model.addAttribute("msg",user.getUsername()+"登錄失敗!");return "error";}@GetMapping("/index")public String index(){System.out.println("用戶進入登錄頁面---------........");return "logins";   //沒使用json返回,直接映射到自定義登錄的頁面}
}

6.?Thymeleaf頁面登錄

logins.html (引入了th,Thymeleaf模板)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form th:action="@{/user/login}" method="post"><!--<input type="hidden" name="_csrf" th:value="${_csrf.token}" />--><!--注意:頁面提交方式必須為 post 請求,用戶名,密碼必須為username,password可以通過 usernameParameter()和 passwordParameter()方法修改默認配置-->用戶名:<input type="text" name="username"><br/>密碼:<input type="text" name="password"><br/><input type="submit" value="login"></form>
</body>
</html>

success.html(引入了th,Thymeleaf模板)

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<span th:text="${msg}"></span>
<h3>success 歡迎你的到來!你成功訪問此方法...</h3>
<br> <a href="/logout">退出</a>
</body>
</html>

error.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3>error 歡迎你的到來!你沒有權限訪問...</h3>
</body>
</html>

7. 運行項目

訪問http://127.0.0.1:8080/user/index

就是訪問Controller層的方法/index,映射請求到logins.html登錄頁面。直接訪問頁面不能訪問到。

輸入用戶名,密碼后登錄成功。

8. 補充說明一下Controller中參數的接收

(1)public String login(String username, String password, Model model)

(2)public String login(User user, Model model)--User實體類中包含username和password

以上兩種方式都能接收到頁面POST的用戶名和密碼。

傳遞參數的時候還可以使用注解@PathVariable或@RequestParam:

@PathVariable
獲取路徑參數。即url/{id}這種形式。


@RequestParam
獲取查詢參數。即url?name=這種形式。或 psot表單中的參數。

@RequestBody,接收的是請求體里面的數據
當你使用@RequestBody注解時,Spring期望請求的Content-Type頭部為application/json。如果請求的Content-Type不是這個值,Spring將無法正確解析請求體中的JSON數據。導致無法請求(POST)到對應的控制層Controller方法。


總結

在這個SpringBoot項目中我也嘗試使用過JSP來弄頁面,但是可惜我沒有弄成功,所以后面也沒有堅持了。但是聽說是可以弄成功的。沒有堅持的原因是:SpringBoot默認不支持 JSP ,因此推薦使用Thymeleaf。Thymeleaf語法更簡單,功能更強大,支持HTML、XML、JavaScript等格式,且與Spring框架高度集成。

附加:

最后我又百度了一下兩個問題:僅參考一下

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

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

相關文章

Java 導出word 實現表格內插入圖表(柱狀圖、折線圖、餅狀圖)--可編輯數據

表格內插入圖表導出效果表格內圖表生成流程分析 核心問題與解決方案 問題 Word 圖表作為獨立對象&#xff0c;容易與文本分離位置難以精確控制&#xff0c;編輯時容易偏移缺乏與表格數據的關聯性 解決方案 直接嵌入&#xff1a;將圖表嵌入表格單元格&#xff0c;確保數據關聯精…

北京JAVA基礎面試30天打卡12

1.MySQL中count(*)、count(I)和count(字段名)有什么區別&#xff1f; 1**.COUNT ()**是效率最高的統計方式&#xff1a;COUNT()被優化為常量&#xff0c;直接統計表的所有記錄數&#xff0c;不依賴字段內容&#xff0c;開銷最低。推薦在統計整個表的記錄數時使用。 2.**COUNT(1…

【AI】——結合Ollama、Open WebUI和Docker本地部署可視化AI大語言模型

&#x1f3bc;個人主頁&#xff1a;【Y小夜】 &#x1f60e;作者簡介&#xff1a;一位雙非學校的大三學生&#xff0c;編程愛好者&#xff0c; 專注于基礎和實戰分享&#xff0c;歡迎私信咨詢&#xff01; &#x1f386;入門專欄&#xff1a;&#x1f387;【MySQL&#xff0…

RAG學習(二)

構建索引 一、向量嵌入 向量嵌入&#xff08;Embedding&#xff09;是一種將真實世界中復雜、高維的數據對象&#xff08;如文本、圖像、音頻、視頻等&#xff09;轉換為數學上易于處理的、低維、稠密的連續數值向量的技術。 想象一下&#xff0c;我們將每一個詞、每一段話、…

亞馬遜店鋪績效巡檢_影刀RPA源碼解讀

一、項目簡介 本項目是一個基于RPA開發的店鋪績效巡店機器人。該機器人能夠自動化地登錄賣家后臺&#xff0c;遍歷多個店鋪和站點&#xff0c;收集并分析各類績效數據&#xff0c;包括政策合規性、客戶服務績效、配送績效等關鍵指標&#xff0c;并將數據整理到Excel報告中&…

跨越南北的養老對話:為培養“銀發中國”人才注入新動能

2025年8月16日&#xff0c;北京養老行業協會常務副會長陳楫寶一行到訪廣州市白云區粵榮職業培訓學校&#xff0c;受到頤年集團副總李娜的熱情接待。此次訪問不僅是京穗兩地養老行業的一次深度交流&#xff0c;更為推動全國智慧養老體系建設、提升養老服務專業化水平注入了新動能…

Spring IOC 學習筆記

1. 概述Spring IOC&#xff08;Inversion of Control&#xff0c;控制反轉&#xff09;是一種設計思想&#xff0c;通過依賴注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;實現。它的核心思想是將對象的創建和依賴關系的管理交給Spring容器&#xff0c;從而降…

揭開Android Vulkan渲染封印:幀率暴增的底層指令

ps&#xff1a;本文內容較干&#xff0c;建議收藏后反復邊跟進源碼邊思考設計思想。壹渲染管線的基礎架構為什么叫渲染管線&#xff1f;這里是因為整個渲染的過程涉及多道工序&#xff0c;像管道里的流水線一樣&#xff0c;一道一道的處理數據的過程&#xff0c;所以使用渲染管…

HTTP 請求轉發與重定向詳解及其應用(含 Java 示例)

在 Web 開發中&#xff0c;我們經常需要在不同頁面之間跳轉&#xff0c;比如登錄成功后跳到首頁、提交表單后跳到結果頁面。這時&#xff0c;常見的兩種跳轉方式就是 請求轉發&#xff08;Request Forward&#xff09; 和 重定向&#xff08;Redirect&#xff09;。雖然它們都能…

如何將 MCP Server (FastMCP) 配置為公網訪問(監聽 0.0.0.0)

如何將 MCP Server &#xff08;FastMCP&#xff09; 配置為公網訪問&#xff08;監聽 0.0.0.0&#xff09;引言常見錯誤嘗試根本原因&#xff1a;從源碼解析正確的解決方案總結引言 在使用 Model Context Protocol(MCP) 框架開發自定義工具服務器時&#xff0c;我們經常使用 …

The Network Link Layer: 無線傳感器中Delay Tolerant Networks – DTNs 延遲容忍網絡

Delay Tolerant Networks – DTNs 延遲容忍網絡架構歸屬Delay Tolerant Networks – DTNs 延遲容忍網絡應用實例例子 1&#xff1a;瑞典北部的薩米人 (Saami reindeer herders)例子 2&#xff1a;太平洋中的動物傳感網絡DTNs路由方式——存儲&轉發DTNs移動模型Random walk …

計算機視覺(opencv)實戰二——圖像邊界擴展cv2.copyMakeBorder()

OpenCV copyMakeBorder() 圖像邊界擴展詳解與實戰在圖像處理和計算機視覺中&#xff0c;有時需要在原始圖像的四周增加邊界&#xff08;Padding&#xff09;。這種操作在很多場景中都有應用&#xff0c;比如&#xff1a;卷積神經網絡&#xff08;CNN&#xff09;中的圖像預處理…

ansible管理變量和事實

ansible管理變量和事實與實施任務控制 在 Ansible 中&#xff0c;變量和事實&#xff08;Facts&#xff09;就像給劇本&#xff08;Playbook&#xff09;配備的 “信息工具箱”&#xff0c;讓你的自動化配置管理更靈活、更智能。 變量&#xff1a;提前準備的 “預設信息” 變…

STM32--寄存器與標準庫函數--基本定時器

目錄 前言 基本定時器概念 定時時間 定時器時鐘確定 倍頻鎖相環被正確配置為168MHz 定時器的庫函數操作 代碼 定時器的寄存器操作 代碼 寄存器 后言 前言 使用平臺:STM32F407ZET6 使用數據手冊&#xff1a;STM32F407數據手冊.pdf 使用參考手冊&…

PCA 實現多向量壓縮:首個主成分的深層意義

PCA 實現多向量壓縮 第一個主成分(components_[0])正是數據協方差矩陣中最大特征值對應的特征向量。 ,layer_attention_vector[layer] 被賦值為 pca.components_[0],這確實是一個特征向量,具體來說是 PCA 分解得到的第一個主成分(主特征向量)。 關于它的維度: 假設 c…

網絡常識-DNS如何解析

DNS&#xff08;Domain Name System&#xff0c;域名系統&#xff09;是互聯網的“地址簿”&#xff0c;負責將人類易記的域名&#xff08;如www.example.com&#xff09;轉換為計算機可識別的IP地址&#xff08;如192.168.1.1&#xff09;。其工作流程可以簡單理解為“從域名到…

Java中 23 種設計模式介紹,附帶示例

文章目錄設計模式六大原則設計模式分類1、創建型模式&#xff08;Creational Patterns&#xff09;2、結構型模式&#xff08;Structural Patterns&#xff09;3、行為型模式&#xff08;Behavioral Patterns&#xff09;一、創建型模式&#xff08;Creational Patterns&#x…

嵌入式開發入門——電子元器件~電磁繼電器、蜂鳴器

文章目錄電磁繼電器定義關鍵參數實物蜂鳴器實物內部結構分類關鍵參數電磁繼電器 定義 概述&#xff1a;電磁繼電器是利用電磁感應原理職稱的一種電磁開關&#xff0c;他能通過&#xff1a;低電壓、低電流的電路&#xff0c;來控制高電壓、高電流的電路。 關鍵參數 線圈電壓…

ROS2基礎

1.helloworld案例1.創建功能包&#xff08;C&#xff09;終端下&#xff0c;進入ws00_helloworld/src目錄&#xff0c;使用如下指令創建一個C 功能包:ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld執行完畢&a…

Python爬蟲實戰:研究pygalmesh,構建Thingiverse平臺三維網格數據處理系統

1. 引言 1.1 研究背景 在數字化浪潮席卷全球的當下,三維建模技術已成為連接虛擬與現實的核心紐帶,廣泛滲透于工程設計、地理信息系統(GIS)、虛擬現實(VR)、增強現實(AR)、醫學影像等關鍵領域。例如,在建筑工程中,BIM(建筑信息模型)技術依賴高精度三維網格實現施工…