網頁后端開發(基礎3--Springboot框架)

web的服務器資源:

????????靜態資源:服務器上存儲的不會改變的數據,通常不會根據用戶的請求而變化。比如:HTML、CSS、JS、圖片、視頻等(負責頁面展示)
????????動態資源:服務器端根據用戶請求和其他數據動態生成的,內容可能會在每次請求時都發生變化。比如:Spring框架(負責邏輯處理)
????????B/S架構:Browser/Server,瀏覽器/服務器架構模式。客戶端只需瀏覽器,應用程序的邏輯和數據都存在服務器端。(維護方便體驗一般)

SpringBoot Web入門

spring:官網spring.io

spring全家桶:

Spring Framework:spring框架,為依賴注入,事務管理,Web應用程序,數據訪問等等提供核心支持。

Spring Boot:輕量化構建Spring應用程序,并盡可能地快速啟動和運行。
Spring Data:為數據訪問(關系,非關系,map-reduce)提供方法

Spring Cloud:為分布式系統的公共模式提供一組工具。對構建和部署微服務非常有用。
Spring Security:spring安全,通過全面且可擴展的身份驗證和授權支持來保護應用程序。

spring全家桶是以Spring Framework(spring框架)為核心。

Spring Framework:配置繁瑣,入門難度大。

Spring Boot:簡化配置,快速開發。

Spring? Boot可以幫助我們非常快速的構建應用程序、簡化開發、提高效率。(官方推薦,企業主流)

入門程序

入門程序
????????需求:基于SpringBoot開發一個Web應用,瀏覽器發起請求/hello之后,給瀏覽器返回一個字符串”Hello XX“
????????發起:http://localhost:8080/hello?name=zyx

? ? ? ? 返回:Hello zyx

SpringBootP1Application是啟動項
HelloController是運行的代碼

package com.cyyweb.springbootp1;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController //標識當前是一個請求處理類
public class HelloController {@RequestMapping("/hello")public String hello(String name){System.out.println("Hello Controller ... hello : " + name);return "Hello " + name + "~";}}

運行結果:

入門程序剖析

依賴:

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>

?

spring-boot-starter-web用于web開發

spring-boot-starter-test用于單元測試


HTTP協議

HTTP協議,超文本傳輸協議,規定了瀏覽器和服務器之間數據傳輸的規范。

HTTP協議特點:
1.基于TCP協議:面向連接,安全
2.基于請求-響應模型的:一次請求對應一次響應
3.HTTP協議是無狀態的協議:對于事務處理沒有記憶能力。每次請求-響應都是獨立的
缺點:多次請求間不能共享數據
優點:速度快

HTTP的請求數據

HTTP的請求數據格式

HTTP請求數據的三部分

請求行(請求數據的第一行)
請求頭(key:value)
請求體(與請求頭之間隔了一個空行)

HTTP的請求數據獲取

HTTP協議-請求數據獲取:
?????????Web服務器(Tomcat)對HTTP協議的請求數據進行解析,并進行了封裝(HttpServletRequest),在調用Controler方法的時候傳遞給了該方法。這樣,就使得程序員不必直接對協議進行操作,讓Web開發更加便捷。

HTTP的響應數據

HTTP響應數據格式

示例1:

? ? ? ? 當訪問http://www.baidu.com時,響應307,進行重定向。訪問https://www.baidu.com。

示例2:

????????當訪問網站時,響應404,表示客戶端不存在,或請求不存在的網站,或禁止訪問。

示例3:

? ? ? ? 當訪問網站時,響應500,表示網站代碼報錯。

HTTP響應數據設置

注意:
響應狀態碼 和 響應頭如果沒有特殊要求的話,通常不手動設定。
服務器會根據請求處理的邏輯,自動設置響應狀態碼和響應頭。

SpringBoot Web案例

準備:

1.創建一個SpringBoot工程,并勾選web依賴、lombok

2.引入準備好的用戶數據文件(user.txt),及前端靜態頁面(user.html)

3.定義一個實體類,用來封裝用戶信息

開發服務端程序,接受請求,讀取文本數據并響應。

具體代碼:

//controller包負責接受,請求,響應數據。
@RestController//@RestController=@Controller+@ResponseBody
public class UserController {//http://localhost:8080/user.html@RequestMapping("/list")public List<User> list()throws Exception{//1.加載并讀取數據//InputStream in=new FileInputStream("C:\\ANzhuang\\JAVAP\\JavaWeb\\SpringBootWeb01\\src\\main\\resources\\user.txt");InputStream in=this.getClass().getClassLoader().getResourceAsStream("user.txt");ArrayList<String> lines=IoUtil.readLines(in,  "UTF-8", new ArrayList<>());//2.解析用戶數據,封裝成對象User->list集合List<User> userList=lines.stream().map(line->{String[] split=line.split(",");Integer id=Integer.parseInt(split[0]);String username=split[1];String password=split[2];String name=split[3];Integer age=Integer.parseInt(split[4]);LocalDateTime updateTime = LocalDateTime.parse(split[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id,username,password,name,age,updateTime);//return new User(Integer.parseInt(split[0]),split[1],split[2],split[3],Integer.parseInt(split[4]),null);}).toList();//3返回數據jsonreturn userList;}}

定義實體類:

運行啟動項:

運行結果:

ResponseBody注解的作用

@ResponseBody->作用:將controller返回值直接作為響應體的數據直接響應;返回值是對象/集合->json->響應
1.將controler方法的返回值直接寫入HTTP響應體
2.如果是對象或集合,會先轉為json,再響應
3.@RestControler =@Controller + @ResponseBody

三次架構

三次架構:

controller:控制層,接收前端發送的請求,對請求進行處理,并響應數據
service:業務邏輯層,處理具體的業務邏輯。
dao:數據訪問層(DataAccessObject)(持久層),負責數據訪問操作,包括數據的增、刪、改、查

pojo封裝數據

controller:控制層

service:業務邏輯層

dao:數據訪問層

過程:

pojo封裝數據
controller接受請求,響應數據,調用service
service對數據進行邏輯處理,需要獲取數據調用dao
dao數據的訪問操作(增刪改查),獲取原始數據

運行結果:

?


分層解耦

耦合:衡量軟件中各個層/各個模塊的依賴關聯程度。
內聚:軟件中各個功能模塊內部的功能聯系。

軟件設計原則:高內聚低耦合。

controler<-->service<-->dao

控制反轉:Inversion Of Contro,簡稱IOC。對象的創建控制權由程序自身轉移到外部(容器),這種思想稱為控制反轉.
依賴注入:Dependency Injection,簡稱DI。容器為應用程序提供運行時,所依賴的資源,稱之為依賴注入.
Bean對象:IOC容器中創建、管理的對象,稱之為Bean.

package com.cyyweb.service.impl;import com.cyyweb.dao.impl.UserDaoImpl;
import com.cyyweb.pojo.User;
import com.cyyweb.dao.UserDao;
import com.cyyweb.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;@Service//service層,邏輯處理層
//@Component //將當前類交給IOC容器管理
public class UserServiceImpl implements UserService {@Autowired//應用程序運行時,會自動的查詢該類型的bean對象,并且賦值給該成員變量private UserDao userDao;@Overridepublic List<User> findAll() {//1。調用Dao,獲取數據List<String> lines=userDao.findALl();//2.解析用戶數據,封裝成對象User->list集合List<User> userList=lines.stream().map(line->{String[] split=line.split(",");Integer id=Integer.parseInt(split[0]);String username=split[1];String password=split[2];String name=split[3];Integer age=Integer.parseInt(split[4]);LocalDateTime updateTime = LocalDateTime.parse(split[5], DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));return new User(id,username,password,name,age,updateTime);//return new User(Integer.parseInt(split[0]),split[1],split[2],split[3],Integer.parseInt(split[4]),null);}).toList();//3.返回數據return userList;}
}

? ? ? ? 在容器中進行對象的創建,稱為控制反轉。

? ? ? ? 當用戶需要時,通過容器來進行對象的創建,稱為依賴注入。

????????在容器中創建的對象叫Bean

實現分層解耦的思路是什么?
將項目中的類交給IOC容器管理(IOC,控制反轉)
應用程序運行時需要什么對象,直接依賴容器為其提供(DI,依賴注入)

如何將一個類交給IOC容器管理?
Component(注意:是加在實現類上,而非接口上)
?

如何從IOC容器中找到該類型的bean,然后完成依賴注入?
@Autowired

IOC詳解

????????注意:聲明bean的時候,可以通過注解的value屬性指定bean的名字,如果沒有指定,默認為類名首字母小寫。

????????前面聲明bean的四大注解,要想生效,還需要被組件掃描注解@ComponentScan掃描。
????????該注解雖然沒有顯式配置,但是實際上已經包含在了啟動類聲明注解@springBootApplication中,默認掃描的范圍是啟動類所在包及其子包。

總結:

1,聲明bean的注解有哪幾個
@Controer
@Service
@Repository
@Component
2,注意事項
在Springboot集成web開發中,聲明控制器bean只能用Controler。
聲明bean的注解要想生效,需要被掃描到,啟動類默認掃描當前包及其子包。

DI詳解

基于@Autowired進行依賴注入的常見方式有如下三種:

1.屬性注入

優點:代碼簡潔、方便快速開發。

缺點:隱藏了類之間的依賴關系、可能會破壞類的封裝性。

@RestController
public class UserController {@Autowiredprivate final UserService userService;}

2.構造函數注入

優點:能清晰地看到類的依賴關系、提高了代碼的安全性。

缺點:代碼繁項、如果構造參數過多,可能會導致構造函臃腫。

注意:如果只有一個構造函數,@Autowired注解可以省略。

@RestController
public class UserController {private final UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService =userService;}
}

3.setter注入

優點:保持了類的封裝性,依賴關系更清晰。

缺點:需要額外編寫setter方法,增加了代碼量。

@Restcontroller
public class Usercontroller {private UserService userService;@Autowiredpublic void setuserService(UserService userService) {this.userService = userService;}
}

Autowired注解,默認是按照類型進行注入的。
如果存在多個相同類型的bean,將會報錯。

解決方法:

注:

@Resource與@Autowired區別
@Autowired是Spring框架提供的注解,而Resource是JavaEE規范提供的
@Autowired默認是按照類型注入,而@Resource默認是按照名稱注入

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

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

相關文章

ROS通過urdf_to_graphiz對urdf和xacro文件進行結構可視化

對機器人的urdf文件進行結構可視化&#xff1a; 舉例命令如下&#xff1a; urdf_to_graphiz go2_description.urdf 輸出 .gv 和 .pdf文件&#xff0c;打開 pdf文件如圖&#xff1a;

基于Uniapp+PHP的教育培訓系統開發指南:網校源碼實戰剖析

在線教育日益普及的今天&#xff0c;如何快速搭建一個功能完善、體驗良好的教育培訓系統&#xff0c;成為眾多教育機構、培訓企業、個體講師關注的焦點。與其從零開發&#xff0c;不如基于成熟框架快速部署。而UniappPHP正是當前“低成本高效率”開發網校系統的黃金組合。 本文…

鍵盤 AK35I Pro V2 分析

文章目錄 AK35I Pro V21. MCU SN32F299SN32F299 內存映射 2. Bootloader3. TFT 135x240 1.14inch4. 鍵盤5. Flash PY25Q128HA6. 藍牙 CH582F7. 擴展板8. 電池 606090 3.7V 4000mAh AK35I Pro V2 AK35I Pro V2 測評視頻 鍵盤外殼使用卡扣固定, 外殼沒有螺絲, 將外框向外翹起, 用…

11. TypeScript 工具類型

TypeScript 提供了一系列內置的“工具類型”&#xff08;Utility Types&#xff09;&#xff0c;它們是對已有類型進行變換的便捷方式。通過這些工具類型&#xff0c;開發者可以更靈活、可維護地進行類型設計&#xff0c;避免重復定義類型邏輯。 工具類型的作用主要有&#xf…

Kafka性能調優全攻略:從JVM參數到系統優化

前言 在大數據處理領域&#xff0c;Kafka以其高吞吐、高并發的特性成為消息隊列的首選。然而&#xff0c;隨著業務規模的擴大和數據量的激增&#xff0c;若配置不當&#xff0c;Kafka的性能和穩定性會受到嚴重影響。其中&#xff0c;JVM參數的調整是優化Kafka性能的關鍵一環&a…

HarmonyOS 5 NPU支持哪些AI框架?

以下是HarmonyOS 5 NPU支持的AI框架及適配方案&#xff0c;結合關鍵技術和實測數據&#xff1a; 一、原生支持框架 MindSpore Lite? ?核心特性?&#xff1a; 原生適配昇騰達芬奇架構&#xff0c;支持INT8/FP16混合量化自動算子融合優化&#xff08;實測推理速度提升3.2倍…

鴻蒙uvc預覽

簡單查看流程&#xff0c;如有錯誤請指出。 CameraNativePreview.ets--> 這里開始進入uvc_camera庫 (CameraDevice.ets/CameraManager.ets) --> CameraUtils.ets--> -->CameraNativeMethods(index.d.ts文件&#xff0c;路徑: uvc_camera\src\main\cpp\types\…

PHP的打印語句

文章目錄 環境總結打印語句換行符括號數組&#xff08;對象&#xff09;和字符串之間的相互轉換 打印語句echoprint括號print_rvar_dump 數組&#xff08;對象&#xff09;和字符串之間的轉換json_encodejson_decodeimplodeexplode 環境 PHP 8.4.5 總結 如果不想看詳細介紹&…

功率MOSFET的SOA曲線

功率MOSFET的SOA曲線 SOA區指的是MOSFET的安全工作區&#xff0c;英文表示為Safe Operating Area&#xff0c;是指MOSFET&#xff08;金屬氧化物半導體場效應晶體管&#xff09;的安全操作范圍。在線性模式運行的情況下&#xff0c;SOA特別有用。但開關模式下&#xff0c;一般…

Stacking集成BP神經網絡/RF/SVM和遺傳算法的煤炭配比優化

一、煤炭配比優化的問題本質與技術路線 煤炭配比需同時滿足煤質指標&#xff08;灰分、揮發分、熱值&#xff09;、燃燒特性&#xff08;著火溫度、燃盡指數&#xff09;、經濟成本等多目標優化。傳統方法依賴經驗公式&#xff0c;難以處理非線性關系&#xff1a; 核心難點&a…

Unity Shader開發-著色器變體(2)-定義著色器變體

一.定義著色器變體 定義一個著色器變體&#xff08;Shader Variant&#xff09;從概念和實現上講&#xff0c;主要包括以下幾個核心部分 1.使用預編譯指令來聲明變體關鍵字 關鍵字是驅動變體生成的“開關”。它們是簡單的字符串標識符&#xff0c;用于在 Shader 代碼中標記不…

sql server耗時模擬

REATE PROCEDURE SimulateDelay AS BEGINPRINT 開始耗時操作...;-- 模擬等待 5 秒WAITFOR DELAY 00:00:05;PRINT 耗時操作完成。; END 方法二&#xff1a;使用忙循環(不推薦&#xff0c;CPU 占用高) CREATE PROCEDURE SimulateBusyLoop AS BEGINDECLARE start DATETIME GETDAT…

Zookeeper的典型應用場景?

大家好&#xff0c;我是鋒哥。今天分享關于【Zookeeper的典型應用場景?】面試題。希望對大家有幫助&#xff1b; Zookeeper的典型應用場景? 超硬核AI學習資料&#xff0c;現在永久免費了&#xff01; Zookeeper 是一個分布式協調服務&#xff0c;廣泛應用于需要高可用性、分…

STM32F103_LL庫+寄存器學習筆記12.3 - 串口DMA高效收發實戰3:支持多實例化的版本

導言 《STM32F103_LL庫寄存器學習筆記12.2 - 串口DMA高效收發實戰2&#xff1a;進一步提高串口接收的效率》基于上一個版本&#xff0c;進一步提升代碼的模塊化水平&#xff0c;支持多實例化。 如上所示&#xff0c;收發大量的數據&#xff0c;沒有丟包。 項目地址&#xff1a…

跨平臺的重構版Notepad++文本編輯器

跨平臺 Notepad 替代方案 Notepad 是 Windows 平臺上的流行文本編輯器&#xff0c;但其原生版本不支持跨平臺。以下是功能相似且支持多平臺的替代工具&#xff1a; Notepadqq&#xff08;Linux/macOS/Windows&#xff09; Notepadqq 是 Notepad 的開源跨平臺版本&#xff0c…

意法STM32F103C8T6 單片機ARM Cortex-M3 國民MCU 電機控制到物聯網專用

STM32F103C8T6 單片機全面解析 1. 產品定位 STM32F103C8T6 是意法半導體&#xff08;ST&#xff09;推出的 經典ARM Cortex-M3內核單片機&#xff0c;采用 LQFP48封裝&#xff0c;以 高性能、豐富外設和超高性價比 成為嵌入式開發領域的"國民MCU"。 2. 核心功能特…

Sui 技術如何助力 Claynosaurz 成功推出 Popkins NFT

像 Claynosaurz 這樣的品牌利用 Sui 推動鏈上創新的邊界&#xff0c;展示了 Web3 如何結合互動娛樂并帶來獨特全新的體驗。Claynosaurz 最近在 Sui 上推出的 Popkins NFT 系列及其大型抽獎活動&#xff0c;不僅在社區參與度上取得了成功&#xff0c;也有力地展示了 Sui 獨特的技…

OpenCV CUDA模塊設備層-----反正弦運算函數asin()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 對一個 uchar 類型的像素值&#xff08;范圍 [0, 255]&#xff09;&#xff0c;先歸一化到浮點范圍 [0.0, 1.0]&#xff0c;然后計算其反正弦值 …

PixiJS 中 HTMLText 富文本渲染問題探究與優化思考?

起因 在使用 PixiJS 進行富文本渲染開發過程中&#xff0c;遭遇 HTMLText 組件處理中文字體加載時出現顯著卡頓現象。針對此問題&#xff0c;在開源社區提交 issue 并附上相關技術細節與運行表現&#xff0c;期望獲得解決方案。 提issues 從 issue 反饋內容來看&#xff0c;項目…

五、Redis的IO模型

簡介 在談及Redis為什么快的時候&#xff0c;很多人都只能回答redis是基于內存&#xff0c;所以快。但他們往往不知道&#xff0c;決定redis快的因素&#xff0c;還有它的IO模型-Reactor模型。談及Redis的IO模型之前&#xff0c;先補充一下IO模型的基礎知識。 IO模型演化 1.堵塞…