本教程是分 5 部分的教程系列的第 2 部分。本教程講解 Apache Tomahawk。在這個(gè)系列的
第 1 期 中,介紹了 Java?Server Faces?(JSF),并在 Apache Geronimo 上構(gòu)建和成功地部署了一個(gè)簡(jiǎn)單的 JSF 應(yīng)用程序。JSF 是一種基于 Java 的新框架,它使 Java Platform, Enterprise Edition(Java EE)應(yīng)用程序圖形用戶界面(GUI)的構(gòu)建工作變得更為容易?,F(xiàn)在將研究 Apache Tomahawk(它提供了幾個(gè)定制的 100% 與 JSF 兼容的組件),并學(xué)習(xí)如何將它集成到應(yīng)用程序來(lái)改進(jìn)界面。
開(kāi)始之前
本教程向 Java 程序員講解如何使用 JSF 組件構(gòu)建高度交互性的部署在 Apache Geronimo 上的 Java EE 應(yīng)用程序。本教程假設(shè)讀者將使用 Eclipse IDE 作為開(kāi)發(fā)平臺(tái)。
關(guān)于本教程
本教程講解 Apache Tomahawk,這是一套可以改進(jìn) JSF 應(yīng)用程序界面的補(bǔ)充組件。我們將添加一些輸入驗(yàn)證器和其他輸入組件,從而進(jìn)一步開(kāi)發(fā)開(kāi)發(fā)者論壇注冊(cè)頁(yè)面的前端。
關(guān)于本系列
本教程是關(guān)于使用 JSF 構(gòu)建 Apache Geronimo 應(yīng)用程序的分五部分的教程系列的第 2 部分。整個(gè)系列教程包括以下幾個(gè)部分:
第 1 部分:使用 Eclipse 和 Apache MyFaces Core 構(gòu)建基本的應(yīng)用程序 介紹如何使用 JSF 標(biāo)準(zhǔn)的 Apache MyFaces 實(shí)現(xiàn)以及 Geronimo(一種也是來(lái)自 Apache 的免費(fèi)應(yīng)用服務(wù)器)。這個(gè)教程講解如何使用 Eclipse IDE 的 Web Tool Platform(WTP)來(lái)構(gòu)建 JSF 應(yīng)用程序。
第 2 部分:在 JavaServer Faces 中使用 Tomahawk 展示如何在 Geronimo 應(yīng)用程序中集成 Apache Tomahawk。Tomahawk 提供了幾個(gè)與 JSF 100% 兼容的定制組件。
第 3 部分:在 JavaServer Faces 中使用 ajax4jsf 演示如何使用 Sun 的免費(fèi)開(kāi)放源碼框架 ajax4jsf 使 Geronimo 應(yīng)用程序獲得 Asynchronous JavaScript + XML(Ajax)功能。
第 4 部分:使用 ADF Faces 擴(kuò)展 JSF 講解怎樣將 ADF Faces 中的組件集成到 Geronimo 應(yīng)用程序中。Oracle 的 ADF Faces 是構(gòu)建于 JSE 之上的一組非常豐富的 UI 組件(它是用 Trinidad 這個(gè)名稱捐獻(xiàn)給 Apache 的代碼的一部分)。
第 5 部分:將 JSF 應(yīng)用程序與 Spring 集成 展示如何將 JSF 應(yīng)用程序與 Spring 框架集成。Spring 是一個(gè)流行的框架,它使 Geronimo 開(kāi)發(fā)者能更容易地構(gòu)建 Java EE 應(yīng)用程序。
系統(tǒng)需求
為了學(xué)習(xí)本教程,需要有下列工具:
Geronimo,Apache 的 Java EE 服務(wù)器項(xiàng)目。根據(jù)需要,Geronimo 提供 Tomcat 和 Jetty 兩種風(fēng)格。我們采用的是 Jetty 風(fēng)格(1.1 版),因?yàn)樗∫稽c(diǎn)兒。
MyFaces,Apache 的 JSF 實(shí)現(xiàn)。請(qǐng)從 Apache 下載核心版本(不帶 Tomcat)。本教程中使用的版本是 1.1.3 版。
Tomahawk,它提供用于 MyFaces 的額外組件和輸入驗(yàn)證器,同時(shí)與 JSF 100% 兼容。
Eclipse,這是一個(gè)可支持大量語(yǔ)言和平臺(tái)的可擴(kuò)展開(kāi)放源碼 IDE。
Eclipse Web Tools Platform(WTP),它給 Eclipse 添加了對(duì) XML 和 JavaScript 編輯的支持以及對(duì) JSF 的基本支持。
將 Java 1.4 或更新版本 安裝到您的系統(tǒng)中。Eclipse 二進(jìn)制文件中帶有自己的 Java 運(yùn)行時(shí),但 Geronimo 和 MyFaces 則沒(méi)有(帶運(yùn)行時(shí)會(huì)使下載歸檔文件的尺寸顯著變大)。在本教程中,我們使用 Mac OS X 10.4 所用的 Java 1.5,但平臺(tái)應(yīng)該不是問(wèn)題。可以從 Sun Microsystems 或 IBM? 處獲得 Java 技術(shù)的文件。
概述
在創(chuàng)建 Web 應(yīng)用程序時(shí),Java Servlet 和 JavaServer Pages?(JSP?)技術(shù)提供了一個(gè)強(qiáng)大的環(huán)境,但并沒(méi)有給出創(chuàng)建用戶界面(UI)的標(biāo)準(zhǔn)方法。您必須全靠自己來(lái)管理 JSP 頁(yè)面中所有表單的狀態(tài),還必須把進(jìn)來(lái)的 HTTP 請(qǐng)求分派給適當(dāng)?shù)氖录幚沓绦?。如果站點(diǎn)的 GUI 很復(fù)雜,隨應(yīng)用程序而產(chǎn)生的復(fù)雜的基礎(chǔ)設(shè)施最終會(huì)變得難以管理。此外,站點(diǎn)還會(huì)有些特有的行為以及其他一些細(xì)節(jié)問(wèn)題,使得您構(gòu)建的代碼很難被重用。JSF 提供了一種簡(jiǎn)化高層任務(wù)(例如 UI 組件的排列和重用)的現(xiàn)成工具,并能夠把組件的狀態(tài)和輸入處理與決定應(yīng)用程序行為的對(duì)象關(guān)聯(lián)起來(lái)。
Apache Geronimo
Apache Geronimo 是一個(gè)開(kāi)放源碼(采用 Apache Software Foundation 許可協(xié)議)的 Java EE 服務(wù)器,其設(shè)計(jì)目的是盡可能增強(qiáng)應(yīng)用程序的兼容性和性能。它的當(dāng)前版本(到寫本文時(shí)是 1.1 版)通過(guò)了 Sun 的 Java 2 Platform, Enterprise Edition(J2EE?)的 Technology Compatibility Kit(TCK)測(cè)試,這意味著它符合 Sun 的規(guī)范,與 J2EE 服務(wù)器完全兼容。
與 Jetty 或 Tomcat Web 服務(wù)器打包在一起時(shí),Geronimo 非常易于啟用和運(yùn)行,而且它已經(jīng)部署了一個(gè)極其有用的管理界面應(yīng)用程序。不需要以任何方式重新啟動(dòng)或重新配置服務(wù)器,就可以從管理控制臺(tái)上載并啟動(dòng) Web 應(yīng)用程序。
Apache MyFaces
Apache MyFaces 是第一個(gè)免費(fèi)的開(kāi)放源碼的 JSF Web 應(yīng)用程序框架實(shí)現(xiàn)。JSF 類似于流行的 Struts 框架,實(shí)現(xiàn)了模型 - 視圖 - 控制器(MVC)模式,但是它的一些特性是 Struts 沒(méi)有提供的。JSF 是由 Java Specification Request #127(JSR 127)規(guī)范所定義的,這個(gè)規(guī)范已經(jīng)被 Web 應(yīng)用程序行業(yè)的專家批準(zhǔn)成為 Java Community Process(JCP)規(guī)范。
Apache Tomahawk
Apache Tomahawk 在 JSF 規(guī)范包含的組件之外提供了一套額外的 JSF 組件,同時(shí)與任何符合 JSF 1.1 的實(shí)現(xiàn)(比如 MyFaces)100% 兼容。
Eclipse
Eclipse 是按照一個(gè)可擴(kuò)展的面向插件的體系結(jié)構(gòu)而構(gòu)建的,它是一個(gè)開(kāi)放源碼的集成開(kāi)發(fā)環(huán)境(IDE)。因此,只要有這一個(gè) IDE 就能夠支持做任何工作所需的幾乎任何語(yǔ)言、任務(wù)、平臺(tái)和數(shù)據(jù)文件。這樣的話,開(kāi)發(fā)人員將可以從出色的 Java 開(kāi)發(fā)支持和 WTP 項(xiàng)目的插件中獲益。WTP 提供了支持 XML 的編輯器,它還提供了實(shí)驗(yàn)性的 MyFaces 支持。
我們來(lái)很快地看一下我們的應(yīng)用程序示例。
應(yīng)用程序示例
在 第 1 部分 中,使用 Geronimo 部署了一個(gè)簡(jiǎn)單的用 MyFaces 編寫的 Web 應(yīng)用程序,它為您創(chuàng)建自己的 Web 應(yīng)用程序提供了一個(gè)很好的開(kāi)端。這個(gè)應(yīng)用程序?yàn)橐粋€(gè)假想的面向開(kāi)發(fā)者的論壇處理注冊(cè)過(guò)程。
在下一節(jié)中,將回顧第一個(gè)教程中所做的工作,然后討論 Tomahawk 的組件并在注冊(cè)應(yīng)用程序中添加幾個(gè) Tomahawk 組件。
回顧
在 第 1 部分 中,介紹了 Apache Geronimo 和 JSF 標(biāo)準(zhǔn)的 MyFaces 實(shí)現(xiàn)。學(xué)習(xí)了如何使用 Eclipse IDE 創(chuàng)建新的 JSF 項(xiàng)目、將它導(dǎo)出為 .war 文件并將它部署在 Geronimo 服務(wù)器上。還看到了如何使用 Eclipse 中的 Faces Configuration 編輯器將 JSP 處理結(jié)果連接到適當(dāng)?shù)捻憫?yīng)文件。
導(dǎo)入 devSignup 項(xiàng)目
應(yīng)該從 第 1 部分 下載 devSignup 示例項(xiàng)目,因?yàn)楸窘坛毯竺鎸⒏倪M(jìn)它。
啟動(dòng) Eclipse,如果還沒(méi)有安裝 Web Tools Platform 及其依賴項(xiàng),那么使用 Update Manager 安裝它們。在從插件列表中選擇 Web Tools Platform 之后,一定要在 Update Manager 中點(diǎn)擊 Select Required 按鈕;這將確保獲得至少兩個(gè)其他項(xiàng)目的必要部分(Eclipse Modeling Framework 和 Graphical Editing Framework)。
從菜單選擇 File > New Project 顯示 New Project 對(duì)話框(見(jiàn) 圖 1)。
圖 1. 創(chuàng)建新 Eclipse 項(xiàng)目
展開(kāi) General 類別并選擇 Project。
點(diǎn)擊 Next。
輸入 devSignup 作為項(xiàng)目名,然后點(diǎn)擊 Finish 創(chuàng)建空項(xiàng)目。
在 Eclipse 的 Navigator 視圖中右擊新的 devSignup 項(xiàng)目,然后在上下文菜單中選擇 Import 顯示 Import 對(duì)話框(見(jiàn) 圖 2)。
圖 2. 導(dǎo)入 devSignup 項(xiàng)目的文件
展開(kāi) General 類別并選擇 Archive File(因?yàn)檫@個(gè)項(xiàng)目是作為存檔文件 devSignup-src.zip 提供的)。
點(diǎn)擊 Next。
點(diǎn)擊 Browse 按鈕并選擇 devSignup 項(xiàng)目的存檔文件(見(jiàn) 圖 3)。
圖 3. devSignup 項(xiàng)目來(lái)自一個(gè) ZIP 存檔文件
點(diǎn)擊 Finish 導(dǎo)入 devSignup Web 應(yīng)用程序的源文件。查看 Navigator 視圖,您會(huì)注意到所有文件都深了一層,位于一個(gè)額外的 devSignup 文件夾下(見(jiàn) 圖 4)。
圖 4. 為什么我的文件在一個(gè)子文件夾中?
不幸的是,這在 Eclipse 中很常見(jiàn)。
選擇額外文件夾下的所有東西(.metadata、.settings、build、src 和 WebContent 目錄以及 .classpath 和 .project)并將它們拖到頂級(jí) devSignup 文件夾中。
刪除空的 devSignup 文件夾,這樣就設(shè)置好了。
在覆蓋頂級(jí) .project 文件時(shí),Eclipse 會(huì)注意到這實(shí)際上是一個(gè) Web 應(yīng)用程序并對(duì)所有文件進(jìn)行驗(yàn)證。如果它詢問(wèn)是否允許緩存來(lái)自 Sun 開(kāi)發(fā)人員 Web 站點(diǎn)的文件,那么同意這么做;Eclipse 將使用這些文件驗(yàn)證 Web 項(xiàng)目。(在大多數(shù)情況下是這樣的。除非您的系統(tǒng)碰巧設(shè)置得與我常用的 iBook 完全一樣(嗨,不要笑,這種可能性很小,但是存在),否則 Eclipse 無(wú)法找到部署這個(gè)項(xiàng)目所需的 MyFaces .jar 文件。)
修復(fù) devSignup 項(xiàng)目
devSignup 項(xiàng)目的某些部分包含系統(tǒng)特有的信息,比如安裝 Java 庫(kù)和 MyFaces JAR 的路徑。這也是用 Eclipse 共享項(xiàng)目時(shí)的常見(jiàn)問(wèn)題。我們來(lái)查看項(xiàng)目的設(shè)置并修復(fù)需要修復(fù)的設(shè)置。
右擊 devSignup 項(xiàng)目并從上下文菜單中選擇 Properties。Eclipse 顯示 Properties 對(duì)話框,見(jiàn) 圖 5。
圖 5. Eclipse 的 devSignup 項(xiàng)目屬性
點(diǎn)擊列表中的 JSF Library References 條目;需要告訴這個(gè)項(xiàng)目 MyFaces 文件在哪里。Eclipse 顯示這個(gè)項(xiàng)目的 JSF Library References 屬性(見(jiàn) 圖 6)。
圖 6. 設(shè)置 JSF 庫(kù)引用
在面板的頂部,選中 Deploy jars to WEB-INF/lib,因?yàn)槟隙ㄏM趧?chuàng)建應(yīng)用程序時(shí)包含 JSF 庫(kù)。
點(diǎn)擊這個(gè)復(fù)選框正下方的 New 按鈕,顯示 Create JSF Implementation Library 對(duì)話框,見(jiàn) 圖 7。
圖 7. 創(chuàng)建一個(gè) JSF 實(shí)現(xiàn)庫(kù)
給這個(gè)庫(kù)起一個(gè)描述性的名字;我起的名字是 MyFaces (Core)。
從 Version Supported 下拉列表中選擇 v1_1(因?yàn)?Apache MyFaces 支持 1.1 版的 JSF 規(guī)范),然后點(diǎn)擊 Add 按鈕,選擇要包含在這個(gè)庫(kù)定義里的 JSF .jar 文件。
包含來(lái)自 MyFaces Core 發(fā)行版的以下文件:
commons-beanutils-1.7.0.jar
commons-codec-1.3.jar
commons-collections-3.1.jar
commons-digester-1.6.jar
commons-el-1.0.jar
commons-lang-2.1.jar
commons-logging-1.0.4.jar
jstl-1.1.0.jar
myfaces-api-1.1.3.jar
myfaces-impl-1.1.3.jar
這是在當(dāng)前的 MyFaces 實(shí)現(xiàn)中最精簡(jiǎn)的一組 JSF 庫(kù)(有些文檔中在這個(gè)清單里沒(méi)有 jstl.jar ,但這是一個(gè)必需的 文件)。
這里需要注意的一點(diǎn)是:在 JSF Implementation 庫(kù)中將包含對(duì)您的 .jar 文件的完全路徑引用;該庫(kù)不會(huì)把這些文件拷貝到您的工作區(qū)里。這樣做是有益的,因?yàn)椴槐貫槊總€(gè)項(xiàng)目都生成這些 JAR 文件的一個(gè)副本;但另一方面,這也有壞處,因?yàn)檫@樣就不能利用 SCM 系統(tǒng),甚至也無(wú)法通過(guò)導(dǎo)出 Eclipse 項(xiàng)目,把這個(gè)項(xiàng)目移交給另一個(gè)開(kāi)發(fā)人員。
添加完所需的 .jar 文件后,單擊 Finish 創(chuàng)建一個(gè) JSF 實(shí)現(xiàn)庫(kù)。
接下來(lái),需要糾正 Java Build Path 面板的內(nèi)容(見(jiàn) 圖 8)。
圖 8. devSignup 的 Java Build Path 面板
選擇 JRE System Library 條目;如果它針對(duì)的平臺(tái)與您目前的平臺(tái)不同,也無(wú)需擔(dān)心。
點(diǎn)擊 Edit 按鈕,顯示 Edit Library 對(duì)話框。
選擇一個(gè)適當(dāng)?shù)?Java 系統(tǒng)庫(kù),然后點(diǎn)擊 Finish。
在 Properties 對(duì)話框中點(diǎn)擊 OK 來(lái)應(yīng)用這些修改。Eclipse 會(huì)重新構(gòu)建 Java 源文件,項(xiàng)目應(yīng)該能夠正常工作了!
Tomahawk 組件
Tomahawk 項(xiàng)目將它的組件松散地劃分為三類:組件、驗(yàn)證器和其他東西。我們來(lái)看看每一類給 JSF 應(yīng)用程序開(kāi)發(fā)人員提供了什么,并展望一下它們對(duì)本系列的 第一個(gè)教程 中開(kāi)發(fā)的 JSF Developer Forum Signup 應(yīng)用程序能夠進(jìn)行怎樣的擴(kuò)展。
一個(gè)重要的細(xì)節(jié)是:許多這些組件需要包含圖形元素(比如圖像)或 JavaScript? 代碼。它們是 Tomahawk .jar 文件的一部分,并自動(dòng)地包含在 MyFaces Extensions Filter 的 JSP 輸出中。在下一節(jié)中,將學(xué)習(xí)如何安裝它,所以不必為缺少 Tomahawk 組件所需的圖像或 JavaScript 擔(dān)心。
組件
大多數(shù) Tomahawk 組件(見(jiàn) 表 1)是擴(kuò)展的或高級(jí)的用戶界面組件,其設(shè)計(jì)目的是使 Web 應(yīng)用程序的外觀和感覺(jué)更接近一般的桌面應(yīng)用程序。其中一些組件提供了極其復(fù)雜的圖形部件,如果您的應(yīng)用程序中碰巧需要這樣的部件,那么直接使用它們可以節(jié)省大量開(kāi)發(fā)時(shí)間。
表 1. Tomahawk 組件
組件 | 描述 |
Alias Bean (Data, <t:aliasBean>) | 允許為現(xiàn)有的 bean 創(chuàng)建別名。例如,假設(shè)有一個(gè)現(xiàn)有的子視圖(<f:subview>),它引用一個(gè)名為 holder 的 bean,但是表單的 bean 名為 userData。可以將 <f:subview> 包裝在 <t:aliasBean> 中,從而表示對(duì) holder 的任何引用都轉(zhuǎn)發(fā)到 userData bean。 |
Buffer (Data, <t:buffer>) | 將頁(yè)面的一部分放進(jìn) bean 中,以便在以后顯示它。 |
Calendar (Input, <t:inputCalendar>) | 顯示一個(gè)日歷,讓用戶可以輕松地選擇一個(gè)日期。周名稱、月名稱和每周的啟始日是根據(jù)系統(tǒng)地區(qū)自動(dòng)選擇的,所以本地化是自動(dòng)的。 |
Column (Column, <t:column>) | <h:column> 的擴(kuò)展版本,提供了直通屬性(也就是說(shuō),它們將直接復(fù)制進(jìn)輸出的 HTML 中),允許精確地控制如何顯示頁(yè)眉、頁(yè)腳和數(shù)據(jù)單元格,以及它們?nèi)绾雾憫?yīng) JavaScript 事件。 |
Columns (Data, <t:columns>) | 在 Data Table 中使用,在表中提供數(shù)量可以動(dòng)態(tài)變化的列。 |
Data List (Data, <t:dataList>) | 與 Data Table 相似,但是將它的行顯示為簡(jiǎn)單的逗號(hào)分隔列表、帶符號(hào)列表或編號(hào)列表。 |
Data Scroller (Panel, <t:dataScroller>) | 這個(gè)控件允許翻頁(yè)瀏覽 UIData(<h:dataTable>);它顯示 first、fast rewind、previous、next、fast forward 和 last 按鈕來(lái)控制顯示。 |
Date (Input, <t:inputDate>) | 顯示一個(gè)用來(lái)輸入日期的文本輸入控件??梢越邮苋掌诨驎r(shí)間(或同時(shí)接受這兩者),提供一個(gè)用來(lái)選擇日期的彈出日歷,處理 12 小時(shí)或 24 小時(shí)時(shí)間。 |
Extended Data Table (Data, <t:dataTable>) | 擴(kuò)展了標(biāo)準(zhǔn)的 JSF DataTable,能夠保存 DataModel 的狀態(tài)并支持可點(diǎn)擊的排序標(biāo)題。 |
File Upload (Input, <t:inputFileUpload>) | 顯示一個(gè)允許用戶上傳文件的 HTML 輸入字段。允許指定這個(gè)字段接受哪種 Multipurpose Internet Mail Extensions(MIME)類型。 |
Html Editor (Input, <t:inputHtml>) | 顯示一個(gè)簡(jiǎn)單的基于 HTML 的行內(nèi)字處理程序。當(dāng)前,在每個(gè)頁(yè)面上只能有一個(gè) HTML 編輯器,但是如果每次只顯示一個(gè)編輯器,那么可以使用選項(xiàng)卡包含多個(gè)編輯器。 |
Html Tag (Output, <t:htmlTag>) | 顯示任何 HTML 標(biāo)記。 |
Javascript Listener (Output, <t:jsValueChangeListener>) | 在客戶機(jī)上模擬 JavaScript 提供的 Value Change Listener 功能。當(dāng)對(duì)一個(gè)控件的修改應(yīng)該在其他控件中觸發(fā)修改時(shí),可以使用這個(gè)組件??梢栽谌魏?Input 控件中嵌入一個(gè)或更多的 Javascript Listener,當(dāng)這個(gè)控件被更新時(shí),這些 Listener 都被觸發(fā)。 |
JSCook Menu (Command, <t:jscookMenu>) | 顯示一個(gè)基于 JavaScript 的動(dòng)態(tài)菜單。 |
Newspaper Table (Obsolete!) | 這個(gè)控件已經(jīng)廢棄了,所以不要使用它。Newspaper Table 的功能現(xiàn)在包含在 Extended Data Table 組件中。 |
Panel Navigation (Panel, <t:panelNavigation>) | 顯示一個(gè)垂直菜單并支持嵌套的菜單項(xiàng)。 |
Panel Navigation 2 (Panel, <t:panelNavigation2>) | 與 Panel Navigation 組件相似,但是使用無(wú)序列表而不是表進(jìn)行顯示。還可以使用 Navigation Menu Items 動(dòng)態(tài)地建立菜單樹(shù)。 |
Panel Stack (Panel, <t:panelStack>) | 顯示重疊的 Panel,允許動(dòng)態(tài)地切換面板。 |
Popup (Panel, <t:popup>) | 一個(gè)在發(fā)生鼠標(biāo)事件時(shí)顯示的彈出面板(比如當(dāng)鼠標(biāo)指針停留在另一個(gè)用戶界面組件上時(shí))。 |
Schedule (Panel, <t:schedule>) | 與 Microsoft? Outlook? 客戶機(jī)或 Evolution 中的日程安排程序相似,在日、工作周、周或月視圖中顯示約會(huì)或活動(dòng)安排。 |
Style Sheet (Output, <t:stylesheet>) | 顯示常用 CSS 樣式表文件的路徑。 |
TabbedPane (Panel, <t:panelTabbedPane>) | 顯示一個(gè)選項(xiàng)卡式的 Panel,允許用戶在 Panel 之間進(jìn)行切換。這種切換可以在客戶機(jī)上進(jìn)行處理,也可以在服務(wù)器上進(jìn)行處理(這會(huì)導(dǎo)致頁(yè)面刷新)。 |
Tree (HtmlTree, <t:tree>) | MyFaces 中 HTML 樹(shù)組件的擴(kuò)展版本,允許為樹(shù)、節(jié)點(diǎn)和選擇的節(jié)點(diǎn)指定 CSS 類。 |
Tree2 (HtmlTree, <t:tree2>) | 一個(gè)高度可定制的擴(kuò)展的樹(shù)組件,它的數(shù)據(jù)由一個(gè)后端 bean 提供。幾乎任何類型的 JSF 組件(文本、圖像、復(fù)選框等等)都可以顯示在樹(shù)的節(jié)點(diǎn)中,而且除了標(biāo)準(zhǔn)的服務(wù)器端轉(zhuǎn)換之外,它還支持在客戶端展開(kāi)節(jié)點(diǎn)(無(wú)需頁(yè)面刷新!)。 |
Tree Table (HtmlTreeColumn, <t:tree>) | 顯示一個(gè)帶樹(shù)型列的表。 |
UI Save State (Data, <t:saveState>) | 允許對(duì) bean 和值進(jìn)行持久化,使其生命周期長(zhǎng)于 Request 范圍,但是短于 Session 范圍??梢允购蠖?bean 和值的持久化范圍與視圖組件相同。傳統(tǒng)的 JSP 應(yīng)用程序在 HttpSession 對(duì)象中保存狀態(tài)信息,這需要一個(gè)過(guò)期日期,而且有幾個(gè)與服務(wù)器重啟和服務(wù)器集群有關(guān)的問(wèn)題。UI Save State 組件將數(shù)據(jù)編碼在客戶機(jī)響應(yīng)中,并在下一次客戶機(jī)請(qǐng)求中自動(dòng)恢復(fù)它。 |
顯然,其中一些組件非常有用,而其他組件可能只適用于很特殊的場(chǎng)景。
現(xiàn)在來(lái)看看 Tomahawk 的驗(yàn)證器組件。
驗(yàn)證器
Tomahawk 還提供了幾個(gè)方便的驗(yàn)證器(見(jiàn) 表 2),可以用來(lái)確保輸入數(shù)據(jù)的質(zhì)量。
表 2. Tomahawk 驗(yàn)證器
驗(yàn)證器 | 描述 |
validateCreditCard (<t:validateCreditCard>) | 驗(yàn)證 American Express、Discover、MasterCard 或 Visa 的信用卡信息。還可以用來(lái)確定數(shù)據(jù)不是支持的信用卡之一。 |
validateEmail (<t:validateEmail>) | 驗(yàn)證電子郵件地址。 |
validateEqual (<t:validateEqual>) | 確保這個(gè)組件中的數(shù)據(jù)與另一個(gè)組件中的數(shù)據(jù)匹配。適用于驗(yàn)證密碼或電子郵件地址等信息。 |
validateRegExpr (<t:validateRegExpr>) | 確保這個(gè)組件中的數(shù)據(jù)與指定的正則表達(dá)式匹配。用來(lái)驗(yàn)證全數(shù)字的字段、電話號(hào)碼等信息。 |
validateUrl (<t:validateUrl>) | 驗(yàn)證 URL。 |
通過(guò)重用這些驗(yàn)證器,可以減少大量工作。正則表達(dá)式驗(yàn)證器尤其靈活,只要能夠?qū)⑺璧臄?shù)據(jù)表示為正則表達(dá)式,就能夠進(jìn)行驗(yàn)證。
現(xiàn)在來(lái)看看 Tomahawk 庫(kù)中包含的其他東西。
其他東西
Tomahawk 還提供了對(duì) JSF 開(kāi)發(fā)人員有幫助的其他一些東西(見(jiàn) 表 3),其中的擴(kuò)展過(guò)濾器是在使用許多 Tomahawk 組件時(shí)都需要的。
表 3. 其他 Tomahawk 內(nèi)容
Tomahawk 內(nèi)容 | 描述 |
擴(kuò)展過(guò)濾器 | 一些 Tomahawk 組件需要對(duì) JavaScript、CSS 樣式表和圖像的額外支持。這些資源包含在 Tomahawk .jar 文件中,而擴(kuò)展過(guò)濾器提供了從生成的 HTML 訪問(wèn)這些資源所需的代碼和 URL。擴(kuò)展過(guò)濾器還處理文件上傳組件(<t:inputFileUpload>)所使用的多部分請(qǐng)求。 |
forceId 屬性 | 可以為任何 Tomahawk 組件指定這個(gè)屬性,允許將這個(gè) ID 設(shè)置為 ID 屬性指定的值。如果需要對(duì)特定的 HTML 元素 ID 使用 JavaScript 或 CSS 樣式,這個(gè)屬性就很有用。 |
JspTilesViewHandler | Tomahawk 允許使用來(lái)自 Struts 應(yīng)用程序的 tiles,從而能夠?qū)F(xiàn)有的 tiles 集成到 JSF 應(yīng)用程序中。 |
如果您還不是 Struts 開(kāi)發(fā)人員,那么擴(kuò)展過(guò)濾器可能是這些東西中最重要的,因?yàn)樵S多 Tomahawk 組件都需要它。因?yàn)?Tomahawk 文檔似乎沒(méi)有包含這方面的詳細(xì)信息,所以如果要使用 Tomahawk 特性,最好總是使用擴(kuò)展過(guò)濾器。幸運(yùn)的是,使用它并不太影響性能。
在下一節(jié)中,將在 MyFaces 應(yīng)用程序中使用 Tomahawk 并在 Eclipse 中用 Web Tools Platform 進(jìn)行開(kāi)發(fā)。
在 Web 應(yīng)用程序中使用 Tomahawk
如果您像我一樣性急的話,現(xiàn)在可能迫不及待地想開(kāi)始編寫一些代碼,試試這些方便的組件。首先,您應(yīng)該仔細(xì)考慮一下在自己的 Web 應(yīng)用程序中需要使用 Tomahawk 做什么。接下來(lái),我們對(duì) 第一個(gè)教程 中的 Developer Forum Signup 應(yīng)用程序進(jìn)行擴(kuò)展,在其中利用一些 Tomahawk 組件。
將 Tomahawk 添加到項(xiàng)目中
將 Tomahawk 組件添加到 JSF 應(yīng)用程序中是很簡(jiǎn)單明了的。需要將一個(gè)資源添加到 Tomahawk .jar 文件中、將擴(kuò)展過(guò)濾器添加到 web.xml 文件中并將 Tomahawk 標(biāo)記庫(kù)包含到 JSF 頁(yè)面中。
在 Eclipse 的 Navigator 視圖中右擊 devSignup 項(xiàng)目,然后在上下文菜單中選擇 Properties。Eclipse 顯示項(xiàng)目屬性對(duì)話框。
在列表中點(diǎn)擊 JSF Library References,顯示 JSF Library References 面板,見(jiàn) 圖 9。
圖 9. 將 Tomahawk 添加到 devSignup 項(xiàng)目中
點(diǎn)擊選擇列表區(qū)域中的 New 按鈕(不是 Implementation Library 旁邊的按鈕),顯示 Create JSF Library 對(duì)話框(見(jiàn) 圖 10)。
圖 10. 創(chuàng)建新的 JSF 庫(kù)
使用這個(gè)對(duì)話框定義一個(gè) JSF 庫(kù),以后可以在項(xiàng)目中包含這個(gè)庫(kù)。這非常適合添加那些包含幾個(gè) JAR 的組件庫(kù)或依賴于其他項(xiàng)目的 .jar 文件的組件庫(kù)。
在 Library Name 字段中輸入庫(kù)名(我使用 Tomahawk),然后從 Version Supported 下拉列表中選擇 v1_1,因?yàn)?MyFaces 實(shí)現(xiàn)了 1.1 版的 JSF 規(guī)范。
點(diǎn)擊 Add 按鈕,然后選擇 Tomahawk .jar 文件(如果使用編寫本文時(shí)的版本,那么就是 tomahawk-1.1.3.jar)。
重復(fù)這個(gè)過(guò)程來(lái)添加下面這些 Tomahawk 所需的 Jakarta .jar 文件:
commons-fileupload-1.1.1.jar
commons-validator-1.3.0.jar
jakarta-oro-2.0.8.jar
點(diǎn)擊 Finish,將這個(gè)新的 Tomahawk 庫(kù)添加到項(xiàng)目屬性的 JSF Library References 面板中的列表中。這個(gè)新的 Tomahawk 庫(kù)添加到右邊的列表中,它會(huì)自動(dòng)地包含在項(xiàng)目的 .war 文件中。
點(diǎn)擊 OK 應(yīng)用修改并關(guān)閉項(xiàng)目屬性對(duì)話框。
為了啟用 Tomahawk 擴(kuò)展,需要將擴(kuò)展過(guò)濾器添加到 Web 應(yīng)用程序中。雙擊項(xiàng)目的 web.xml 文件(位于 WebContent/WEB-INF 文件夾中),在 XML 編輯器中打開(kāi)它。如果編輯器處于 Design 模式,就要點(diǎn)擊編輯器底部的 Source 選項(xiàng)卡,從而切換到 Source 模式,這樣就會(huì)看到原始的 XML 樹(shù)。
將 清單 1 中的代碼添加到 web.xml 中;<filter> 和 <filter-mapping> 元素應(yīng)該是 <web-app> 的子元素,而不是任何其他 web.xml 標(biāo)記的子元素。
清單 1. 在 web.xml 中啟用 Tomahawk 擴(kuò)展
<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
<filter-class>
org.apache.myfaces.webapp.filter.ExtensionsFilter
</filter-class>
<init-param>
<param-name>maxFileSize</param-name>
<param-value>20m</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<url-pattern>/faces/myFacesExtensionResource/*</url-pattern>
</filter-mapping>
<filter> 元素添加 MyFaces 擴(kuò)展過(guò)濾器類并將 maxFileSize 參數(shù)設(shè)置為 20MB。maxFileSize 是文件上傳組件允許的最大大小,可以以字節(jié)(一個(gè)數(shù)字)、千字節(jié)(一個(gè)數(shù)字加上 k)、兆字節(jié)(一個(gè)數(shù)字加上 m)或千兆字節(jié)(一個(gè)數(shù)字加上 g)為單位來(lái)指定。
第一個(gè) <filter-mapping> 元素將 MyFaces 擴(kuò)展過(guò)濾器應(yīng)用于指定的 servlet。<servlet-name> 必須與 web.xml 文件中已有的 <servlet> 元素中指定的 servlet 名稱匹配。
第二個(gè) <filter-mapping> 元素告訴 MyFaces 擴(kuò)展過(guò)濾器在處理 Tomahawk 組件使用的額外 JavaScript、樣式表和圖像時(shí)要匹配哪些 URL。與這個(gè)模式匹配的 URL 被解釋和轉(zhuǎn)換為對(duì) Tomahawk .jar 文件中適當(dāng)資源的引用。
需要做的最后一件事是在 .jsp 文件中啟用 Tomahawk 擴(kuò)展。
將下面的代碼添加到每個(gè)使用 Tomahawk 組件的 JSP 頁(yè)面中。在 devSignup 項(xiàng)目中,只有 signup.jsp(響應(yīng)頁(yè)面不使用任何 JSF 代碼)。
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t" %>
這樣就行了!現(xiàn)在已經(jīng)可以在示例應(yīng)用程序中使用 Tomahawk 組件了。
將 Tomahawk 組件添加到 Developer Forum Signup 應(yīng)用程序中
在第一個(gè)教程中創(chuàng)建的 Developer Forum Signup 應(yīng)用程序非常簡(jiǎn)單。它允許用戶輸入屏幕名、電子郵件地址和密碼。對(duì)數(shù)據(jù)沒(méi)有進(jìn)行驗(yàn)證,也沒(méi)有采用任何機(jī)制來(lái)確保用戶輸入的密碼沒(méi)有輸錯(cuò)。清單 2 顯示主注冊(cè)頁(yè)面 signup.jsp 的當(dāng)前狀態(tài)(注意,我已經(jīng)在 <f:view> 元素前面添加了 Tomahawk 標(biāo)記庫(kù))。
清單 2. Developer Forum Signup 頁(yè)面
<?xml version="1.0" encoding="UTF-8" ?>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t" %>
<f:view>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Developer Forum Signup</title>
</head>
<body>
<h1>Developer Forum Signup</h1>
<p>
Welcome to our forums! Please fill in the following form to create your
forum account.
</p>
<h:form>
<dl>
<dt>Screen name:</dt>
<dd>
<h:inputText value="#{signupData.screenName}"/>
</dd>
<dt>Email:</dt>
<dd>
<h:inputText value="#{signupData.email}"/>
</dd>
<dt>Password:</dt>
<dd>
<h:inputSecret value="#{signupData.password}"/>
</dd>
</dl>
<h:commandButton action="#{signupData.register}">Sign
up</h:commandButton>
</h:form>
</body>
</html>
</f:view>
這是一個(gè)簡(jiǎn)單的頁(yè)面,它使用 MyFaces 組件收集用戶的數(shù)據(jù)并在 Sign up 按鈕被點(diǎn)擊時(shí)執(zhí)行 signupData bean 的 register() 方法。
應(yīng)該添加的一個(gè)東西是一個(gè)驗(yàn)證器,用它確保用戶已經(jīng)輸入了有效的電子郵件地址。
編輯 devSignup 項(xiàng)目中的 signup.jsp(如果還沒(méi)有添加 Tomahawk 標(biāo)記庫(kù),那么一定要記得添加它)并將 Email 字段的 <h:input> 標(biāo)記替換為 清單 3 中的代碼。
清單 3. 驗(yàn)證用戶的電子郵件地址
<h:inputText value="#{signupData.email}" id="email" required="true">
<t:validateEmail/>
</h:inputText><br/>
<strong><h:message for="email"/></strong>
這就是需要做的所有工作。Tomahawk 會(huì)自動(dòng)地檢查輸入的數(shù)據(jù),確保它是有效的電子郵件地址。如果不是有效的電子郵件地址,那么它將 ID email 的消息設(shè)置為適當(dāng)?shù)腻e(cuò)誤消息。如果有消息,<h:message> 元素將顯示 ID email 的消息(否則,它什么都不顯示,所以只會(huì)在發(fā)生錯(cuò)誤時(shí)看到這個(gè)消息)。
例如,如果輸入 not!email 作為電子郵件地址,那么在點(diǎn)擊 “Sign up” 按鈕之后可能看到 圖 11 這樣的結(jié)果。
圖 11. 輸入無(wú)效的電子郵件地址
表單會(huì)重新顯示。這一次,設(shè)置了 Email 字段的消息,所以它會(huì)顯示出來(lái);看到了吧,正如我們預(yù)料的,這是一個(gè)錯(cuò)誤消息。
現(xiàn)在,應(yīng)該要求用戶輸入密碼兩次;用戶看不到自己輸入的密碼,所以兩次輸入可以幫助用戶確保正確地輸入了想要設(shè)置的密碼。
將 清單 4 中的代碼添加到 Password 字段的 </dd> 標(biāo)記后面。這會(huì)添加第二個(gè) Password 輸入字段,而且用戶在這里輸入的數(shù)據(jù)必須與第一個(gè) Password 字段的內(nèi)容匹配。
清單 4. 兩次密碼輸入
<dt>Password (for verification):</dt>
<dd>
<h:inputSecret id="password_verify" required="true">
<t:validateEqual for="password"/>
</h:inputSecret><br/>
<strong><h:message for="password_verify"/></strong>
</dd>
這使用 <t:validateEqual> 確保內(nèi)容是相同的,并使用 <h:message> 顯示與表單的這個(gè)部分相關(guān)聯(lián)的任何消息??梢钥吹?圖 12 這樣的錯(cuò)誤消息。
圖 12. 輸入了兩個(gè)不匹配的密碼
可以看到,這個(gè)驗(yàn)證器并不完善。但是,至少已經(jīng)在注冊(cè)頁(yè)面中添加了一些出色的功能,而無(wú)需修改 Java 代碼。
怎么添加更酷一點(diǎn)兒的東西呢?向進(jìn)行注冊(cè)的用戶詢問(wèn)生日。可以使用這一信息確保用戶超過(guò)了 18 歲(如果需要這么做的話),還可以在適當(dāng)?shù)娜兆酉蛴脩糇YR生日快樂(lè)。
將 清單 5 中的代碼添加到 signup.jsp 文件中 </dl> 標(biāo)記的前面。
清單 5. 添加日期輸入控件
<dt>Birthday:</dt>
<dd>
<t:inputDate id="birthday" value="#{signupData.birthday}" popupCalendar="true"/>
</dd>
圖 13 顯示生日提示和一個(gè)支持彈出式日歷的日期輸入控件,這樣用戶就能夠用選擇的方法輸入生日而無(wú)需手工輸入。
圖 13. 添加生日提示和日期輸入控件
因?yàn)橐?signupData bean 的 date 成員,所以最終還必需修改一些 Java 代碼。
編輯 SignupData.java 文件(在 devSignup 項(xiàng)目中 src/devSignup 下面),將 清單 6 中的代碼添加到 SignupData 類中。
清單 6. 在 bean 中添加生日支持
private java.util.Date _birthday = null;
public SignupData() {
_birthday = new java.util.Date();
}
public java.util.Date getBirthday() {
return _birthday;
}
public void setBirthday( java.util.Date newBirthday ) {
this._birthday = newBirthday;
}
并不需要做很多工作,就能夠在 Web 頁(yè)面上添加如此復(fù)雜的數(shù)據(jù)輸入控件!現(xiàn)在可以構(gòu)建并部署這個(gè) Web 應(yīng)用程序,看看已經(jīng)完成的成果。
部署新的 Developer Signup 應(yīng)用程序
我們已經(jīng)做了幾處修改,現(xiàn)在是時(shí)候看看 Developer Signup 應(yīng)用程序的效果了。需要構(gòu)建這個(gè)項(xiàng)目、導(dǎo)出 .war 文件并將它部署到 Geronimo 服務(wù)器上。
在 Eclipse 的 Navigator 視圖中點(diǎn)擊 devSignup 項(xiàng)目,然后從菜單中選擇 Project > Build Project。Eclipse 編譯 Java 代碼并驗(yàn)證 JSP 頁(yè)面和 XML 文件。
在 Navigator 視圖中右擊 devSignup,然后從上下文菜單中選擇 Export。
在 Export 向?qū)е?,展開(kāi) Web 組,選擇 WAR file,然后點(diǎn)擊 Next 顯示 WAR Export 面板,見(jiàn) 圖 14。
圖 14. 導(dǎo)出 .war 文件
點(diǎn)擊 Browse 按鈕,選擇一個(gè)目標(biāo)目錄和 .war 文件的文件名(我將自己的文件作為 devSignup.war 保存到桌面,這樣在服務(wù)器上部署它時(shí)很容易找到它。)
點(diǎn)擊 Finish,導(dǎo)出 .war 文件。
打開(kāi)您喜歡的 Web 瀏覽器并訪問(wèn) http://localhost:8080/console/(如果您的 Geronimo 服務(wù)器不在同一臺(tái)機(jī)器上運(yùn)行,那么要用它的主機(jī)名替換 localhost)。這會(huì)顯示 Geronimo Console Login 屏幕(見(jiàn) 圖 15)。
圖 15. 登錄 Geronimo 的管理控制臺(tái)
登錄管理控制臺(tái)(記住,默認(rèn)用戶名是 server,默認(rèn)密碼是 manager,應(yīng)該修改它們。)
點(diǎn)擊 Console Navigation 列表中 Applications 部分中的 Deploy New,顯示 Install New Applications 屏幕,見(jiàn) 圖 16。
圖 16. 安裝新的 Web 應(yīng)用程序
點(diǎn)擊 Archive 字段旁邊的 Browse 按鈕,找到剛才創(chuàng)建的 .war 文件。
因?yàn)橐呀?jīng)選中了 Start app after install,點(diǎn)擊 Install,上傳 .war 文件并啟動(dòng)應(yīng)用程序。在瀏覽器完成存檔文件的上傳而且 Geronimo 啟動(dòng)了應(yīng)用程序之后,會(huì)看到一個(gè)成功消息。
如果已經(jīng)在服務(wù)器上運(yùn)行過(guò) devSignup(因?yàn)槟呀?jīng)學(xué)習(xí)了第一個(gè)教程),那么要選中 Redeploy application 復(fù)選框,從而安裝新版本并卸載舊版本。
現(xiàn)在,在訪問(wèn) Developer Signup 應(yīng)用程序時(shí)(在我的系統(tǒng)上是 http://localhost:8080/devSignup/signup.faces,如果您的服務(wù)器不在本地機(jī)器上運(yùn)行,那么要用服務(wù)器的主機(jī)名替換 localhost),應(yīng)該會(huì)看到 圖 17 這樣的界面。
圖 17. 改進(jìn)后的應(yīng)用程序
當(dāng)用戶點(diǎn)擊 Birthday 輸入字段旁邊的 ... 按鈕時(shí),出現(xiàn) 圖 18 這樣的組件。(這個(gè)組件如此復(fù)雜,但是我們沒(méi)做多少工作就獲得了這種功能,對(duì)它的支持是自動(dòng)的?。?/p>
圖 18. 日期輸入字段的彈出式日歷
這非???,而且它完全是用 JavaScript 和 CSS 在客戶機(jī)系統(tǒng)上實(shí)現(xiàn)的。惟一的缺點(diǎn)是它看起來(lái)不太像 “本機(jī)” 應(yīng)用程序。
好了!我們已經(jīng)成功地掌握了 Apache Tomahawk 并使用它擴(kuò)展了 Developer Signup Web 應(yīng)用程序。
結(jié)束語(yǔ)
我們研究了 Apache Tomahawk 組件,討論了如何將它們添加到 Eclipse Web 應(yīng)用程序項(xiàng)目中,并使用它們擴(kuò)展了第一個(gè)教程中開(kāi)發(fā)的 Developer Forum Signup 應(yīng)用程序。
在本系列的下一期中,我們將在 JSF 應(yīng)用程序中添加 Ajax 功能,使用它們讓 Developer Forum Signup 應(yīng)用程序更具交互性,同時(shí)避免更多的頁(yè)面重載或轉(zhuǎn)移。
下載
描述 | 名字 | 大小 | 下載方法 |
第 2 部分源代碼 | devSignup-src.zip | 11KB | HTTP |
Signup2 應(yīng)用程序 WAR 文件 | devSignup-war.zip | 3160KB | HTTP |
聯(lián)系客服