JavaRush /Java Blog /Random-TW /沒有悲情。讓我們來談談 Java EE、servlet 及其容器
eGarmin
等級 41

沒有悲情。讓我們來談談 Java EE、servlet 及其容器

在 Random-TW 群組發布
在這個主題中,我想坦白地談談我對 servlet 的理解,什麼是 servlet 容器,大多數(如果不是全部)Web 前端框架是什麼,並且還涉及到 servlet 容器和應用程式伺服器如何關聯的主題彼此,以及servlet 和Web 伺服器容器。 沒有悲情。 讓我們來談談 Java EE、servlet 及其容器 - 1在開始對話之前,我想指出,我真的希望進行討論,因為… 這裡我不想給任何程式碼,只是想觸及本質,而本質總是可以用語言來表達的。我將嘗試概述我剛開始時不清楚的所有要點。當我在各種論壇上詢問有關 Tomcat servlet 容器與任何應用程式伺服器(例如 WebSphere 或 Geronimo)有何不同的問題時,唯一敢於回答的人都是混蛋,他們除了“看看 Wikipedia”或“很難說,伺服器應用程式- 這是企業應用程式的複雜基礎設施,...」等等等等。我無法忍受這樣的人,我猜你們大多數人也不能忍受。我們將糾正歷史的不公義。去…

小服務程序

不管別人怎麼說,Servlet 都是用 Java 寫的網頁。有人會說我錯了,Servlet 是一個 Web 應用程序,這些概念之間存在差異,但事實並非如此。現在沒有差別了,用 PHP 寫的網站也可以安全地呼叫 Web 應用程式。現在這是完全自然的,因為...... php 完全支援 OOP,Joomla 等 CMS 也積極使用這一點。什麼是程式碼等級的 Servlet?該類別具有許多休眠方法,並查看是否有人透過 GET 或 POST HTTP 請求存取它們。那些。我們在瀏覽器中輸入一些 GET 請求,servlet 類別的相應方法接受它,然後以 HTML 頁面的形式產生對其的回應。在傳統意義上的 servlet 中,正如 Sun 所設想的那樣,該頁面被逐行發送到客戶端,從行 <!DOCTYPE htm>> 開始,到行 </html> 結束。所以在Java中有一個基本的servlet類別叫做Servlet. 此外,還有許多其他類別繼承自該基類,從而擴展了其功能。這就是 Servlet——僅此而已。它只是 PHP 程式碼的 Java 類似物,同樣在伺服器上執行,並且僅以網頁形式對 Web 瀏覽器請求的回應傳送到客戶端。全部。

Web 前端框架

副標題很複雜,通常他們只寫前端框架,甚至是Web 槍口,但我決定在這裡強調,當我們談論前端框架時,我們談論的是透過 Web 瀏覽器使用 Java 的 GUI。那些。這裡我們再次討論 Java 中的網站,即 關於servlet。幾乎任何前端框架都是什麼,例如Apache Struts。它只是一組擴展基底類別的類別Servlet。而已。那些。這只是創建相同常規 servlet 的不同方式。只是這個框架的開發者(或者換句話說,這個技術的開發者)認為他們在基類中添加Servlet一些方法對於程式設計師來說比Sun/Oracle的經典servlet的微薄功能更方便有。

JSP 頁面

Java servlet 概念的開發人員幾乎立刻就想到了另一個想法。由於我們正在編寫一個servlet,其任務是發送一個html頁面到客戶端,那麼立即編寫這個html頁面可能會更正確,而如果您需要Java中的某種邏輯,那麼只需直接插入即可到html 中。如果還沒有變得更清楚,那麼這句話可能會有所幫助:jsp 頁面是 php 頁面的類似物。難的?那我再解釋一下。當我們用PHP寫頁面時,我們要做什麼?我們有靜態 html,當我們需要在 PHP 中插入任何邏輯(例如循環和條件)時,我們將其插入到標記的主體中 <?php … ?>。對於jsp,一切都是一樣的,只是邏輯是用純Java寫的,其程式碼被插入到標籤的主體中<% … %>。讓我們再次回到 Servlet 的概念。本質上,JSP 頁面是一個servlet,但編寫方式略有不同。在常規 servlet 中,我們編寫一個方法來執行一些邏輯,並根據其結果為客戶端產生 HTML 頁面。只是過了一段時間,servlet開發者開始思考:如果方法幾乎沒有任何邏輯,幾乎只發生html頁面的形成,那麼立即將html頁面寫入其中不是更容易嗎?哪個可以使 Java 插入最少?程式碼。好吧,關於 jsp 頁面的最後一件事。第一次造訪這樣的頁面時,它會被編譯成 servlet,然後執行。對該 jsp 頁面的後續請求將會更快,因為 它已經被編譯並且只需要執行。

小服務程式容器

所以我們寫了一個servlet類別或一個JSP頁面。下一步是什麼?如何將它們推送到 Web 伺服器(例如 apache),以便將它們傳送到使用者的 Web 瀏覽器?Web伺服器只能發送html,如果我們的頁面有php程式碼,那麼Web伺服器首先將頁面傳遞給解釋器,將php翻譯成html,然後將結果傳送到客戶端。Servlet 也會發生相同的事情 - 在發送之前,需要執行它們才能產生 HTML 頁面,而 servlet 容器正是負責執行 servlet 和 jsp 頁面程式碼的東西。那些。java servlet 容器類似於 Web 伺服器中的 php 解釋器模組。因此,當使用者在 Web 瀏覽器中輸入位址時,請求將傳送到 Web 伺服器,Web 伺服器了解正在請求 Servlet,並將請求傳遞到 Servlet 容器。此後,servlet 容器執行 servlet,將產生的 HTML 頁面傳送到 Web 伺服器,然後 Web 伺服器將其傳回給客戶端。Servlet 容器可以獨立運作嗎?沒有網頁伺服器?像 Tomcat 這樣的東西絕對可以。如果我們想要建立一個除了基於 servlet 的頁面之外沒有任何其他 html 頁面的站點,那麼 servlet 容器對我們來說就足夠了。但是,如果我們想要將 servlet 和 PHP 頁面等網站結合起來,那麼我們就必須安裝 Web 伺服器。此外,並非所有 Web 伺服器都預設包含 servlet 容器,但幾乎所有伺服器都允許您將其作為插件安裝。因此,如果我們想在 Internet 上的某個主機(Apache 最有可能運行的地方)上啟動我們的網站,那麼我們必須詢問提供者 servlet 容器是否已連線。

JavaEE

有所謂的JavaSE(Java標準版)。這個概念包括所有類java,使用它們時我們只需要導入它們(例如,java.util.Date),甚至不需要這樣做(例如,String因為它位於包中java.lang)。還有 Java EE(Java 企業版)。這些類別也屬於Sun/Oracle,但唯一的區別是它們更難在專案中開始使用。一條簡單的線import…是不夠的,因為...... 該專案將無法編譯。為了糾正這種情況,您需要找到javaee.jar庫檔案並將其包含在專案中。這可以透過開發環境中的項目屬性來完成。人們常說,這個連結過程被稱為:在專案的 建置路徑類別路徑中註冊一個jar暱稱。

應用程式伺服器

現在假設我們已經編譯了使用 Java EE 的 servlet 專案。一切都很棒,但我們現在需要將編譯後的類別放入 servlet 容器中。假設他們做到了。我們的應用程式會起作用嗎?答案是不行。當存取servlet時,會拋出異常,表示某些類別沒有找到。為什麼?因為我們透過滑動「欺騙」了編譯器javaee.jar в classpath,即 編譯器看到 Java EE 中的類別已就位並平靜下來,但 servlet 容器看不到這些類,但它看到來自我們的 servlet 的到它們的連結。這種情況可以在 servlet 容器中解決嗎?當然可以,只需要將javaee.jar庫檔案加入到servlet容器中我們的servlet所在的資料夾。現在想像一下,會有很多這樣的項目,而且它們都運行在一個 Tomcat servlet 容器中。這意味著您必須將此 jar 檔案複製到每個 servlet 的資料夾中。這是不方便且錯誤的。透過引入應用程式伺服器的概念解決了這種情況,其中該檔案長期以來一直處於單一副本中,並且所有 servlet 都可以存取它,並且沒有自己的副本。在我看來,這是非常方便且符合邏輯的。當然,所有的麻煩都不是由於一個 jar 檔案(我以它為例)——有很多這樣的檔案。但這並不是應用程式伺服器為我們提供的全部內容。應用程式伺服器本身可以維護與許多資源(例如資料庫)的連接。同時,我們的servlet本身可能不會打開這樣的連接,而只是從應用程式伺服器獲取它。在 servlet 容器中,這是不可能的,因為... 在某種程度上,容器是一個精簡的應用程式伺服器。在容器中,Servlet 必須始終建立與資料庫本身的連線。像這樣的東西... 戰爭檔案 什麼是戰爭檔案?WAR 是網路存檔。事實上,它只是一個 zip 文件,就像任何 jar 一樣。基本上,這只是將我們的網站(包含許多網頁、jsp 頁面和 servlet 類別)塞入一個 zip 檔案的一種方法。 web.xml web.xml 就是所謂的部署描述符。這是一個文件,愚蠢地描述了哪個 Web 瀏覽器線路請求發送到哪個 servlet 類別進行處理,以便 servlet 容器不會混淆,哪個 servlet 負責什麼。一般來說,在 Java 中,在各種 xml 檔案中描述設定是非常流行的,但最近出現了放棄這種傳統的趨勢。你問如何?並透過註釋。註釋類別本身不執行任何操作;創建它們只是為了描述各種設定(元資料),而不是在單獨的 xml 檔案中,而是直接在程式碼中。非常舒服。然而,現在有一個中間階段,有些設定是透過註解指定的,有些是透過 xml 指定的,這可能會令人困惑,因為 您查看 xml 並看到一個設置,但根據註釋還有另一個設置。哪一個具有最高優先權?誰知道…

結論

寫完這篇文章後,我認為如此快速的評論對任何人都沒有幫助,因為... 不包含任何細節,也沒有範例,但另一方面,不要刪除所寫的內容,所以就這樣吧。
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION