tomcat與apache的區別:(轉自:http://blog.csdn.net/longzs/article/details/10959945)
1.apache支持靜態頁,tomcat支持動態的,比如servlet等,一般使用apache+tomcat的話,apache只是作為一個轉發,對jsp的處理是由tomcat來處理的。 apache可以支持php\cgi\perl,但是要使用java的話,你需要tomcat在apache后台支撐,將java請求由apache轉發給tomcat處理。apache是web服務器,Tomcat是應用(java)服務器,它只是一個servlet(jsp也翻譯成servlet)容器,可以認為是apache的擴展,但是可以獨立於apache運行。
這兩個有以下幾點可以比較的: 1、兩者都是apache組織開發的 2、兩者都有HTTP服務的功能 3、兩者都是免費的 。不同點:
Apache是專門用了提供HTTP服務的,以及相關配置的(例如虛擬主機、URL轉發等等)
Tomcat是Apache組織在符合J2EE的JSP、Servlet標准下開發的一個JSP服務器
2.APACHE是一個web服務器環境程序 啟用他可以作為web服務器使用 不過只支持靜態網頁 如(asp,php,cgi,jsp)等動態網頁的就不行
如果要在APACHE環境下運行jsp 的話就需要一個解釋器來執行jsp網頁 而這個jsp解釋器就是TOMCAT, 為什么還要JDK呢?因為jsp需要連接數據庫的話
就要jdk來提供連接數據庫的驅程,所以要運行jsp的web服務器平台就需要APACHE+TOMCAT+JDK
整合的好處是:
如果客戶端請求的是靜態頁面,則只需要Apache服務器響應請求 如果客戶端請求動態頁面,則是Tomcat服務器響應請求
因為jsp是服務器端解釋代碼的,這樣整合就可以減少Tomcat的服務開銷
3.apache:側重於http server
tomcat:側重於servlet引擎,如果以standalone方式運行,功能上與apache等效 , 支持JSP,但對靜態網頁不太理想;
apache是web服務器,tomcat是應用(java)服務器,它只是一個servlet(jsp也翻譯成servlet)容器,可以認為是apache的擴展,但是可以獨立於apache運行。 換句話說,apache是一輛卡車,上面可以裝一些東西如html等。但是不能裝水,要裝水必須要有容器(桶),而這個桶也可以不放在卡車上。
tomcat與servlet區別:(摘自http://greenyouyou.blog.163.com/blog/static/13838814720112143022834/)
1.servlet的工作過程以及容器的作用
Servlet沒有main()方法,他們受控與另外一個java應用,這個java應用稱為容器(Container)。Tomcat就是這么一個容器,web服務器應用(如Apache)得到一個指向Servlet的請求時,服務器不是把這個請求交給Servlet本身,而是交給部署該servlet的容器。要由容器向servlet提供HTTP請求和響應,而且是由容器調用servlet的方法(doGet()和doPost())。容器運行多個servlet線程來處理對同一servlet的多個請求。(對每個請求分配一個線程,而不是每個客戶)
見圖(servlet01.jpg)
這里又得談談容器的作用了。
1)通信支持。利用容器提供的方法,web服務器能輕松的與servlet進行通信。
2)生命周期管理。容器控制着servlet的生與死。它會負責加載類,實例化,初始化,調用servlet的方法以及使servlet能夠被垃圾回收。
3)多線程支持。容器會自動的接受每個servlet請求,創建一個新的java線程。針對每個請求,如果servlet已經運行完相應的HTTP方法,線程就會結束。但是我們同時也得考慮線程的安全性。
4)JSP支持。負責將JSP翻譯成真正的java。
容器是如何處理用戶請求的了?
1)用戶點擊一個鏈接,指向一個servlet而不是一個靜態頁面。
2)web服務器接到這個請求后轉發給容器。容器接着創建兩個對象:HttpServletRequest和HttpServletResponse。
3)容器根據請求中的URL找到相應的servlet,為這個請求創建一個線程,並把請求對象HtttpServletRequest和響應對象HttpServletResponse傳遞給這個servlet線程。
4)線程接下來調用service()方法,根據請求的不同,service()方法調用doGet()和doPost()方法。
5)doGet()方法生成動態頁面,並把這個頁面塞到響應對象里。
6)service()方法結束,隨之線程結束,容器把響應對象裝換為一個HTTP相應,發送給客戶,然后刪除請求和響應對象。
2.Servlet的生命周期
注意他的一生都是由容器控制的。servlet一生中只有一個實例出現,但是有多個線程出現。
加載類 Servlet .class文件
實例化 構造函數運行
初始化 容器調用 init() 方法(一生只調一次,並且是在第一次調用servlet的 時候執行)
service方法 servlet一生主要在這里度過
銷 毀 銷毀實例之前調用 destroy() 方法
可回收 等待垃圾回收等待垃圾回收
注意:當我們配置文件中指定load-on-startup 屬性時,若他的值是一個大於等於0的整數,容器會在啟動的時候加載這個servlet類並調用他的init方法。
3.Servlet一生中的三大重要時刻
1)init()方法:在servlet實例被創建后調用,可以覆蓋此方法做一些初始化的工作,比方說得到一個數據庫連接。
2)service()方法:當客戶請求到來時,容器會創建一個新的線程,調用servlet的service()方法。servlet的一生基本都在這里度過。我們一般不要覆蓋此方法。
3)doGet或者doPost()方法:service方法根據請求的HTTP方法,來調用doGet()或者doPost()方法。我們在開發servlet時肯定要覆蓋此方法。每次運行doGet()或者doPost()方法,它都在一個單獨的線程
中。
4.容器(tomcat)在啟動時會做什么?
容器在啟動時,會根據相應的部署文件去尋找servlet文件。
5.為什么要有init方法了?難道不能將init代碼放在構造函數中么?
因為讓一個普通的java類成為servlet文件時容器付出的代價也挺大,比如說內存分配。在沒有調用init方法時他還是一個普普通通的java對象,只有在用戶使用時才再讓他稱為servlet這樣對資源的利
用比較合理,注意:init方法是在第一個用戶調用此servlet時被觸發。