Java web項目基本介紹
1、如何新建Java web項目
1.1、在IDEA中新建一個Java web項目
在IDEA中創建一個Java web項目其實很簡單,只需創建project,并且勾選 web application 選項即可,由此就創建了一個Java EE項目。
可參考:https://blog.csdn.net/qq_34107571/article/details/79774250
1.2、在eclipse中新建一個Java web項目
參考:https://jingyan.baidu.com/article/7f41ecec4b76fe593d095cea.html
建議使用 Java ee 版本的 eclipse。
2、在eclipse中配置tomcat服務器
參考:http://www.rzrgm.cn/greamrod/p/10330404.html
2.1、在eclipse中設置tomcat熱更新
參考:https://jingyan.baidu.com/article/e75aca853188ba142edac6b5.html
照著上面鏈接做效果可能還比較慢,更新得比較慢,此時可以將更新時間調為 0,如下:

2.2、修改tomcat的默認部署路徑
當項目在服務器上運行后,eclipse 中會生成一個與工程文件并列的一個文件夾:Servers。如下:(如果刪掉了Servers文件夾,當重新運行時,文件夾又會自動生成)

這個文件夾是Tomcat服務器的一個基本的配置。

上圖中可以看到,項目 javaWebTest01 已經部署到Tomcat服務器上去了,也就是看到了TomcatTest這個工程被發布出去了。我們雙擊上圖中的 tomcat 服務器可以看到我們新建的 tomcat 的一些設置信息,如下:

上圖中紅框表示的意思是,該項目將默認會發布在 eclipse 工作空間下的 .metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps 路徑下(比如:F:\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps),而不是在 tomcat 的安裝目錄下。我們打開該路徑可以看到已經被打包好的 javaWebTest01 項目,如下:
打開 javaWebTest01 文件夾可以看到該項目打包后的目錄結構:

當然,我們也可以修改部署目錄,將該項目默認部署在我們tomcat的安裝目錄下。先將該項目從 tomcat 中移除掉(必須得先移除掉,不然無法修改配置信息),然后修改配置信息,啟動即可。如下:

然后就可以修改部署的路徑了,比如我們將部署路徑修改為 tomcat 安裝目錄下的 webapps 目錄:

修改保存,然后重新運行 tomcat 即可。運行結束后我們可以在 tomcat 安裝目錄下的 webapps 看到多了一個 javaWebTest01 文件夾,證明部署成功。
參考:https://blog.csdn.net/suhang1992/article/details/82838341
3、在IDEA中配置tomcat服務器
創建完一個 java web項目后,我們就可以往這個項目當中配置 tomcat 服務器了。首先需要做的是先安裝一個 tomcat ,如何安裝 tomcat 可以參考:http://www.rzrgm.cn/wenxuehai/p/14133196.html
安裝完之后就配置 tomcat,主要就是給這個項目添加一個配置 configuration,大致就是先選擇 tomcat server -> 然后選擇 local ,詳細可參考:http://www.rzrgm.cn/shijiaoyun/p/5882281.html#top (在Chrome中打開可能圖片顯示不出來)
在配置 tomcat 之后,如果想在修改項目文件后立即生效,實現熱部署的效果,可以在配置中修改為下面的選項。修改為下面選項在修改 java 代碼時可能還沒有實時更新的效果,在啟動 tomcat 時選擇 debug 就可以。

3.1、IDEA中web項目的配置文件
在 IDEA 中,每一個 tomcat 部署的項目都會有一個單獨的配置,IDEA 會為每個 tomcat 部署的項目單獨建立一份配置文件。
該配置文件的路徑會在啟動 tomcat 時在控制臺輸出,一般在前面會輸出,類似于:Using CATALINA_BASE: "C:\Users\xxx\.IntelliJIdea2019.3\system\tomcat\Unnamed_new_tomcat_test_2" 這么一行代碼,配置文件就存放在該路徑當中。
目錄結構如下:

在 conf 文件夾下有 server.xml 文件,該文件就是該 web 項目的 tomcat 配置文件。
在 conf/Catalina/localhost 中可以看到有 xml 配置文件,由此可以知道部署方式采用的是新增配置文件的方式來進行部署的。
3.2、tomcat真正訪問的web項目路徑
打開上述配置文件目錄 conf/Catalina/localhost 下的 xml 配置文件,docBase 屬性指的就是 tomcat 實際訪問的項目路徑:
<Context path="/new_tomcat_test_war_exploded" docBase="F:\develop_WorkSpace\IntelliJ_IDEA_workSpace\new_tomcat_test\out\artifacts\new_tomcat_test_war_exploded" />
我們可以把平常編寫的項目路徑和 tomcat 實際訪問的項目路徑分為:工作空間項目、tomcat 部署的項目。可以看到 docBase 指向的是 IDEA開發工具的工作空間下的 out 目錄下的路徑文件,而不是我們平常的工作空間路徑,但是這個 out 目錄在 IDEA 下是看不到的。也就是說 tomcat 訪問的部署項目路徑和我們工作空間的項目是不太一樣的。該 out/artifacts 目錄下的項目實際上就是我們需要部署的文件。
tomcat 部署的項目實際上對應著工作空間項目下的 web 目錄下的所有資源,再加上 src 目錄下的資源。
WEB-INF 目錄下的資源不能被瀏覽器直接訪問,所以不要在 WEB-INF 目錄下新建 html 等資源。
4、Java和Java Web項目的目錄結構
我們應該要知道,Java項目和Java web項目的目錄結構是有很大不一樣的。這是有很多因素構成的,比如Java web項目中需要跟 tomcat 進行部署等。
4.1、Java項目的目錄結構
.project:是工程構建配置文件
.classpath:保存的是項目所用的外部引用包的路徑
.settings:記錄項目配置變化的記錄文件夾
src: sourcefolder項目源代碼 .java文件的存放位置
bin:項目開發時的classes文件存放目錄。該文件夾下的 classes 文件夾(即 bin/classes )存放著項目編譯后 .class 文件
lib:為方便編程,常常會引用別人已經實現的方法,通常會封裝成jar包,lib文件夾就是用來存放從外部引入的jar包。
4.2、Java web項目的目錄結構
在Eclipse中只要創建一個Dynamic Web Project,就可以根據創建向導創建出一個典型Java Web站點的目錄結構。除非有特殊需要,在大多數情況下都沒有必要修改這個目錄結構,這也是Web容器的缺省目錄結構,我們只要直接使用即可。一般的目錄結構如下:

下面了解一下這些目錄或者文件夾的用途。
(1)Java Resources
- src:用來存放Java源文件。
- Libraries:存放的是Tomcat及JRE中的jar包。
(2)build:項目開發時的 classes 文件存放目錄。該文件夾下的 classes 文件夾(即 build/classes )存放著項目編譯后 .class 文件。build 文件夾和 bin 文件夾是類似的,我們可以手動設置項目開發時編譯后的 class 文件是存放在 bin 還是 build 文件夾下。
(3)WebContent(WebRoot):是這個Web應用的頂層目錄,也稱為文檔根目錄,目錄結構如下:
WebContent
|---META-INF
| |---MANIFEST.MF
|---WEB-INF
| |---web.xml
| |---lib
| | |---*.jar 程序需要的jar包
| |---classes class文件目錄
| |---...*.class class文件
|---<userdir> 自定義的目錄
| |---*.jsp,*.js,*.css 自定義的資源文件
- META-INF:系統自動生成,存放系統描述信息。
- 一系列自定義的靜態文件:包括所有的HTML網頁、CSS文件、圖像文件等。一般按功能已文件夾形式分類,例如,圖像文件集中存儲在images目錄中。
- JSP文件:利用JSP可以很方便地在頁面中生成動態的內容,使Web應用可以輸出動態頁面。
- WEB-INF:是Java的WEB應用的安全目錄。所謂安全就是客戶端無法訪問,即無法對外發布,用戶訪問不到,只有服務端可以訪問。如果想在頁面中直接訪問其中的文件,必須通過web.xml文件對要訪問的文件進行相應映射才能訪問。
- WEB-INF/lib:存放第三方庫的文件夾,它包含Web應用所需要的.jar或者.zip文件。java web項目需要引用的 jar 包必須得放在這個目錄下,否則將該項目部署在 tomcat 時,你如果引用了 jar 包中的類或方法,tomcat 會無法找到你所引用的 jar 包。因為Tomcat下的web項目有兩個預置的classpath(就是能找到.class文件的入口),這兩個預置的classpath是WEB-INF/classes與WEF-INF/lib。
- WEB-INF/classes:項目在部署時,java 文件經編譯后生成的 .class 文件的存放路徑。為什么需將項目編譯后生成的字節碼文件放在這個文件夾下,理由同上述 WEB-INF/lib 文件夾。
- WEB-INF/web.xml:Web應用的核心配置文件
打包前項目目錄:

打包后目錄:

可以看到,打包前 web(WebContent) 目錄下的文件及文件夾都會被打包到項目的根目錄,而 src 目錄下的文件及包和類,都會被打包到項目根目錄下的 WEB-INF/classes 目錄下。
4.3、Java web項目各種文件的含義(.classpath、.mymetadata 、.project、.metadata、.setting)
.classpath保存的是項目所用的外部引用包的路徑
.mymetadata 保存的是工程屬性文件
.project 是工程構建配置文件
.metadata文件夾的作用 Eclipse內所有改動都放在這個文件夾
.setting文件夾的作用:.setting這個文件是eclipse查看js文件的時候用的,記錄了用什么編碼方式查看。發布新版本的時候,.settings\文件夾不會被打到.war包里,與發布無關。比如把.js文件的編碼方式由改成默認的ISO-8859-1改成GBK時,這個文件會有記錄。如果把這個文件刪了,在eclipse中查看js文件的中文字符就是亂碼,但發布的時候還是能正常顯示中文的。結論:這個文件是shueclipse查看js文件的時候用的,記錄了用什么編碼方式查看。與發布無關。.settings\文件夾不會被打到.war包里。
4.4、項目中各種libraries的含義
一個工程目錄下一般會有以下幾類Libraries,如圖:

JRE System Library:Java SE 的常用庫文件集合,構建任何Java項目都會使用,為最基本的庫文件。
Java EE 6.0 Generic Library:Java EE的常用庫文件集合,構建Web項目時會用到這個庫文件與Java SE的庫文件。
Referenced Library:項目中所使用的第三方的庫文件集合,如果你把項目所需要的其他JAR包直接加在 項目->屬性->Java Build Path -> Libraries 中的時候,MyEclipse 會自動將這些JAR包歸類到一個集合中, 并取名為 Referenced Libraries , 顯示在項目中。
Web App Libraries:動態管理WEB-INF/lib 和 WEB-INF/classes目錄下的jar包。
Referenced Library和WEB-INF/lib 下的jar包的區別:首先 Referenced Libraries可以是引用 WebRoot /WEB-INF/ lib下的jar包,也可以是其他從別的地方復制過來的第三方jar包。Referenced Library是編譯環境下所使用的JAR包,也就是說在MyEclipse中進行源碼文件編寫的時候,使用到的類都是從這個下面拿。WebRoot/WEB-INF/lib 下的jar包是實際運行環境下所使用的jar包,也就是程序部署后實際運行時所需要的jar包都是從WebRoot/WEB-INF/lib下面拿。
我們位于WebRoot/WEB-INF/lib中的第三方的jar包(比如SSM框架的jar包)都要經過Build Path后,就會位于Referenced Library下,即可用于項目源碼的編寫。
也就是說,在開發時,項目所有依賴的包都要經過 build path 添加到項目依賴當中,否則開發集成工具無法找到項目依賴的包。但在生產環境時,需要將項目依賴包放在 WEB-INF/lib 目錄下,放在該目錄下的話 tomcat 服務器能自動找到該目錄下的包,項目運行就不會有問題
Build Path的作用:MyEclipse中的Build Path就是用來管理項目中的Jar包的,如果缺少什么jar包,就可以通過右鍵項目/built path/Configure built path/點擊libraries標簽進行添加。
參考:http://www.rzrgm.cn/hanszhao/p/9440294.html
4.5、classpath(項目編譯后,類存放的路徑)
classpath 指的就是在項目編譯后,各個類存放的路徑。Tomcat 下的 web 項目有兩個預置的 classpath(就是能找到.class文件的入口),這兩個預置的 classpath 是 webcontent/WEB-INF/classes 與 webcontent/WEF-INF/lib。
- WEB-INF/lib:存放第三方庫的文件夾,它包含Web應用所需要的.jar或者.zip文件。java web項目需要引用的 jar 包必須得放在這個目錄下,否則將該項目部署在 tomcat 時,你如果引用了 jar 包中的類或方法,tomcat 會無法找到你所引用的 jar 包。
- WEB-INF/classes:打包前在 web(或者WebContent) 目錄下的文件及文件夾在打包后都會被打包到項目的根目錄,而 src 目錄下的文件及包和類,會被打包到項目根目錄下的 WEB-INF/classes 的根目錄下。
5、如何將一個Java web項目打包成war包
eclipse參考:http://www.rzrgm.cn/yjq520/p/7323934.html
IDEA參考:https://jingyan.baidu.com/article/c1a3101ee342ea9f646deb0d.html
將 war 包放在 tomcat 安裝目錄下的 weapps 目錄下即代表部署成功,tomcat 會自動解壓 war 包。我們打開 tomcat 解壓 war 包過后生成的文件夾,可以看到目錄結構如下:

WEB-INF 文件夾下的目錄結構:

可以看到打包后的目錄結構有 META-INF、WEB-INF、靜態文件。。。
在 WEB-INF 里面有 classes、lib、web.xml,當然,前提是我們設置該項目的編譯路徑是默認的,即 src 輸出在 classes 并且 Webcontent 輸出在根目錄。
6、WEB-INF/lib和WEB-INF/classes文件夾
Tomcat 在運行時是如何找編譯好的.class文件 的呢?其實Tomcat下的web項目有兩個預置的 classpath(就是能找到.class文件的入口),這兩個預置的 classpath 就是 WEB-INF/classes 和 WEF-INF/lib。所以說,我們編譯過后的字節碼文件必須得放在這兩個文件夾下才能被 tomcat 給找到,否則 tomcat 根本就無法找到字節碼文件,那你寫的那些類、給前端訪問的接口等等都無法生效。
其實我們在新建一個 java web項目時,默認 src 文件夾下的 java 文件經編譯后生成的字節碼文件存放路徑就是 WEB-INF/classes,我們可以通過右鍵項目 -> properties -> Deployment Assembly 來查看:

而在 WEF-INF/lib 目錄下的文件經編譯后仍然是會放在 WEF-INF/lib 目錄下的。所以說,java web項目需要引用的 jar 包必須得放在 WEF-INF/lib 目錄下,并且 src 目錄下的文件編譯后必須得放在 WEB-INF/classes 文件夾下,否則的話 tomcat 就無法找到它們。
從上圖還可以看出,webcontent 內的文件內容默認編譯過后是會放在項目根目錄的。
其實想理解很簡單,如果我們不啟動Tomcat,那么只需要把包添加到java環境的路徑下即可(就是我們常用的 build path - add path),這樣,java程序就可以使用這個包中的類。但是,java web是運行在Tomcat下的,我們導的包,必須讓Tomcat找到,而Tomcat默認的路徑就是WEB_INF這個目錄下的lib,如果我們不放在這里,就會找不到依賴。
7、java web多用戶和多線程
在java web服務中每個用戶的請求實際上都是可以看作是一次http請求,而 tomcat 對于每次的http請求都是重新開辟線程的。tomcat 本身就有維護著一個線程池,去應對用戶的訪問請求。多線程是tomcat實現的,你寫的代碼是tomcat線程池中一個線程調用,在單線程中執行。
多用戶請求對于 java 開發人員來說不是多線程,對于開發 tomcat 的程序員來說是多線程。 對java 開發人員的多線程指的是編碼中用到多線程來處理耗時的任務。多用戶訪問咱們寫的代碼叫并發。

浙公網安備 33010602011771號