Spring MVC (下)小項目實戰

1. 加法計算器

? ? ? ? 需求分析:

????????客戶端輸入倆個數,服務端進行相加然后返回結果.

? ? ? ? 約定前后端交互接口:?

? ? ? ? ? ? ? ? 接口的概念:?

? ? ? ? 接口?叫API(ApplicationProgrammingInterface),我們?般講到 接口或者API,指的都是同?個東西.是指應?程序對外提供的服務的描述,?于交換信息和執?任務(與JavaSE階段學習的[類和 接口]中的 接口是兩回事).簡單來說,就是允許客戶端給服務器發送哪些HTTP請求,并且每種請求預期獲取什么樣的HTTP響應.

????????現在"前后端分離"模式開發,前端和后端代碼通常由不同的團隊負責開發.雙?團隊在開發之前,會提前約定好交互的方式.客戶端發起請求,服務器提供對應的服務.服務器提供的服務種類有很多,客戶端按照雙?約定指定選擇哪?個服務.接口,計算機網絡講的的"應用層協議".把約定的內容寫在文檔上,就是"接口文檔",接口文檔也可以理解為是應用程序的"操作說明書".

? ? ? ? 簡而言之:?接口(此接口就是api,就是我們剛剛一直訪問的url,也就是RequestMapping里面,一般由客戶端定義和服務端定義之后,客戶端(前端)進行review(檢查))
注意事項: 雙方并行開發,接口定義之后,不輕易改變,改變了就要通知到每一個調用方,接口定義以接口文檔(防止背鍋)來進行呈現.

????????接口設計:
????????????????1. 接收什么(看后端完成這個功能需要什么)
????????????????2. 返回什么(1.后端能提供什么. 2. 前端頁面顯示需要什么)

? ? ? ? 我們這個加法計算器的接口:?

? ? ? ? 請求路徑: calc/sum

? ? ? ? 參數: num1,num2

? ? ? ? 返回: 倆個數相加的和(sum)

前端代碼:

頁面展示:

后端代碼:

結果:

代碼之間的關系:

2. 登錄

需求分析:

用戶輸?賬號和密碼,后端進?校驗密碼是否正確
如果不正確,前端進行用戶告知
如果正確,跳轉到首頁.首頁顯示當前登錄用戶
后續再訪問首頁,可以獲取到登錄用戶信息

頁面效果:

補充:異步調用

在發起異步調用后,代碼不會等待該調用完成,而是會立即繼續執行后續的語句,并在稍后的某個時間點處理異步操作的結果。

約定前后端交互接口:

用戶登錄
url:/user/login
參數:userName用戶名,password密碼
返回結果: true false 密碼正確還是失敗

獲取當前登錄用戶
url:/user/index
參數:無
返回:userName 當前登錄用戶

前端代碼:

用戶登錄

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>登錄頁面</title>
</head><body><h1>用戶登錄</h1>用戶名:<input name="userName" type="text" id="userName"><br>密碼:<input name="password" type="password" id="password"><br><input type="button" value="登錄" onclick="login()"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script>function login() {//前端向后端發送請求$.ajax({//這個是個異步調用的東西url:"/user/login",type: "post",data:{userName:$("#userName").val(),password:$("#password").val()},     //http響應成功的話success:function(result){if(result == true){//頁面跳轉location.href = "index.html"// //另一種跳轉方式// location.assign("index.html")// //還有一種方式// location.replace(可以了解一下三種的區別)}else{alert("密碼錯誤");}}});}</script>
</body></html>

獲取當前登錄用戶

<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport"content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>用戶登錄首頁</title>
</head><body>登錄人: <span id="loginUser"></span><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script> $.ajax({url: "/user/index",type: "get",success:function(loginName){$("#loginUser").text(loginName)}})</script>
</body></html>

后端代碼:

package org.xiaobai.springmvc_tets.MVCFistclass;import ch.qos.logback.core.util.StringUtil;
import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.SessionAttribute;@RequestMapping("/user")
@RestController
public class UserController {//用戶登錄@RequestMapping("/login")public Boolean login(String userName, String password, HttpSession session) {//參數校驗
//        if(userName == null || userName.length() == 0
//            || password == null || password.length() == 0){
//            return false;
//        }//另一種判斷方式if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)){return false;}//判斷密碼是否正確//上面進行了判空處理userName不為null,但是如果我們沒有判斷的話就會報空指針,因此我們是admin.eq而不是password.eq//后面開發的時候我們都把常量字符串寫在前面,變量寫在后面if("admin".equals(userName) && "admin".equals(password)) {//設置sessionsession.setAttribute("userName",userName);return true;}else {return false;}}//獲取當前登錄用戶@RequestMapping("/index")
//    public String getUserName(HttpSession session){public String getUserName(@SessionAttribute("userName") String userName){//從session里面去拿,首先我們要先去設置session里面的內容return userName;}}

注意: StringUtils.hasLength,這個是判斷字符串是不是一個空的對象的或者長度為0.

結果:


代碼之間的關系:

?

3. 表白墻

需求分析:

1. 輸入留言信息,點擊提交.后端收到前端的信息,并且存儲起來

2. 前端頁面顯示輸入的表白墻的信息

定義接口:

1. 發布留言(把信息從前端傳到后端)

url:/message/publish

param:from,to,say

返回結果: return: 成功/失敗 ture/false {ok:1}

2. 查詢留言(在前端頁面顯示所有的留言信息)

url:/message/getList

param:無

返回結果: 返回json[{},{},{}]

引入的工具或者包: lombok

lombok: 它是?個Java?具庫,通過添加注解的?式,在編譯時期自動幫我們生成代碼

步驟:

1. 安裝插件EditStart(可以快速把依賴搞到pom里面)


但是注意,不是所有的依賴都可以通過這個插件添加.如果插件沒有,那么就自己去手動添加
2. 添加lombok

用法演示:

@Data=@Getter+@Setter+@ToString+@EqualsAndHashCode+@RequiredArgsConstructor+@NoArgsConstructor. 因此@Data是一個復合注解

這個是其他注解的一些解釋和作用

接口1的前端后端代碼:

?后端接受到的消息實體:

主要代碼解析:

接口2的前后端代碼:

整體的聯系:

運行結果:

?

解決問題常用的辦法:

alt+shift+f格式化(idea)

出現問題:

(寫完后端,就測后端,寫完前端就測前端)

1.定位:是前端還是后端問題
打日志,看后端接收前端數據部分的代碼有沒有效果


如果沒有進入到后端就說明前端有問題,去前端也看看

前端打斷點:


然后去前端加日志,看提交數據部分的代碼生效不

如果前后端交互都沒有拿到值:?去fidde抓包,看請求的參數和postman里面請求參數是不是一樣

處理的方法:
1. 后端問題: 打日志,debug

這個是看表達式的值


2. 前端問題: 打日志,抓包
3. 考慮緩存問題刷新(ctrl+f5強制刷新或者清除緩存ctrl+Shift+delet),后端緩存:maven的循環按鈕)

好用的小工具: 在線比較代碼diff

圖書管理系統:

前端工具介紹:

簡介 · Bootstrap v4 中文文檔 v4.6 | Bootstrap 中文網

用法:

1. 引入css

2. 喜歡哪個構建就copy什么

3. 關于如何修改前端代碼

比如在模板上想改顏色,遵循就近原則,我們就去f12,找到它的css樣式(就近原則)

應用層分層

? ? ? ? 分層的概念:

在進入正式的圖書管理系統的編寫之前,我們需要知道什么是應用層分層

比如,一開始的MVC模式,view是涉及前端的,后面我們實現了前后端分離,現在MVC基本上都是把后端進行功能的拆分,再也不涉及前端.后面后端又進行了進一步的劃分.

? ? ? ? 那么我們理解了什么是分層的操作,什么是應用層分層呢?

????????應?分層是?種軟件開發設計思想,它將應?程序分成N個層次,這N個層次分別負責各自的職責,多個層次之間協同提供完整的功能.根據項?的復雜度,把項?分成三層,四層或者更多層.
常?的MVC設計模式,就是應?分層的?種具體體現.

? ? ? ? 為什么分層?

????????在最開始的時候,為了讓項?快速上線,我們通常是不考慮分層的.但是隨著業務越來越復雜,?量的代碼混在?起,會出現邏輯不清晰、各模塊相互依賴、代碼擴展性差、改動?處就牽?發?動全?等問題.所以學習對項目進?分層就是我們程序員的必修課了.簡而言之就是更好的管理.

? ? ? ? 怎么進行分層?

? ? ? ? 剛剛提到的MVC,就是把整體的系統分成了Model(模型),View(視圖)和Controller(控制器)三個層次,也就是將用戶視圖和業務處理隔離開,并且通過控制器連接起來,很好地實現
了表現和邏輯的解耦,是?種標準的軟件分層架構。

? ? ? ? 三層架構:

?????????前現在更主流的開發?式是"前后端分離"的?式,后端開發?程師不再需要關注前端的實現,所以對于Java后端開發者,?有了?種新的分層架構:把整體架構分為表現層、業務邏輯層和數據層.這種分層?式也稱之為"三層架構".
? ? ? ? 1. 表現層:就是展示數據結果和接受用戶指令的,是最靠近用戶的?層;
? ? ? ? 2. 業務邏輯層:負責處理業務邏輯,里面有復雜業務的具體實現;
? ? ? ? 3. 數據層:負責存儲和管理與應?程序相關的數據

? ? ? ? 簡單來理解:

? ? ? ? 應用層分層(相當于文件管理)->把代碼包的好看一些,調理清晰一些

? ? ? ? 它是一種軟件開發思想,把后端代碼進行分層

? ? ? ? 三層架構:

? ? ? ? 1. 表現層: 接受請求,結果響應(接受參數)

? ? ? ? 2. 業務邏輯層: 根據請求,對數據進行加工處理

? ? ? ? 3. 數據層: 數據相關的處理,比如mysql等獲取數據

?????????

? ? ? ? 包的分類類型:

????????Controller:控制層。接收前端發送的請求,對請求進?處理,并響應數據。
????????Service:業務邏輯層。處理具體的業務邏輯。
????????Dao:數據訪問層,也稱為持久層。負責數據訪問操作,包括數據的增、刪、改、查

????????Model: 放實體類.(比如剛剛表白墻的MessageInf和接下來的BookInf)

?

? ? ? ? ?幾個例子:

重點看下面倆張圖

按照上?的層次劃分,SpringMVC站在后端開發?員的?度上,也進?了?持,把上?的代碼劃分為三個部分:
????????請求處理、響應數據:負責,接收??的請求,給??響應數據.(表現層,Controller)
????????邏輯處理:負責業務邏輯處理的代碼.(業務邏輯層,Servce)
????????數據訪問:負責業務數據的維護操作,包括增、刪、改、查等操作.(數據層,Dao)

????????MVC和三層架構之間的關系(面試題)

????????MVC架構模式由三部分組成,分別是:模型(Model),視圖(View)和控制器(Controller).

????????三層架構將業務應?劃分為:表現層,業務邏輯層,數據訪問層.

????????MVC模式強調數據和視圖分離,將數據展?和數據處理分開,通過控制器對兩者進?組合.
三層架構強調不同維度數據處理的?內聚和低耦合(一個模塊種的各個元素的緊密程度越高越好,不同模塊之間的緊密程度越低越好),將交互界?,業務處理和數據庫操作的邏輯分開.

????????MVC強調的是數據和視圖的分離,三層架構主要是對數據進行了分層,但是?者的?的是相同的,都是解耦,分層,代碼復?

? ? ? ? 關系:

? ? ? ? MVC的視圖+控制器相當于三層架構種的表現層(接受請求返回響應)

? ? ? ? 三層架構的業務邏輯層+數據層+實體類=MVC的模型(業務處理)

? ? ? ? 應用分層的好處:

? ? ? ? 1. 降低層與層之間的依賴,實現高內聚低耦合

? ? ? ? 2. 開發人員在修改某一層的代碼的時候可以只關注這一層,不必要管其他層,降低了代碼的維護成本? ? ? ?

? ? ? ? 3. 有利于標準化

? ? ? ? 命名規則:

幾種書寫形式

????????大駝峰:UserController
????????小駝峰: userController
????????蛇形: user_controller
????????串行: user-controller

大部分企業規范:

?????????類名采用大駝峰: UserController

?????????局部變量,方法名,參數名,成員變量采用小駝峰:userController

????????常量采用蛇形:DEFAULT_VALUES

????????css里面采用串行: margin-top

?

需求分析:

1. 用戶登錄: 判斷用戶密碼和賬號是否正確,完成登錄功能

2. 圖書列表: 顯示所有的圖書信息

接口定義:

1. 用戶登錄

url: /user/login

參數: userName,password

返回: 成功/失敗 String(成功: ""進入圖書管理系統的頁面,失敗:返回失敗原因

2. 圖書列表

url: /book/getBookList

參數:無

返回結果: 圖書列表(圖書對象).[{},{},{}]

1前后端代碼

這里后端代碼判斷是否密碼和賬號正確的方式需要解釋一下

2前后端代碼

注意:

value可以用來區分多個具有相同名稱的復選框

運行結果:

此處圖書管理系統只完成了登錄和顯示圖書的功能,后續把功能完善之后我再把代碼放上來

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

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

相關文章

在K8S中,如何查看Pod狀態的詳情?事件顯示cpu不足如何處理?

在Kubernetes中&#xff0c;查看Pod狀態的詳細通常設計使用kubectl命令行工具&#xff0c;這是kubernetes提供的一個強大的管理工具。以下是如何查看Pod狀態詳情的步驟&#xff1a; 1. 查看Pod狀態詳情 列出所有Pod&#xff1a; 使用kubectl get pods命令可以查看集群所有Po…

詳細講一下React中的路由React Router

1. 基本概念 React Router 是 React 的路由管理庫&#xff0c;用于在 React 應用中實現頁面導航和路由控制。 2. 安裝 npm install react-router-dom 3. 基礎用法 // App.jsx import { BrowserRouter, Routes, Route, Link } from react-router-domfunction App() {return (…

人工智能的視覺天賦:一文讀懂卷積神經網絡

什么是CNN&#xff1f; CNN&#xff0c;全稱為卷積神經網絡&#xff08;Convolutional Neural Network&#xff09;&#xff0c;是一種模擬人類視覺感知機制的人工神經網絡。它通過層疊的卷積、池化等操作&#xff0c;從數據中提取關鍵特征&#xff0c;進而完成分類、識別或預…

【OpenGL ES】GLSL基礎語法

1 前言 本文將介紹 GLSL 中數據類型、數組、結構體、宏、運算符、向量運算、矩陣運算、函數、流程控制、精度限定符、變量限定符&#xff08;in、out、inout&#xff09;、函數參數限定符等內容&#xff0c;另外提供了一個 include 工具&#xff0c;方便多文件管理 glsl 代碼&a…

使用 ECharts 與 Vue 構建數據可視化組件

在前端開發中&#xff0c;數據可視化是非常重要的一部分。ECharts 作為一個功能強大且易于使用的開源數據可視化庫&#xff0c;被廣泛應用于各種圖表展示需求中。而 Vue.js 是當下流行的前端框架之一&#xff0c;它的數據驅動和組件化開發模式讓我們能輕松地將 ECharts 集成到 …

RPA系列-uipath 學習筆記4

使用Uipath 處理hover的問題 備注&#xff1a;使用uipath stversion&#xff1a;2024.10.6,所有學習來源自uipath Academy 首先&#xff0c;打開uipath給我們提供的一個網站 ACME,這個網站呢&#xff0c;需要提前注冊一下的哈。 今天呢&#xff0c;就是記錄一下&#xff0c;怎…

Linux:進程概念

1.馮諾依曼體系結構 結論&#xff1a; --- CPU不和外設直接打交道&#xff0c;和內存直接打交道。 --- 所有的外設&#xff0c;有數據需要收入&#xff0c;只能載入到內存中&#xff1b;內存寫出&#xff0c;也一定是寫道外設中。 --- 為什么程序要運行必須加載到內存&#xf…

活動預告 | Microsoft Azure 在線技術公開課:使用 Azure OpenAI 服務構建生成式應用

課程介紹 通過 Microsoft Learn 免費參加 Microsoft Azure 在線技術公開課&#xff0c;掌握創造新機遇所需的技能&#xff0c;加快對 Microsoft Cloud 技術的了解。參加我們舉辦的“使用 Azure OpenAI 服務構建生成式應用”活動&#xff0c;了解如何使用包括 GPT 在內的強大的…

Linux(Centos 7.6)常見基礎配置

1.網絡配置 網絡配置詳見&#xff1a;VMware安裝Linux(Centos 7.6)后網絡配置 2.yum源配置 yum源配置詳見&#xff1a;Linux(Centos 7.6)yum源配置 3.主機名配置 1.Linux(Centos 7.6)系統安裝后&#xff0c;沒有配置主機名時&#xff0c;root用戶登錄后&#xff0c;是如下…

【PyCharm】如何把本地整個項目同步到服務器?

在PyCharm中&#xff0c;您可以使用部署功能將項目同步到服務器。以下是步驟和示例配置&#xff1a; 打開PyCharm&#xff0c;選擇您的項目。 點擊菜單欄的 “File” -> “Settings” -> “Build, Execution, Deployment”。 在左側菜單中&#xff0c;選擇 “Deployme…

電子電器架構 ---什么是智能電動汽車上的逆變器?

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 所謂雞湯,要么蠱惑你認命,要么慫恿你拼命,但都是回避問題的根源,以現象替代邏輯,以情緒代替思考,把消極接受現實的懦弱,偽裝成樂觀面對不幸的…

Flutter:打包apk,詳細圖文介紹

困擾了一天&#xff0c;終于能正常打包apk安裝了&#xff0c;記錄下打包的流程。建議參考我這篇文章時&#xff0c;同時看下官網的構建說明。 官網構建并發布 Android 應用詳情 1、AS創建Flutter項目 2、cmd執行命令 生成一個sunluyi.jks的文件&#xff0c;可以自行把sunluyi替…

【服務器學習專欄 1.2 -- 帶外管理】

請閱讀 嵌入式學習必備專欄 文章目錄 Overview服務器帶外管理BMC 介紹BMC 特點BMC 工作原理 Overview 從技術的角度&#xff0c;網絡管理可分為帶外管理&#xff08;out-of-band&#xff09;和帶內管理&#xff08;in-band&#xff09;兩種管理模式。 帶內管理&#xff0c;是指…

南京市建鄴區南苑街道一行蒞臨園區考察交流

2024年8月28日&#xff0c;南京市建鄴區南苑街道辦事處副主任董兵、南苑街道發展服務辦公室一級主任科員王洪政、建鄴區國資集團科創公司經理杲暢&#xff0c;在樹莓集團華東區負責人田林和陳強經理的陪同下&#xff0c;蒞臨集團總部-國際數字影像產業園考察交流。 樹莓科技&am…

docker中使用nginx

宿主機和docker中nginx做映射 宿主機中nginx 映射目錄 /root/myDockerData/devnginx 在容器中相關位置分別是&#xff1a; 配置文件位置&#xff1a;/etc/nginx/ 日志位置&#xff1a;/var/log/nginx/ 項目位置&#xff1a;/usr/share/nginx/html 如下配置啟動命令行&#x…

【ES6復習筆記】對象方法擴展(17)

對象方法擴展 在 JavaScript 中&#xff0c;對象是屬性和方法的集合。除了內置的方法&#xff0c;我們還可以通過擴展對象的原型來添加新的方法。本教程將介紹如何使用 Object.is、Object.assign 和 Object.setPrototypeOf 方法來擴展對象。 1. Object.is 判斷兩個值是否完全…

基于JDK 17 編寫的Java常用工具類

文章目錄 DateUtilsEncryptUtilsFunIdCardCalibrationUtilResultResultCodeValidateNameUtilValidatePhoneUtil 廢話少說看源碼 DateUtils package com.huihang.core.utils;import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import j…

Casino Royale靶場wp

0x00 下載安裝 https://download.vulnhub.com/casinoroyale/CasinoRoyale.ova 導入vmware啟動 0x01 主機信息收集 0x02目錄掃描 index.php 獲取到一個域名 修改本地hosts 添加一行 路徑&#xff1a;C:\Windows\System32\drivers\etc 192.168.2.20 casino-royale.local 點擊…

智能家居體驗大變革 博聯 AI 方案讓智能不再繁瑣

1. 全球AI技術發展背景及智能家居市場趨勢 人工智能&#xff08;AI&#xff09;技術的飛速發展正在推動全球各行業的數字化轉型。國際電信聯盟與德勤聯合發布《人工智能向善影響》報告指出&#xff0c;全球94%的商界領袖認為&#xff0c;人工智能技術對于其企業在未來5年內的發…

鴻蒙開發(27)案例今日任務

案例為純前端實現&#xff0c;總結案例。 主頁面代碼 import { TaskStatisties } from ../view/TaskStatisties import { TaskItem } from ../view/TaskItem import CreateTaskModel, {TaskModel} from ../viewmodel/TaskModel import { router } from kit.ArkUI// xxx.ets En…