0 引言
作者正在學習SpringMVC相關內容,學到了一些知識,希望分享給需要短時間想要了解SpringMVC的讀者朋友們,想用通俗的語言講述其中的知識,希望與諸位共勉,共同進步!
本系列會持續更新!!可以放心食用!
ps:RestFul架構風格會分為上中下三篇來描述,名字分別為系列五-系列七,這三篇會同一時間發布!!!
1 響應處理實驗
在本系列四和五中,我們通過十個請求處理實驗,基本上把前端傳遞過來的請求的處理給過了一遍,接下來的響應實驗則是從我們的后端需要怎么返回數據給前端的問題。
1.1 響應實驗:返回一個JSON格式數據
假設我需要給前端返回一個People對象,并以JSON格式的數據傳輸,我們可以進行以下測試:
首先在網頁打開local:8080,并點擊:
點擊F12我們發現點擊這個前端給我的發送的請求是/resp01,并且經過測試請求類型為Get:
所以后端的測試代碼可以寫成:
@RequestMapping("/resp01")public People resp01(){People people = new People();people.setUsername("張三");people.setPassword("123456");people.setCellphone("123456789");people.setAgreement(true);people.setSex("男");people.setGrade("2021級");people.setHobby(new String[]{"看電影","看小說"});return people;}
注意,我們在后端只需要返回對象,SpringMVC會自動把返回的對象轉化為JSON格式!
網頁中測試結果:
成功返回!
1.2?響應實驗:返回一個下載文件
這種情況其實我們經常碰見,當我們去官網上下載什么東西的時候,是不是需要點擊一個下載按鈕,然后在我們的下載出就會彈出當前在下載的.exe文件,例如我們在下載百度網盤的客戶端的時候:
我們這次實驗要做的就是當前端發送請求過來時,我們返回給前端一個照片文件,后端的代碼可以這樣寫:
@RequestMapping("/download")public ResponseEntity<byte[]> download() throws Exception {FileInputStream fileInputStream = new FileInputStream("D:\\1.png");byte[] bytes = fileInputStream.readAllBytes();return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(bytes.length)//內容處理方式.header("Content-Disposition", "attachment;filename=1.png").body(bytes);}
最核心的代碼是:
return ResponseEntity.ok().contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(bytes.length)//內容處理方式.header("Content-Disposition", "attachment;filename=1.png").body(bytes);
這一塊內容,經過前面系列我們知道了HttpEntity,里面封裝了包括請求頭以及請求體中的所有數據,ResponseEntity則是封裝了響應頭和響應體中所有的數據。
1)contentType是指定響應體中內容的類型;
2)contentLength指的是內容的長度;
3)header里的設置是相對固定的,只有我們在響應頭中插入這些內容,前端才會響應成下載文件
4)body傳入實際內容。
寫完之后我們進行測試:
點擊測試,網頁結果返回:
返回成功!!
PS:響應處理相關代碼已更新放置網址:
lin/請求測試十個實驗
不想敲代碼的朋友們可直接查看
2 Restful軟件架構風格
2.1簡介
用簡單的話來說RESTful 代碼架構是一種設計風格,就像蓋房子有統一規劃一樣。客戶端就像來你家玩的朋友,服務器就像是你的家,雙方通過網絡這條 “路” 來溝通。采用 HTTP 協議約定的規則,用網址(URL)確定要操作的東西(資源),通過不同的方法(GET、POST、PUT、DELETE 等,類似于不同的動作指令),客戶端像朋友一樣跟服務器交流,來獲取、創建、修改、刪除服務器上的信息,整個過程服務器不記性(無狀態),每次對話完就忘記之前的事兒,這樣大家交流簡單、高效、標準統一。
2.2 簡要說明
我們可以看出Restful風格下的網址請求,如果請求對單個員工數據表進行操作的話前面路徑都是/employee,也可以說當你對某一個數據庫進行操作,你的前置路徑就可以統一規劃成/XX,之間業務的不同可以通過請求方式以及后置路徑的不同來體現!!!這就是Restful風格代碼!在多層級的業務代碼中,主要在controller包中進行體現!!!
2.3?舉例說明--使用員工增刪改查的例子
2.3.1 初始準備
(1)首先我們先創建一個新工程,注意需要勾選下面這幾個依賴:
(2)然后創建一個新的MySQL數據表,使用以下語句創建數據表:
CREATE SCHEMA `crud` ;/*Navicat Premium Dump SQLSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80027 (8.0.27)Source Host : localhost:3306Source Schema : restful_crudTarget Server Type : MySQLTarget Server Version : 80027 (8.0.27)File Encoding : 65001Date: 20/08/2024 18:46:17
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;USE crud; -- 添加此語句選擇數據庫-- ----------------------------
-- Table structure for employee
-- ----------------------------
DROP TABLE IF EXISTS `employee`;
CREATE TABLE `employee` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵',`name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '員工名字',`age` int NULL DEFAULT NULL COMMENT '年齡',`email` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '郵箱',`gender` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '性別',`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '住址',`salary` decimal(10, 2) NULL DEFAULT NULL COMMENT '薪資',PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of employee
-- ----------------------------
INSERT INTO `employee` VALUES (1, '張三', 11, 'aa@qq.com', '男', '西安', 9999.00);
INSERT INTO `employee` VALUES (4, 'leifengyang', 10, 'aaa', '男', 'sss', 100.00);SET FOREIGN_KEY_CHECKS = 1;
我們可以創建完成后可以進MySQL Workbench里看看在員工表中已經存儲了這兩條數據(沒有下載MySQL以及MySQL Workbench可以去找一找教程進行安裝):
(3)然后回到我們代碼端,在配置文件application.properties中先配置如下:
用戶名和密碼使用自己的就可以啦!!接下來就是正式的代碼環節。
2.3.1 業務代碼結構
主要包括:
主要結構存在bean/dao/service/controller這四個包
1)bean
專門用于存放對象類的地方,比如我們需要增刪改查的員工就需要使用的員工類,代碼如下:
import lombok.Data;import java.math.BigDecimal;@Data
public class Employee {private Long id;private String name;private Integer age;private String email;private String gender;private String address;private BigDecimal salary;
}
注意這與數據庫中的員工表里的屬性一一對應!!!!
2)dao
這個包下,主要對接數據庫,主要編寫對數據庫增刪改查的操作,需要分成接口以及實現兩個部分
3)service
這個包主要是會對dao包傳遞過來已經處理后的的數據進行真正的業務代碼編寫,也是需要分成接口以及實現兩個部分
4)controller
這個包下,主要對接前端的請求,對前端輸入的請求數據進行處理。且需要分成接口以及實現兩個部分。這一部分主要體現Restful風格!!具體在后續文章中給出詳細解釋!
對于dao、service以及controller下的包需要干什么可能還有點抽象,在本系列(六)中會進行詳細的代碼編寫
參考:
P102-107
107.RESTful - API 接口設計的架構風格_嗶哩嗶哩_bilibili