SpringBoot | 第十八章:web應用開發(fā)之WebJars使用

第十八章:web應用開發(fā)之WebJars使用

前言

前面一章節(jié)我們主要講解了關于文件上傳的兩種方式。本章節(jié)繼續(xù)web開發(fā)的相關知識點。通常對于web開發(fā)而言,像jscssimages等靜態(tài)資源版本管理是比較混亂的,比如JqueryBootstrapVue.js可能各個前端框架所依賴的自個組件的版本都不盡相同,一不注意就可能引起不同版本的沖突問題。所以,是否有一種像后端管理jar包一樣的解決方案呢?答案當然是有的,今天我們就來重點介紹下關于WebJars的使用。前面我們介紹的Swagger2也是基于webJars進行頁面集成的。

一點知識

原本我們在進行web開發(fā)時,一般上都是講靜態(tài)資源文件放置在webapp目錄下,在SpringBoot里面,一般是將資源文件放置在src/main/resources/static目錄下。而在Servlet3中,允許我們直接訪問WEB-INF/lib下的jar包中的/META-INF/resources目錄資源,即WEB-INF/lib/{*.jar}/META-INF/resources下的資源可以直接訪問。

Servlet3靜態(tài)文件處理-轉自網絡

所以其實,WebJars也是利用了此功能,將所有前端的靜態(tài)文件打包成一個jar包,這樣對于引用放而言,和普通的jar引入是一樣的,還能很好的對前端靜態(tài)資源進行管理。

WebJars使用

WebJars是將web前端資源(如jQuery & Bootstrap)打成jar包文件。借助版本管理工具(Maven、gradle等)進行版本管理,保證這些Web資源版本唯一性。避免了文件混亂、版本不一致等問題。

官網介紹

WebJar結構

開始使用前,我們看下Jquerywebjars,借此來了解下webjars包的目錄結構。以下是基于jquery-3.3.1.jar:

META-INF
    └─maven
        └─org.webjars.bower
            └─jquery
                └─pom.properties
                └─pom.xml
    └─resources
        └─webjars
            └─jquery
                └─3.3.1
                       └─(靜態(tài)文件及源碼)
jquery-3.3.1目錄結構

所以可以看出,靜態(tài)文件存放規(guī)則:META-INF/resources/webjars/${name}/${version}。這點官網也有說明的:

webjar目錄官網說明

WebJars實踐

接下來我們以一個簡單的示例,對webjars進行簡單的實踐下。

0.在src/main/resouces路徑下創(chuàng)建META-INF/resources/webjars/0.0.1目錄,同時為了演示效果,拷貝一個圖片到此目錄下。

新建目錄

1.編寫一個簡單的html頁面,放在在src/main/resources/static下(當然也可以直接放在webjar下了,只需要后面加個映射關系即可),內容如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello,WebJars</title>
</head>
<body>
  <h1>Hello,WebJars</h1>
  <img alt="sprinboot" src="webjars/demo/0.0.1/springboot.jpg">
</body>
</html>

2.編寫配置類,添加一個資源映射關系.其實也可以不寫,因為第十五章節(jié)也有說過,springboot默認的四個資源路徑里面就包含了/META-INF/resources/了。

默認不配置時,從控制臺啟動項也是可以獲悉的:

2018-08-08 23:26:54.874  INFO 5900 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-08-08 23:26:54.874  INFO 5900 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-08-08 23:26:54.917  INFO 5900 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-08-08 23:26:54.941  INFO 5900 --- [           main] oConfiguration$WelcomePageHandlerMapping : Adding welcome page: class path resource [static/index.html]

這里為了演示下可通過此方法,自定義一些其他路徑的靜態(tài)資源目錄:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //配置映射關系
        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

3.編寫控制層,返回此頁面地址。

/**
 * webjar示例
 * @author oKong
 *
 */
@Controller
public class WebJarsDemoController {
    
    @GetMapping("/")
    public String index() {
        return "index.html";
    }

}

4.啟動應用,訪問地址即可:

image

可以看見圖片已經正確顯示出來了。

5.現在直接將META-INF下打成一個jar,然后加入依賴進入。在來測試下。
這里直接創(chuàng)建一個新的工程,存在靜態(tài)資源信息,工程結果如下:

靜態(tài)資源工程

然后對應的pom配置主要就加入一個資源拷貝動作:

<build>
    <resources>
        <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <targetPath>${project.build.outputDirectory}/META-INF/resources/webjars</targetPath>
        </resource>
    </resources>
</build>

之后利用maven打包后,就可以看見其目錄結構了:

資源包目錄結構

然后我們刪除了我們原先的資源文件或者圖片重命名下,并引入依賴:

    <!-- 靜態(tài)資源依賴 -->
    <dependency>
        <groupId>cn.lqdev.learning</groupId>
        <artifactId>springboot-webjars</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

最后重新啟動應用,再次訪問下,依舊是正常顯示的:

image

一點技巧

我們可以看見,我們在index.html中訪問圖片是這么訪問的:webjars/demo/0.0.1/springboot.jpg。咋一看,可能覺得沒問題。但當我們靜態(tài)資源版本有更新時,我們不是又需要去改下這個靜態(tài)資源的引入路徑,那何來的優(yōu)雅!所以官方提供了一個webjars-locator包,就是來解決此問題的。

0.pom文件中,加入依賴(這里注意,Springboot(1.5.15.RELEASE)父類pom文件中已經指定了此版本為:0.32-1,所以我們可以不需要去添加版本了):

    <dependency>
        <groupId>org.webjars</groupId>
        <artifactId>webjars-locator</artifactId>
    </dependency>

1.修改index.html中的圖片路徑
原來:

<img alt="sprinboot" src="webjars/demo/0.0.1/springboot.jpg">

現在:

<img alt="sprinboot" src="webjars/demo/springboot.jpg">

2.修改配置類,加入resourceChain屬性,不然還是去除了版本時路徑找不到的,這里需要注意。

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter{

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //配置映射關系
        //即:/webjars/** 映射到 classpath:/META-INF/resources/webjars/ 
        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/")
                //新增 resourceChain 配置即開啟緩存配置。
                //不知道為何不加這個配置 設置了 webjars-locator 未生效。。沒過多糾結。。
                .resourceChain(true);//生產時建議開啟緩存(只是緩存了資源路徑而不是資源內容),開發(fā)是可以設置為false
    }
}

這樣之后,我們只需要修改依賴包即可,前端都不需要重新改了。

相關資料

  1. https://www.webjars.org/contributing
  2. 靜態(tài)文件處理這篇講的不錯,可以看看:https://blog.csdn.net/xichenguan/article/details/52794862

總結

本章節(jié)主要是講解了webjars的使用。使用是相對來說比較簡單了,有了這個后,我們之后去管理前端的靜態(tài)資源就很方便了,也能引用已經打好jar的第三方庫了,是不是很方便!

最后

目前互聯網上很多大佬都有SpringBoot系列教程,如有雷同,請多多包涵了。本文是作者在電腦前一字一句敲的,每一步都是實踐的。若文中有所錯誤之處,還望提出,謝謝。

老生常談

  • 個人QQ:499452441
  • 微信公眾號:lqdevOps
公眾號

個人博客:http://blog.lqdev.cn

原文地址:http://blog.lqdev.cn/2018/08/09/springboot/chapter-eighteen/

完整示例:https://github.com/xie19900123/spring-boot-learning/tree/master/chapter-18

靜態(tài)文件工程:https://github.com/xie19900123/spring-boot-learning/tree/master/springboot-webjars

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 134,782評論 18 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,898評論 6 342
  • SpringBoot靜態(tài)資源的訪問 在我們開發(fā)Web應用的時候,會用到大量的js、css、image、html等靜...
    lavor閱讀 47,579評論 0 11
  • 一個Web應用是一個Web服務器上眾多資源的集合,它包括了servlets,HTML頁面,類,和其它組成一個完整應...
    Lucky_Micky閱讀 1,735評論 0 2
  • 一、Spring Boot 入門 1、Spring Boot 簡介 簡化Spring應用開發(fā)的一個框架;整個Spr...
    Y了個J閱讀 6,692評論 1 6