IDEA構(gòu)建JavaWeb項(xiàng)目并通過Tomcat成功運(yùn)行解讀
一、Tomcat簡(jiǎn)介
Web服務(wù)器通常由硬件和軟件共同構(gòu)成。
- 硬件:電腦,提供服務(wù)供其它客戶電腦訪問
- 軟件:電腦上安裝的服務(wù)器軟件,安裝后能提供服務(wù)給網(wǎng)絡(luò)中的其他計(jì)算機(jī),將本地文件映射成一個(gè)虛擬的url地址供網(wǎng)絡(luò)中的其他人訪問。

常見的JavaWeb服務(wù)器:
- Tomcat(Apache):當(dāng)前應(yīng)用最廣的JavaWeb服務(wù)器
- Jetty:更輕量級(jí)、更靈活的servlet容器
- JBoss(Redhat紅帽):支持JavaEE,應(yīng)用比較廣EJB容器 –> SSH輕量級(jí)的框架代替
- GlassFish(Orcale):Oracle開發(fā)JavaWeb服務(wù)器,應(yīng)用不是很廣
- Resin(Caucho):支持JavaEE,應(yīng)用越來越廣
- Weblogic(Orcale):要錢的!支持JavaEE,適合大型項(xiàng)目
- Websphere(IBM):要錢的!支持JavaEE,適合大型項(xiàng)目
Tomcat是Apache 軟件基金會(huì)(Apache Software Foundation)的Jakarta 項(xiàng)目中的一個(gè)核心項(xiàng)目,由Apache、Sun 和其他一些公司及個(gè)人共同開發(fā)而成。最新的Servlet 和JSP 規(guī)范總是能在Tomcat 中得到體現(xiàn),因?yàn)門omcat 技術(shù)先進(jìn)、性能穩(wěn)定,而且免費(fèi),因而深受Java 愛好者的喜愛并得到了部分軟件開發(fā)商的認(rèn)可,成為目前比較流行的Web 應(yīng)用服務(wù)器。
Tomcat 版本和Servlet版本之間的對(duì)應(yīng)關(guān)系:
| Servlet Version | Tomcat Version | JDK Version |
|---|---|---|
| 6.1 | 11.0.x | 17 and later |
| 6.0 | 10.1.x | 11 and later |
| 5.0 | 10.0.x (superseded) | 8 and later |
| 4.0 | 9.0.x | 8 and later |
| 3.1 | 8.5.x | 7 and later |
| 3.1 | 8.0.x (superseded) | 7 and later |
| 3.0 | 7.0.x (archived) | 6 and later (7 and later for WebSocket) |
二、Tomcat安裝步驟
注意:安裝Tomcat之前要安裝JDK!
官網(wǎng):https://tomcat.apache.org/
1.選擇分支下載
進(jìn)入該網(wǎng)址:https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.34/bin/
2.點(diǎn)擊下載zip安裝包

3.解壓到?jīng)]有中文、
空格和特殊字符的目錄下
4.雙擊bin目錄下的startup.bat腳本啟動(dòng)Tomcat

會(huì)彈出一個(gè)Dos窗口,這個(gè)就是Tomcat服務(wù)器

如果你下載的Tomcat是10版本,Dos窗口打印的中文可能會(huì)有亂碼,解決方式如下:
Tomcat——config——logging.properties文件:修改編碼格式為GBK

5.瀏覽器訪問Tomcat
瀏覽器地址欄輸入:http://localhost:8080/
出現(xiàn)下面的頁(yè)面,就說明Tomcat服務(wù)器訪問成功。

6.關(guān)閉Tomcat服務(wù)器
8080端口只能被占用一次 重復(fù)啟動(dòng)時(shí) 會(huì)報(bào)錯(cuò) 端口占用 無法正常啟動(dòng)
關(guān)閉tomcat時(shí) 建議使用腳本關(guān)閉 主動(dòng)釋放端口 直接殺進(jìn)程 端口釋放不及時(shí) 有時(shí)候會(huì)卡主端口 長(zhǎng)時(shí)間不釋放
建議用腳本關(guān)閉

三、Tomcat目錄介紹

bin:該目錄下存放的是二進(jìn)制可執(zhí)行文件,如果是安裝版,那么這個(gè)目錄下會(huì)有兩個(gè)exe文件:tomcat8.exe、tomcat8w.exe,前者是在控制臺(tái)下啟動(dòng)Tomcat,后者是彈出GUI窗口啟動(dòng)Tomcat;如果是解壓版,那么會(huì)有startup.bat和shutdown.bat文件,startup.bat用來啟動(dòng)Tomcat,但需要先配置JAVA_HOME環(huán)境變量才能啟動(dòng),shutdown.bat用來停止Tomcat;
conf:這是一個(gè)非常非常重要的目錄,這個(gè)目錄下有四個(gè)最為重要的文件:
server.xml:配置整個(gè)服務(wù)器信息。例如修改端口號(hào)。默認(rèn)HTTP請(qǐng)求的端口號(hào)是:8080
修改啟動(dòng)端口號(hào):conf/server.xml

tomcat-users.xml:存儲(chǔ)tomcat用戶的文件,這里保存的是tomcat的用戶名及密碼,以及用戶的角色信息??梢园粗撐募械淖⑨屝畔⑻砑觮omcat用戶,然后就可以在Tomcat主頁(yè)中進(jìn)入Tomcat Manager頁(yè)面了;
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin"
password="admin"
roles="admin-gui,admin-script,manager-gui,manager-script,manager-jmx,manager-status"
/>
</tomcat-users>- web.xml:部署描述符文件,這個(gè)文件中注冊(cè)了很多MIME類型,即文檔類型。這些MIME類型是客戶端與服務(wù)器之間說明文檔類型的,如用戶請(qǐng)求一個(gè)html網(wǎng)頁(yè),那么服務(wù)器還會(huì)告訴客戶端瀏覽器響應(yīng)的文檔是text/html類型的,這就是一個(gè)MIME類型??蛻舳藶g覽器通過這個(gè)MIME類型就知道如何處理它了。當(dāng)然是在瀏覽器中顯示這個(gè)html文件了。但如果服務(wù)器響應(yīng)的是一個(gè)exe文件,那么瀏覽器就不可能顯示它,而是應(yīng)該彈出下載窗口才對(duì)。MIME就是用來說明文檔的內(nèi)容是什么類型的!
- context.xml:對(duì)所有應(yīng)用的統(tǒng)一配置,通常我們不會(huì)去配置它。
- lib:Tomcat的類庫(kù),里面是一大堆jar文件。如果需要添加Tomcat依賴的jar文件,可以把它放到這個(gè)目錄中,當(dāng)然也可以把應(yīng)用依賴的jar文件放到這個(gè)目錄中,這個(gè)目錄中的jar所有項(xiàng)目都可以共享之,但這樣你的應(yīng)用放到其他Tomcat下時(shí)就不能再共享這個(gè)目錄下的jar包了,所以建議只把Tomcat需要的jar包放到這個(gè)目錄下;
- logs:這個(gè)目錄中都是日志文件,記錄了Tomcat啟動(dòng)和關(guān)閉的信息,如果啟動(dòng)Tomcat時(shí)有錯(cuò)誤,那么異常也會(huì)記錄在日志文件中。
- temp:存放Tomcat的臨時(shí)文件,這個(gè)目錄下的東西可以在停止Tomcat后刪除!
- webapps:存放web項(xiàng)目的目錄,其中每個(gè)文件夾都是一個(gè)項(xiàng)目;如果這個(gè)目錄下已經(jīng)存在了目錄,那么都是tomcat自帶的項(xiàng)目。其中ROOT是一個(gè)特殊的項(xiàng)目,在地址欄中訪問:http://127.0.0.1:8080,沒有給出項(xiàng)目目錄時(shí),對(duì)應(yīng)的就是ROOT項(xiàng)目。http://localhost:8080/examples,進(jìn)入示例項(xiàng)目。其中examples"就是項(xiàng)目名,即文件夾的名字。
項(xiàng)目的訪問路徑與項(xiàng)目的部署目錄可以不一致,可以在IDEA中配置:

- work:運(yùn)行時(shí)生成的文件,最終運(yùn)行的文件都在這里。通過webapps中的項(xiàng)目生成的!可以把這個(gè)目錄下的內(nèi)容刪除,再次運(yùn)行時(shí)會(huì)生再次生成work目錄。當(dāng)客戶端用戶訪問一個(gè)JSP文件時(shí),Tomcat會(huì)通過JSP生成Java文件,然后再編譯Java文件生成class文件,生成的java和class文件都會(huì)存放到這個(gè)目錄下。
- LICENSE:許可證。
- NOTICE:說明文件。
四、WEB項(xiàng)目的標(biāo)準(zhǔn)結(jié)構(gòu)
一個(gè)標(biāo)準(zhǔn)的可以用于發(fā)布的WEB項(xiàng)目標(biāo)準(zhǔn)結(jié)構(gòu)如下:

app 本應(yīng)用根目錄
- static 非必要目錄,約定俗成的名字,一般在此處放靜態(tài)資源 (css js img)
WEB-INF 必要目錄,必須叫WEB-INF,受保護(hù)的資源目錄,瀏覽器通過url不可以直接訪問的目錄
- classes 必要目錄,src下源代碼,配置文件,編譯后會(huì)在該目錄下,web項(xiàng)目中如果沒有源碼,則該目錄不會(huì)出現(xiàn)
- lib 必要目錄,項(xiàng)目依賴的jar編譯后會(huì)出現(xiàn)在該目錄下,web項(xiàng)目要是沒有依賴任何jar,則該目錄不會(huì)出現(xiàn)
- web.xml 必要文件,web項(xiàng)目的基本配置文件。較新的版本中可以沒有該文件,但是學(xué)習(xí)過程中還是需要該文件
index.html 非必要文件,index.html/index.htm/index.jsp為默認(rèn)的歡迎頁(yè)
在tomcat的webapps目錄下新建app文件,具體文件結(jié)構(gòu)如下:

訪問login.html:

訪問regist.html:

訪問static/img/logo.jpg:

如果在WEB-INF目錄下放一張圖片,圖片無法訪問:
五、WEB項(xiàng)目部署的三種方式
(一)方式一——直接將編譯好的項(xiàng)目放在webapps目錄下
上面已經(jīng)演示過。
(二)方式二——war包放在webapps目錄下
將編譯好的項(xiàng)目打成war包放在webapps目錄下,tomcat啟動(dòng)后會(huì)自動(dòng)解壓war包(其實(shí)和第一種一樣)

在tomcat的conf下創(chuàng)建Catalina/localhost目錄,并在該目錄下準(zhǔn)備一個(gè)app.xml文件
<!--
path: 項(xiàng)目的訪問路徑,也是項(xiàng)目的上下文路徑,就是在瀏覽器中,輸入的項(xiàng)目名稱
docBase: 項(xiàng)目在磁盤中的實(shí)際路徑
-->
<Context path="/app" docBase="D:\mywebapps\app" />啟動(dòng)tomcat訪問測(cè)試即可

url的組成部分和項(xiàng)目中資源的對(duì)應(yīng)關(guān)系:

tomcat的webapps目錄默認(rèn)給我們提供了如下項(xiàng)目:

瀏覽器訪問項(xiàng)目名,有沒有輸入index.html都是默認(rèn)展示這一頁(yè)


ROOT項(xiàng)目比較特殊,它的部署目錄和訪問路徑不一致,訪問方式如下:
瀏覽器地址不需要寫ROOT:http://localhost:8080/index.jsp

(三)IDEA中開發(fā)并部署運(yùn)行WEB項(xiàng)目





IDEA可以配置多個(gè)Tomcat,點(diǎn)擊+號(hào)還可以繼續(xù)新增
六、IDEA中開發(fā)并部署運(yùn)行WEB項(xiàng)目
1.創(chuàng)建一個(gè)空項(xiàng)目或空模塊


2.配置Web Application


如果你的Tomcat版本是10以上,需要先做這一步:

再重新勾選Web Application,選擇5.0版本

3.搭建內(nèi)部框架
刪除index.jsp

Java代碼寫在src中,網(wǎng)頁(yè)代碼寫在web目錄下:
新增日程管理一期的login.html和regist.html到web下,新增static目錄,下面放多個(gè)目錄和文件

當(dāng)前項(xiàng)目的jar包必須放在WEB-INF下的lib目錄中

4.構(gòu)建項(xiàng)目

選擇要build的項(xiàng)目進(jìn)行Build


- resources和src文件編譯后的文件,放在classes中;
- web對(duì)應(yīng)demo01_web01_war_exploded,demo01_web01_war_exploded就是可以在Tomcat中發(fā)布的app;
- static和WEB-INF對(duì)應(yīng)demo01_web01_war_exploded下的static和WEB-INF;

build部分的步驟也可以跳過,在這里配置完成后直接啟動(dòng)項(xiàng)目即可:






5.運(yùn)行Tomcat項(xiàng)目


6.瀏覽器訪問


停止服務(wù),刪除out文件,再重新啟動(dòng),瀏覽器輸入url,也可以成功訪問,IDEA會(huì)自動(dòng)進(jìn)行build

Catalina log亂碼問題解決:
Tomcat10以上版本可能會(huì)出現(xiàn)亂碼問題,修改config目錄下的logging.properties文件的編碼即可。

七、IDEA部署并運(yùn)行JavaWeb項(xiàng)目的原理
構(gòu)建好的項(xiàng)目并不會(huì)放在Tomcat安裝目錄的webapps中,防止污染本地安裝的Tomcat,而是放在Tomcat生成的副本中



Tomcat磁盤上的軟件按照Tomcat副本中的配置文件進(jìn)行運(yùn)行,這樣既不會(huì)污染本地安裝的Tomcat軟件,創(chuàng)建的副本也很小。
IDEA部署并運(yùn)行項(xiàng)目的原理
idea并沒有直接進(jìn)將編譯好的項(xiàng)目放入tomcat的webapps中
idea根據(jù)關(guān)聯(lián)的tomcat,創(chuàng)建了一個(gè)tomcat副本,將項(xiàng)目部署到了這個(gè)副本中
idea的tomcat副本在C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\中
idea的tomcat副本并不是一個(gè)完整的tomcat,副本里只是準(zhǔn)備了和當(dāng)前項(xiàng)目相關(guān)的配置文件而已
idea啟動(dòng)tomcat時(shí),是讓本地tomcat程序按照tomcat副本里的配置文件運(yùn)行
idea的tomcat副本部署項(xiàng)目的模式是通過conf/Catalina/localhost/*.xml配置文件的形式實(shí)現(xiàn)項(xiàng)目部署的
C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2022.2\tomcat\35d71a34-4fc7-4686-917a-b4aca77b806a\conf\Catalina\localhost目錄下的*.xml文件:

<Context path="/web01" docBase="G:\develop\workspace\atguigujavaweb\one\basecode\out\artifacts\demo01_web01_war_exploded" />
八、Tomcat支持熱部署
當(dāng)想要修改代碼時(shí),不需要重啟Tomcat服務(wù),點(diǎn)擊熱部署按鈕即可。

總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- idea普通javaweb項(xiàng)目如何部署到tomcat(讀取web.xml文件)
- 使用IDEA創(chuàng)建servlet?JavaWeb?應(yīng)用及使用Tomcat本地部署的實(shí)現(xiàn)
- JavaWeb 入門篇:創(chuàng)建Web項(xiàng)目,Idea配置tomcat
- JavaWeb開發(fā)之【Tomcat 環(huán)境配置】MyEclipse+IDEA配置教程
- 如何在IntelliJ IDEA 2018上配置Tomcat并運(yùn)行第一個(gè)JavaWeb項(xiàng)目
- Idea2020.2創(chuàng)建JavaWeb項(xiàng)目(部署Tomcat)方法詳解
- IDEA運(yùn)行導(dǎo)入的javaweb項(xiàng)目tomcat正常,但是運(yùn)行失敗404問題
相關(guān)文章
基于Feign傳輸對(duì)象無法接收參數(shù)的問題
這篇文章主要介紹了基于Feign傳輸對(duì)象無法接收參數(shù)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringBoot?+?Redis如何解決重復(fù)提交問題(冪等)
在開發(fā)中,一個(gè)對(duì)外暴露的接口可能會(huì)面臨瞬間的大量重復(fù)請(qǐng)求,本文就介紹了SpringBoot + Redis如何解決重復(fù)提交問題,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12
Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(19)
下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你2021-07-07
詳解Java?ReentrantReadWriteLock讀寫鎖的原理與實(shí)現(xiàn)
ReentrantReadWriteLock讀寫鎖是使用AQS的集大成者,用了獨(dú)占模式和共享模式。本文和大家一起理解下ReentrantReadWriteLock讀寫鎖的實(shí)現(xiàn)原理,需要的可以了解一下2022-10-10
Java中多個(gè)線程交替循環(huán)執(zhí)行的實(shí)現(xiàn)
有些時(shí)候面試官經(jīng)常會(huì)問,兩個(gè)線程怎么交替執(zhí)行呀,本文就來詳細(xì)的介紹一下Java中多個(gè)線程交替循環(huán)執(zhí)行的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-01-01

