Web項目部署到Tomcat總結:
前一段時間一直遇到莫名其妙的問題使項目無法往下進行,之前一直以爲是Tomcat的問題,今天總算把它弄明白了,原來是eclipse中項目設置的問題導致classes文件找不到,今天總結一下希望能夠幫到大家!
一:先說說web項目的運行原理
知識回顧:
什麼是容器?
Servlet沒有main()方法。Servlet受控於另一個Java應用,這個Java應用稱爲容器。Tomcat就是這樣一個容器。如果web服務器應用得到一個指向servlet的請求(而不是其他請求,如請求一個普通的靜態HTML),此時服務器不是把這個請求交給servlet本身,而是交給部署該servlet的容器,要由容器調用servlet的方法,如doPost()或doGet()。
JSP頁面是如何被執行的?JSP執行效率比Servlet低嗎?
答:當客戶端向一個JSP頁面發出請求時,Web Container將JSP轉換成Servlet的源代碼(只是第一次請求時),然後編譯轉化後的Servlet並加載到內存中執行,執行的結果Response到客戶端。
JSP只在第一次執行的時候會轉化爲Servlet,以後的每次執行Web容器都是直接執行編譯後的Servlet,所有JSP和Servlet只有第一次執行的時候不一樣,JSP慢一點,以後的執行都是相同的。
執行原理:
- 客戶端請求服務
- Web服務器將請求交給web容器Tomcat
- Tomcat主線程對轉發來用戶的請求做出響應創建兩個對象:HttpServletRequest和HttpServletResponse;
- 從請求中的URL中找到正確Servlet,Tomcat爲其創建或者分配一個線程,同時把步驟3創建的兩個對象傳遞給該線程;(此時servlet類加載並實例化並調用init方法)
- Tomcat調用Servlet的servic()方法,根據請求參數的不同調用doGet()或者doPost()方法;
- .假設是HTTP GET請求,doGet()方法生成靜態頁面,並組合到響應對象裏;
7、Servlet線程結束時:Tomcat將響應對象轉換爲HTTP響應發回給客戶,同時刪除請求和響應對象。(調用destroy()方法)
注意:
**1.**創建Servlet對象的時機:
Servlet容器啓動時:讀取web.xml配置文件中的信息,構造指定的Servlet對象,創建ServletConfig對象,同時將ServletConfig對象作爲參數來調用Servlet對象的init方法。
在Servlet容器啓動後:客戶首次向Servlet發出請求,Servlet容器會判斷內存中是否存在指定的Servlet對象,如果沒有則創建它,然後根據客戶的請求創建HttpRequest、HttpResponse對象,從而調用Servlet 對象的service方法。
Servlet容器在啓動時自動創建Servlet,這是由在web.xml文件中爲Servlet設置的屬性決定的。從中我們也能看到同一個類型的Servlet對象在Servlet容器中以單例的形式存在。
**2.**在Servlet接口和GenericServlet中是沒有doGet()、doPost()等等這些方法的
HttpServlet中定義了這些方法,但是都是返回error信息,所以,我們每次定義一個Servlet的時候,都必須實現doGet或doPost等這些方法。我們經常使用的httpServlet是繼承於GenericServlet實現的。
把web項目加載到Tomcat時:
- 將src下的所有Java文件編譯並放到WEB-INF/classes中。
- 加載Eclipse外部引用的jar包放在 WEB-INF/lib 中。
- Jsp文件第一次被執行時Java代碼及class文件都放到C:\軟件\Apach\apache-tomcat-8.5.35\work\Catalina\localhost\NWNULiuYanBan\org\apache\jsp下。
- Tomcat根據web.xml加載servlet及welcome頁面
用eclipse建web工程Java類編譯後存放目錄:
Eclipse workspace中:
Tomcat中:
Maven工程:
Eclipse workspace中:
Tomcat中:
Web項目的jsp文件的Java代碼及class文件: