我們遷移的示例應(yīng)用程序是使用 Web 層組件創(chuàng)建的 General Store 應(yīng)用程序,Web 層組件包括:
該應(yīng)用程序使用模型-視圖-控制器(Model-View-Controller,MVC)的體系結(jié)構(gòu)來(lái)路由請(qǐng)求,并且全部是無(wú)腳本(JSP 頁(yè)面內(nèi)沒(méi)有嵌入式 Java 代碼)的。
作為 Tomcat 5.5 應(yīng)用程序,它還使用下面的 Tomcat 的特定功能:
圖 2 演示了該應(yīng)用程序的一般體系結(jié)構(gòu)。
在圖 2 中,所有傳入請(qǐng)求都被發(fā)送到控制器(MVC 體系結(jié)構(gòu))Servlet。該 Servlet 根據(jù)傳入請(qǐng)求的參數(shù)將請(qǐng)求發(fā)送到兩個(gè) JSP頁(yè)面中的某一個(gè)頁(yè)面。最初,請(qǐng)求被發(fā)送到顯示產(chǎn)品目錄的 generalstore.jsp。圖 3 顯示了 General Store應(yīng)用程序的產(chǎn)品目錄頁(yè)面。
當(dāng)您單擊某個(gè) BUY 超鏈接時(shí),控制器會(huì)將請(qǐng)求發(fā)送到 checkoutcart.jsp 頁(yè)面,該頁(yè)面使您能夠?qū)⒍鄠€(gè)項(xiàng)添加到購(gòu)物車,清除購(gòu)物車,或返回到購(gòu)物。
generalstore.jsp 和 checkoutcart.jsp 都大量使用 JSTL 生成交互式購(gòu)物車腳本;沒(méi)有使用嵌入式 Java 代碼。
名為 GerneralStore 的類具有一個(gè)方法,通過(guò)該方法,可以獲得目錄以及每個(gè)目錄中的產(chǎn)品列表。在生產(chǎn)場(chǎng)景中,該類的實(shí)現(xiàn)可以連接到外部 RDBMS 以獲得它們的數(shù)據(jù)。在本例中,為了保持簡(jiǎn)單實(shí)現(xiàn)具有硬編碼的目錄和產(chǎn)品信息。
要通過(guò) JDBC 訪問(wèn)外部 RDBMS,checkoutcart.jsp 頁(yè)面使用 RDBMS 獲取今天的促銷消息并將該消息顯示給購(gòu)物者。
本文的下載 ZIP 文件提供了組成示例應(yīng)用程序的文件。表 2 概括介紹了組成應(yīng)用程序的類和文件,并描述了它們的用途。
文件 | 描述 |
---|---|
generalstore.jsp | 向用戶呈現(xiàn)目錄。 |
checkoutcart.jsp | 向用戶呈現(xiàn)購(gòu)物車。將通過(guò)數(shù)據(jù)源(使用 JNDI 查找)訪問(wèn) RDBMS 以顯示促銷消息。 |
generalstore.css | 兩個(gè) JSP 頁(yè)面所使用的用來(lái)格式化 HTML 元素的樣式表。 |
StoreController.java | 將請(qǐng)求發(fā)送到 JSP 的主控制器。還可以獲得目錄和產(chǎn)品信息,并將這些信息作為 JSP 的屬性附加以進(jìn)行顯示。 |
GeneralStore.java | 包含返回應(yīng)用程序所需的數(shù)據(jù)的方法。還包含實(shí)現(xiàn)自定義標(biāo)記庫(kù)的功能(請(qǐng)參閱 generalstore-taglib.tld)。 |
Category.java Proudct.java LineItem.java | 當(dāng)數(shù)據(jù)在應(yīng)用程序的模型和視圖之間傳送時(shí),JavaBean 用于保存值。 |
generalstore-taglib.tld | 實(shí)現(xiàn)為 GeneralStore.java 的方法的自定義標(biāo)記庫(kù),這些方法用于 JSP。 |
要使用該示例應(yīng)用程序,您必須下載以下應(yīng)用程序并將它們安裝到您的環(huán)境中:
![]() ![]() |
![]()
|
通過(guò)轉(zhuǎn)到代碼目錄并鍵入下面的命令,您可以構(gòu)建示例應(yīng)用程序:
|
這將在 dist 目錄中創(chuàng)建一個(gè)名為 generalstore.war 的 WAR 文件。它是可以部署到 Tomcat 5.5 的 Web 應(yīng)用程序存檔文件。
缺省情況下,Tomcat 5.5 服務(wù)器在端口 8080 偵聽(tīng)請(qǐng)求。這是通過(guò) Tomcat 5.5 安裝目錄下的 conf/server.xml 配置的。清單 1 顯示了配置連接器的 server.xml 代碼段。
清單1.server.xml 中的 Tomcat 連接器配置
|
如果您需要更改端口,則執(zhí)行以下操作:
port="8080"
更改為上面的 server.xml 代碼段中需要的端口。2. Tomcat 5.5 身份驗(yàn)證領(lǐng)域配置
在Tomcat 中,領(lǐng)域維護(hù)用戶、組和密碼信息。缺省情況下,UserDatabaseRealm 在 Tomcat 5.5中進(jìn)行了配置,從而使您能夠讓用戶在訪問(wèn)雜貨店前對(duì)他們進(jìn)行身份驗(yàn)證。此領(lǐng)域在 server.xml 文件中也進(jìn)行了設(shè)置。清單 2 中的server.xml 代碼段的粗體行表示該身份驗(yàn)證領(lǐng)域的配置。
清單 2. server.xml 中的 Tomcat UserDatabaseRealm 配置
|
上面的配置對(duì) UserDatabaseRealm 進(jìn)行設(shè)置,以使用 conf/tomcat-users.xml下面的文件維護(hù)用戶、密碼和角色信息。由于該領(lǐng)域是在 <Engine> 級(jí)配置的,因此它可以用于運(yùn)行在 Tomcat引擎上的所有主機(jī)。
要運(yùn)行我們的應(yīng)用程序,您不需要對(duì) conf/server.xml文件進(jìn)行任何修改,因?yàn)槿笔∨渲脤槲覀冃薷摹H欢?,您需要?duì) conf/tomcat-users.xml 文件進(jìn)行一些更改,其中UserDatabaseRealm 保留所有用戶信息。對(duì) tomcat-users.xml 文件進(jìn)行清單 3 中以粗體表示的更改。
清單 3. 在 tomcat-users.xml 中為 tomcat 用戶添加管理和管理員角色
|
這分配tomcat 用戶(密碼為“tomcat”)角色為管理員和管理組的一部分。
在應(yīng)用程序的 web.xml 文件中,存儲(chǔ)的控制器受到保護(hù),并且它只對(duì)具有 admin 角色的用戶授予訪問(wèn)權(quán)限。清單 4 中的粗體行顯示了保護(hù)應(yīng)用程序的 web.xml 代碼(在代碼分配的 dd 目錄中)。
清單 4. 對(duì)應(yīng)用程序進(jìn)行身份驗(yàn)證訪問(wèn)保護(hù)的 web.xml 部署描述符
|
以上代碼中的<security-constraint> 和 <security-role> 元素是標(biāo)準(zhǔn)的 J2EE安全性配置元素,并且在容器之間是可移植的。因此,未改變的 web.xml 稍后可以在 Community Edition環(huán)境中工作。然而,您在 Tomcat 中部署和使用應(yīng)用程序之前,應(yīng)該設(shè)置該應(yīng)用程序要訪問(wèn)的 Derby RDBMS。
3. 設(shè)置 Derby 網(wǎng)絡(luò)服務(wù)器
首先,請(qǐng)確保包裝 Apache Derby 10.1。將 DERBY_INSTALL 環(huán)境變量設(shè)置為 Derby 安裝目錄,并確保 CLASSPATH 環(huán)境變量中包含下列元素:
在源代碼分配中,提供的 sp.bat 文件可用于設(shè)置這些變量。如果您使用該批處理文件,請(qǐng)確保首先對(duì)其進(jìn)行修改,以反映您自己實(shí)際的 Derby 安裝目錄。然后,您可以使用以下命令在控制臺(tái)窗口中啟動(dòng) Derby 網(wǎng)絡(luò)服務(wù)器:
|
Derby 服務(wù)器啟動(dòng)并在缺省端口 1527 進(jìn)行偵聽(tīng)。
接下來(lái),創(chuàng)建要使用的數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)名為 generalstore
,它只包含一個(gè)名為 promotions
的表。createdb1.sql 文件將執(zhí)行該創(chuàng)建并填充數(shù)據(jù)庫(kù)。
使用 ij 命令執(zhí)行 SQL 腳本:
|
createdb1.sql 腳本包含清單 5 所示的 SQL 命令。
清單 5. createdb1.sql 腳本:創(chuàng)建數(shù)據(jù)庫(kù)表并填充數(shù)據(jù)
|
如果您看到消息 ERROR 08001: No suitable driver
,則所需的 lib/derbyclient.jar 庫(kù)不在 CLASSPATH 環(huán)境變量中。
4. Tomcat 5.5 JNDI 資源引用和 JDBC 連接器
checkoutcart.jsp 頁(yè)面使用 JSTL 的 SQL 支持標(biāo)記訪問(wèn)促銷數(shù)據(jù)庫(kù)并輸出促銷消息。清單 6 顯示訪問(wèn) RDBMS 的代碼摘錄。
清單 6. 訪問(wèn)數(shù)據(jù)庫(kù)服務(wù)器的 checkoutcart.jsp 中的 JSP 代碼
|
JSTL<sql:query> 標(biāo)記將通過(guò) JNDI 查找名為 jdbc/storeDB 的數(shù)據(jù)源。該名稱引用是以 J2EE標(biāo)準(zhǔn)方式在應(yīng)用程序的 web.xml 部署描述符中定義的。該標(biāo)準(zhǔn)配置適用于 Tomcat 5.5 和 Community Edition。清單7 顯示該配置。
清單 7. 指定 JNDI 數(shù)據(jù)源引用的 web.xml 中的元素
|
現(xiàn)在,您需要配置該引用,以匹配實(shí)際的JDBC 驅(qū)動(dòng)程序和 RDBMS 連接。這是通過(guò)一種容器的特定方式完成的,對(duì)于 Tomcat 和 Community Edition來(lái)說(shuō)有所不同。對(duì)于 Tomcat 5.5,可以在 META-INF/context.xml 文件(位于 dd 目錄)中進(jìn)行配置(清單 8)。
清單 8. 將 JNDI 資源與 Derby JDBC 連接器相關(guān)聯(lián)的 Tomcat 的特定 context.xml 描述符
|
此處,Derby JDBC 驅(qū)動(dòng)程序org.apache.derby.jdbc.ClientDriver 用于在 URLjdbc:derby://localhost/generalstore 訪問(wèn)數(shù)據(jù)庫(kù)。Derby 服務(wù)器具有缺省的用戶“APP”和密碼“APP”。
5. 使用管理器應(yīng)用程序部署到 Tomcat 5.5 環(huán)境
要使用自定義設(shè)置部署應(yīng)用程序 WAR 文件,請(qǐng)啟動(dòng) Tomcat 5.5 服務(wù)器并在 Web 瀏覽器中指向:
|
您將被提示登錄;這要使用我們先前設(shè)置的 UserDatabaseRealm。由于需要管理人員角色,因此使用用戶“tomcat”和密碼“tomcat”。
管理器應(yīng)用程序?qū)@示所有部署的模塊。滾動(dòng)到底部,此處有一個(gè)框“Deploy directory or WAR file located on server”。對(duì)于“Context path”,輸入 /Shopping
,而對(duì)于“WAR or Directory URL”,輸入到 generalstore.war 文件的絕對(duì)路徑。按下 Deploy 按鈕?,F(xiàn)在您應(yīng)該看到運(yùn)行于 /Shopping 上下文的 General Store 應(yīng)用程序。圖 4 顯示成功部署后的管理器應(yīng)用程序。
使用下面的 URL 嘗試訪問(wèn)應(yīng)用程序:
http://localhost:8080/Shopping/store.cgi
聯(lián)系客服