springboot中不同war包殿托、jar包下jsp的正確項目存放路徑

大家都知道霹菊,對于springboot的app,我們都是通過maven構(gòu)建出war或jar,然后通過java -jar X.war/X.jar的方式來運行項目旋廷。在這篇文章中鸠按,我們來探討一下,不同的包文件后綴和打包方式饶碘,jsp的文件路徑應(yīng)該如何設(shè)置才能正常顯示目尖。

這里我們討論三種情況
1.正常通過maven build成app.war包,即在pom.xml指定<packaging>war</packaging>
2.基于1中build好的war包扎运,強行改名為faker.jar (之所以討論這種情況瑟曲,是因為這種case真實存在于我們的項目中,只單純作為一個研究的case)
3.正常通過maven build成real.jar包豪治,即在pom.xml指定<packaging>jar</packaging>

首先我們先簡單捋一下jsp頁面的加載流程洞拨。對于一個請求,會mapping到對應(yīng)mvc view的template (比如這里對應(yīng)的是/a)负拟,這個template會根據(jù)已經(jīng)配置好的template base path prefix, (比如這里項目里面配置的是/WEB-INF/jsp), 構(gòu)建出/WEB-INF/jsp/a.jsp的相對路徑烦衣,然后通過這個相對路徑,去web resources里面遍歷匹配是否jsp文件真實存在(具體如何匹配掩浙,下面會詳細介紹)花吟。如果不存在,最終返回給前端的是404 not found exception涣脚。如果存在示辈,會基于這個jsp進行java文件的生成以及class文件的編譯,然后解析返回給前端顯示遣蚀。

image.png

所以jsp頁面正常顯示問題的關(guān)鍵在于,如何在上述的三種情況下纱耻,保證jsp都可以在web resource里面找到芭梯。這里我們先針對第一種情況下介紹一下web resource生成的過程以及jsp路徑匹配的過程。
web resource本身是一個List弄喘,用來存放文件的路徑玖喘,包括五種resource,這里我們只需要討論main resource和jar resource蘑志,

org/apache/catalina/webresources/StandardRoot.class


image.png

web resource初始化的大致調(diào)用鏈如下
org/springframework/boot/SpringApplication.class----run()
org/springframework/context/support/AbstractApplicationContext.class----refresh()
org/springframework/boot/web/servlet/context/ServletWebServerApplicationContext.class----onRefresh()
org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactory.class----getWebServer()
org/springframework/boot/web/embedded/tomcat/TomcatServletWebServerFactory.class----prepareContext()

可以看到這里開始獲取DocumentRoot累奈,具體實現(xiàn)細節(jié)會執(zhí)行三個方法返回具體路徑。因為這里我們的命令行是java -jar app.war, 所以判斷后綴為.war,返回路徑為/Users/hzzou/Downloads/cronus/demo/app.war

image.png

image.png

然后基于剛才返回的DocumentRoot設(shè)置DocBase急但,為/Users/hzzou/Downloads/cronus/demo/app.war


image.png

設(shè)置好了DocBase澎媒,開始啟動tomcat


image.png

image.png

這里開始涉及到web resource的初始化


image.png

(1)設(shè)置main resource


image.png

image.png

image.png

這里需要注意這里的internalPath為“/”,初始化會自動轉(zhuǎn)成“”


image.png

image.png

main resource初始化成功如下
image.png

(2)設(shè)置jar resource
獲取擁有META-INF/resources的jar


image.png

image.png

jar resource初始化成功如下


image.png

剛才提到的jsp的relative path /WEB-INF/jsp/a.jsp波桩,會遍歷web resource戒努,根據(jù)base path和internal path構(gòu)造絕對路徑,粗略構(gòu)造效果等同與base path + internal path + jsp relative path镐躲。我們可以看到储玫,對于情況1侍筛,是可以在main resource知道到對應(yīng)jsp頁面的。所以我們針對情況1撒穷,a.jsp頁面只需要放置在/WEB-INF/jsp目錄下面即可匣椰。

而針對情況2,我們發(fā)現(xiàn)在設(shè)置DocumentRoot的時候出現(xiàn)不同端礼,getWarFileDocumentRoot 和getExplodedWarFileDocumentRoot 和 getCommonDocumentRoot 都是返回null窝爪,導(dǎo)致DocBase為一個temp dir,/var/folders/hn/87t2n4nx7hdbxq1chffy7gpr0000gq/T/tomcat-docbase.8080.11206243289434379479


image.png

image.png

這也直接導(dǎo)致最后的main resource里面構(gòu)建的是一個dir resource


image.png

image.png

所以對于情況2齐媒,我們沒有辦法適配蒲每,因為此時的main resource并不能幫助定位到j(luò)sp的具體位置


image.png

而針對情況3,對于main resource的構(gòu)建如情況2喻括,但是在構(gòu)建jar resouce的時候出現(xiàn)不同邀杏。因為我們知道,構(gòu)建jar resource的集合是有META-INF/resources的jar唬血,所以本身項目的jar也會被加載進去jar resource里面望蜡,具體效果如下


image.png

image.png

image.png

所以對于情況3,我們可以把WEB-INF/jsp/a.jsp放在META-INF/resources下面拷恨,也是可以讓jsp正常被展示的, 具體如下

image.png

結(jié)論:
針對情況1脖律,jsp路徑為webapp/WEB-INF/jsp/a.jsp
針對情況2,無法適配
針對情況3腕侄,jsp路徑為jsp路徑為META-INF/resources/WEB-INF/jsp/a.jsp

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末小泉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冕杠,更是在濱河造成了極大的恐慌微姊,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件分预,死亡現(xiàn)場離奇詭異兢交,居然都是意外死亡,警方通過查閱死者的電腦和手機笼痹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進店門配喳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凳干,你說我怎么就攤上這事晴裹。” “怎么了纺座?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵息拜,是天一觀的道長。 經(jīng)常有香客問我,道長少欺,這世上最難降的妖魔是什么喳瓣? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任赞别,我火速辦了婚禮,結(jié)果婚禮上惠毁,老公的妹妹穿的比我還像新娘鞠绰。我一直安慰自己蜈膨,他們只是感情好牺荠,可當(dāng)我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布灶壶。 她就那樣靜靜地躺著驰凛,像睡著了一般鱼蝉。 火紅的嫁衣襯著肌膚如雪魁亦。 梳的紋絲不亂的頭發(fā)上羔挡,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天绞灼,我揣著相機與錄音,去河邊找鬼印叁。 笑死,一個胖子當(dāng)著我的面吹牛昨悼,可吹牛的內(nèi)容都是我干的跃洛。 我是一名探鬼主播汇竭,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼两曼,長吁一口氣:“原來是場噩夢啊……” “哼悼凑!你這毒婦竟也來了佛析?” 一聲冷哼從身側(cè)響起彪蓬,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤档冬,失蹤者是張志新(化名)和其女友劉穎酷誓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盐数,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡玫氢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了漾峡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片攻旦。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡生逸,死狀恐怖且预,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情烙无,我是刑警寧澤锋谐,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布皱炉,位于F島的核電站怀估,受9級特大地震影響多搀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赌髓,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荣倾,春花似錦悯搔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铸豁,卻和暖如春灌曙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背节芥。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工在刺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人头镊。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓增炭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親拧晕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內(nèi)容