最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2022年03月22日 11:55:33   作者:扎哇太棗糕  
SpringBoot是一種整合Spring技術(shù)棧的方式(或者說(shuō)是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開(kāi)發(fā)的腳手架

1 數(shù)據(jù)響應(yīng)

  數(shù)據(jù)響應(yīng)一般分為兩種:頁(yè)面響應(yīng)和數(shù)據(jù)響應(yīng),一般來(lái)說(shuō)頁(yè)面響應(yīng)是用來(lái)開(kāi)發(fā)一些單體項(xiàng)目(也就是前后端都在一個(gè)開(kāi)發(fā)工具中),而數(shù)據(jù)響應(yīng)則是用來(lái)進(jìn)行前后端分離開(kāi)發(fā)的項(xiàng)目,前端發(fā)送過(guò)來(lái)請(qǐng)求后端響應(yīng)相應(yīng)的數(shù)據(jù)。

1.1 數(shù)據(jù)響應(yīng)(JSON為例)

  如果想讓SpringMVC響應(yīng)返回一個(gè)JSON類型的數(shù)據(jù),首先需要在項(xiàng)目的pom.xml文件中導(dǎo)入web場(chǎng)景的啟動(dòng)器

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

<!--web場(chǎng)景的啟動(dòng)器的底層導(dǎo)入了JSON的開(kāi)發(fā)場(chǎng)景-->
<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ù)而不是頁(yè)面跳轉(zhuǎn),或者將controller上的@Controller注解換成@RestController,相當(dāng)于這個(gè)controller下的所有方法都自動(dòng)加上了@ResponseBody注解。

1.2 數(shù)據(jù)響應(yīng)之內(nèi)容協(xié)商

內(nèi)容協(xié)商: 服務(wù)器會(huì)根據(jù)客戶端接收能力的不同,返回不同媒體類型的數(shù)據(jù)。

原理: 前端發(fā)送請(qǐng)求的時(shí)候請(qǐng)求頭攜帶Accept字段,用于服務(wù)器聲明自己(客戶端)能夠接收的數(shù)據(jù)類型。

處理流程: 首先判斷當(dāng)前響應(yīng)頭中是否已經(jīng)有之前處理時(shí)緩存的媒體類型,如果沒(méi)有的話就是第一次處理需要確定處理的媒體類型,通過(guò)Accept字段獲取客戶(PostMan、瀏覽器)支持接收的內(nèi)容類型。經(jīng)過(guò)遍歷循環(huán)所有當(dāng)前系統(tǒng)的MessageConverter看誰(shuí)支持操作這個(gè)對(duì)象(Person),找到支持操作Person的converter之后把它支持的媒體類型統(tǒng)計(jì)出來(lái)。如此操作我們就得到了客戶端支持接受的類型和服務(wù)端能夠返回的類型,再通過(guò)內(nèi)容協(xié)商的最佳匹配媒體類型,用支持將對(duì)象轉(zhuǎn)為最佳匹配媒體類型converter。

2 頁(yè)面響應(yīng)

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

2.1 模板引擎之Thymeleaf

  要想使用Thymeleaf實(shí)現(xiàn)頁(yè)面的渲染的話,首先需要在pom.xml文件里引入它的場(chǎng)景啟動(dòng)器依賴

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

  在導(dǎo)入場(chǎng)景啟動(dòng)器之后,SpringBoot就會(huì)給我們?cè)赥hymeleafAutoConfiguration自動(dòng)配置類中配置好所有的相關(guān)組件,并將相關(guān)配置項(xiàng)與ThymeleafProperties.class(代碼如下)通過(guò)注解@EnableConfigurationProperties相關(guān)聯(lián),配置類中設(shè)置了默認(rèn)頁(yè)面跳轉(zhuǎn)的前綴和后綴,也就是規(guī)范了頁(yè)面存放的位置必須是templates文件夾和頁(yè)面的文件后綴必須是.html,我們只需要直接開(kāi)發(fā)頁(yè)面即可。

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

入門(mén)案例

第一步: templates文件夾下建個(gè)html文件

第二步: <html>標(biāo)簽引入templates命名空間,這樣的優(yōu)點(diǎn)就是在進(jìn)行頁(yè)碼編寫(xiě)的時(shí)候會(huì)有相關(guān)的提示信息

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

第三步: 創(chuàng)建一個(gè)controller用于進(jìn)頁(yè)面跳轉(zhuǎn)

@Controller
public class ViewTestController {

   @GetMapping("/jump")
   public String jumpTo(Model model) {
       // 之前講過(guò)model的所有屬性值都會(huì)存儲(chǔ)在request域中,需要使用的時(shí)候直接使用
       model.addAttribute("msg", "你好,張三");
       model.addAttribute("link", "http://www.baidu.com");

       return "seccess";
   }
}

第四步: 編寫(xiě)頁(yè)面代碼獲取域中的值

<!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" >點(diǎn)擊進(jìn)入百度</a>
       <a th:href="@{link}" rel="external nofollow" >點(diǎn)擊進(jìn)入百度</a>
   </h2>
</body>
</html>  

?  頁(yè)面中兩種符號(hào)區(qū)別:${}是直接獲取到link屬性的值作為鏈接地址,而@{}是拼裝項(xiàng)目的訪問(wèn)路徑+符號(hào)里的值,對(duì)本案例而言:第一個(gè)鏈接是打開(kāi)百度,第二個(gè)是發(fā)送http://localhost:8080/link的請(qǐng)求

2.2 攔截器

  用戶登陸成功之后,再發(fā)送任意請(qǐng)求的時(shí)候都應(yīng)該是有個(gè)登錄判斷的過(guò)程(判斷session中是否有正確的用戶名和密碼),這個(gè)功能可以在每個(gè)controller使用代碼進(jìn)行判斷,但是這個(gè)過(guò)程是重復(fù)的會(huì)大大增加代碼的冗余,于是我們可以將判斷功能放在攔截器中,將登陸成功后的所有從頁(yè)面發(fā)送的請(qǐng)求攔截住進(jìn)行用戶判斷,成功則放行失敗則返回登錄。 以上述例子為例講解攔截器的使用:

第一步: 自定義攔截器(實(shí)現(xiàn)HandlerInterceptor接口,重寫(xiě)內(nèi)置方法在相應(yīng)的方法內(nèi)編寫(xiě)判斷邏輯)

public class LoginInterceptor implements HandlerInterceptor {
    // 在目標(biāo)方法執(zhí)行之前執(zhí)行的方法
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 實(shí)現(xiàn)登錄檢查的邏輯
        HttpSession session = request.getSession();
        Object user = session.getAttribute("loginUser");
        if (user != null) {
            // 已經(jīng)登錄,放行
            return true;
        }
        // 未登錄,重定向到登錄頁(yè)面
        request.setAttribute("msg", "請(qǐng)先登錄之后再進(jìn)行相關(guān)操作");
        request.getRequestDispatcher("/").forward(request, response);
        return false;
    }

    // 在目標(biāo)方法執(zhí)行之后執(zhí)行的方法
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    // 頁(yè)面渲染之后執(zhí)行的方法
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

第二步: 自定義配置類實(shí)現(xiàn)WebMvcConfigurer接口,重寫(xiě)addInterceptors方法將攔截器注冊(cè)進(jìn)容器中,并指定攔截規(guī)則

@Configuration
public class AdminWebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 有個(gè)問(wèn)題就是,攔截器攔截的不只是動(dòng)態(tài)請(qǐng)求,還有靜態(tài)的頁(yè)面資源和樣式,所以也要將靜態(tài)資源放行
        registry.addInterceptor(new LoginInterceptor())
                // 攔截所有的請(qǐng)求
                .addPathPatterns("/**")
                // 直接放行的請(qǐng)求
                .excludePathPatterns("/", "/login", "/css/**", "/fonts/**", "/js/**", "/images/**");
    }
}

2.3 文件上傳

  文件上傳需要前后端的協(xié)調(diào)配合,前端使用一個(gè)form表單提交所有的信息,包括單文件上傳和多文件上傳,后端使用注解獲取到表單中的所有值,對(duì)他們進(jìn)行操作 前端表單:

<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 {
    // 將頭像保存到本地磁盤(pán)中
    if (!headerImg.isEmpty()) {
    	// 創(chuàng)建相應(yīng)的文件夾
        File file1 = new File("E:\\bootTest\\" + userName + "\\headerImg");
        file1.mkdirs();
        // 獲取圖片名 生成存儲(chǔ)路徑
        headerImg.transferTo(new File("E:\\bootTest\\" + userName + "\\headerImg\\" + headerImg.getOriginalFilename()));
    }

    // 將生活照保存到本地磁盤(pán)中
    if (photos.length > 0) {
    	// 創(chuàng)建相應(yīng)的文件夾
        File file1 = new File("E:\\bootTest\\" + userName + "\\photos");
        file1.mkdirs();
        // 存儲(chǔ)圖片
        for (MultipartFile photo:photos) {
            if (!photo.isEmpty()) {
                // 獲取圖片名 生成存儲(chǔ)路徑
                photo.transferTo(new File("E:\\bootTest\\" + userName + "\\photos\\" + photo.getOriginalFilename()));
            }
        }
    }

    return "index";
}

文件上傳的配置:

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

到此這篇關(guān)于SpringBoot2零基礎(chǔ)到精通之?dāng)?shù)據(jù)與頁(yè)面響應(yīng)的文章就介紹到這了,更多相關(guān)SpringBoot2 數(shù)據(jù)響應(yīng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java多線程創(chuàng)建及線程安全詳解

    java多線程創(chuàng)建及線程安全詳解

    多線程是日常開(kāi)發(fā)中的常用知識(shí),也是難用知識(shí)。通這篇文章主要給大家介紹了關(guān)于java多線程創(chuàng)建及線程安全的相關(guān)資料,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Springdoc替換swagger的實(shí)現(xiàn)步驟分解

    Springdoc替換swagger的實(shí)現(xiàn)步驟分解

    最近在spring看到的,spring要對(duì)api文檔動(dòng)手了,有些人說(shuō)swagger不好用,其實(shí)也沒(méi)那么不好用,有人說(shuō)代碼還是有點(diǎn)侵入性,這倒是真的,我剛試了springdoc可以說(shuō)還是有侵入性但是也可以沒(méi)有侵入性,這就看你對(duì)文檔有什么要求了
    2023-02-02
  • spring boot security 沒(méi)有合適的構(gòu)造器問(wèn)題

    spring boot security 沒(méi)有合適的構(gòu)造器問(wèn)題

    這篇文章主要介紹了spring boot security 沒(méi)有合適的構(gòu)造器問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 詳解Sentinel流量控制限流框架的原理與使用

    詳解Sentinel流量控制限流框架的原理與使用

    Sentinel 是一個(gè)高可用、高擴(kuò)展、高穩(wěn)定性的開(kāi)源流量控制和熔斷降級(jí)框架,可以在分布式系統(tǒng)中實(shí)現(xiàn)實(shí)時(shí)的流量控制,下面就來(lái)和大家聊聊是具體如何操作的吧
    2023-05-05
  • 詳解spring boot引入外部jar包的坑

    詳解spring boot引入外部jar包的坑

    本篇文章主要介紹了spring boot引入外部jar的坑,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 詳解Java設(shè)計(jì)模式中的裝飾模式

    詳解Java設(shè)計(jì)模式中的裝飾模式

    裝飾模式是指在不改變現(xiàn)有對(duì)象結(jié)構(gòu)的情況下,動(dòng)態(tài)地給該對(duì)象增加一些職責(zé)(即增加其額外功能)的模式,它屬于對(duì)象結(jié)構(gòu)型模式。本文將為大家詳細(xì)介紹一下裝飾模式,感興趣的可以了解一下
    2021-12-12
  • Spring Boot和Hazelcast使用詳解

    Spring Boot和Hazelcast使用詳解

    這篇文章主要介紹了Spring Boot和Hazelcast使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • Spring Event觀察者模式事件監(jiān)聽(tīng)詳解

    Spring Event觀察者模式事件監(jiān)聽(tīng)詳解

    這篇文章主要介紹了Java Spring Event事件監(jiān)聽(tīng)詳情解析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Java經(jīng)典排序算法之插入排序

    Java經(jīng)典排序算法之插入排序

    這篇文章主要為大家詳細(xì)介紹了Java經(jīng)典排序算法之插入排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • MyBatis中多條件查詢商品的三種方法及區(qū)別

    MyBatis中多條件查詢商品的三種方法及區(qū)別

    本文主要介紹了MyBatis中多條件查詢商品的三種方法及區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論

青海省| 绍兴市| 西城区| 通辽市| 衡东县| 绿春县| 江孜县| 突泉县| 和顺县| 河南省| 沅江市| 辽源市| 芮城县| 石嘴山市| 偏关县| 肃南| 通城县| 延安市| 临澧县| 清水县| 施甸县| 儋州市| 新余市| 军事| 龙川县| 宝应县| 云梦县| 迁西县| 襄汾县| 荥阳市| 冷水江市| 阿坝| 常宁市| 岳普湖县| 湟源县| 东乡县| 余江县| 祁连县| 冕宁县| 石泉县| 读书|