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