開始之前
本教程向 Java 程序員介紹如何使用 JSF 組件來構(gòu)建具有高度交互性的部署在 Apache Geronimo 上的 Java EE 應(yīng)用程序。本教程假定讀者使用 Eclipse 集成開發(fā)環(huán)境(IDE)作為開發(fā)平臺。
關(guān)于本教程
本教程介紹了 Apache Geronimo,它是一個純 Java EE 應(yīng)用服務(wù)器。還介紹了使用 Eclipse IDE 和 Apache MyFaces(這是一個開放源碼的 JSF 框架實(shí)現(xiàn))的 JSF 編程環(huán)境。這里將會開發(fā)一個開發(fā)者論壇注冊頁面的前端,并學(xué)會如何使用常見的輸入方法和數(shù)據(jù)驗(yàn)證技術(shù)。
關(guān)于本系列
這是一個關(guān)于使用 JSF 構(gòu)建 Apache Geronimo 應(yīng)用程序的教程,教程分五部分,這是其中的第 1 部分。在后面的系列教程中包括以下幾個部分:
第 2 部分:在 JavaServer Faces 中使用 Tomahawk 展示了如何在 Geronimo 應(yīng)用程序中集成 Apache Tomahawk。Tomahawk 提供了幾個定制組件,可跟 JSF 100% 兼容。
第 3 部分:在 JavaServer Faces 中使用 ajax4jsf 演示了如何使用 Sun 的 ajax4jsf 工具使 Geronimo 應(yīng)用程序獲得與 Ajax 的兼容性。
第 4 部分:使用 ADF Faces 擴(kuò)展 JSF 教您怎樣將 ADF Faces 中的組件集成到 Geronimo 應(yīng)用程序中。Oracle 的 ADF Faces 是構(gòu)建于 JSE 之上的一組非常豐富的 UI 組件。
第 5 部分:將 JSF 應(yīng)用程序與 Spring 集成 展示了如何將 JSF 應(yīng)用程序與 Spring 框架集成。Spring 是一個流行的框架,它使 Geronimo 開發(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)。請從 Apache 下載內(nèi)核版本(不帶 Tomcat)。本教程中我們使用的版本是 1.1.3 版。
一個空的 MyFaces Web 應(yīng)用程序。請從 coreservelets.com 這個Web 站點(diǎn)下載 Marty Hall 的 jsf-blank-myfaces-minimal.zip 歸檔文件。該歸檔文件包括一個空的 Web 應(yīng)用程序,其中含有基本 MyFaces 應(yīng)用程序所必需的最小的 MyFaces 庫,幾乎可以原封不動地轉(zhuǎn)到 Geronimo 上去。是的,兩次下載了這些 .jar 文件(一次在這里,一次在 MyFaces 內(nèi)核歸檔文件那里),因?yàn)槿孕枰獜?MyFaces 歸檔文件里獲得文檔和您可能會感興趣的其他可選 JAR 文件。
Eclipse,這是一個可支持大量語言和平臺的可擴(kuò)展開放源碼集成開發(fā)環(huán)境(IDE)。
Eclipse Web 工具平臺(WTP) ,它給 Eclipse 添加了對 XML 的支持和對 JSF 的基本支持。
將 Java 1.4 或更新版本 安裝到您的系統(tǒng)中。Eclipse 二進(jìn)制文件中帶有它自己的 Java 運(yùn)行時,但 Geronimo 和 MyFaces 則沒有(帶運(yùn)行時會使下載歸檔文件的尺寸急劇變大)。在本教程中,我們使用 Mac OS X 10.4 所用的 Java 1.5,但平臺應(yīng)該不是問題。可以從 Sun Microsystems 或 IBM? 處獲得 Java 技術(shù)的文件。
概述
在創(chuàng)建 Web 應(yīng)用程序時,Java Servlet 和 JavaServer Pages(JSP)技術(shù)提供了一個性能強(qiáng)大的環(huán)境,但其中并沒有給出創(chuàng)建用戶界面(UI)的標(biāo)準(zhǔn)方法。您必須全靠自己來管理 JSP 頁面中所有表單的狀態(tài),而且還必須把進(jìn)來的 HTTP 請求轉(zhuǎn)發(fā)給適當(dāng)?shù)氖录幚沓绦颉H绻军c(diǎn)的 GUI 很復(fù)雜,隨應(yīng)用程序而產(chǎn)生的復(fù)雜的基礎(chǔ)設(shè)施會變得難以管理。此外,站點(diǎn)還會有些特有的行為以及其他一些細(xì)節(jié)問題,使得您構(gòu)建的代碼很難被重用。JSF 提供了一種簡化高層任務(wù)(例如 UI 組件的排列和重用)的現(xiàn)成工具,并把組件的狀態(tài)和輸入處理跟決定應(yīng)用程序行為的對象關(guān)聯(lián)了起來。
Apache Geronimo
Apache Geronimo 是一個開放源碼的(采用 Apache Software Foundation 許可協(xié)議)的 Java EE 服務(wù)器,其設(shè)計(jì)目的是盡可能增強(qiáng)應(yīng)用程序的兼容性和性能。它的當(dāng)前版本(到寫本文時為止是 1.1 版)通過了 Sun 的 Java 2 Platform, Enterprise Edition(J2EE)的 Technology Compatibility Kit(TCK)測試,這表示它符合 Sun 的規(guī)范,跟 J2EE 服務(wù)器完全兼容。
與 Jetty 或 Tomcat Web 服務(wù)器打包使用時,Geronimo 非常易于啟用和運(yùn)行,而且它已經(jīng)部署了一個極其有用的管理界面應(yīng)用程序。不需要以任何方式重新啟動或重新配置服務(wù)器,就可以上載并啟動 Web 應(yīng)用程序。
MyFaces
MyFaces 是第一個免費(fèi)的開放源碼的 JSF Web 應(yīng)用程序框架實(shí)現(xiàn)。JSF 類似于流行的 Struts 框架,實(shí)現(xiàn)了模型 - 視圖 - 控制器(MVC)模式,但是它有一些功能是 Struts 沒有提供的。JSF 是由 Java Specification Request #127(JSR 127)規(guī)范所定義的,它被 Web 應(yīng)用行業(yè)的專家批準(zhǔn)成為 Java Community Process(JCP)的規(guī)范。
Eclipse
Eclipse 是按照一個可擴(kuò)展的基于插件的架構(gòu)而構(gòu)建的,它是一個開放源碼的集成開發(fā)環(huán)境(IDE)。這樣,只要一個 IDE 就能夠支持做任何工作所需的幾乎任何語言、任務(wù)、平臺和數(shù)據(jù)文件。這樣,將可以從 Java 對開發(fā)的出色支持和 WTP 項(xiàng)目的插件中獲益。WTP 提供了支持 XML 的編輯器,它還提供了實(shí)驗(yàn)性的對 MyFaces 的支持。
我們來很快地看一下我們的應(yīng)用程序示例。
應(yīng)用程序示例
在本教程中,將使用 Geronimo 部署一個簡單的用 MyFaces 寫的 Web 應(yīng)用程序,它為您創(chuàng)建自己的 Web 應(yīng)用程序提供了一個很好的開端。將為一個假想的面向開發(fā)者的討論區(qū)論壇構(gòu)建一個注冊過程,可參見本教程末尾的 圖 19。
誠然,這不是 Slashdot.org 或是什么可怕的論壇,但這里的東西確實(shí)是每個人都熟悉的(這就像注冊到某個論壇、郵件列表單或 beta 測試的情況)。
在下一節(jié),您將了解所有需要做的工作,并為這個應(yīng)用程序創(chuàng)建一個 Eclipse 項(xiàng)目。
創(chuàng)建項(xiàng)目
首先,為使用 MyFaces 的應(yīng)用程序創(chuàng)建一個準(zhǔn)備放到 Geronimo Java EE 服務(wù)器上的 Eclipse 項(xiàng)目。這一節(jié)將完成所有不需要費(fèi)力的工作(創(chuàng)建 Eclipse 項(xiàng)目、進(jìn)行必要的設(shè)置、導(dǎo)出 .war 文件并把它部署到服務(wù)器上)。
在 Eclipse 中進(jìn)行必要的設(shè)置
為 Geronimo 服務(wù)器創(chuàng)建新的 MyFaces 應(yīng)用程序時,要做的第一件事就是創(chuàng)建一個 Eclipse 項(xiàng)目。注意,為了繼續(xù)進(jìn)行這部分的教程,必須先安裝好 Eclipse,并通過 Eclipse 的更新管理器安裝好 WTP。安裝完 Eclipse 后,可到 WTP 的 Web 站點(diǎn)了解如何安裝 WTP。
啟動 Eclipse,然后從菜單選擇 File > New > Project。會彈出一個新項(xiàng)目向?qū)?,?圖 1 所示。
圖 1. Eclipse 新項(xiàng)目向?qū)?br style="word-wrap: break-word; word-break: break-all;">
在 “Web” 處選擇 Dynamic Web Project。這樣將會創(chuàng)建一個項(xiàng)目,它按下面的結(jié)構(gòu)存放一個 Web 應(yīng)用程序:
build
classes
src
WebContent
META-INF
MANIFEST.MF
WEB-INF
lib
faces-config.xml
web.xml
除 faces-config.xml 文件外,Web 應(yīng)用程序開發(fā)者應(yīng)該對 WebContent 文件夾中的文件和目錄很熟悉。Java 類的源代碼會存到 src 文件夾中,而構(gòu)建輸出文件(例如 .class 文件)會創(chuàng)建在 build 文件夾中。
單擊 Next,顯示 New Dynamic Web Project 向?qū)Вㄒ?圖 2) 。
圖 2. 創(chuàng)建一個動態(tài) Web 項(xiàng)目
填入項(xiàng)目名稱,并從下拉配置列表中選擇 Java Server Faces 1.1 Project。創(chuàng)建一個名為 devSignup 的項(xiàng)目。
單擊 Next 顯示 New Dynamic Web Project 向?qū)У?Project Facets 面板。這里不需要做任何事,所以再次單擊 Next 顯示 Web Module 面板。
這個面板上的 Context Root 域決定了部署到 Web 服務(wù)器上時應(yīng)用程序目錄的名稱。默認(rèn)的目錄名與項(xiàng)目名稱相同,在這個樣例中為 devSignup 。如果不喜歡這樣,就改個目錄名,然后單擊 Next 顯示 JSF Capabilities 面板(見 圖 3)。在 JSF Capabilities 面板上可以定義幾組在項(xiàng)目中使用的 JSF JAR。為了便于部署,也可以在導(dǎo)出這個 Web 應(yīng)用程序時讓 Eclipse 自動包含這些 JAR。
圖 3. 給項(xiàng)目加入 JSF 兼容性
在面板頂部,選中 Deploy jars to WEB-INF/lib,這是因?yàn)閯?chuàng)建應(yīng)用程序時希望包括 JSF 庫。
單擊這個復(fù)選框正下方的 New 按鈕,顯示 Create JSF Implementation Library 對話框(見 圖 4)。這樣就可以設(shè)置一組在 Web 應(yīng)用程序中可以重用的標(biāo)準(zhǔn) JSF JAR。
圖 4. 創(chuàng)建一個 JSF 實(shí)現(xiàn)庫
給這個庫起一個描述性的名字(我起的名字是 MyFaces(Core))。
從 Version Supported 下拉列表中選擇 v1_1,因?yàn)?Apache MyFaces 支持 1.1 版的 JSF 規(guī)范。
單擊 Add 按鈕,選擇要包括在這個庫的定義里的 JSF .jar 文件。庫中包括的文件列在下面。
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)中最精簡的一組 JSF 庫(有些文檔中在這個清單里沒有 jstl.jar ,但這是一個必需的文件)。在最小空應(yīng)用程序歸檔文件中,這些 JAR 的副本省略了版本號(而且它帶了兩個額外的庫:commons-validator.jar 和 jakarta-oro.jar,它們分別提供數(shù)據(jù)驗(yàn)證類和對正則表達(dá)式的支持)。
這里需要注意的一點(diǎn)是:在 JSF Implementation 庫中將包含對您的 .jar 文件的完全路徑的引用;該庫不會把這些文件拷貝到您的工作區(qū)里。這樣做是有益的,因?yàn)槟槐貫槊總€項(xiàng)目都生成這些 JAR 文件的一個副本;但另一方面,這也有壞處,因?yàn)檫@樣就不能利用軟件配置管理(SCM)系統(tǒng),甚至也無法通過導(dǎo)出 Eclipse 項(xiàng)目,把這個項(xiàng)目移交給另一個開發(fā)者。
添加完所需的 .jar 文件后,單擊 Finish 創(chuàng)建一個 JSF Implementation 庫。
已經(jīng)完成了 New Dynamic Project 向?qū)У脑O(shè)置,所以單擊 Finish 創(chuàng)建一個 Web 應(yīng)用程序骨架。Eclipse 自動轉(zhuǎn)到 Java EE 透視圖,目前這對于您的 JSF 開發(fā)沒有什么幫助。WTP 中對 JSF 的支持目前是 0.5 版,所以還不能指望會有無縫的集成。
從菜單中選擇 Window > Close Perspective ,切回到 Resource 透視圖。
在 Navigator 視圖下把項(xiàng)目展開(見 圖 5 ),觀察向?qū)?chuàng)建的目錄結(jié)構(gòu)和文件。
圖 5. 一個有待開發(fā)的新 Web 應(yīng)用程序
現(xiàn)在就可以把應(yīng)用程序放到服務(wù)器上試試了。
把東西都拼起來
現(xiàn)在已經(jīng)創(chuàng)建了一個基本的 Web 應(yīng)用程序,還需要再加一些東西進(jìn)去,這樣才能讓它成為一個真正的(基本)Web 應(yīng)用程序,并使它適于部署到一個 Geronimo 服務(wù)器上。
編輯 web.xml 文件。如果 Eclipse 的 XML 編輯器以設(shè)計(jì)模式啟動(看見底部的選項(xiàng)卡了嗎?),單擊 Source 選項(xiàng)卡,就可以直接編輯 XML 文件了??梢詫⑺庉嫵深愃朴?清單 1 所示。
清單 1. 的簡單應(yīng)用程序的 web.xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="devSignup" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>devSignup</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
在 <web-app> 標(biāo)記中,把 id 屬性從其默認(rèn)值(WebApp_ID)改過來;這是在這個服務(wù)器上啟動 Web 應(yīng)用程序的 URL。我會采用 devSignup 來代替它。還需要加入 xmlns 聲明和 xsi:schemaLocation 聲明。
刪掉 <servlet> 和 <servlet-mapping> 塊,并從 <welcome-file-list> 部分刪掉一些 <welcome-file> 標(biāo)記。<welcome-file> 標(biāo)記定義了顯示 Web 應(yīng)用程序時將使用的文件(按指定的順序)。例如,默認(rèn)的清單包括 index.html 、index.htm、index.jsp 和其他一些文件。去掉除 index.jsp 外的所有文件,然后就要創(chuàng)建一個 index.jsp 文件。
右鍵單擊 WebContent 文件夾,然后從上下文相關(guān)菜單選擇 New > Other 顯示新建文件向?qū)А?/p>
展開 Web 組,選擇 JSP,然后單擊 Next。
將文件名設(shè)為 index.jsp,然后單擊 Finish 創(chuàng)建新的 index.jsp 文件。
如 清單 2 所示編輯 index.jsp。這是 “ Hello World ”程序,沒什么有用的 JSP 或 JSF 交互,所以可以放心不會有什么問題。
清單 2. 人人喜歡的程序,JSP 風(fēng)格
<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1" />
<title>Developer Signup</title>
<jsp:useBean id="datetime" class="java.util.Date"/>
</head>
<body>
<p>
Hello, world!
</p>
<p>
The server's time is ${datetime}.
</p>
</body>
</html>
這還不完全是一個基本的 “ Hello World ”程序,因?yàn)橛?java.util.Date bean 提供了當(dāng)前日期和時間。
這個拼圖的最后一塊是 Geronimo 的部署描述符。右鍵單擊項(xiàng)目中的 WEB-INF 文件夾,然后從上下文相關(guān)菜單中選擇 New > Other。
在新建文件向?qū)Ю?,展開 XML 組,選擇 XML,然后單擊 Next。
確保選中 Create XML file from scratch,然后單擊 Next。
把文件名改為 geronimo-web.xml,然后單擊 Finish 創(chuàng)建一個新文件并編輯它。
按 清單 3 所示編輯 geronimo-web.xml。這個基本的 Geronimo 部署文件只是告訴服務(wù)器在哪里發(fā)布這個 Web 應(yīng)用程序(與我們在 web.xml 中已做過的很類似)。
清單 3. Geronimo 的部署文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://geronimo.apache.org/xml/ns/j2ee/web-1.1"
xmlns:naming="http://geronimo.apache.org/xml/ns/naming">
<context-root>/devSignup</context-root>
</web-app>
在這個示例中,我把 <context-root> 設(shè)置為 /devSignup,這樣就可以在服務(wù)器上的 /devSignup 下看到這個應(yīng)用程序了。
挺容易,對吧?現(xiàn)在需要把最初的 Web 應(yīng)用程序?qū)С鰹橐粋€ .war 文件,并把它部署到服務(wù)器上。繼續(xù)閱讀,學(xué)習(xí)怎么做到這些!
Web 應(yīng)用程序風(fēng)格的 “Hello World” 程序
現(xiàn)在已創(chuàng)建了一個項(xiàng)目,一個基本的歡迎頁面以及一個 Geronimo 部署描述符,可以創(chuàng)建一個 .war 文件把它部署到服務(wù)器上。
在 Navigator 視圖內(nèi)右擊項(xiàng)目的名字(這里是 devSignup),然后從上下文相關(guān)菜單中選擇 Export。
在 Export 向?qū)е?,展開 Web 組,選擇 WAR file ,然后單擊 Next 顯示 WAR Export 面板(見 圖 6)。
圖 6. 導(dǎo)出一個 .war 文件
由于是在導(dǎo)航器中導(dǎo)出項(xiàng)目的,所以 Web 模塊已經(jīng)被正確地選擇。單擊 Browse 按鈕為 .war文件選擇一個目的目錄和文件名。將它起名為 devSignup.war 存到桌面上,這樣比較容易找到它。然后把它部署到服務(wù)器上。
單擊 Finish 導(dǎo)出這個 .war 文件。
如果不熟悉一般的 IDE(或只是不熟悉 Eclipse ),您可能不相信它會正確地工作。如果檢查 .war 文件的內(nèi)容,看到的東西應(yīng)該類似于 清單 4 所示。
清單 4. .war 文件的內(nèi)容
./index.jsp
./META-INF
./META-INF/MANIFEST.MF
./WEB-INF
./WEB-INF/classes
./WEB-INF/faces-config.xml
./WEB-INF/geronimo-web.xml
./WEB-INF/lib
./WEB-INF/lib/commons-beanutils-1.7.0.jar
./WEB-INF/lib/commons-codec-1.3.jar
./WEB-INF/lib/commons-collections-3.1.jar
./WEB-INF/lib/commons-digester-1.6.jar
./WEB-INF/lib/commons-el-1.0.jar
./WEB-INF/lib/commons-lang-2.1.jar
./WEB-INF/lib/commons-logging-1.0.4.jar
./WEB-INF/lib/jstl.jar
./WEB-INF/lib/myfaces-api.jar
./WEB-INF/lib/myfaces-impl.jar
./WEB-INF/web.xml