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文件贮匕。
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è)問題,大致的流程是這樣的:
在開啟這個(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)行了,多省心啊姑廉。