【SpringBoot 2】(八)數據響應 頁面響應

寫在前面在這里插入圖片描述🛫更多知識總結見SpringBoot 2專欄
🚕本篇知識點總結自尚硅谷雷神的視頻
🚒博主對于該知識尚在學習階段
🚄如果發現存在問題請毫不吝嗇的指出
🚀🚀扎哇太棗糕的博客首頁🚀🚀

文章目錄

  • 1 數據響應
    • 1.1 數據響應(JSON為例)
    • 1.2 數據響應之內容協商
  • 2 頁面響應
    • 2.1 模板引擎之Thymeleaf
    • 2.2 攔截器
    • 2.3 文件上傳

1 數據響應

在這里插入圖片描述??數據響應一般分為兩種:頁面響應和數據響應,一般來說頁面響應是用來開發一些單體項目(也就是前后端都在一個開發工具中),而數據響應則是用來進行前后端分離開發的項目,前端發送過來請求后端響應相應的數據。

1.1 數據響應(JSON為例)

??如果想讓SpringMVC響應返回一個JSON類型的數據,首先需要在項目的pom.xml文件中導入web場景的啟動器

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!--web場景的啟動器的底層導入了JSON的開發場景-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-json</artifactId><version>2.6.4</version><scope>compile</scope>
</dependency>

??其次就是在controller中加入@ResponseBody注解,這樣的話就是響應數據而不是頁面跳轉,或者將controller上的@Controller注解換成@RestController,相當于這個controller下的所有方法都自動加上了@ResponseBody注解。在這里插入圖片描述

1.2 數據響應之內容協商

??內容協商: 服務器會根據客戶端接收能力的不同,返回不同媒體類型的數據。
??原理: 前端發送請求的時候請求頭攜帶Accept字段,用于服務器聲明自己(客戶端)能夠接收的數據類型。
??處理流程: 首先判斷當前響應頭中是否已經有之前處理時緩存的媒體類型,如果沒有的話就是第一次處理需要確定處理的媒體類型,通過Accept字段獲取客戶(PostMan、瀏覽器)支持接收的內容類型。經過遍歷循環所有當前系統的MessageConverter看誰支持操作這個對象(Person),找到支持操作Personconverter之后把它支持的媒體類型統計出來。如此操作我們就得到了客戶端支持接受的類型和服務端能夠返回的類型,再通過內容協商的最佳匹配媒體類型,用支持將對象轉為最佳匹配媒體類型converter

2 頁面響應

??SpringBoot默認的打包方式是jar包方式,但是JSP不支持在jar包(一種壓縮包)中編譯,所以SpringBoot默認不支持JSP,于是我們需要引入第三方的模板引擎技術——Thymeleaf實現頁面的渲染。

2.1 模板引擎之Thymeleaf

??要想使用Thymeleaf實現頁面的渲染的話,首先需要在pom.xml文件里引入它的場景啟動器依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

??在導入場景啟動器之后,SpringBoot就會給我們在ThymeleafAutoConfiguration自動配置類中配置好所有的相關組件,并將相關配置項與ThymeleafProperties.class(代碼如下)通過注解@EnableConfigurationProperties相關聯,配置類中設置了默認頁面跳轉的前綴和后綴,也就是規范了頁面存放的位置必須是templates文件夾和頁面的文件后綴必須是.html,我們只需要直接開發頁面即可。

private String prefix = "classpath:/templates/";
private String suffix = ".html";

入門案例

第一步: templates文件夾下建個html文件
第二步: <html>標簽引入templates命名空間,這樣的優點就是在進行頁碼編寫的時候會有相關的提示信息

xmlns:th="http://www.thymeleaf.org"

第三步: 創建一個controller用于進頁面跳轉

@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}">點擊進入百度</a><a th:href="@{link}">點擊進入百度</a></h2>
</body>
</html>  

在這里插入圖片描述? ?頁面中兩種符號區別:${}是直接獲取到link屬性的值作為鏈接地址,而@{}是拼裝項目的訪問路徑+符號里的值,對本案例而言:第一個鏈接是打開百度,第二個是發送http://localhost:8080/link的請求

2.2 攔截器

??用戶登陸成功之后,再發送任意請求的時候都應該是有個登錄判斷的過程(判斷session中是否有正確的用戶名和密碼),這個功能可以在每個controller使用代碼進行判斷,但是這個過程是重復的會大大增加代碼的冗余,于是我們可以將判斷功能放在攔截器中,將登陸成功后的所有從頁面發送的請求攔截住進行用戶判斷,成功則放行失敗則返回登錄。
??以上述例子為例講解攔截器的使用:
第一步: 自定義攔截器(實現HandlerInterceptor接口,重寫內置方法在相應的方法內編寫判斷邏輯)

public class LoginInterceptor implements HandlerInterceptor {// 在目標方法執行之前執行的方法@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 實現登錄檢查的邏輯HttpSession session = request.getSession();Object user = session.getAttribute("loginUser");if (user != null) {// 已經登錄,放行return true;}// 未登錄,重定向到登錄頁面request.setAttribute("msg", "請先登錄之后再進行相關操作");request.getRequestDispatcher("/").forward(request, response);return false;}// 在目標方法執行之后執行的方法@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}// 頁面渲染之后執行的方法@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

第二步: 自定義配置類實現WebMvcConfigurer接口,重寫addInterceptors方法將攔截器注冊進容器中,并指定攔截規則

@Configuration
public class AdminWebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 有個問題就是,攔截器攔截的不只是動態請求,還有靜態的頁面資源和樣式,所以也要將靜態資源放行registry.addInterceptor(new LoginInterceptor())// 攔截所有的請求.addPathPatterns("/**")// 直接放行的請求.excludePathPatterns("/", "/login", "/css/**", "/fonts/**", "/js/**", "/images/**");}
}

2.3 文件上傳

??文件上傳需要前后端的協調配合,前端使用一個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()) {// 創建相應的文件夾File file1 = new File("E:\\bootTest\\" + userName + "\\headerImg");file1.mkdirs();// 獲取圖片名 生成存儲路徑headerImg.transferTo(new File("E:\\bootTest\\" + userName + "\\headerImg\\" + headerImg.getOriginalFilename()));}// 將生活照保存到本地磁盤中if (photos.length > 0) {// 創建相應的文件夾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";
}

文件上傳的配置:

# 文件上傳大小的設置
spring:servlet:multipart:# 單個文件的最大大小max-file-size: 50MB# 總文件的最大大小max-request-size: 100MB

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

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

相關文章

2020年最快的dns_2020年哪里換旅行證最快取證?需要幾天?

關注我的都知道了很多的實用攻略你還在等什么~美媽不論去哪個地方更換旅行證&#xff0c;都喜歡問“這個地方是否可以加急&#xff1f;”“最快幾天可以拿到新的旅行證&#xff1f;”今天就來整理一下2020年各地換證需要幾天&#xff0c;是否可以加急。"目前更換旅行證有兩…

語句拼接_Linux 進階語句

日常工作需要用到&#xff0c;shell語句用于分析定位生產問題&#xff0c;本次做個記錄# 將日志先拷貝到當前目錄cp /tmp/nginx.log .本次目標是&#xff1a; 找出log中的404 500的報錯#使用管道取出相關日志less nginx.log 通過/ 查詢得知 狀態碼處于第9個字段#使用 awk 篩選出…

【SpringBoot 2】(九)異常處理 web原生組件的注入

寫在前面&#x1f6eb;更多知識總結見SpringBoot 2專欄 &#x1f695;本篇知識點總結自尚硅谷雷神的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

項目管理最佳實踐方法_項目管理最佳實踐,企業如何進行有效的項目管理

前言&#xff1a;企業在劃分項目時&#xff0c;可按照項目的復雜程度、管理范圍等將項目分為三個級別&#xff0c;分別是企業級、部門級和小組級&#xff08;與目標劃分原則相同&#xff09;&#xff0c;然后將每一級的目標與項目對應起來。我們知道&#xff0c;企業制定的目標…

python 歷遍子彈_python之子彈移動

"""新增功能&#xff1a;完成我方坦克發射子彈的移動"""import pygameimport timeimport randomwin_width 700win_height 500bg_color pygame.Color(0, 0, 0)text_color pygame.Color(255, 0, 0)class MainGame():window Nonemy_tank None…

【SpringBoot 2】(十)數據庫相關

寫在前面&#x1f6eb;更多知識總結見SpringBoot 2專欄 &#x1f695;本篇知識點總結自尚硅谷雷神的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

線性分組碼的最小漢明距為6_第二章 線性代數

2.1 標量、向量、矩陣和張量標量(scalar)一個標量就是一個單獨的數&#xff0c;用斜體表示標量。向量(vector)一個向量是一列有序排列的數&#xff0c;用粗寫的小寫字母表示。矩陣(matrix)矩陣式一個二維數組&#xff0c;其中的么一個元素由兩個索引(而非一個)所確定&#xff0…

【SpringBoot 2】(十一)單元測試JUnit 5 指標監控

寫在前面&#x1f6eb;更多知識總結見SpringBoot 2專欄 &#x1f695;本篇知識點總結自尚硅谷雷神的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

sklearn中lstm_分別用sklearn和tensorflow做房價預測

原標題&#xff1a;分別用sklearn和tensorflow做房價預測本篇是后面用tensorflow做回歸時的一個參照&#xff0c;忍不住要說的是sklearn真是簡單好用&#xff0c;要不是他沒有卷積cnn等時髦模型&#xff0c;真是不想用其他家的了。經典的sklearn集成模型結果&#xff1a;真是又…

多個containers 共用一個pvc_2020阜新PVC-UH市政管廠家-煙臺塑膠

2020阜新PVC-UH市政管廠家煙臺金沃泉塑膠有限公司主要產品PVC-U、PVC-M、PVC-UH聚氯乙烯給給水管材、HDPE高密度聚乙烯給水管材、CPVC氯化聚氯乙烯、MPP高壓電力電纜護套管、PERT-Ⅱ型熱力管道、高分子托輥管、水處理膜殼管。公司為電網、南方電網、電建集團、建筑集團、五礦集…

【SpringBoot 2】(十二) profile功能 自定義starter

寫在前面&#x1f6eb;更多知識總結見SpringBoot 2專欄 &#x1f695;本篇知識點總結自尚硅谷雷神的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

jpa transaction 回滾_我遇到的JPA中事務回滾的問題

在最近的項目中&#xff0c;做的是解析XML文件&#xff0c;解析過程中會有異常&#xff0c;比如&#xff1a;XML文件中節點的數據和與之對應的數據庫的字段中數據的類型不匹配&#xff1b;XML中數據長度超過數據庫定義的長度&#xff1b;有數據了的重復插入問題&#xff1b;讀取…

pb 怎么判斷是 小數_考試90分以上的孩子是怎么學數學的?聽聽老師怎么說?

一二年級&#xff0c;考試上九十分很輕松。但是&#xff0c;不少小朋友一上三年級&#xff0c;成績就落下來了。那么&#xff0c;我們來看看三年級起&#xff0c;考試還能夠保持在90分以上的孩子是怎么學習數學的吧&#xff01;第一&#xff0c;計算能力過關通過這兩張圖片的對…

快速上手Mybatis-Plus 入門案例

寫在前面&#x1f6eb;更多知識總結見Mybatis-Plus專欄 &#x1f695;內容總結自尚硅谷楊博超老師的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

交換機分布緩存_網絡交換機緩存在數據中心的作用

什么產生了緩存&#xff1f;網絡交換機要配置多少緩存才夠用&#xff1f;緩存容量是否有標準可以衡量&#xff1f; 當網絡交換機接口收到超出其所能處理的流量后&#xff0c;它會選擇要么將其緩存&#xff0c;或者將其丟棄。 緩存通常都是因為網絡接口速率不同造成的&#xff0…

黑蘋果 選擇語言 點不了_什么是天然的“黑鉆”?—科普貼

天然黑鉆也被成為“碳酸氫”&#xff0c;具有與白鉆相同的化學成分&#xff0c;然而黑鉆石的晶體結構是不同的&#xff0c;這意味著它們由許多小晶體組成&#xff0c;它們以隨機的形式粘在一起&#xff0c;而不是一個具有可識別自然線的固體錐形。天然黑鉆石有極高的含物&#…

sim卡沒壞但蘋果手機無服務_解決手機插SIM卡后都顯示“無SIM卡”的故障問題

故障現象顧客描述手機插SIM卡后都顯示“無SIM卡”。維修過程引起插入SIM卡卻顯示“無SIM卡”的故障&#xff0c;除了可能是SIM卡座的供電、時鐘、復位及SIM卡插入檢測信號不正常導致外&#xff0c;還有可能是基帶不正常導致的。插上手機卡&#xff0c;左上角提示“無SIM卡”&am…

Mybatis-Plus實現簡單的增刪改查 實體類上的注解

寫在前面&#x1f6eb;更多知識總結見Mybatis-Plus專欄 &#x1f695;內容總結自尚硅谷楊博超老師的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

webpack 讀取文件夾下的文件_webpack基本介紹及使用

1.什么是webpackwebpack是一個前端資源加載/打包工具。它根據模塊的依賴關系進行靜態分析&#xff0c;然后將這些模塊按照指定的規則生成對應的靜態資源。從上圖看出&#xff0c;webpack可以將多種靜態資源js&#xff0c;css&#xff0c;less轉換成一個靜態文件&#xff0c;減少…

conda失敗說沒有寫權限_愛情中,為什么男生表白失敗,女生還說可以繼續做朋友,想過沒有...

在愛情中&#xff0c;不是每個男生都是幸運的&#xff0c;也不是每次的表白都是如你所愿的。有成功總有失敗&#xff0c;成功是喜悅的&#xff0c;但是失敗卻是痛苦的。不過有的時候男生和女生表白以后&#xff0c;女生對男生說了這樣的一段&#xff0c;其實我希望以后我們還是…