The Java EE 5 Tutorial 中文版 (翻譯中) (第三章)

第二部分 Web


第二部分 開始學習Web層技術

第三章 開始學習Web應用



Web應用是web服務器或者應用服務器的動態的擴展,其可分爲以下兩種:

       面向展現的: 一個面向展現的web應用生成可交互的web頁面。可根據客戶請求,返回包括多種類型的標記語言(例如HTML,XML)的動態內容。第4「Java servlet 技術到第15「國際化與本地化的web應用」講解了如何開發面向展現的web應用。

       面向服務的: 一個面向服務的web應用實現了web serviceendpoint技術。面向展現的應用常常是面向服務應用的客戶端。第16「使用JAX-WS構建web應用」到第19「帶附件的SOAP消息 Java API講解了如何開發面向服務的web應用。


Web應用
Java 2 平臺,web組件爲web服務器提供了動態的擴展能力。Web組件可以使servletJSP頁面、或者web service endpoint3-1展現了這種web客戶端和web應用之間的交互。客戶端向web服務器發送http請求,web服務器實現了Java ServletJSP技術來把請求轉換爲 HTTPServletRequest對象。之後將對象轉發給web組件,web組件則用這些對象與JavaBean組件或者數據庫交互,並動態地生成內容。這些web組件之後生成HTTPServletResponse對象,或者將請求傳遞給其他web組件,並最終由某個web組件生成一個HTTPServletResponse對象。Web服務器再將此對象轉換爲HTTP相應並返回給客戶端。

 




 
 
3-1 Java Web 應用請求處理過程

 

Servlets Java語言編寫的類文件,用以動態的生成處理請求並且生成響應。JSP 頁面pages 是普通的文本文檔,可被當做servlet來執行,但是使用更自然的方式來創建靜態內容。雖然servletJSP頁面可以互相替換地使用,但是也各有所長。Servlet最適合實現面向服務的應用(web service endpoint就是用servlet實現的),面向展現應用的控制功能,例如請求轉發和處理非文本數據。JSP頁面更適合生成本文標記語言,例如HTMLScalable Vector Graphics (SVG), Wireless Markup Language (WML), XML

 

Java ServletJSP技術出現以後,相關的用於交互式web應用的Java技術和框架也被開發出來了。3–2展示了這些技術及其之間的關係。



 
 3–2    Java Web 應用技術

 

請注意Java Servlet技術是所有web應用技術的基礎,所以你應該熟讀第4章的內容Java Servlet技術」甚至如果你不打算編寫servlet。每種技術都增加了一層湊想,來使web應用更加模板化,提高開發速度。同時也有利於維護、提高可擴展性和健壯性。

 

Web組件是由叫做web 容器(container)的運行平臺服務來支持的。一個web容器提供諸如此類服務:請求轉發,安全,併發,生命週期管理。他也爲web組件提供命名、事務管理、郵件服務。

 

當應用安裝(install)或者部署(deployed)web容器時,某些的web應用可以配置其運行方式。配置信息保存在一個叫做web應用部署描述符  (web application deployment descriptor) (DD)XML文本文檔中。一個DD必須符合Java Servlet 規範中描述的schema定義。

 

本章提供了一個web應用開發涉及事項的概覽。首先,概述了web應用的生命週期,之後描述瞭如何在應用服務器上打包及部署非常簡單的web應用,然後講述了配置應用服務器並討論瞭如何指定最常用的配置參數。接下來提供了一個示例,Duke的書店。這個示例展現了Java EE web層的全部技術,並且描述瞭如何建立這個例子的共享組件。最後本章討論瞭如何從web應用訪問duke應用所需的數據庫以及如何設置數據庫資源。

 

Web應用生命週期

 

一個web應用由web組件、靜態文件(例如圖像)、輔助類文件及庫文件組成。Web容器提供了多種支持服務,來增強web組件,並使其易於開發。然而,由於web應用必須利用這些服務,創建及運行web應用的過程也和傳統的獨立Java類的開發過程不同。

 

創建、部署、執行web應用的過程可以總結如下:

1.  開發web組件代碼

2.  開發web應用部署描述符

3.  編譯web應用組件及組件用到的輔助類

4.  將應用打包爲一個可部署文件(可選)

5.  將應用部署到web容器

6.  訪問指向web應用的URL

 

部署web組件代碼將在後面幾章講述。第2步到第4步將在接下來的幾節中,通過一個Hello World的面向展現的應用來講解。該應用允許用戶着在HTML表單( 3–3)中輸入一個人名,之後顯示對此人的問候( 3–4)

 


3–3    問候表單

 


  3–4   響應

 

這個Hello應用包括了兩個web組件,用以生成問候語和響應。本章討論了該應用的兩個版本:一個JSP版本叫做hello1,此版本中組件是由兩個JSP實現。(tut-install/javaeetutorial5/examples/web/hello1/web/index.jsp 和 tut-install/javaeetutorial5/examples/web/hello1/web/response.jsp) 另一個servlet版本叫做hello2,其組件是由兩個servlet類實現。(tut-install/javaeetutorial5/examples/web/hello2/src/servlets/GreetingServlet.java 和 tut-install/javaeetutorial5/examples/web/hello2/src/servlets/ResponseServlet.java這兩個版本都是用來展示如何打包、部署、配置以及運行包含這些組件的應用。第二章 使用教學示例說明了如何得到這些示例的代碼。

 

在你安裝完教學文件後,示例的源碼就在下列目錄:

        tut-install/javaeetutorial5/examples/web/hello1/

        tut-install/javaeetutorial5/examples/web/hello2/

 

 

Web模塊

 

Java EE構架中,web組件和靜態web內容文件(例如圖像)叫做web 資源(resources).一個 web 模塊(module) 則是最小的可部署的可用web資源。一個Java EE web模塊符合Java Servlet規範中定義web 應用(application)的要求。

 

除了web組件和web資源,一個web模塊還可能包括:

    服務器端功能類(數據庫bean, 購物車等)。通常這些類是符合JavaBean組件構架的。

    客戶端功能類 (applet 和功能類)

 

一個web模塊有特定的結構。Web模塊的頂層目錄叫做應用的文檔根目錄(document root)。這個文檔根目錄是JSP頁面,客戶端(client-side)類文件及歸檔文件(archives)、靜態web資源(例如圖像)保存的地方。

 

這個文檔根目錄包括了一個叫做WEB-INF的子目錄,其中包括以下文件:

     web.xml: web應用部署描述符

     標籤庫描述文件(Tag library descriptor)(參見第標籤庫描述符)

     classes文件夾: 一個包括服務器端類文件(server-side classes)的目錄,包括servlet,功能類及JavaBean組件

      tag文件夾: 一個包括標籤文件的目錄。標籤文件是標籤庫的實現。 (參看標籤文件位置)

      lib文件夾: A一個包括JAR歸檔文件的目錄,其中的庫文件是服務器端類文件。

 

如果你的web模塊不包括任何servlet、過濾器或者監聽器組件,那麼他就不需要web部署描述符。換句話說,如果你的web模塊只包括JSP和靜態文件,那就不需要加入一個web.xml文件。將在 Web模塊打包一節中討論的,hello1示例,只包括JSP頁面和圖像,所以因此不需要加入一個部署描述符文件。

 

你也可以創建一個應用特定的子目錄(即包目錄)、使用文檔根目錄,或者使用WEB-INF/classes/ 目錄。

 

一個web模塊可以部署爲未打包的文件結構,也可以部署爲叫做WAR(web archive)的打包JAR文件。

 

要在應用服務器上部署一個WAR文件,文件必須包含一個運行時部署描述符,這個運行時部署描述符是一個XML文件,包括了以下信息:web應用上下文根(context root)、應用程序資源的可移植(portable)名稱到應用服務器資源的映射。

 

這個叫做sun-web.xml(應用服務器web應用)運行時部署描述符(DD)位於WEB-INF目錄下,和web應用部署描述符放在一起。部署於應用服務器上的Web模塊的結構見: 3–5

 


3–5    Web模塊結構

 

Web模塊打包

某些部署場合中以及你要分發web模塊時,web模塊就必須被打包成WAR文件。你可以通過在目錄中執行jar命令來打包web模塊,目錄格式要符合web模塊要求;你也可以使用Ant工具,或者使用你喜歡的IDE工具。本教程展示瞭如何使用NetBeans IDE或者Ant來構建、打包、部署同樣的應用。

 

要使用NetBeans IDE構建hello1應用,按下述步驟即可:

1.  選擇 File→Open Project.

2.  Open Project 對話框,選擇:

tut-install/javaeetutorial5/examples/web/

3.  選擇hello1文件夾

4.  勾選Open as Main Project(作爲主項目)複選框

5.  點擊Open Project

6.  Projects面板,右鍵點擊hello1項目並選擇Build

 

要使用Ant來構建hello1按下述步驟即可:

1.  在終端窗口,進入目錄: tut-install/javaeetutorial5/examples/web/hello1/

2.  輸入ant. 這個命令會觸發必要的編譯,並將文件複製到

tut-install/javaeetutorial5/examples/web/hello1/build/ 目錄,創建WAR文件並將其複製到tut-install/javaeetutorial5/examples/web/hello1/dist/ 目錄。

 

部署WAR文件

 

你可以用以下幾種方式將WAR文件部署到應用服務器:

        WAR包複製到domain-dir/autodeploy/ 目錄

        使用Admin Console

        使用asadmin或者ant來部署WAR

        使用NetBeans IDE

 

所有這些方式都在本章有描述;但是整個教程中,你只會用到antNetBeans IDE來打包和部署。

 

設置上下文根(Context Root)

 

上下文根(context root) 用來在Java EE server中表示一個web應用。你部署web模塊時,需要指定上下文根。一個上下文根必須以正斜線(forward slash) (/)開頭,以字符串結尾。

 

在一個供應用服務器部署的打包web模塊中,上下文根保存在sun-web.xml中。

 

要編輯上下文根,按下述步驟即可:

1.  NetBeans IDEProject面板中打開你的項目

2.  打開你項目的Web PagesWEB-INF目錄

3.  雙擊sun-web.xml

4.  在編輯面板,點擊Edit As XML

5.  編輯上下文根,其位於context-root元素之中

 

部署一個打包的Web模塊

如果你已經部署過hello1應用那在進行本節的部署操作之前,請先按照後面小結所講內容卸載:卸載Web模塊

 

使用Admin Console部署:

 

1.  點開Applications節點

2.  選擇Web Applications節點

3.  點擊Deploy按鈕

4.  選中radio buttonPackage file to be uploaded to the Application Server.

5.  輸入WAR文件的全路徑(或者點擊Browse,通過瀏覽方式指定),並點擊OK按鈕

6.  點擊下一步Next.

7.  輸入application name(應用名稱)

8.  輸入context root(上下文根)

9.  勾選Enabled選項

10. 點擊Finish按鈕

 

 

使用asadmin部署:

 

要使用asadmin部署WAR,打開終端窗口或者命令行窗口並執行:

 

asadmin deploy  full-path-to-war-file

 

 

使用Ant部署

 

要使用asadmin部署WAR,打開終端窗口或者命令行窗口,進入你構建並打WAR包的目錄,執行:

 

ant  deploy

 

 

使用NetBeans IDE部署

 

要使用NetBeans IDE部署WAR包:

 

1.  選擇File→Open Project.

2.  Open Project對話框中,導航到(找到)你的項目,並打開它

3.  Projects選項卡,右鍵你的項目,選擇Undeploy and Deploy.

 

 

 

測試已部署Web模塊

 

現在web模塊已經部署好了,你可在瀏覽器打開查看你的應用。默認情況下,應用部署在本機(localhost)8080端口桑。此web應用的上下文根是hello1


 

 

要測試部署的應用,執行以下步驟:

 

1.  打開web瀏覽器

2.  在地址欄輸入如下地址:http://localhost:8080/hello1

3.  輸入你的名字,點擊submit

 

應用就會如 3–3 3–4所示,顯示你提交的名字。

 

 

列出已部署Web模塊

 

Application Server提供了兩種方式來查看已部署web模塊

Admin Consoleasadmin命令

 

使用Admin Console

1.  在瀏覽器打開地址:http://localhost:4848/asadmin

2.  展開節點Applications→Web Applications.

 

使用asadmin命令:

asadmin list-components

 

 

更新Web模塊

 

典型的迭代開發週期包括web模塊部署及之後對應用組件的修改。要更新已部署web模塊,必須執行以下步驟:

 

1.  重新編譯所有修改過的類文件

2.  如果你部署的是一個打包的web模塊,將更新WAR包內修改過的組件。

3.  重新部署該模塊

4.  客戶端重新載入URL

 

 

更新打包的Web模塊

本節講述瞭如何更新已打包的hello1 web模塊

 

首先,修改下記文件中的問候語:

tut-install/javaeetutorial5/examples/web/hello1/web/index.jsp

 

<h2>Hi, my  name is Duke. Whats yours?</h2>


 

 

要在NetBeans IDE更新項目:

 

        右鍵選擇項目,點擊Build.

        右鍵選擇項目,點擊Undeploy and Deploy.

 

要在Ant構建工具中更新項目:

 

        輸入ant來將修改過的JSP頁面複製到構建目錄

        輸入ant deploy來部署WAR

要查看修改過的模塊,在瀏覽器重新載入URL即可。你就能在瀏覽器中看到 3–6

 

 



3–6    新的問候畫面


 

動態重新載入(Dynamic Reloading)

 

如果動態重新載入是開啓的狀態,在你需要修改一些代碼或者部署描述符時,你就不需要重新部署應用或者模塊。你需要的只是將修改過的jsp或者class文件複製到應用(或模塊)的部署目錄下。名稱爲context-rootweb模塊的部署目錄爲:

domain-dir/applications/j2ee-modules/context-root 服務器定期檢查有無修改,自動並動態地,並重新部署應用變更的部分。

 

這種功能在開發環境下十分實用,因爲這樣就可以在修改代碼後快速測試。動態載入並不推薦在生產環境使用,因爲他可能會影響性能。另外,當重新載入完成後,seesion也會失效,客戶端必須重新開始一個會話(session)


 

 

要啓用動態重載,打開Admin Console:

 

1.  選擇Applications Server節點

2.  選擇Advanced選項卡

3.  勾選Reload Enabled以啓用動態重新加載

4.  Reload Poll Interval字段,輸入一個秒數,以設定應用和模塊檢查代碼變化和自動重新載入的時間間隔。

5.  點擊Save按鈕

 

另外,要加載新的servlet文件或者部署描述符變更時,必須執行如下步驟:

 

1.  在模塊的根目錄創建一個名爲.reload的空文件

domain-dir/applications/j2ee-modules/context-root/.reload

2.  在每次修改(servletDD)時,顯式地更新.reload文件的時間戳。在UNIX上,執行:

 

touch .reload

 

對於JSP頁面,更新和重載入的頻率由上述Reload Poll Interval決定。要禁用JSP頁面的自動重新載入,將Reload Poll Interval字段的值置爲 -1 即可。

 

 

卸載 Web模塊

 

有四種方式來卸載應用:NetBeans IDE, Admin Console, asadmin命令, Ant工具。

 

使用NetBeans IDE:

1.  確認Application Server正在運行

2.  Runtime窗口,展開Application Server實例及包含應用(或模塊)的節點

3.  右鍵應用或模塊,選擇Undeploy

 

使用Admin Console:

1.  瀏覽器中打開地址:http://localhost:4848/asadmin

2.  展開Applications節點

3.  選擇Web Applications

4.  勾選你要卸載的應用(勾選應用後的check box)

5.  點擊Undeploy按鈕

 

使用asadmin命令:

asadmin undeploy context-root

 

要使用Ant工具,在你 構建並打WAR包的目錄下,執行此命令即可:

 

ant  undeploy

 

配置Web應用

 

你可通過web應用部署描述符中包含的元素來配置Web應用。

 

後面小節會爲web應用的常用配置做一個簡述。一些可配置的安全參數,參見第30 保證Web應用安全

 

下面的小節中,例子演示了配置Hello, World應用的步驟。對於Hello, World沒有用到的特別配置,本節也會推薦其他(章節的)示例,來演示如何指定該部署描述符元素。

 

 

URL映射到Web組件

 

web容器收到一個請求時,容器必須決定由哪個web組件來處理此請求。其通過將請求中URLweb應用及組件相匹配來是實現。一個URL路徑包含了上下文根(context root)和一個別名(alias)

 

http://host:port/context-root/alias

 

 

設置組件別名(Alias)

(alias) 標示了應該處理請求web組件。別名路徑必須以正斜線(/)(forward slash)開頭,以字符串或者帶擴展名的通配符結束 (例如*.jsp) 。由於web容器會自動匹配以*.jsp結尾的別名,所以你不需要爲JSP頁面指定別名,除非你不想根據jsp的文件名來引用頁面。(unless you wish to refer to the page by a name other than its file name.)

 

hello2 應用有連個servlet需要配置到web.xml文件中,你可以在NetBeans IDE中通過如下方式來編輯web.xml文件:

 

1.  選擇File→Open Project.

2.  Open Project對話框,導航到:

 

tut-install/javaeetutorial5/examples/web/

3.  選擇hello2文件夾

4.  勾選Open as Main Project選項

5.  點擊Open Project.

6.  Projects面板展開項目樹

7.  在項目樹中展開Web pages節點,並打開WEB-INF節點

8.  雙擊WEB-INF節點中的web.xml

(翻到這真想吐槽啊,把人都當傻子了啊有木有~~)

 

下述步驟描述瞭如何對web.xml文件進行必要的修改,包括如何設置顯示名稱、如何映射servlet組件。因爲編輯內容已經寫在文件裏了,你可以按些步驟下看看設置就行。

 

設置顯示名稱:

 

1.  擊編輯器頂部的General,打開通用配置

2.  Display Name字段輸入hello2

進行servlet映射配置:

 

1.  點擊編輯器頂部的Servlets,打開Servlet配置

2.  點擊Add Servlet.

3.  Add Servlet對話框Servlet Name字段輸入GreetingServlet

4.  Servlet Class字段輸入servlets.GreetingServlet

5.  URL Pattern字段輸入 /greeting

6.  點擊OK.

7.  重複以上步驟,只是把servlet name替換爲ResponseServlet servlet class替換爲servlets.ResponseServlet, URL pattern替換爲/response

 

如果你沒使用NetBeans IDE,你也可以用一個文本編輯器裏添加這些設置。

 

要用NetBeans IDE打包此實例,按以下步驟:

 

1.  選擇 File→Open Project.

2.  Open Project對話框,導航到

tut-install/javaeetutorial5/examples/web/

3.  選擇hello2文件夾

4.  勾選Open as Main Project

5.  點擊Open Project

6.  Projects選項卡,右鍵hello2項目,選擇Build.

要用Ant打包此實例,按以下步驟:

1.  在終端窗口,進入目錄: tut-install/javaeetutorial5/examples/web/hello2/.

2.  輸入ant. target會構建WAR包並將其複製到下記目錄:

tut-install/javaeetutorial5/examples/web/hello2/dist/

 

要使用NetBeans IDE部署本示例,右鍵項目面板中的項目,然後選擇Undeploy and Deploy

 

要使用Ant部署本示例,輸入 ant deploy. The deploy target in this case gives you an incorrect URL to run the application. To run the application, please use the URL shown at the end of this section.

 

要運行本應用,先部署此web模塊,然後在瀏覽器中打開URL

http://localhost:8080/hello2/greeting