SpringBoot2零基礎(chǔ)到精通之數(shù)據(jù)與頁面響應(yīng)
1 數(shù)據(jù)響應(yīng)

數(shù)據(jù)響應(yīng)一般分為兩種:頁面響應(yīng)和數(shù)據(jù)響應(yīng),一般來說頁面響應(yīng)是用來開發(fā)一些單體項目(也就是前后端都在一個開發(fā)工具中),而數(shù)據(jù)響應(yīng)則是用來進行前后端分離開發(fā)的項目,前端發(fā)送過來請求后端響應(yīng)相應(yīng)的數(shù)據(jù)。
1.1 數(shù)據(jù)響應(yīng)(JSON為例)
如果想讓SpringMVC響應(yīng)返回一個JSON類型的數(shù)據(jù),首先需要在項目的pom.xml文件中導(dǎo)入web場景的啟動器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--web場景的啟動器的底層導(dǎo)入了JSON的開發(fā)場景-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.6.4</version>
<scope>compile</scope>
</dependency>其次就是在controller中加入@ResponseBody注解,這樣的話就是響應(yīng)數(shù)據(jù)而不是頁面跳轉(zhuǎn),或者將controller上的@Controller注解換成@RestController,相當于這個controller下的所有方法都自動加上了@ResponseBody注解。

1.2 數(shù)據(jù)響應(yīng)之內(nèi)容協(xié)商
內(nèi)容協(xié)商: 服務(wù)器會根據(jù)客戶端接收能力的不同,返回不同媒體類型的數(shù)據(jù)。
原理: 前端發(fā)送請求的時候請求頭攜帶Accept字段,用于服務(wù)器聲明自己(客戶端)能夠接收的數(shù)據(jù)類型。
處理流程: 首先判斷當前響應(yīng)頭中是否已經(jīng)有之前處理時緩存的媒體類型,如果沒有的話就是第一次處理需要確定處理的媒體類型,通過Accept字段獲取客戶(PostMan、瀏覽器)支持接收的內(nèi)容類型。經(jīng)過遍歷循環(huán)所有當前系統(tǒng)的MessageConverter看誰支持操作這個對象(Person),找到支持操作Person的converter之后把它支持的媒體類型統(tǒng)計出來。如此操作我們就得到了客戶端支持接受的類型和服務(wù)端能夠返回的類型,再通過內(nèi)容協(xié)商的最佳匹配媒體類型,用支持將對象轉(zhuǎn)為最佳匹配媒體類型converter。
2 頁面響應(yīng)
SpringBoot默認的打包方式是jar包方式,但是JSP不支持在jar包(一種壓縮包)中編譯,所以SpringBoot默認不支持JSP,于是我們需要引入第三方的模板引擎技術(shù)——Thymeleaf實現(xiàn)頁面的渲染。
2.1 模板引擎之Thymeleaf
要想使用Thymeleaf實現(xiàn)頁面的渲染的話,首先需要在pom.xml文件里引入它的場景啟動器依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
在導(dǎo)入場景啟動器之后,SpringBoot就會給我們在ThymeleafAutoConfiguration自動配置類中配置好所有的相關(guān)組件,并將相關(guān)配置項與ThymeleafProperties.class(代碼如下)通過注解@EnableConfigurationProperties相關(guān)聯(lián),配置類中設(shè)置了默認頁面跳轉(zhuǎn)的前綴和后綴,也就是規(guī)范了頁面存放的位置必須是templates文件夾和頁面的文件后綴必須是.html,我們只需要直接開發(fā)頁面即可。
private String prefix = "classpath:/templates/"; private String suffix = ".html";
入門案例
第一步: templates文件夾下建個html文件
第二步: <html>標簽引入templates命名空間,這樣的優(yōu)點就是在進行頁碼編寫的時候會有相關(guān)的提示信息
xmlns:th="http://www.thymeleaf.org"
第三步: 創(chuàng)建一個controller用于進頁面跳轉(zhuǎn)
@Controller
public class ViewTestController {
@GetMapping("/jump")
public String jumpTo(Model model) {
// 之前講過model的所有屬性值都會存儲在request域中,需要使用的時候直接使用
model.addAttribute("msg", "你好,張三");
model.addAttribute("link", "http://www.baidu.com");
return "seccess";
}
}第四步: 編寫頁面代碼獲取域中的值
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1 th:text="${msg}">哈哈</h1>
<h2>
<a th:href="${link}" rel="external nofollow" >點擊進入百度</a>
<a th:href="@{link}" rel="external nofollow" >點擊進入百度</a>
</h2>
</body>
</html> 
? 頁面中兩種符號區(qū)別:${}是直接獲取到link屬性的值作為鏈接地址,而@{}是拼裝項目的訪問路徑+符號里的值,對本案例而言:第一個鏈接是打開百度,第二個是發(fā)送http://localhost:8080/link的請求
2.2 攔截器
用戶登陸成功之后,再發(fā)送任意請求的時候都應(yīng)該是有個登錄判斷的過程(判斷session中是否有正確的用戶名和密碼),這個功能可以在每個controller使用代碼進行判斷,但是這個過程是重復(fù)的會大大增加代碼的冗余,于是我們可以將判斷功能放在攔截器中,將登陸成功后的所有從頁面發(fā)送的請求攔截住進行用戶判斷,成功則放行失敗則返回登錄。 以上述例子為例講解攔截器的使用:
第一步: 自定義攔截器(實現(xiàn)HandlerInterceptor接口,重寫內(nèi)置方法在相應(yīng)的方法內(nèi)編寫判斷邏輯)
public class LoginInterceptor implements HandlerInterceptor {
// 在目標方法執(zhí)行之前執(zhí)行的方法
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 實現(xiàn)登錄檢查的邏輯
HttpSession session = request.getSession();
Object user = session.getAttribute("loginUser");
if (user != null) {
// 已經(jīng)登錄,放行
return true;
}
// 未登錄,重定向到登錄頁面
request.setAttribute("msg", "請先登錄之后再進行相關(guān)操作");
request.getRequestDispatcher("/").forward(request, response);
return false;
}
// 在目標方法執(zhí)行之后執(zhí)行的方法
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
// 頁面渲染之后執(zhí)行的方法
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}第二步: 自定義配置類實現(xiàn)WebMvcConfigurer接口,重寫addInterceptors方法將攔截器注冊進容器中,并指定攔截規(guī)則
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 有個問題就是,攔截器攔截的不只是動態(tài)請求,還有靜態(tài)的頁面資源和樣式,所以也要將靜態(tài)資源放行
registry.addInterceptor(new LoginInterceptor())
// 攔截所有的請求
.addPathPatterns("/**")
// 直接放行的請求
.excludePathPatterns("/", "/login", "/css/**", "/fonts/**", "/js/**", "/images/**");
}
}2.3 文件上傳
文件上傳需要前后端的協(xié)調(diào)配合,前端使用一個form表單提交所有的信息,包括單文件上傳和多文件上傳,后端使用注解獲取到表單中的所有值,對他們進行操作 前端表單:
<form role="form" th:action="@{/upload}" method="post" enctype="multipart/form-data">
<!--email郵箱-->
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
<input type="email" name="email" class="form-control" id="exampleInputEmail1" placeholder="Enter email">
</div>
<!--userName用戶名-->
<div class="form-group">
<label for="exampleInputPassword1">userName</label>
<input type="text" name="userName" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
<!--單文件上傳 頭像-->
<div class="form-group">
<label for="exampleInputFile">headerImg</label>
<input type="file" name="headerImg" id="exampleInputFile">
</div>
<!--多文件上傳 生活照-->
<div class="form-group">
<label for="exampleInputFile">image of yourself</label>
<input type="file" name="photos" multiple >
</div>
<div class="checkbox">
<label>
<input type="checkbox"> Check me out
</label>
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>后端controller:
@PostMapping("/upload")
public String upload(@RequestParam("email") String email,
@RequestParam("userName") String userName,
@RequestPart("headerImg")MultipartFile headerImg,
@RequestPart("photos")MultipartFile[] photos) throws IOException {
// 將頭像保存到本地磁盤中
if (!headerImg.isEmpty()) {
// 創(chuàng)建相應(yīng)的文件夾
File file1 = new File("E:\\bootTest\\" + userName + "\\headerImg");
file1.mkdirs();
// 獲取圖片名 生成存儲路徑
headerImg.transferTo(new File("E:\\bootTest\\" + userName + "\\headerImg\\" + headerImg.getOriginalFilename()));
}
// 將生活照保存到本地磁盤中
if (photos.length > 0) {
// 創(chuàng)建相應(yīng)的文件夾
File file1 = new File("E:\\bootTest\\" + userName + "\\photos");
file1.mkdirs();
// 存儲圖片
for (MultipartFile photo:photos) {
if (!photo.isEmpty()) {
// 獲取圖片名 生成存儲路徑
photo.transferTo(new File("E:\\bootTest\\" + userName + "\\photos\\" + photo.getOriginalFilename()));
}
}
}
return "index";
}文件上傳的配置:
# 文件上傳大小的設(shè)置
spring:
servlet:
multipart:
# 單個文件的最大大小
max-file-size: 50MB
# 總文件的最大大小
max-request-size: 100MB
到此這篇關(guān)于SpringBoot2零基礎(chǔ)到精通之數(shù)據(jù)與頁面響應(yīng)的文章就介紹到這了,更多相關(guān)SpringBoot2 數(shù)據(jù)響應(yīng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你如何在IDEA?中添加?Maven?項目的?Archetype(解決添加不起作用的問題)
這篇文章主要介紹了如何在?IDEA?中添加?Maven?項目的?Archetype(解決添加不起作用的問題),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
SpringBoot+Vue項目部署上線的實現(xiàn)示例
本文主要介紹了SpringBoot+Vue項目部署上線的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
幾句話說清session,cookie和token的區(qū)別及說明
這篇文章主要介紹了幾句話說清session,cookie和token的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Java 多線程等待優(yōu)雅的實現(xiàn)方式之Phaser同步屏障
在JAVA 1.7引入了一個新的并發(fā)API:Phaser,一個可重用的同步barrier。在此前,JAVA已經(jīng)有CyclicBarrier、CountDownLatch這兩種同步barrier,但是Phaser更加靈活,而且側(cè)重于 重用2021-11-11

