JSF 2 簡(jiǎn)介,第 1 部分: 流線化 Web 應(yīng)用程序開發(fā)使用 JSF 2 簡(jiǎn)化導(dǎo)航、免除 XML 配置并輕松訪問資源 ![]() |
|
![]() |
級(jí)別: 中級(jí) David Geary , 總裁, Clarity Training, Inc. 2009 年 6 月 15 日 隨著 2.0 版本的發(fā)布,Java?Server Faces (JSF) 現(xiàn)在可以輕松地實(shí)現(xiàn)健壯的、Ajax 風(fēng)格的 Web 應(yīng)用程序。本文是共三部分的系列文章的開篇,JSF 2.0 專家組成員 David Geary 將展示如何利用 JSF 2 中的新特性。在這期文章中,您將了解到如何使用 JSF 2 流線化開發(fā),您將使用注釋和約定代替 XML 配置,簡(jiǎn)化導(dǎo)航,并輕松訪問資源。并且您將看到如何在您的 JSF 應(yīng)用程序中使用 Groovy。<!-- START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --> <!-- END RESERVED FOR FUTURE USE INCLUDE FILES--> 有關(guān) Web 應(yīng)用程序框架的最佳發(fā)源地,人們一直爭(zhēng)論不休:是象牙塔(由理論家空想而來)還是現(xiàn)實(shí)世界。在后一種情況下,框架的誕生經(jīng)受了實(shí)際需求的嚴(yán)酷考驗(yàn)。憑直覺判斷,經(jīng)受了實(shí)際需求的考驗(yàn)要?jiǎng)龠^理論家的空想,并且我認(rèn)為這種直覺完全經(jīng)得起更進(jìn)一步的檢驗(yàn)。 JSF 1 就是在象牙塔中開發(fā)的,因此,它的出現(xiàn)并沒有引起太大的轟動(dòng)。但是,JSF 做對(duì)了一件事情 — 它使市場(chǎng)上出現(xiàn)了大量來自實(shí)際開發(fā)的創(chuàng)新。早些時(shí)候,F(xiàn)acelets 的初次登場(chǎng)成為了 JavaServer Pages (JSP) 的強(qiáng)有力候補(bǔ)。然后出現(xiàn)了 Rich Faces,一個(gè)出色的 JSF Ajax 庫;接著是 ICEFaces,將 Ajax 和 JSF 聯(lián)合起來的新穎方法;還有 Seam、Spring Faces、Woodstock 組件、JSF Templating,等等。所有這些開源 JSF 項(xiàng)目都是由開發(fā)人員根據(jù)自己需要的功能構(gòu)建的。 JSF 2.0 專家組實(shí)際上對(duì)來自這些開源項(xiàng)目的最佳特性進(jìn)行了標(biāo)準(zhǔn)化。盡管 JSF 2 規(guī)范確實(shí)是由一些理論家編寫的,但它也受到了來自實(shí)際開發(fā)的創(chuàng)新的驅(qū)動(dòng)。回想起來,專家組的工作其實(shí)非常輕松,因?yàn)槲覀冋驹诰奕说募绨蛏希热?Gavin King (Seam)、Alexandr Smirnov (Rich Faces)、Ted Goddard (ICEFaces) 和 Ken Paulson (JSF Templating)。實(shí)際上,所有這些巨人都是 JSF 2 專家組的成員。因此,JSF 2 在許多方面都結(jié)合了象牙塔和真實(shí)世界的長(zhǎng)處。并且它展示了這一點(diǎn)。JSF 2 是對(duì) JSF 1 的重大改進(jìn)。 本文是共三部分的系列文章的開篇,主要有兩個(gè)目標(biāo):展示激動(dòng)人心的 JSF 2 新特性,展示如何最佳地利用這些特性,這樣您就能夠利用 JSF 2 提供的功能。通過演示 JSF 2 的應(yīng)用并伴隨一些最佳使用技巧,我將闡述前面兩個(gè)問題。下面是本文將要介紹的技巧:
但是,我將首先介紹貫穿整個(gè)系列文章的示例應(yīng)用程序。本文的應(yīng)用程序源代碼可以 下載 獲得。 基于強(qiáng)制映射的 Web 服務(wù) mashup 示例 圖 1 展示了一個(gè) JSF mashup — 我將它稱為 places 應(yīng)用程序 — 它使用 Yahoo! Web 服務(wù)將地址轉(zhuǎn)換為地圖,并顯示縮放級(jí)別和天氣預(yù)報(bào): 圖 1. 從 Yahoo! Web Services 中查看地圖和天氣信息 ![]() 要?jiǎng)?chuàng)建一個(gè)地點(diǎn),需要填寫地址表單,激活 Go 按鈕,然后應(yīng)用程序?qū)训刂钒l(fā)送給兩個(gè) Web 服務(wù):Yahoo! Maps 和 Yahoo! Weather。
Map 服務(wù)在 Yahoo! 服務(wù)器上返回指向地址映射的 11 個(gè)地圖 URL,使用不同的縮放級(jí)別。Weather 服務(wù)返回一些預(yù)先組裝的 HTML。圖像 URL 和 HTML 內(nèi)容都輕松地顯示在一個(gè) JSF 視圖中,這要分別感謝
places 應(yīng)用程序使您能夠輸入任意數(shù)量的地址。您甚至可以多次使用同一個(gè)地址 ,如圖 2 所示,它實(shí)際上演示了縮放級(jí)別: 圖 2. 縮放級(jí)別 ![]() places 應(yīng)用程序有 4 個(gè)托管 bean(managed bean),如 表 1 所示: 表 1. places 應(yīng)用程序中的托管 bean 托管 bean 名稱 類 范圍
應(yīng)用程序在會(huì)話范圍內(nèi)存儲(chǔ)了一組
創(chuàng)建地點(diǎn)非常簡(jiǎn)單。清單 1 顯示了 圖 1 中的視圖所含的地址表單的代碼:
當(dāng)用戶激活 Go 按鈕并提交表單后,JSF 將調(diào)用按鈕的操作方法:
清單 2 展示了
清單 2.
Place.fetch()
方法
注意
清單 3. 在視圖中顯示位置
清單 3
中的代碼使用 Facelets
圖 3. 視圖中顯示的位置 ![]()
zoom 菜單(參見
圖 3
和
清單 3
)有一個(gè)
清單 4.
Place.zoomChanged()
清單 5.
Place.getMapUrl()
如 果曾經(jīng)使用過 JSF 1,那么很可能會(huì)注意到本文的 JSF 2 代碼中存在一些細(xì)微的差別。首先,我使用了 JSF 2 的新的顯示技術(shù) — Facelets — 而不是 JSP。您將從本系列后續(xù)文章中看到,F(xiàn)acelets 提供了許多強(qiáng)大的特性來幫助您實(shí)現(xiàn)健壯、靈活和可擴(kuò)展的用戶界面。但是在前面的代碼清單中,我并沒有過多利用這種功能。然而,F(xiàn)acelets 為 JSF 帶來的眾多微小改進(jìn)之一便是能夠?qū)?JSF 值表達(dá)式直接放入到 XHTML 頁面;例如,在
清單 1
中,我將
從 Facelets 角度來講,還需要注意
清單 3
中的
目前為止,前面的代碼并沒有使用 Facelets,與 JSF 1 相比沒有出現(xiàn)顯著的變化。現(xiàn)在,我將展示更加大的差異。第一個(gè)比較大的差異體現(xiàn)在將要為 JSF 2 應(yīng)用程序編寫的 XML 配置的數(shù)量方面。
Web 應(yīng)用程序的 XML 配置始終是個(gè)麻煩問題 — 它非常冗長(zhǎng)并且容易出現(xiàn)錯(cuò)誤,因此最好將 XML 配置委托給一個(gè)框架,比如通過注釋、約定或特定于領(lǐng)域的語言。作為開發(fā)人員,我們應(yīng)該能夠集中精力實(shí)現(xiàn)一些操作,而不是將浪費(fèi)時(shí)間在冗長(zhǎng)的 XML 方面。 作為一個(gè)典型的例子,清單 6 展示了在使用 JSF 1 的情況下,在 places 應(yīng)用程序中聲明托管 bean 所需的 20 行 XML 代碼: 清單 6. JSF 1 的托管 bean 聲明
對(duì)于 JSF 2,XML 消失了,您將對(duì)類使用注釋,如清單 7 所示: 清單 7. JSF 2 的托管 bean 注釋
按照約定,托管 bean 的名稱與類名相同,類名的第一個(gè)字母被轉(zhuǎn)換為小寫。例如,
清單 7
中創(chuàng)建的托管,從上到小依次為:
在
清單 7
中,我對(duì)
也可以使用
表 2. JSF 2 托管 bean 注釋(
@...Scoped
注釋只對(duì)
@ManagedBean
有效)
托管 bean 注釋 描述 屬性
從 faces-config.xml 中移除托管 bean 聲明將極大地減少 XML,但是在 JSF 2 中,通過使用注釋(如我對(duì)托管 bean 所做的一樣)或是約定(比如 JSF 2 的簡(jiǎn)化的導(dǎo)航處理),幾乎可以去掉所有的 XML 內(nèi)容。
在 JSF 1 中,導(dǎo)航使用 XML 指定。比如,要從 login.xhtml 轉(zhuǎn)到 places.xhtml,可能使用清單 8 所示的導(dǎo)航規(guī)則: 清單 8. JSF 1 中的導(dǎo)航配置規(guī)則和用例
要去除
清單 8
中的 XML,可以利用 JSF 2 的導(dǎo)航約定:JSF 將 .xhtml 添加到按鈕操作的末尾并加載該文件。這意味著不需要使用注釋或其他內(nèi)容,只需要使用約定就可以完整地避免編寫導(dǎo)航規(guī)則的需求。在清單 9 在,按鈕的操作是
清單 9. 通過約定進(jìn)行導(dǎo)航
對(duì)于
清單 9
來說,不需要任何導(dǎo)航 XML。清單 9 中的按鈕加載 places.xhtml,但是前提是該文件和按鈕所在的文件處于同一個(gè)目錄中。如果操作并沒有以斜杠(
清單 10. 使用絕對(duì)路徑的導(dǎo)航
當(dāng)用戶激活 清單 10 中的按鈕時(shí),JSF 將加載 /pages/places.xhtml 文件。
默認(rèn)情況下,JSF 將從一個(gè) XHTML 頁面轉(zhuǎn)至另一個(gè) XHTML 頁面,但是通過指定
清單 11. 通過重定向進(jìn)行導(dǎo)航
Java 技術(shù)的最大優(yōu)勢(shì)并不是 Java 語言,而是 Java 虛擬機(jī)(JVM)。在 JVM 上運(yùn)行著強(qiáng)大、新穎和創(chuàng)新的語言,比如 Scala、JRuby 和 Groovy,這使您在編寫代碼時(shí)擁有了更多選擇。Groovy 這個(gè)名字有些奇怪,但是功能非常強(qiáng)大,融合了 Ruby、Smalltalk 和 Java 語言,它是這些語言中最為流行的一種語言(參見 參考資料 )。 使用 Groovy 的理由有很多。首先,它要比 Java 語言更加簡(jiǎn)潔、功能更加強(qiáng)大。還有兩個(gè)原因:不使用分號(hào),不需要強(qiáng)制轉(zhuǎn)換(casting)。
您可能還沒有注意到,在
清單 2
中,
可 以將 Groovy 用于任何使用 Java 代碼編寫的 JSF 工件 — 例如,組件、呈現(xiàn)器、驗(yàn)證器和轉(zhuǎn)換器。事實(shí)上,這對(duì)于 JSF 2 來說并不新鮮 — 因?yàn)?Groovy 源文件編譯為 Java 字節(jié)碼,您只需使用 Groovy 生成的 .class 文件,就好象它們是由
JSF 2 提供了定義和訪問資源的標(biāo)準(zhǔn)機(jī)制。您將自己的資源放到名為 resources 的頂級(jí)目錄下,并使用一些 JSF 2 標(biāo)記來在視圖中訪問這些資源。例如,圖 4 展示了 places 應(yīng)用程序的資源: 圖 4. places 應(yīng)用程序的資源 ![]() 對(duì)資源的惟一需求是它必須位于 resources 目錄或 resources 目錄的子目錄中。可以隨意命名 resources 目錄的子目錄。
在您的視圖代碼中,可以使用兩個(gè) JSF 2 標(biāo)記訪問資源:
清單 12. 在 XHTML 中訪問資源
開 發(fā)人員需要能夠在頁面中指定想要呈現(xiàn)他們的資源的位置。例如,如果將 JavaScript 放在頁面體中,瀏覽器將在加載頁面時(shí)執(zhí)行 JavaScript。另一方面,如果將 JavaScript 放到頁面的頭部,那么 JavaScript 只有在得到調(diào)用時(shí)才會(huì)被執(zhí)行。由于資源的放置位置會(huì)影響它的使用方式,因此需要能夠指定希望在哪些位置顯示資源。
JSF 2 資源是
可重新定位的
,這意味著您可以在頁面中指定希望放置資源的位置。您將使用
有些情況下,需要使用 JSF 表達(dá)式語言(EL)訪問資源。比如,清單 13 展示了如何使用
清單 13. 使用 JSF 表達(dá)式語言訪問資源
在 EL 表達(dá)式內(nèi)訪問資源的語法是
到目前為止,我僅僅觸及了 JSF 2 特性中最淺顯的內(nèi)容,包括托管 bean、注釋、簡(jiǎn)化導(dǎo)航和資源支持。在本系列隨后的兩篇文章中,我將探討 Facelets、JSF 2 的復(fù)合組件以及對(duì) Ajax 的內(nèi)置支持。
描述 名字 大小 下載方法 源代碼
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
討論
|
轉(zhuǎn)自:http://www.ibm.com/developerworks/cn/java/j-jsf2fu1/
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
