我理解的WAR包

war包是什么甲棍?

war包就是一個(gè)web應(yīng)用程序。不懂脉课,我想知道詳細(xì)一點(diǎn)救军,war包到底是個(gè)啥?來倘零,從上之下,我們把問題逐步分解戳寸,先從最高的邏輯層面說起呈驶。

一. 為什么要打成war包

1.這個(gè)web應(yīng)用是做什么的

開始的開始,我們不知道什么叫做web應(yīng)用疫鹊,我們只有一個(gè)需求:公司需要統(tǒng)計(jì)員工的基本信息袖瞻。老板希望每個(gè)人登錄一個(gè)固定的網(wǎng)站,填寫表單信息之后拆吆,保存在一個(gè)地方聋迎,然后統(tǒng)一管理起來。

要滿足這個(gè)需求枣耀,我們需要提供一個(gè)網(wǎng)頁霉晕,這個(gè)網(wǎng)頁上有很多表單要填寫,填好了之后一點(diǎn)擊,所有信息都沒保存起來了牺堰。這個(gè)能提交保存數(shù)據(jù)的東西叫做web應(yīng)用拄轻,可以知道,這個(gè)應(yīng)用最少有一個(gè)網(wǎng)頁伟葫,還需要能把網(wǎng)頁數(shù)據(jù)保存下來的東西恨搓。

2.寫出來以后給誰用

寫出來當(dāng)然是給員工用,把這個(gè)web應(yīng)用放到網(wǎng)上筏养,大家能通過網(wǎng)頁開啟這個(gè)應(yīng)用就行「В現(xiàn)在又有了一個(gè)新的需求,身在海外的其他分公司也想使用這個(gè)web應(yīng)用渐溶,并且他們不希望自己的信息被別人知道夺姑,那么我就需要將這個(gè)應(yīng)用”獨(dú)立”地發(fā)給他們,讓他們自己把這個(gè)東西用起來掌猛。所以盏浙,我們寫的這個(gè)東西還可能被獨(dú)立的拿到其他地方運(yùn)行,因此我們的應(yīng)用需要滿足各種各樣的環(huán)境荔茬。

接下來我們說點(diǎn)實(shí)際的東西废膘。

二. 一個(gè)war包有什么樣的結(jié)構(gòu)

1. 一個(gè)web應(yīng)用需要哪些文件

一個(gè)web應(yīng)用,直觀地來說慕蔚,需要一個(gè)界面丐黄,這個(gè)界面是一個(gè)用戶交互的界面,負(fù)責(zé)給用戶提供信息輸入的地方孔飒,所以一個(gè)web頁面是要有的灌闺,這里設(shè)定為jsp頁面,接著往下想坏瞄,這些數(shù)據(jù)需要保存下來桂对,那么需要一個(gè)界面背后的東西,這個(gè)東西其實(shí)就是一個(gè)java類鸠匀,jsp把網(wǎng)頁上的數(shù)據(jù)穿送給后臺(tái)的java類蕉斜,java類在得到這些數(shù)據(jù)之后再進(jìn)行數(shù)據(jù)相關(guān)的工作,如存入數(shù)據(jù)庫缀棍,給出相關(guān)統(tǒng)計(jì)數(shù)據(jù)等等宅此,這里的java類比如servlet,那么接著你就會(huì)想爬范,servlet是別人的東西啊父腕,我們需要引入它,于是我們還需要一些外部依賴包青瀑,就是一些jar包璧亮。自己寫的java類編譯之后生成的是class文件萧诫。

感覺好像差不多了,該有的就有了杜顺,那我們開始著手給這些東西建立依賴關(guān)系吧财搁,以便他們能正常工作。好躬络,現(xiàn)在我們把自己想成是整個(gè)應(yīng)用的組織人尖奔,我們要召集各位同事,jsp同志穷当,java類同志來一起為公司的數(shù)據(jù)采集工作獻(xiàn)身了提茁,和之前一樣,你能很直觀的看到j(luò)sp在最前面工作馁菜,其他的都是幕后英雄茴扁,那后面的人怎么辦,我也要把他們協(xié)調(diào)起來汪疮,于是我必須有一個(gè)list寫明后面有誰在工作峭火,在我們的應(yīng)用里,后臺(tái)的任務(wù)是java類來完成的智嚷,這里是servlet卖丸,于是就有了一個(gè)web.xml的文件來記錄這個(gè)web應(yīng)用中有哪些類,那么在jsp頁面上只需要給出這個(gè)servlet的名字即可盏道,然后我們在web.xml文件中詳細(xì)記錄這個(gè)servlet的各種信息稍浆,以便應(yīng)用能夠準(zhǔn)確的使用它。那么你可能會(huì)想猜嘱,為什么不將詳細(xì)信息直接記錄在jsp頁面呢衅枫?我覺得可能是猶由于模塊之間的低耦合要求吧。至于怎么工作呢朗伶,后面我們再來說弦撩。

2. 這些東西放在什么位置

我們已經(jīng)有了應(yīng)用需要的文件,接下來需要讓這些文件各司其職腕让,也就是把文件放在固定的位置孤钦,需要他們的時(shí)候去對(duì)應(yīng)的位置找。那么這種位置關(guān)系就是應(yīng)用的目錄結(jié)構(gòu)纯丸。一個(gè)基本的war包的目錄結(jié)構(gòu)如圖1所示,根目錄下有一個(gè)index.jsp文件静袖,是應(yīng)用的界面觉鼻,當(dāng)然你也可以加上css等讓界面變得更炫。然后有一個(gè)WEB-INF文件夾队橙,這個(gè)是war包的核心坠陈,在WEB-INF文件夾有web.xml文件萨惑,lib文件夾下存的是需要用到的外部依賴的jar包,classes下存的是帶包名結(jié)構(gòu)的java類仇矾,因?yàn)榘臀募夸浭且灰粚?duì)應(yīng)的關(guān)系庸蔼,所以你在classes文件夾下就會(huì)看到和包名一致的目錄結(jié)構(gòu),最后一層就是你編譯好的class文件贮匕。


圖1


3. 文件是怎么交互的

這些目錄組織好了姐仅,那么文件是怎么交互的呢,這么多目錄結(jié)構(gòu)刻盐,程序怎么知道哪里是哪里掏膏,該去哪里找相關(guān)的class呢?這就和web.xml文件相關(guān)了敦锌,那么web.xml文件是怎么記錄這些class的呢馒疹,下面我們來看一下:


從標(biāo)簽可以看出來,從第1行到第4行是servlet的注冊信息乙墙,第2行給出了這個(gè)servlet的名字颖变,是這個(gè)servlet編譯后帶包名的class類。那么是干什么的听想,先看看它里面有什么腥刹,和上面標(biāo)簽中的name是一致的,下面有個(gè)哗魂,看到url就想到一定是給出位置信息的標(biāo)簽肛走,以便程序能夠定位servlet。我們在jsp頁面里录别,要提交一個(gè)表單朽色,我們會(huì)這么寫:

其中action屬性后面的值給出了點(diǎn)擊”提交”這個(gè)動(dòng)作,之后的工作交給servlet文件下AcceptUserReg這個(gè)類來做组题,通過中的屬性來定位servlet葫男。那你可能要問了,我訪問的是AcceptUserReg這個(gè)class崔列,那為什么直接寫AcceptUserReg呢梢褐?至少要有一個(gè)包名吧?其實(shí)的作用就在這里赵讯,在標(biāo)簽下我們給com.wzt.AcceptUserReg這個(gè)類起了個(gè)名字叫AcceptUserReg盈咳,也就是被注冊了,在任何要用到com.wzt.AcceptUserReg的地方都能用AcceptUserReg代替边翼,這里的jsp的URL·就是一個(gè)例子鱼响。

最后我們讓代碼跑起來試試。

1<servlet>

2 ? ?<servlet-name>AcceptUserReg</servlet-name>

3 ? ?<servlet-class>com.wzt.AcceptUserReg</servlet-class>

4</servlet>

5<servlet-mapping>

6 ? ?<servlet-name>AcceptUserReg</servlet-name>

7 ? ?<url-pattern>/com/wzt/AcceptUserReg</url-pattern>

8 </servlet-mapping>

從標(biāo)簽可以看出來组底,從第1行到第4行是servlet的注冊信息丈积,第2行給出了這個(gè)servlet的名字筐骇,是這個(gè)servlet編譯后帶包名的class類。那么是干什么的江滨,先看看它里面有什么铛纬,和上面標(biāo)簽中的name是一致的,下面有個(gè)唬滑,看到url就想到一定是給出位置信息的標(biāo)簽告唆,以便程序能夠定位servlet。我們在jsp頁面里间雀,要提交一個(gè)表單悔详,我們會(huì)這么寫:

<form method="POST" action="servlet/AcceptUserReg" name="form1">

其中action屬性后面的值給出了點(diǎn)擊”提交”這個(gè)動(dòng)作,之后的工作交給servlet文件下AcceptUserReg這個(gè)類來做惹挟,通過中的屬性來定位servlet茄螃。那你可能要問了,我訪問的是AcceptUserReg這個(gè)class连锯,那為什么直接寫AcceptUserReg呢归苍?至少要有一個(gè)包名吧?其實(shí)的作用就在這里运怖,在標(biāo)簽下我們給com.wzt.AcceptUserReg這個(gè)類起了個(gè)名字叫AcceptUserReg拼弃,也就是被注冊了,在任何要用到com.wzt.AcceptUserReg的地方都能用AcceptUserReg代替摇展,這里的jsp的URL·就是一個(gè)例子吻氧。

最后我們讓代碼跑起來試試。

三. war包怎么用起來

1. 怎么打包一個(gè)war包

打包war包很簡單咏连,首先需要把你的java文件編譯成class文件盯孙,使用javac命令,記得跟上依賴的外部jar包祟滴,指定輸出路徑為WEB-INF下的classes振惰,然后使用jar cvf命令將你的jsp文件和WEB-INF文件一起打包即可。

2. war怎么跑起來

其實(shí)這個(gè)問題有兩種含義垄懂,第一骑晶,怎么運(yùn)行一個(gè)war包。第二草慧,Tomcat服務(wù)器是怎么樣解析這個(gè)war包的桶蛔。

對(duì)于第一個(gè)問題,我們只需要把打好的war包拷貝到Tomcat的webapps目錄下漫谷,Tomcat服務(wù)器會(huì)自行解壓這個(gè)包羽圃。

對(duì)于第二個(gè)問題,大致的流程是這樣的:


圖2

在開啟這個(gè)web應(yīng)用的時(shí)候抖剿,servlet容器掃描應(yīng)用下的web.xml文件朽寞,注冊所有的servlet,等待觸發(fā)行為的發(fā)生斩郎,也就是等待用戶提交等行為脑融,一旦需要后臺(tái)的處理,那么久輪到servlet干活了缩宜,可以看到肘迎, 下的給出的路徑是經(jīng)過處理后的路徑,它被瀏覽器訪問的路徑所匹配锻煌,但是不是直接匹配妓布,一個(gè)URL路徑與web應(yīng)用根目錄做差之后,得到一個(gè)目標(biāo)路徑宋梧,拿這個(gè)路徑和所有的servlet的匹配匣沼。比如我訪問的是:

1. http://localhost:8080/FormDemo/com/wzt/servlet/AcceptUserReg

我們的應(yīng)用根目錄是:

2. http://localhost:8080/FormDemo

將1-2可以得到:

/com/wzt/servlet/AcceptUserReg

這就是待匹配的目標(biāo)url灸姊,之后到了圖中1的地方雕拼,匹配成功耻瑟,然后找到同級(jí)子標(biāo)簽下的servlet名字溜腐,即圖中步驟2尝苇,之后再去標(biāo)簽中找相同名字的servlet扫尺,到了步驟3拴鸵,最后找到該標(biāo)簽同級(jí)子標(biāo)簽下的吩跋,完成第4個(gè)步驟之后展融,servlet容器便找到了該次響應(yīng)的servlet類窖认,執(zhí)行這個(gè)類就能完成想要的工作了。

在明白了war包的結(jié)構(gòu)和工作原理之后告希,我們來想想最開始的那個(gè)上層的邏輯問題扑浸?為什么一定要把這些文件打包呢?這個(gè)包怎么拿給別人用呢暂雹?其實(shí)你肯定已經(jīng)感受到了首装,我們在把這一大堆的文件有組織有紀(jì)律的放在一起,通過打包的方式變成一個(gè)文件杭跪,那么別人需要的時(shí)候就傳輸這一個(gè)文件即可仙逻,越簡單越不容易出錯(cuò)嘛。因?yàn)榇蠹矣玫亩际荰omcat涧尿,所以大家把拿到的這一個(gè)war包放在Tomcat下系奉,Tomcat就會(huì)嘩嘩嘩的自己運(yùn)行了,多省心啊姑廉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缺亮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子桥言,更是在濱河造成了極大的恐慌萌踱,老刑警劉巖葵礼,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異并鸵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)届谈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門咏闪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來织鲸,“玉大人搂擦,你說我怎么就攤上這事〕髫玻” “怎么了桑逝?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵楞遏,是天一觀的道長寡喝。 經(jīng)常有香客問我预鬓,道長劈彪,這世上最難降的妖魔是什么草添? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任屠凶,我火速辦了婚禮,結(jié)果婚禮上唉韭,老公的妹妹穿的比我還像新娘属愤。我一直安慰自己,他們只是感情好酸役,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布涣澡。 她就那樣靜靜地躺著贱呐,像睡著了一般入桂。 火紅的嫁衣襯著肌膚如雪奄薇。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天馁蒂,我揣著相機(jī)與錄音远搪,去河邊找鬼。 笑死倘潜,一個(gè)胖子當(dāng)著我的面吹牛废睦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播养泡,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼嗜湃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了澜掩?” 一聲冷哼從身側(cè)響起购披,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肩榕,沒想到半個(gè)月后刚陡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡株汉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年筐乳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乔妈。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蝙云,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褒翰,到底是詐尸還是另有隱情贮懈,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布优训,位于F島的核電站朵你,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏揣非。R本人自食惡果不足惜抡医,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望早敬。 院中可真熱鬧忌傻,春花似錦、人聲如沸搞监。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琐驴。三九已至俘种,卻和暖如春秤标,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背宙刘。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工苍姜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人悬包。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓衙猪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親布近。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垫释,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評(píng)論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)吊输,斷路器饶号,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法季蚂,內(nèi)部類的語法,繼承相關(guān)的語法琅束,異常的語法扭屁,線程的語...
    子非魚_t_閱讀 31,631評(píng)論 18 399
  • 1.什么是JSP (1)jsp全稱是Java Server Pages,它和Servlet技術(shù)一樣都是sun公司定...
    yjaal閱讀 3,655評(píng)論 5 99
  • 我在難得有太陽的冬日里拿著小馬扎坐在樓下看來往的車輛以及各色各樣的行人涩禀。 遠(yuǎn)遠(yuǎn)地走來一個(gè)人影料滥,手里提著早餐,即使逆...
    陸青琦閱讀 69評(píng)論 0 0