国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Servlet/JSP深入詳解:基于Tomcat的Web開發(fā)--第三章
本章要點
— 掌握配置任意目錄下的Web應(yīng)用程序
— 掌握以WAR文件的形式發(fā)布Web應(yīng)用程序
— 掌握與Servlet配置相關(guān)的元素的使用
Web應(yīng)用程序的開發(fā)分為設(shè)計開發(fā)與配置部署兩個階段。通過部署,實現(xiàn)了組件與組件之間的松耦合,降低了Web應(yīng)用程序的維護難度。
本章主要介紹以下幾個主題:
— 如何配置任意目錄下的Web應(yīng)用程序
— 如何以WAR文件的形式發(fā)布Web應(yīng)用程序
— 與Servlet配置相關(guān)的元素的使用
3.1   配置任意目錄下的Web應(yīng)用程序
一個Web容器可以運行多個Web應(yīng)用程序,每個Web應(yīng)用程序都有一個唯一的上下文根,上下文根如何部署是和具體的Web容器相關(guān)的。對于Tomcat來說,%CATALINA_HOME%\webapps目錄下的每一個子目錄都是一個獨立的Web應(yīng)用程序,這個子目錄的名字就是這個Web應(yīng)用程序的上下文根。例如,第2章的Web應(yīng)用程序位于%CATALINA_HOME%\webapps\ch02目錄,上下文根就是ch02。
在部署和訪問Web應(yīng)用程序時,通過上下文路徑(context path)來區(qū)分不同的Web應(yīng)用程序。上下文路徑以斜杠(/)開頭,但結(jié)束沒有斜杠(/)。在默認上下文中,這個路徑將是空字符串""。例如:/ch02是第2章的Web應(yīng)用程序的上下文路徑,凡是發(fā)往/ch02路徑的請求,都會交由這個路徑下的Web應(yīng)用程序的資源來進行響應(yīng)。
在第2章中,我們將開發(fā)的Web應(yīng)用程序放在了%CATALINA_HOME%\webapps目錄下,當Tomcat啟動時,會自動加載webapps目錄下的Web應(yīng)用程序,所以在這個目錄下的Web應(yīng)用程序不需要進行其他的配置就可以直接訪問了。但是,我們在開發(fā)的時候,經(jīng)常會建立自己的開發(fā)目錄,在開發(fā)階段完成后,才進入正式的產(chǎn)品部署階段。如果每當我們完成一個功能,需要測試運行的時候,都要將文件復(fù)制到webapps目錄下對應(yīng)的Web應(yīng)用程序目錄中,那未免太煩瑣了。我們知道,在Web服務(wù)器中可以配置虛擬目錄,而虛擬目錄所對應(yīng)的真實目錄可以在任何路徑下。同樣地,在Tomcat中,也有類似的配置,這主要是在XML配置文件中通過<Context>元素的設(shè)置來完成的。一個<Context>元素就表示一個Web應(yīng)用程序,運行在特定的虛擬主機中。
<Context>元素的常用屬性如表3-1所示。
表3-1  <Context>元素的常用屬性
屬    性
描    述
className
指定實現(xiàn)了org.apache.catalina.Context接口的類名。如果沒有指定類名,將使用標準的實現(xiàn)。標準的實現(xiàn)類是org.apache. catalina.core.StandardContext
cookies
指示是否將Cookie應(yīng)用于Session,默認值是true
crossContext
如果設(shè)置為true,在應(yīng)用程序內(nèi)部調(diào)用ServletContext.getContext()將成功返回運行在同一個虛擬主機中的其他Web應(yīng)用程序的請求調(diào)度器。在注重安全的環(huán)境中,將該屬性設(shè)為false,那么getContext()將總是返回null。默認值是false
docBase
指定Web應(yīng)用程序的文檔基目錄或者WAR文件的路徑名??梢灾付夸浀幕騑AR文件的絕對路徑名,也可以指定相對于Host元素的appBase目錄的路徑名。該屬性是必需的
path
指定Web應(yīng)用程序的上下文路徑。在一個特定的虛擬主機中,所有的上下文路徑都必須是唯一的。如果指定一個上下文路徑為空字符串(""),則定義了這個虛擬主機的默認Web應(yīng)用程序,負責(zé)處理所有的沒有分配給其他Web應(yīng)用程序的請求
reloadable
如果設(shè)置為ture,Tomcat服務(wù)器在運行時,會監(jiān)視WEB-INF/classes和WEB-INF/lib目錄下類的改變,如果發(fā)現(xiàn)有類被更新,Tomcat服務(wù)器將自動重新加載該Web應(yīng)用程序。這個特性在應(yīng)用程序的開發(fā)階段非常有用,但是它需要額外的運行時開銷,所以在產(chǎn)品發(fā)布時不建議使用。該屬性的默認值是false
unpackWAR
如果為true,Tomcat在運行Web應(yīng)用程序前將展開所有壓縮的Web應(yīng)用程序。默認值是true
<Context>元素是<Host>元素的子元素,可以在%CATALINA_HOME%\conf\server.xml文件中設(shè)置Context元素。例如,針對第2章的Web應(yīng)用程序,可以做如下配置:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/ch02" docBase="ch02" reloadable="true"/>
</Host>
在<Context>元素中使用的屬性的含義在表3-1中已經(jīng)列出了,這里就不再講述了。
在Tomcat中,我們還可以把<Context>元素放在下列位置的文件中。
① %CATALINA_HOME%\conf\context.xml文件,在這個文件中設(shè)置的信息將被所有的Web應(yīng)用程序所加載。
② %CATALINA_HOME%\conf\[enginename]\[hostname]\context.xml.default文件,[enginename]表示的是在server.xml文件中設(shè)置的<Engine>元素的name屬性的值,[hostname]表示的是在server.xml文件中設(shè)置的<Host>元素的name屬性的值,關(guān)于servet.xml文件的詳細信息,可以參看附錄C。在筆者的機器上,%CATALINA_HOME%\ conf\server.xml文件中<Engine>元素的name屬性的值是Catalina,<Host>元素的name屬性的值是localhost,你可以在%CATALINA_HOME%\conf目錄下依次創(chuàng)建Catalina\localhost目錄,然后在localhost目錄下新建context.xml.default文件,在這個文件中設(shè)置的信息將被屬于該虛擬主機的所有Web應(yīng)用程序所加載。
③ 可以為一個Web應(yīng)用程序建立%CATALINA_HOME%\conf\[enginename]\ [hostname]\xxx.xml文件,在這個XML文件中,<Context>元素的docBase屬性通常是Web應(yīng)用程序目錄的絕對路徑名,或者是Web應(yīng)用程序歸檔文件的絕對路徑名。
④ 在Web應(yīng)用程序的目錄結(jié)構(gòu)中增加META-INF\context.xml文件。包含META-INF子目錄的Web應(yīng)用程序的目錄層次結(jié)構(gòu)如圖3-1所示。
在%CATALINA_HOME%\webapps目錄下的Web應(yīng)用程序,如果沒有在任何文件中設(shè)置<Context>元素,那么Tomcat將為這個Web應(yīng)用程序自動生成<Context>元素。自動生成的<Context>元素的上下文路徑將以斜杠(/)開始,后面緊跟Web應(yīng)用程序所在目錄的名字,如果目錄的名字是ROOT,那么上下文路徑將是一個空字符串("")。所以在%CATALINA_HOME%\webapps目錄下的Web應(yīng)用程序可以不經(jīng)配置而直接使用。
在%CATALINA_HOME%\webapps目錄下有一個ROOT目錄,Tomcat為ROOT目錄生成的<Context>元素的上下文路徑是空字符串(""),而我們知道,如果一個Web應(yīng)用程序的上下文路徑是空字符串(""),則這個Web應(yīng)用程序?qū)⒆鳛樘摂M主機的默認Web應(yīng)用程序,負責(zé)處理所有的沒有分配給其他Web應(yīng)用程序的請求如果要讓Struts 2不加載struts-default.xml,或者加載自定義的配置文件,可以在struts.properties文件中設(shè)置struts.configuration.files鍵。,這也就是為什么我們訪問http://localhost:8080/時,訪問的是%CATALINA_ HOME%\webapps\ROOT目錄下的資源。
如果我們想將開發(fā)的目錄直接配置成Web應(yīng)用程序運行的目錄,而不是將這個目錄復(fù)制到%CATALINA_HOME%\webapps目錄下,可以在兩處地方進行配置。例如,在筆者的機器上,本章的例子程序所在目錄是F:\JSPLesson\ch03,為了可以直接在這個目錄下運行Web應(yīng)用程序,我們編輯%CATALINA_HOME%\conf\server.xml文件,設(shè)置<Context>元素,如例3-1所示。
例3-1  在server.xml中設(shè)置<Context>元素
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Context path="/ch03"docBase="F:\JSPLesson\ch03"reloadable="true"/>
</Host>
使用docBase屬性指定Web應(yīng)用程序的真實路徑。將屬性reloadable設(shè)置為true,Tomcat在運行時會自動監(jiān)測Servlet類的改動,如果發(fā)現(xiàn)有類被更新,Tomcat服務(wù)器將自動重新加載該Web應(yīng)用程序。這樣,在開發(fā)時,我們就不需要頻繁重啟Tomcat了。讀者可以將ch03目錄按照Web應(yīng)用程序的目錄層次結(jié)構(gòu)建好,然后編寫一個簡單的輸出“Hello World”的Servlet進行測試,步驟和第2章的實例程序的編寫步驟是一樣的。
此外,我們還可以在%CATALINA_HOME%\conf目錄下依次創(chuàng)建Catalina\localhost目錄,然后在localhost目錄下為ch03這個Web應(yīng)用程序建立ch03.xml文件,編輯這個文件,輸入如例3-2所示的內(nèi)容。
例3-2  ch03.xml
<Context path="/ch03" docBase="F:\JSPLesson\ch03" reloadable="true"/>
讀者可以用自己編寫的Servlet類進行測試,在測試之前,要先把server.xml文件中設(shè)置的<Context>元素刪除或注釋起來。
從Tomcat 5開始,不建議直接在server.xml文件中配置<Context>元素,因為server.xml文件作為Tomcat的主要配置文件,一旦Tomcat啟動后,將不會再讀取這個文件,因此你無法在Tomcat服務(wù)器啟動時發(fā)布Web應(yīng)用程序。如果在其他地方配置<Context>元素,那么在Tomcat運行時,也可以發(fā)布Web應(yīng)用程序。
從Tomcat 5.5開始,在%CATALINA_HOME%\conf\[enginename]\ [hostname]\目錄下創(chuàng)建XML配置文件來配置Web應(yīng)用程序,Tomcat將以XML文件的文件名將作為Web應(yīng)用程序的上下文路徑,而不管你在<Context>元素的path屬性中指定的上下文路徑是什么。例如,文件名是ch03.xml,<Context>元素的path屬性設(shè)置為/hello,那么執(zhí)行http://localhost:8080/hello/helloworld將提示HTTP 404錯誤,如果執(zhí)行http://localhost:8080/ch03/helloworld將顯示正確的輸出信息。而Tomcat 5.5之前的版本則是以<Context>元素的path屬性的值作為上下文的路徑。
由于Tomcat 5.5之后的版本是以XML配置文件的文件名作為Web應(yīng)用程序的上下文路徑的,因此在配置<Context>元素時,可以不使用path屬性。
%CATALINA_HOME%\conf\web.xml為運行在同一個Tomcat實例中的所有Web應(yīng)用程序定義了默認值。當Tomcat加載一個Web應(yīng)用程序的時候,首先讀取這個文件,然后再讀取Web應(yīng)用程序目錄下的WEB-INF/web.xml文件。
3.2   WAR文件
如果一個Web應(yīng)用程序的目錄和文件非常多,那么將這個Web應(yīng)用程序部署到另一臺機器上,就不是很方便了,我們可以將Web應(yīng)用程序打包成Web歸檔(WAR)文件,這個過程和把Java類文件打包成JAR文件的過程類似。利用WAR文件,可以把Servlet類文件和相關(guān)的資源集中在一起進行發(fā)布。在這個過程中,Web應(yīng)用程序就不是按照目錄層次結(jié)構(gòu)來進行部署了,而是把WAR文件作為部署單元來使用。
一個WAR文件就是一個Web應(yīng)用程序,建立WAR文件,就是把整個Web應(yīng)用程序(不包括Web應(yīng)用程序?qū)哟谓Y(jié)構(gòu)的根目錄)壓縮起來,指定一個.war擴展名。下面我們將第2章的Web應(yīng)用程序打包成WAR文件,然后發(fā)布。WAR文件的創(chuàng)建與JAR文件的創(chuàng)建使用相同的命令。
打開命令提示符,進入%CATALINA_HOME%\webapps\ch02\目錄,執(zhí)行下面的命令:
jar -cvf ch02.war *
這個命令將ch02目錄下所有的子目錄和文件都打包成一個名為ch02.war的歸檔文件。如果不想包含src目錄及其下的Java源文件(在發(fā)布時不應(yīng)該把Java源文件包含到WAR文件中),可以執(zhí)行下面的命令:
jar -cvf ch02.war *.html WEB-INF/
要查看WAR文件的內(nèi)容,可以執(zhí)行下面的命令:
jar -tf ch02.war
這個命令將列出WAR文件的內(nèi)容,或者用WinRAR工具軟件查看ch02.war文件的內(nèi)容,如圖3-2所示。
圖3-2  使用WinRAR查看ch02.war文件
如果修改了某個Servlet類文件,需要替換WAR文件中的舊文件,可以執(zhí)行下面的命令:
jar -uf ch02.war WEB-INF/classes/org/sunxin/ch02/servlet/LoginServlet. class
當然你也可以利用WinRAR軟件來更新壓縮包中的文件。
如果我們將ch02.war文件放到%CATALINA_HOME%\webapps目錄下,在Tomcat啟動時,會自動解壓這個WAR文件,按照打包前的目錄層次結(jié)構(gòu)生成與WAR文件的文件名同名的目錄ch02及下面的子目錄和文件。讀者可以自己動手做一下實驗,先刪除在%CATALINA_HOME%\webapps目錄下的ch02目錄,然后將ch02.war文件復(fù)制到%CATALINA_HOME%\webapps目錄下,啟動Tomcat,你會看到在webapps目錄下新產(chǎn)生了一個ch02目錄。
當然,我們也可以直接從WAR文件運行Web應(yīng)用程序,打開%CATALINA_ HOME%\conf\server. xml文件,找到<Host>元素的配置處,如下所示:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
將unpackWARs屬性的值設(shè)置為false,這樣,Tomcat將直接運行WAR文件。關(guān)于<Host>元素各屬性的含義,請參看附錄C或Tomcat的文檔。
刪除Tomcat產(chǎn)生的目錄ch02,重新啟動Tomcat,查看%CATALINA_HOME%\webapps目錄,可以看到這次沒有產(chǎn)生ch02目錄,打開瀏覽器,輸入以前訪問過的URL進行測試。
在建立WAR文件之前,需要建立正確的Web應(yīng)用程序的目錄層次結(jié)構(gòu)。
— 建立WEB-INF子目錄,并在該目錄下建立classes與lib兩個子目錄。
— 將Servlet類文件放到WEB-INF\classes目錄下,將Web應(yīng)用程序所使用Java類庫文件(即JAR文件)放到WEB-INF\lib目錄下。
— 建立web.xml文件,放到WEB-INF目錄下。
— 根據(jù)Web應(yīng)用程序的需求,將JSP頁面或靜態(tài)HTML頁面放到上下文根路徑下或其子目錄下。
— 如果有需要,建立META-INF目錄,并在該目錄下建立context.xml文件。
只有在確保這些工作后都完成后,才開始建立WAR文件。
要注意的是,雖然WAR文件和JAR文件的文件格式是一樣的,并且都是使用jar命令來創(chuàng)建,但就其應(yīng)用來說,WAR文件和JAR文件是有根本區(qū)別的。JAR文件的目的是把類和相關(guān)的資源封裝到壓縮的歸檔文件中,而對于WAR文件來說,一個WAR文件代表了一個Web應(yīng)用程序,它可以包含Servlet、HTML頁面、Java類、圖像文件,以及組成Web應(yīng)用程序的其他資源,而不僅僅是類的歸檔文件。
我們什么時候應(yīng)該使用WAR文件呢?在開發(fā)階段不適合使用WAR文件,因為在開發(fā)階段,經(jīng)常需要添加或刪除Web應(yīng)用程序的內(nèi)容,更新Servlet類文件,而每一次改動后,重新建立WAR文件將是一件浪費時間的事情。在產(chǎn)品發(fā)布階段,使用WAR文件是比較合適的,因為在這個時候,幾乎不需要再做什么改動了。
在開發(fā)階段,我們通常將Servlet源文件放到Web應(yīng)用程序目錄的src子目錄下,以便和Web資源文件區(qū)分。在建立WAR文件時,只需要將src目錄從Web應(yīng)用程序目錄中移走,就可以打包了。
3.3   與Servlet配置相關(guān)的元素
3.3.1  <servlet>元素及其子元素
在web.xml文件中,<servlet>元素及其可以包含的子元素如圖3-3所示。
圖3-3  <servlet>元素及其子元素
圖3-3中的*表示可以有零個或多個子元素,?表示可以有零個或一個子元素,除此之外的元素為必備的元素。下面我們對<servlet>元素的各個子元素的含義做一個說明。
Ø  <description>
為Servlet指定一個文本描述。
Ø  <display-name>
為Servlet指定一個簡短的名字,這個名字可以被某些工具所顯示。
Ø  <icon>
為Servlet指定一個圖標。這個圖標可以在一些圖形界面工具中用于表示該Servlet。
Ø  <servlet-name>
指定Servlet的名字,這個名字在同一個Web應(yīng)用程序中必須是唯一的。這個元素在第2章的例子中已經(jīng)使用過。
Ø  <servlet-class>
指定Servlet類的完整限定名。這個元素在第2章的例子中也已經(jīng)使用過。
Ø  <jsp-file>
指定在Web應(yīng)用程序中的JSP文件的完整路徑,該路徑以斜杠(/)開始。如果要對一個JSP文件做URL映射,就會用到這個元素。
Ø  <init-param>
定義Servlet的初始化參數(shù)。如果使用了<init-param>元素,則必須包含<param-name>和<param-value>元素,可以包含零個或多個<description>元素。
—  <description>
為初始化參數(shù)提供一個文本描述。
—  <param-name>
定義初始化參數(shù)的名字。
—  <param-value>
定義初始化參數(shù)的值。
Ø  <load-on-startup>
指定當Web應(yīng)用程序啟動時,Servlet被加載的次序。元素的內(nèi)容必須是一個整數(shù),如果這個值是一個負數(shù),或者沒有設(shè)定這個元素,Servlet容器將在客戶端首次請求這個Servlet時加載它;如果這個值是正數(shù)或0,容器將在Web應(yīng)用程序部署時加載和初始化這個Servlet,并且先加載數(shù)值小的Servlet,后加載數(shù)值大的Servlet。如果某個Servlet需要在其他Servlet被加載之前加載,可以在部署描述符中使用這個元素。如果<servlet>元素包含了<jsp-file>元素和<load-on-startup>元素,則JSP文件將被預(yù)編譯并加載。
Ø  <run-as>
指定用于執(zhí)行組件的角色。如果使用了<run-as>元素,可以包含零個或多個<description>元素,必須包含<role-name>元素。
—  <description>
指定一個文本描述。
—  <role-name>
指定用于執(zhí)行組件的角色名。
Ø  <security-role-ref>
聲明在組件或部署的組件的代碼中的安全角色引用。如果使用了<security-role-ref>元素,則必須包含<role-name>元素,可以包含零個或多個<description>元素,零個或一個<role-link>元素。
—  <description>
為安全角色引用提供一個文本描述。
—  <role-name>
指定在代碼中使用的安全角色的名字。
—  <role-link>
指定到一個安全角色的引用。
3.3.2  <servlet-mapping>元素及其子元素
<servlet-mapping>元素在Servlet和URL樣式之間定義一個映射。它包含了兩個子元素<servlet- name>和<url-pattern>,<servlet-name>元素給出的Servlet名字必須是在<servlet>元素中聲明過的Servlet的名字。<url-pattern>元素指定對應(yīng)于Servlet的URL路徑,該路徑是相對于Web應(yīng)用程序上下文根的路徑。例如:
<servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
如果要讓Struts 2不加載struts-default.xml,或者加載自定義的配置文件,可以在struts.properties文件中設(shè)置struts.configuration.files鍵。Servlet 2.5規(guī)范允許<servlet-mapping>的<url-pattern>子元素出現(xiàn)多次,之前的規(guī)范只允許一個<servlet-mapping>元素包含一個<url-pattern>子元素。我們看下面的例子:
<servlet-mapping>
<servlet-name>welcome</servlet-name>
<url-pattern>/en/welcome</url-pattern>
<url-pattern>/zh/welcome</url-pattern>
</servlet-mapping>
在配置了Servlet與URL樣式之間的映射后,當Servlet容器接收到一個請求,它首先確定該請求應(yīng)該由哪一個Web應(yīng)用程序來響應(yīng)。這是通過比較請求URI的開始部分與Web應(yīng)用程序的上下文路徑來確定的。映射到Servlet的路徑是請求URI減去上下文的路徑,Web應(yīng)用程序的Context對象在去掉請求URI的上下文路徑后,將按照下面的路徑映射規(guī)則的順序?qū)κS嗖糠值穆窂竭M行處理,并且在找到第一個成功的匹配后,不再進行下一個匹配。
— 容器試著對請求的路徑和Servlet映射的路徑進行精確匹配,如果匹配成功,則調(diào)用這個Servlet來處理請求。
— 容器試著匹配最長的路徑前綴,以斜杠(/)為路徑分隔符,按照路徑樹逐級遞減匹配,選擇最長匹配的Servlet來處理請求。
— 如果請求的URL路徑最后有擴展名,如.jsp,Servlet容器會試著匹配處理這個擴展名的Servlet。
— 如果按照前面3條規(guī)則沒有找到匹配的Servlet,容器會調(diào)用Web應(yīng)用程序默認的Servlet來對請求進行處理,如果沒有定義默認的Servlet,容器將向客戶端發(fā)送HTTP 404錯誤信息(請求資源不存在)。
在部署描述符中,可以使用下面的語法來定義映射。
Ø  以/開始并且以 /* 結(jié)束的字符串用來映射路徑,例如:
<url-pattern>/admin/*</url-pattern>
如果沒有精確匹配,那么對/admin/路徑下的資源的所有請求將由映射了上述URL樣式的Servlet來處理。
Ø  以 *. 為前綴的字符串用來映射擴展名,例如:
<url-pattern>*.do</url-pattern>
如果沒有精確匹配和路徑匹配,那么對具有.do擴展名的資源的請求將由映射了上述URL樣式的Servlet來處理。
Ø  以一個單獨的/指示這個Web應(yīng)用程序默認的Servlet,例如:
<url-pattern>/</url-pattern>
如果對某個請求沒有找到匹配的Servlet,那么將使用Web應(yīng)用程序的默認Servlet來處理。
Ø  所有其他的字符被用于精確匹配,例如:
<url-pattern>/login</url-pattern>
如果請求/login,那么將由映射了URL樣式/login的Servlet來處理。
下面我們看幾個請求映射的例子,如表3-2和表3-3所示。
表3-2  Servlet映射
映射的URL
對應(yīng)的Servlet
/hello
servlet1
/bbs/admin/*
servlet2
/bbs/*
servlet3
*.jsp
servlet4
/
servlet5
表3-3  實際請求映射的結(jié)果
去掉上下文路徑的剩余路徑
處理請求的Servlet
/hello
servlet1
/bbs/admin/login
servlet2
/bbs/admin/index.jsp
servlet2
/bbs/display
servlet3
/bbs/index.jsp
servlet3
/bbs
servlet3
/index.jsp
servler4
/hello/index.jsp
servlet4
/hello/index.html
servlet5
/news
servlet5
Tomcat在%CATALINA_HOME%\conf\web.xml文件中配置了默認的Servlet,配置代碼如下:如果要讓Struts 2不加載struts-default.xml,或者加載自定義的配置文件,可以在struts.properties文件中設(shè)置struts.configuration.files鍵。
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>
org.apache.catalina.servlets.DefaultServlet </servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
%CATALINA_HOME%\conf\web.xml文件中的配置將被運行在同一個Tomcat實例中的所有Web應(yīng)用程序所共享。
3.4   一個實例
在上一節(jié)我們介紹了,在<servlet>元素中可以使用<init-param>子元素為Servlet定義初始化參數(shù),在本節(jié)中,我們通過一個實例來看看初始化參數(shù)的應(yīng)用,順便再復(fù)習(xí)一下Servlet的配置。
在本例中,我們將編寫一個帶表單的HTML頁面,表單中提供了一個文本域,讓用戶輸入他的姓名,然后提交給Servlet進行處理。Servlet接收到請求后,首先從web.xml文件中讀取預(yù)先設(shè)置的初始化歡迎信息,然后從提交的表單中取出用戶姓名,加上歡迎信息輸出到客戶端。為了便于同時為中文用戶和英文用戶服務(wù),我們在web.xml文件中為同一個Servlet設(shè)置了不同的名字、初始化參數(shù)和URL映射,并為客戶端提供了兩個HTML頁面,一個為中文用戶使用,一個為英文用戶使用,兩個頁面分別指定不同的提交URL。實例的開發(fā)主要有下列步驟。
Step1:編寫welcome_en.html和welcome_zh.html
編寫welcome_en.html和welcome_zh.html,將編寫好的兩個文件放到F:\JSPLesson\ch03目錄下。兩個文件的代碼如例3-3和例3-4所示。
例3-3  welcome_en.html
<html>
<head>
<title>Welcome you!</title>
</head>
<body>
<form action="en/welcome" method="post">
Please input your name:<input type="text" name="user"><p>
<input type="submit" value="submit">
</form>
</body>
</html>
例3-4  welcome_zh.html
<html>
<head>
<title>Welcome you!</title>
</head>
<body>
<form action="zh/welcome" method="post">
請輸入用戶名:<input type="text" name="user"><p>
<input type="submit" value="提交">
</form>
</body>
</html>
Step2:編寫WelcomeServlet類
將編寫好的WelcomeServlet.java源文件放到F:\JSPLesson\ch03\src目錄下。完整的源代碼如例3-5所示。
例3-5  WelcomeServlet.java
1.package org.sunxin.ch03.servlet;
2.
3.import java.io.IOException;
4. import java.io.PrintWriter;
5. import javax.servlet.ServletException;
6.import javax.servlet.http.HttpServlet;
7. import javax.servlet.http.HttpServletRequest;
8. import javax.servlet.http.HttpServletResponse;
9.
10.public class WelcomeYou extends HttpServlet
11.{
12.    public void doGet(HttpServletRequest req, HttpServletResponse resp)
13.                   throws ServletException,IOException
14.    {
15.        req.setCharacterEncoding("gb2312");
16.        String user=req.getParameter("user");
17.        String welcomeMsg=getInitParameter("msg");
18.
19.        resp.setContentType("text/html;charset=gb2312");
20.
21.        PrintWriter out=resp.getWriter();
22.
23.        out.println("<html><head><title>");
24.        out.println("Welcome Page");
25.        out.println("</title><body>");
26.        out.println(welcomeMsg+", "+user);
27.        out.println("</body></head></html>");
28.        out.close();
29.    }
30.
31.    public void doPost(HttpServletRequest req, HttpServletResponse resp)
32.                   throws ServletException,IOException
33.    {
34.         doGet(req,resp);
35.    }
36.}
因為客戶端可能會發(fā)送中文用戶名,所以在代碼的第15行,我們設(shè)置請求正文使用的字符編碼是gb2312。第17行,調(diào)用getInitParameter()方法得到初始化參數(shù)msg的值,這個方法是通過調(diào)用Servlet Config.getInitParameter()方法來得到初始化參數(shù)的。第26行,將初始化歡迎信息和用戶姓名組合在一起,發(fā)送到客戶端。
Step3:編譯WelcomeServlet.java
打開命令提示符,進入到F:\JSPLesson\ch03\src目錄下,然后執(zhí)行:
javac -d ..\WEB-INF\classes WelcomeServlet.java
在WEB-INF\classes目錄下生成org\sunxin\ch03\servlet目錄結(jié)構(gòu),以及在servlet子目錄中的WelcomeServlet.class文件。
在進行這一步操作之前,如果要讓Struts 2不加載struts-default.xml,或者加載自定義的配置文件,可以在struts.properties文件中設(shè)置struts.configuration.files鍵。讀者應(yīng)該首先按照Web應(yīng)用程序要求的目錄結(jié)構(gòu)創(chuàng)建WEB-INF目錄和classes目錄。
Step4:部署WelcomeServlet
在F:\JSPLesson\ch03\WEB-INF目錄下新建web.xml文件,添加對本例中的Servlet的配置,完整的內(nèi)容如例3-6所示。
例3-6  web.xml
1.<?xml version="1.0" encoding="GBK"?>
2.
3.<web-app version="2.5"
4.  xmlns="http://java.sun.com/xml/ns/javaee"
5.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
6.  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
7.  http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
8.
9.    <servlet>
10.        <servlet-name>welcome_en</servlet-name>
11.        <servlet-class>
12.             org.sunxin.ch03.servlet.WelcomeServle
13.        </servlet-class>
14.        <init-param>
15.            <param-name>msg</param-name>
16.            <param-value>welcome you</param-value>
17.        </init-param>
18.    </servlet>
19.
20.    <servlet-mapping>
21.        <servlet-name>welcome_en</servlet-name>
22.        <url-pattern>/en/welcome</url-pattern>
23.    </servlet-mapping>
24.
25.    <servlet>
26.        <servlet-name>welcome_zh</servlet-name>
27.        <servlet-class>
28.             org.sunxin.ch03.servlet.WelcomeServle
29.        </servlet-class>
30.        <init-param>
31.            <param-name>msg</param-name>
32.            <param-value>歡迎你</param-value>
33.        </init-param>
34.    </servlet>
35.
36.    <servlet-mapping>
37.        <servlet-name>welcome_zh</servlet-name>
38.        <url-pattern>/zh/welcome</url-pattern>
39.    </servlet-mapping>
40.
41.</web-app>
注意在第1行的XML聲明中,指定該文檔的編碼為GBK,因為我們在文檔中使用了中文字符。第9~18行,配置WelcomeServlet,指定它的名字為welcome_en,定義了初始化參數(shù),用于提供英文的歡迎信息。第20~23行,定義welcome_en與URL的映射,為welcome_en指定URL:/en/welcome。第25~34行,又一次配置WelcomeServlet,為其指定了另外一個名字welcome_zh,并定義初始化參數(shù),用于提供中文的歡迎信息。第36~39行,定義welcome_zh與URL的映射,為welcome_zh指定URL:/zh/welcome。
Servlet是單實例多線程的,Servlet容器根據(jù)web.xml文件中的Servlet配置來實例化Servlet為請求進行服務(wù)。通常情況下,一個Servlet類只產(chǎn)生一個實例如果要讓Struts 2不加載struts-default.xml,或者加載自定義的配置文件,可以在struts.properties文件中設(shè)置struts.configuration.files鍵。為所有的客戶請求進行服務(wù),但是,如果你在web.xml文件中多次配置了同一個Servlet類,那么每一個配置都將產(chǎn)生一個Servlet實例。換句話說,Servlet容器是根據(jù)web.xml文件中Servlet配置的數(shù)量來產(chǎn)生Servlet實例,而不管Servlet類是否是同一個。
Step5:配置ch03 Web應(yīng)用程序
我們直接將開發(fā)目錄(F:\JSPLesson\ch03)配置為ch03 Web應(yīng)用程序運行的目錄。在%CATALINA_HOME%\conf目錄下依次創(chuàng)建Catalina\localhost目錄,在localhost目錄下新建ch03.xml文件,內(nèi)容如例3-7所示。
例3-7  ch03.xml
<Context path="/ch03" docBase="F:\JSPLesson\ch03" reloadable="true"/>
Step6:訪問WelcomeServlet
分別通過welcome_en.html和welcome_zh.html訪問WelcomeServlet。啟動Tomcat服務(wù)器,打開IE瀏覽器,首先在地址欄中輸入http://localhost:8080/ch03/welcome_en.html,出現(xiàn)頁面后,在文本域中輸入用戶姓名,單擊“submit”按鈕,你將看到如圖3-4所示的頁面。
接著在地址欄中輸入http://localhost:8080/ch03/welcome_zh.html,出現(xiàn)頁面后,在文本域中輸入用戶姓名,單擊“提交”按鈕,你將看到如圖3-5所示的頁面。
           
圖3-4  WelcomeServlet顯示英文的歡迎信息         圖3-5  WelcomeServlet顯示中文的歡迎信息
從這個例子中可以看到,在編寫Servlet時,將初始化的信息通過部署描述符傳遞給Servlet,可以提高Web應(yīng)用程序的可維護性。當需要修改初始化參數(shù)時,只要在web.xml文件中做相應(yīng)的修改就可以了,而Servlet本身不需要做任何的改動。另外,通過在web.xml文件中對Servlet進行配置,可以讓同一個Servlet表現(xiàn)出不同的行為,給用戶的感覺,就好像訪問的是不同的資源。
3.5   小結(jié)
本章主要介紹了以下3個部分的內(nèi)容。
— 如何利用<Context>元素來配置Web應(yīng)用程序,在Tomcat中,<Context>元素可以放到多個位置的文件中,不同位置的配置文件,所起的作用也是不同的。
— 如何建立WAR文件,利用WAR文件來發(fā)布Web應(yīng)用程序。
— 介紹了<servlet>元素和<servlet-mapping>元素,以及它們的子元素的作用。
最后通過一個實例,向讀者演示了Servlet初始化參數(shù)的使用,以及在部署描述符中對Servlet進行不同的配置,從而讓同一個Servlet表現(xiàn)出不同的行為。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Tomcat配置技巧Top10
windowns 2k下快速配置jsp服務(wù)器+tomcat篇
Tomcat安裝、配置和部署筆記
WAR文件
JTomcat與Java Web開發(fā)技術(shù)詳解連載之一
JavaWeb應(yīng)用簡介
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服