国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

了解基本的Web應用結構

2024-04-27 15:04:42
字體:
來源:轉載
供稿:網友

了解基本的Web應用結構

  大量的組件共同的組成了一個java EE Web應用程序。首先,需要自己的代碼和它依賴的第三方庫。然后需要部署描述符,其中包含了部署和啟動應用程序的指令。還可以添加ClassLoader用于將自己應用程序與同一臺服務器上的其他Web應用程序隔開。最后,通過某種方式將應用程序打包,生成WAR和EAR文件。

Servlet、過濾器、監聽器和jsp

  Servlet是任何Java EEWeb應用程序的一個關鍵組件。Servlet是用于接收和響應HTTP請求的Java類。幾乎發送到應用程序中的所有請求都將經過某種類型的Servlet的處理,除了錯誤的或被其他組件攔截的請求。過濾器就是這樣一種組件,可以攔截發送給Servlet的請求。通過使用過濾器可以滿足各種需求,包括數據格式化、對返回的數據進行壓縮、認證和授權(角色權限管理)。

  Java EEWeb應用程序支持各種不同類型的監聽器。這些監聽器可以通知代碼多種事件,例如應用程序啟動、應用程序關閉、HTTP會話創建和會話銷毀。

Java EE工具中最強大的一個就是JSP(JavaServer Pages)技術。通過使用JSP可以為web應用程序創建動態的、基于HTML的圖形化用戶界面。JSP技術包括了許多不同的內容,包括JavaServer Pages Standard Tag Library、Java UnifiedExPRession Language、自定義標簽、國際化和本地化。

除了Servlet、過濾器、監聽器和JSP,JavaEE還有很多特性,但是我們用到的并不會很多。

目錄結構和WAR文件

  標準Java EE Web應用程序將作為WAR文件或未歸檔的Web應用程序目錄進行部署。JAR文件就是一個簡單的Zip格式的歸檔文件,其中包含了可被JVM識別的標準目錄結構。沒有專門的JAR文件格式,任何ZIP歸檔應用程序都可以創建和讀取JAR文件。Web應用程序歸檔或WAR是Java EE Web應用程序的歸檔文件。

  所有的Java EE Web應用程序服務器都支持WAR文件應用程序歸檔。大多數服務器還支持未歸檔的應用程序目錄。無論是歸檔的還是未歸檔的文件,它們的目錄格式約定都是相同的。如同JAR文件一樣,該結構包含了類和其他應用程序資源,但是這些類并未像JAR文件一樣存儲在應用程序根目錄對應的相對路徑上。相反,類文件都存儲在/WEB-INF/classes中。WEB-INF目錄存儲了一些包含了信息和指令的文件,Java EE Web應用程序服務器使用它們決定如何部署和運行應用程序。它的classes目錄被用作根目錄。所有編譯后的應用程序類文件和其他資源都被存儲在該目錄中。

  不同于標準的JAR文件,WAR文件可以包含應用程序所以依賴的JAR文件,它們被存儲在/WEB-INF/lib中。JAR文件中所有在該目錄中的類對于在應用程序路徑上的應用程序都是可用的。目錄/WEB-INF/tags和/WEB-INF/tld分別用于存儲JSP標簽文件和標簽庫描述符。目錄il8n實際上并不是Java EE規范的一部分,但大多數應用程序開發者都會遵守這個約定,將國際化(il8n)和本地化(L10n)文件存儲在該目錄中。

  這里有兩個不同的META-INF目錄存在,但是你記住了最簡單的類路徑規則就可以區分他們。如同JAR文件的META-INF目錄一樣,跟級別的/META-INF目錄包含了應用程序的清單文件。它也可以存儲特定Web容器或應用程序服務器需要的資源。例如,Apache Tomcat在該目錄中尋找context.xml文件,并使用該文件自定義在Tomcat中部署的應用程序。這些文件都不是Java EE規范的一部分,并且支持的文件可能隨著應用程序服務器或者Web容器的不同而變化。

  不同于JAR文件的是,跟級別的/META-INF目錄并不在應用程序類路徑上。不能使用ClassLoader獲得該目錄中的資源。不過/WEB-INF/classes/META-INF在類路徑上??梢詫⑷魏蜗M褂玫馁Y源文件存儲在該目錄中,這樣就可以通過ClassLoader訪問這些資源。一些Java EE組件指定了某些文件必須存儲在該目錄中。例如,Java Persistence API指定兩個文件——persistence.xml和orm.xml——必須存儲在/WEB-INF/classes/META-INF目錄中。

  包含在WAR文件或未歸檔Web應用程序目錄中的大多數文件都是可以通過URL訪問的資源。例如,存儲在應用程序根目錄的文件/bar.xml將被部署在http://example.org/foo,可通過http://example.org/foo/bar.html訪問。在不使用過濾器或安全規則的情況下,應用程序中的所有符合條件的資源都可以通過這種方式訪問,除了在/WEB-INF和/META-INF目錄下的文件。因為這些目錄中的文件是受到保護的,因此不能通過URL訪問。

部署描述符

  部署描述符是用于描述Web應用程序的元數據,并為Java EE Web應用程序服務器部署和運行Web應用程序提供指令。從傳統上來說,所有元數據都來自于部署描述符文件/WEB-INF/web.xml。該文件通常包含Servlet、監聽器和過濾器的定義,以及HTTP會話、JSP和應用程序的配置選項。Java EE 6中的Servlet 3.0添加了使用注解和Java Configuration API配置Web應用程序的能力。它還增加了Web片段的概念-- 應用程序中的JAR文件可以包含Servlet、過濾器和監聽器的配置,這些配置將被添加到必要JAR文件的部署描述符文件/META-INF/web-fragment.xml中。Web片段也可以使用注解和Java Configuration API。

  JavaEE 6對Web應用程序部署的這個改變為文件部署增加了巨大的復雜性。為了簡化操作,可以配置Web片段的順序,從而按照特定的順序掃描和激活它們。可以通過下面兩種方式實現:

l  每個Web片段的web-fragment.xml文件中可以包含一個<ordering>元素,該元素可以使用嵌套的<before>和<after>標簽來控制該Web片段在哪個Web片段之前或之后激活。這些標簽包含嵌套的<name>元素用于指定與當前片段有順序關系的Web片段。<before>和<after>也可以包含嵌套的<others>元素,表示該片段應該在任何未指定的片段之前或之后激活。

l  如果未創建特定的Web片段,并且不能控制它的內容,那么仍然可以在應用程序的部署描述符中控制Web片段的順序。通過使用/WEB-INF/web.xml中的<absolute-ordering>元素與它的嵌套的<name>和<others>元素,可以配置綁定的Web片段的絕對順序,該配置將覆蓋來自于Web片段的任何順序指令。

  默認情況下,Servlet 3.0及更高版本的環境將掃描Web應用程序和Web片段中的Java EE Web應用程序注解,用于配置Servlet、監聽器、過濾器等。如果需要,可以在根<web-app>或<web-fragment>元素中添加特性metadata-complete="true",禁止掃描和注解配置。還可以在部署描述符中添加元素<absolute-ordering/>(不包含任何嵌套元素),禁止應用程序中的所有Web片段。

類加載器架構

  在使用Java EE Web應用程序時,有必要理解類加載器(ClassLoader)架構,因為它不同于你所熟悉的標準Java SE應用程序。在典型的應用程序中,Java SE平臺中的java.*類將被加載到特定的根類加載器中,并且不能被覆蓋。這是一種安全的方式,它阻止了惡意代碼的執行,例如惡意代碼可能會替換String類,或者重定義Boolean.TRUE和Boolean.FALSE。

  在根類加載器之后是擴展類加載器,它將加載JRE安裝目錄中的擴展JAR。最后,應用程序Class Loader將加載應用程序中的所有其他類。這組成了類加載器的層次,根類加載器是所有類加載器最早的祖先。當低級別類加載器申請加載一個類時,它總是首先將該任務委托給它的父類加載器。繼續向上委托直至根類加載器確認成功。如果它的父類加載器未能找到該類,那么當前的類加載器將嘗試從自己的JAR文件和目錄中加載該類。

  這種類加載的方法被稱為雙親優先類加載委托模式,盡管這種方法適用于許多類型的應用程序,但它并不完全適用于Java EE Web應用程序。運行Java EE Web應用程序的服務器通常相當復雜,許多供應商都可以提供其實現。服務器可能使用了與個人應用程序使用的相同的第三方庫,但它們的版本可能相互沖突。另外,不同的Web應用程序也可能使用了同一第三方庫的沖突版本,導致更多的問題。為了解決這些問題,就需要使用子女優先類加載委托模式。

  在Java EE Web應用程序服務器中,每個Web應用程序都被分配了一個自由的相互隔離的類加載器,它們都繼承自公共的服務器類加載器。通過隔離不同的應用程序,它們不能訪問相互的類。這不僅消除了類沖突的風險,還是一種阻止Web應用程序被其他Web應用程序干擾或傷害的安全方式。另外,Web應用程序類加載器通常會在自己無法加載某個類的時候,請求它的父類加載器幫助加載。通過這種方式,類加載的任務會在最后而不是首先委托給它的父類,Web應用程序中的類和庫會被優先使用,而不是服務器提供的版本優先使用。為了維持綁定的JavaSE類的安全狀態,Web應用程序類加載器仍然會在嘗試加載任何類之前與根類加載器確認。盡管幾乎在所有的情況下,這種委托模式都更適用于Web應用程序,但仍然有它不適用的情況。出于這個原因,兼容Java EE的服務器通常會提供修改委托模式的方法,從父類最后改為父類首先。

企業級應用程序歸檔文件

  盡管之前已經學習了WAR文件,但還有另一種Java EE歸檔文件需要了解:EAR文件。企業級應用程序歸檔將許多JAR文件、WAR文件和配置文件壓縮到單個可部署的歸檔文件中(與JAR和WAR使用相同的ZIP格式)。

  如同WAR文件一樣,根部的/META-INF目錄包含了歸檔清單文件,并且該目錄中的所有文件都不在應用程序的類路徑上。文件/META-INF/application.xml是特有的部署描述符,用于描述如何部署EAR文件中包含的各種不同組件。在EAR文件的根目錄中是它所包含的所有Web應用程序模塊-- 一個模塊對應一個WAR文件。這些WAR文件沒有什么特殊之處;它們與獨立的WAR文件包含著相同的內容和功能。EAR文件還可以包含JAR庫,用于多種不同的目的。JAR文件可以包含在/META-INF/application.xml部署描述符中聲明的EJB(EnterpriseJavaBeans),或者可用作EAR中兩個或多個WAR模塊的第三方庫。

如同WAR文件一樣,EAR也有著自己獨有的類加載器架構。通常,需要在服務器類加載器和為每個模塊分配的Web應用程序類加載器之間插入一個額外的類加載器。該類加載器用于將該企業級應用程序與其他企業級應用程序隔離開,但允許單個EAR中的多個模塊之間共享通用庫。Web應用程序類加載器可以是雙親委托優先模式(優先使用EAR庫中的類)或子女委托優先模式(優先使用WAR文件中的類)。盡管了解EAR是非常有用的,它是完整Java EE規范的一部分,但是大多數只包含了Web容器的服務器(例如ApacheTomcat)并不支持它。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海门市| 镇雄县| 永城市| 白沙| 怀柔区| 长治县| 铅山县| 乃东县| 甘孜| 蒲江县| 邮箱| 娄烦县| 固始县| 黄骅市| 海丰县| 蚌埠市| 彩票| 周至县| 福安市| 郎溪县| 柏乡县| 二连浩特市| 项城市| 卓尼县| 中方县| 德江县| 苗栗市| 赤峰市| 临城县| 青浦区| 罗田县| 潞西市| 博乐市| 疏勒县| 买车| 库车县| 中山市| 军事| 武安市| 南平市| 安图县|