<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
資料響應一般分為兩種:頁面響應和資料響應,一般來說頁面響應是用來開發一些單體專案(也就是前後端都在一個開發工具中),而資料響應則是用來進行前後端分離開發的專案,前端傳送過來請求後端響應相應的資料。
如果想讓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註解。
內容協商: 伺服器會根據使用者端接收能力的不同,返回不同媒體型別的資料。
原理: 前端傳送請求的時候請求頭攜帶Accept欄位,用於伺服器宣告自己(使用者端)能夠接收的資料型別。
處理流程: 首先判斷當前響應頭中是否已經有之前處理時快取的媒體型別,如果沒有的話就是第一次處理需要確定處理的媒體型別,通過Accept欄位獲取客戶(PostMan、瀏覽器)支援接收的內容型別。經過遍歷迴圈所有當前系統的MessageConverter看誰支援操作這個物件(Person),找到支援操作Person的converter之後把它支援的媒體型別統計出來。如此操作我們就得到了使用者端支援接受的型別和伺服器端能夠返回的型別,再通過內容協商的最佳匹配媒體型別,用支援將物件轉為最佳匹配媒體型別converter。
SpringBoot預設的打包方式是jar包方式,但是JSP不支援在jar包(一種壓縮包)中編譯,所以SpringBoot預設不支援JSP,於是我們需要引入第三方的模板引擎技術——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}" rel="external nofollow" >點選進入百度</a> <a th:href="@{link}" rel="external nofollow" >點選進入百度</a> </h2> </body> </html>
⚠ 頁面中兩種符號區別:${}是直接獲取到link屬性的值作為連結地址,而@{}是拼裝專案的存取路徑+符號裡的值,對本案例而言:第一個連結是開啟百度,第二個是傳送http://localhost:8080/link的請求
使用者登陸成功之後,再傳送任意請求的時候都應該是有個登入判斷的過程(判斷session中是否有正確的使用者名稱和密碼),這個功能可以在每個controller使用程式碼進行判斷,但是這個過程是重複的會大大增加程式碼的冗餘,於是我們可以將判斷功能放在攔截器中,將登陸成功後的所有從頁面傳送的請求攔截住進行使用者判斷,成功則放行失敗則返回登入。 以上述例子為例講解攔截器的使用:
第一步: 自定義攔截器(實現HandlerInterceptor介面,重寫內建方法在相應的方法內編寫判斷邏輯)
public class LoginInterceptor implements HandlerInterceptor { // 在目標方法執行之前執行的方法 @Override public 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; } // 在目標方法執行之後執行的方法 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } // 頁面渲染之後執行的方法 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }
第二步: 自定義設定類實現WebMvcConfigurer介面,重寫addInterceptors方法將攔截器註冊進容器中,並指定攔截規則
@Configuration public class AdminWebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 有個問題就是,攔截器攔截的不只是動態請求,還有靜態的頁面資源和樣式,所以也要將靜態資源放行 registry.addInterceptor(new LoginInterceptor()) // 攔截所有的請求 .addPathPatterns("/**") // 直接放行的請求 .excludePathPatterns("/", "/login", "/css/**", "/fonts/**", "/js/**", "/images/**"); } }
檔案上傳需要前後端的協調配合,前端使用一個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
到此這篇關於SpringBoot2零基礎到精通之資料與頁面響應的文章就介紹到這了,更多相關SpringBoot2 資料響應內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45