web應用(轉自Sun社區)
Web應用是Web服務的一種動態擴展。Web應用可分為兩類:在Java2平臺上,Web組件為Web 服務器提供了動態擴展能力。Web組件可以是Java Servlets或者JSP頁面。Servlets是Java編程語言中用于動態地處理請求和建立響應的一種類。JSP頁面是基于文本的文檔,它像 servlets一樣執行,但是允許使用更自然的方法來創建靜態內容。盡管servlet和JSP頁面可以交替地使用,但是它們各有千秋。 Servlets最適合于面向服務的Web應用,同時還擅長于管理面向表示的Web服務的控制功能,例如發送請求和處理非原文的數據。而JSP頁面則更適 合于產生基于文本的標記,例如:HTML、SVG、WML以及XML等。
Web組件以一個名為Web容器 的運行時平臺中的服務作為支撐。在Java Web服務開發包(Java Web Services Developer Pack, Java WSDP)中的Web組件在Tomcat Web容器內運行。Web容器提供了一些服務,例如請求發送、安全、并發以及生命周期管理。它還使得Web組件可以訪問多種API, 例如命名、事務處理以及e-mail等方面的API。
本章里描述了Web應用的組織、配置以及安裝和部署過程。第11章和第12章中講述如何開發面向服務的Web應用的Web組件。第14章和第15章講述如何開發面向表示Web的應用的Web組件。JSP技術的許多特征是由Java Servlet技術決定的,因此即使你不打算編寫servlet,也應該熟悉這方面的知識。
大多數Web應用都使用HTTP協議,而且對HTTP的支持也正是Web組件的一個主要方面。對于HTTP協議特征的簡要總結,參見HTTP概述。
Web應用由Web組件、靜態資源文件(如圖像)、幫助類和庫組成。Java WSDP提供許多支持服務,用于增強Web組件的性能并使得它們更易于開發。不過,由于要充分考慮這些支持服務,所以Web應用在創建和運行過程上與傳統的stand-alone式的Java類有所不同。
在Web應用被部署以后,就可以對其行為的某些方面進行配置。配置信息通過Web應用部署描述文件來維護,該文件是一種XML格式的文本文件。部署描述文件必須遵從Java Servlet規范中描述的模式。
2.建立Web應用組件連同所有靜態資源(例如圖像)和組件要引用到的幫助類。
3.將應用安裝或部署到Web容器中。
開 發Web組件代碼這方面的知識將在以后的章節中講述。接下來的幾節將對步驟2到步驟4作出詳細的講解,并給出一個Hello,World式的面向表示的應 用的例子。該應用允許用戶輸入名字到HTML表單中(見圖4-1),并且在名字提交之后顯示一條問候信息(見圖4―2)。
圖4-1 問候表單
這個Hello應用包含了兩個Web組件,用于產生問候信息和響應。在本指南中,該應用有兩個版本:一個是servlet版,名為Hello1,它的組件通過兩個servlet類(GreetingServlet.java和ResponseServlet.java)來實現。另一個是JSP版,名為Hello2,它的組件通過兩個JSP頁面(greeting.jsp 和 response.jsp)來實現。這兩個版本的例子展示了一個包含Web組件的應用在大包、部署和運行時所涉及到的任務。如果你是在線瀏覽本指南,請務必下載本指南的捆綁包,以獲得這個示例的源代碼。
Web應用歸檔文件
如果要發布一個Web應用,你可以將其打包到一個Web應用歸檔文件(Web application archive,WAR)中,WAR與JAR類似,都是用作Java類庫的包。除了應用的Web組件外,Web應用的歸檔文件還包含其他的一些文件,包括:
·?? 服務器端的實用工具類(如數據庫bean、購物車等等)。這些類通常與JavaBeans組件的結構一致。
Web應用的運行可以通過一個WAR文件,或者通過一個同為WAR格式的解包目錄。
WAR的頂級目錄是該應用的文檔根目錄。這個文檔根目錄下存放著JSP頁面、客戶端類和歸檔文件,以及靜態Web資源。
文檔根目錄下含有一個名為WEB-INF的子目錄,其中包含了以下文件和目錄:
·?? classes
—— 一個子目錄,包含了服務器端類:servlets,實用工具類和JavaBeans組件。
·?? lib
—— 一個子目錄,包含了庫(標簽庫和所有作為服務器端類的實用工具類)
還可以創建應用專用(application-specific)的子目錄(即包目錄),可以在文檔根目錄下創建,或者在WEB-INF/classes
目錄下創建。
為了便于迭代開發并且將Web應用的源代碼與已編譯的文件分開,實例的源代碼存儲在每個應用目錄mywebapp
下,其結構如下:
·?? src
—— servler和Javabeans組件的Java源代碼。
隨示例一起發布的Ant
build文件(build.xml)中包含了一些目標 (target),用以在mywebapp
的build
子目錄中創建解包的WAR結構,將文件拷貝和編譯到那個目錄中,并且通過專門的Ant任務調用manager
命令,來安裝、重新裝載、移除、部署和解部署應用。該指南示例的Ant目標是:
·?? prepare
(準備) —— 創建build目錄和WAR子目錄。
·?? build
(編譯) —— 編譯和拷貝mywebapp
Web應用文件到build目錄下。
·?? install
(安裝)—— 使用Ant install
任務通知Tomcat安裝應用(見安裝Web應用)。
·?? reload
(重新裝載)—— 使用Ant reload
任務通知Tomcat重新裝載應用(見更新Web應用)。
·?? deploy
(部署) —— 使用Ant deploy任務通知Tomcat部署應用(見部署Web應用)。
·?? undeploy
(解除部署)——使用Ant undeploy任務通知Tomcat解除部署應用(見解除部署Web應用)
·?? remove
(移除) —— 使用 Ant remove
任務通知Tomcat移除應用(見移除Web應用)
·?? 使用隨J2SE SDK一起發布的JAR工具。只需簡單地在指南示例的build目錄下執行如下命令:
配置Web應用
Web 應用的配置是通過包含在Web應用部署描述文件中的元素的設置來實現的。你可以使用文本編輯器來手工創建這些描述文件。接下來的章節將對你想配置的Web 應用特征作一個簡要的介紹。其中,許多的安全參數都可以在配置時指定,這些內容在第18章可以看到。如果你想得到這些特征的完整列表和描述,參見Java Servlet規范。
在接下來的幾節中,將給出一些示例來演示Hello,World應用的配置過程。如果Hello,World沒有使用指定的配置特征,那么本節將給出其他的示例來展示部署描述文件的元素并描述指定這種特征的一般過程。
注 意:描述符元素必須在部署描述文件中按照下列順序出現:icon,display,description,distributable,context -param,filter,filter-mapping,listener,servlet,servlet-mapping,session-config,mime-mapping,welcome-file-list,error-page,taglib,resource-env-ref,resource-ref,security-contraint,login-config,seurity-role,env-entry.
既然部署描述文件是一種XML文檔,它就需要一個序言。Web應用的部署描述文件的序言如下所示:
當Tomcat收到一個請求時,它必須決定使用哪個Web組件來處理請求。這一步是通過將包含在請求中的URL路徑映像到一個Web組件來實現的。URL路徑包含上下文根目錄(參見Installing Web Application,http://java.sun.com/webservices/docs/1.1/tutorial/doc/WebApp5.html#wp75667)和一個別名路徑。
在servlet 可以被訪問前,Web容器必須最少有一個該組件的別名路徑。別名路徑必須以一個“/”開始,以一個字符串或者一個帶擴展名的通配符(例如:*.jsp)結 束。既然Web容器自動地映像到以*.jsp結束的別名路徑,你無需為JSP頁面指定別名路徑,除非你想通過一個名稱,而不是其文件名來引用JSP頁面。 在更新Web應用中討論的實例中,問候頁面有一個別名response.jsp,但它仍然是通過其文件名來引用的。
在Web 部署描述文件中設置servlet版的Hello應用的映像,必須添加下列servlet和servlet-mapping元素到Web應用部署描述文件 中。為了定義JSP頁面的別名,必須替換在servlet元素中的servlet-class子元素和jsp-file子元素。
??greeting
??greeting
??no description
??GreetingServlet
??response
??response
??no description
??ResponseServlet
??greeting
??/greeting
??response
??/response
同 一個WAR中的各Web組件共享一個表示它們的應用上下文的對象(見訪問Web上下文)。你可以傳遞參數到上下文或者Web組件。要實現這一點,你必須添 加一個context-param或init-param元素到Web應用部署描述文件中。context-param是頂級web-app元素的子元 素。init-param是servlet元素的子元素。下面的元素用于聲明一個上下文參數,該參數設置在第17章中討論的示例的資源束:
??
????
??????javax.servlet.jsp.jstl.fmt.localizationContext
????
????messages.BookstoreMessages
??
??...
要添加事件監聽器類,必須添加一個listener元素到Web應用部署描述文件中。下面的元素描述了在第14章和第17章用到的監聽器類)。
Web 容器使用過濾器映像聲明來決定應用于某個請求的過濾器,并且決定這些過濾器的順序。正如在別名路徑中描述的那樣,該容器將請求URL與一個servlet 相匹配。要決定引用哪個過濾器,容器通過servlet名或者URL模式來匹配過濾器映像聲明。過濾器被調用的順序就是過濾器映像聲明在過濾器映像列表中 出現的順序,過濾器映像聲明將請求URI與一個servlet匹配起來。
要指定過濾器映像,必須添加一個filter和filter-mapping元素到Web應用部署描述文件中。下面的元素用于聲明有序的過濾器,并將其映像到在第14章討論過的Receipt servlet:
可
以指定狀態代碼與Web資源之間的映像,其中的狀態代碼可以是一個HTTP響應中返回的,也可以是由任何Web組件返回的一個Java編程語言異常中返回
的。要設置映像,必須添加一個
注意:你也可以為包含在WAR內的JSP頁面定義錯誤頁面。如果錯誤頁面是同時為WAR和JSP頁面而定義的,則JSP頁面的錯誤頁面居先。
指向環境條目、資源環境條目或資源的引用
如
果Web組件需要引用環境條目,資源環境條目或資源(如數據庫),必須通過在Web應用部署描述文件中的
上下文(context)是映射到一個Web應用的名稱。例如,Hello1應用的上下文是/hello1。為了將應用安裝到Tomcat,需要通知Tomcat有一個新的可用上下文。
可以使用Ant install任務來通知Tomcat有一個新的上下文。注意,在Tomcat重新啟動之后,安裝好的應用還不能使用。要永久地部署應用,參見部署Web應用。
Ant install任務告訴由url屬性指定的在本地運行的管理器安裝一個應用,其上下文由path屬性指定,其安裝位置包含了由war屬性指定的該Web應用的文件。war屬性的值可以是一個WAR文件,如:
jar:file:/path/to/bar.war!/ 或者是一個解包目錄:
?file:/path/to/foo。
??username="username"
password="password" />
username和password屬性將在Tomcat Web應用管理程序中討論。 這里無需提供一個war屬性,你可以使用config屬性來指定配置信息: ??path="mywebapp"
config="file:build/context.xml" ??username="username"
password="password"/>
??docBase="../docs/tutorial/examples/web/bookstore1/build" 注意,這個上下文條目通過它的docBase屬性隱式地指定了Web應用文件的位置。 本指南示例build文件包含一個Ant
install target,它將調用Ant install 任務: ??description="Install
web application" depends="build"> ?? ????config="file:build/context.xml" ????username="${username}"
password="${password}"/> Ant
install任務要求Web應用部署描述文件(web.xml)是可用的。所有的指南示例應用都是隨一個部署描述文件一起發布的。 To
install the Hello1 application described in Web
Application Life Cycle: 要安裝Web應用生命周期中描述的Hello1應用,需按下列步驟:
1. 在終端窗口中,轉到<JWSDP_HOME>/docs/tutorial/examples/web/hello1. 3.執行ant install。install target通知Tomcat新的上下文是可用的。 如果Tomcat正在運行,就可以使用Ant
deploy任務永久地將一個上下文部署到Tomcat。 ?? ????war="file:/path/to/mywebapp.war" ????username="username"
password="password" />
不同于install任務,install任務可以引用一個解包目錄,deploy任務需要一個WAR。該任務加載WAR到Tomcat并且啟動應用。也可以通過這個任務將其部署到一個遠程服務器上。 下面是其他一些可用的部署方法,但是它們要求重新啟動Tomcat:
·??
將包含了上下文條目的名為mywebapp.xml的配置文件拷貝到 ?? ????docBase="../docs/tutorial/examples/web/ ??????bookstore1/build" debug="0">
一些實例build文件包含一個像Ant
deploy 任務一樣調用的Ant deploy 目標。 如果想列出當前在Tomcat內可使用所有Web應用,你可以使用Ant
list任務: 指南示例build文件包含一個像調用Ant
list 任務一樣調用的Ant list 目標。 還可以通過運行Manager
Application來查看列出的應用: Web應用是在Web瀏覽器引用映像到組件的URL時執行的。一旦安裝了或者部署了Hello1應用,便可通過將瀏覽器指向 用運行Tomcat的主機名替代 在開發期間,經常需要對Web應用進行修改。在修改servlet之后,必須: 更新JSP頁面時,無需重新編譯或重新裝載應用,因為Tomcat會自動完成這些事情。 為了嘗試這一特征,修改Hello應用的servlet版本。例如,你可以將
1.?? 編輯在源碼目錄 2. 運行ant build任務。該任務將servlet重新編譯到build目錄中。 更新服務器中的應用這一過程取決于你是否使用Ant
install任務來安裝或者使用Ant deploy任務來部署這個應用。 如果你已經使用Ant
install命令安裝了應用,就可以使用Ant reload任務來更新服務器中的應用: 示例build文件包含一個
Ant remove目標,該目標調用 Ant remove任務。從而更新服務器中的Hello1應用,執行ant
reload。為了觀察經過更新的應用,重新裝載客戶端的Hello1的URL。注意, 為了在該實例的JSP版本上嘗試這一特性,首先建立和部署JSP版的Hello應用:
2.??? 運行 3. 運行 修改某一個JSP文件。然后運行 如果已經通過使用Ant
deploy任務部署了應用,就可以通過接連使用 如果想從服務中移除已安裝的Web應用,可以調用 示例build文件包含一個
Ant remove目標,該目標調用 Ant remove任務。 如果想移除一個已部署的Web應用,可以使用Ant
undeploy任務: 一些實例build文件包含一個Ant
undeploy目標,該目標調用Ant undeploy任務。 所謂的國際化是指使得應用能夠支持各種語言和數據格式的過程。所謂本地化,是指使得一個國際化的應用能夠支持某種特定的或者本地的語言的過程。雖然所有客戶端用戶接口都應該被國際化和本地化,但是國際化和本地化對于Web應用來說尤其重要,因為Web本身就是無所不及的。如果想要很好地鳥瞰一下國際化與本地化問題,參見 http://java.sun.com/docs/books/tutorial/i18n/index.html
·??
在每個目標位置中提供一個JSP頁面,并且使用一個控制器servlet來發送請求到適當的頁面上(取決于被請求的位置)。如果需要對一個頁面或者一個完
整的Web應用的數據進行國際化,這種方法比較有用。
·?? 將頁面上所有的本地敏感的數據 (例如錯誤信息,串字符或按鈕標簽)
分離到資源束內,然后訪問這些數據,來獲取響應的翻譯過來的信息并將其插入到頁面當中。這樣一來,就不是在代碼中直接創建字符串,而是創建一個包含了翻譯
過來的信息的資源束,然后使用相應的關鍵字從該資源束中讀出翻譯過來的信息。資源束可以由一個文本文件(屬性資源束)或一個包含了映像的類(列表資源束)
來支持。 在
下面的關于Web技術的幾章中,Duke's
Bookstore實例被分別國際化和本地化成英語和西班牙語。關鍵字-值對包含在名為message.BookMessage_*.class的列表資
源束。為了了解在資源束中的關鍵字-值對是怎樣的,請看在文件messages.BookMessages.java中添加的幾行: {"TitleCashier",
"Cashier"}, {"TitleBookDescription",
"Book Description"}, {"Visitor",
"You are visitor number "}, {"What",
"What We"re Reading"}, {"Talk",
" talks about how Web components can transform the
way you develop applications
for the Web. This is a must read for any self respecting
Web developer!"}, 為了獲得對應于某個給定用戶的正確字符串,Web組件從請求中獲取位置(由瀏覽器的語言首選項設定),為那個位置打開資源束,然后將該資源束作為會話屬性保存: ResourceBundle messages
= (ResourceBundle)session. ??getAttribute("messages"); ??if (messages
== null) { ????Locale
locale=request.getLocale(); ????messages
= ResourceBundle.getBundle("WebMessages", ??????locale);
????session.setAttribute("messages",
messages); ResourceBundle messages
= ??(ResourceBundle)session.getAttribute("messages"); 然后用下面的語句查找與關鍵字TitleCashier相關的字符串:
messages.getString("TitleCashier"); 上面對國際化Web應用的介紹非常簡要。如果要了解更多該主題的相關信息,參見Java
BluePrints:
posted @ 2005-11-09 18:01 svg_007 閱讀(286) | 評論 (0) | 編輯 收藏
列出已安裝和部署的Web應用
運行Web應用
更新Web應用
GreetingServlet
返回的問候信息修改為:reload
任務只改變Java類,而不會改變Web.xml文件。為了重新裝載web.xml,需要將應用刪除
(參見移除Web應用)并重新安裝。
<JWSDP_HOME>/docs/tutorial/examples/web/hello2.
ant build
。build
目標將產生所有必需的編譯并且拷貝文件到<JWSDP_HOME>/docs/tutorial/examples/web/hello2/build
目錄。ant install
。install
目標將build目錄拷貝到ant
build
將經過修改的文件拷貝到docs/tutorial/examples/web/hello2/build。記住,這里無需重新裝載服務器中的應用,因為當某個JSP文件被修改時,Tomcat會自動檢測到這一情況。要查看經過修改的應用,
需重新裝載客戶端的Hello2的URL。Ant undeploy
任務(見解除部署Web應用)和Ant
deploy
任務來更新這個應用。移除Web應用
Ant remove
任務:解除部署Web應用