JavaServer Faces 技術使Web應用程序開發變得更容易

 

JavaServer Faces 技術使Web應用程序開發變得更容易<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

JavaServer Faces 技術是建立web應用程序用戶界面的框架標準,它是通過JCP(Java Community Process)由JSR-127專家組開發的,利用JavaServer Faces 技術所提供的程序模型,不同層次的 開發者都能夠迅速並且容易的開發Web應用程序,他們只需要在一個頁面上裝配可重用的UI組件,鏈接這些組件到應用程序數據源,並且綁定客戶端產生的事件到服務器端的事件處理器。

JavaServer Faces 技術所帶來的巨大能力使得Web應用程序能夠在服務器端處理錯綜複雜 的用戶界面管理, 允許應用程序開發者只關注於應用程序代碼。

 

JavaServer Faces 主要由以下組成:

·         一組API:顯示UI組件並管理它們的狀態、處理事件和輸入校驗、定義頁面導航、支持國際化和訪問。

·         一個JSPJavaServer Pages™)定製標籤庫來表示在JSP頁面上的UI組件。

 

這種清晰的編程模型和UI組件標籤庫大大減輕了建立和維護web應用程序的負擔,你能夠

·         綁定Client 端產生的事件到Server端應用程序代碼;

·         映射頁面的UI組件到Server端數據;

·         構建可重用和可擴展的UI組件;

·         在server請求生命期之上保存和恢復UI狀態。

 

JavaServer Faces 技術的好處

 

·         簡單易用:JavaServer Faces的簡單易用源於它自身的體系機構。一方面,JavaServer Faces 技術在行爲和表現之間提供了乾淨的分離,大部分用戶,從網頁設計者到組件開發者,都可以利用JavaServer Faces 技術的這個優點,使得更好的分工和獲得更短的開發週期。另一方面 ,由JavaServer Faces 技術創建的用戶界面處理了所有的錯綜複雜的界面管理,包括輸入校 驗、組件狀態管理、頁面導航和事件處理。

·         標準化:JavaServer Faces 技術是通過JCP(Java Community Process)在JSR-127下開發的, 幾家著名的工具開發商是SR-127專家組的成員,他們將致力於在他們的工具中支持 JavaServer Faces 技術。

·         設備獨立:JavaServer Faces 技術的設計是非常靈活的,在可擴展的UI組件類僅僅定義組件 的功能,JavaServer Faces 體系機構允許組件開發者去擴展這些組件類,從而爲特定的客戶 端產生他們自己的組件標籤庫。

 

什麼是JavaServer Faces 應用程序

 

在很大程度上,JavaServer Faces應用程序就像其他的java web應用程序,他們執行在java servelet容器中,典型的它們包含:

·         Java Bean 組件(在JavaServer Faces技術中成爲模型對象)包含特定應用程序的功能和 數據;

·        事件監聽器;

·         頁面,例如JSP頁面;

·         Server端輔助類,例如數據庫訪問bean.

 

除了這些,JavaServer Faces應用程序還包含:

·        一個定製標籤庫用來在頁面上顯示UI組件;

·        一個定製標籤庫用來代表事件處理器、校驗器和其它的動作;

·         UI組件,是Server端有狀態的對象;

·        校驗器、事件處理器和導航處理器。

 

每個JavaServer Faces 應用程序必須包括兩個定製標籤庫, 其中一個定製標籤庫定義了代表UI 組件的標籤,另外一個定製標籤庫定義了其它核心操作,如事件處理器或校驗器。這兩個標籤庫由 JavaServer Faces實現提供。

 

組件標籤庫消除了在HTML中硬編碼UI組件或其他標記語言的需要,從而產生完全的可重用組件,並且核心標籤庫使得在組件上註冊事件、校驗器和其它操作變得容易。

 

組件標籤庫可以是包含在JavaServer Faces技術參考實現中的html_basic標籤庫,或者你也可以 定義自己的標籤庫來傳遞定製組件或傳遞輸出,而不是HTML

 

JavaServer Faces 應用程序另外一個優點就是在頁面上的UI組件在Server端被表現爲有狀態的對象,這使得應用程序能夠處理組件的狀態並且捆綁客戶端產生的事件到Server端。

 

最後,JavaServer Faces技術允許你在單獨的組件上轉化和校驗數據,並且在Server端數據被更 新之前報告錯誤。

JavaServer Faces 技術開發中的角色

因爲JavaServer Faces 技術使得各部分工作可以分離,所以JavaServer Faces應用程序的開發和維護 能夠迅速並且容易得進行。一個典型開發組的成員是列在下面的這些,在一些組裏,有的 人可能充當以下角色中的多種,然而基於主要職責的觀點來考慮JavaServer Faces技術仍舊是非 常有用的。

·         頁面設計者 他們用標記語言,像HTML, Web應用程序設計頁面,當用JavaServer Faces技術架 構時,頁面設計者極有可能只單單使用標籤庫。

·         應用程序開發者 他們編寫模型對象、事件處理器、校驗器和頁面導航控制,應用程序開發者也 負責一些其它的輔助類。

·         組件開發者 他們有用戶界面編程經驗,喜歡用某種語言創建定製組件,這些人可以直接從組件 庫常見自己的組件,他們也能夠擴展由JavaServer Faces技術提供的標準組件。

·         工具提供者 他們提供集成了JavaServer Faces技術的工具,使得建立Server端用戶界面非常容易。

JavaServer Faces技術的主要用戶是頁面設計者和應用程序開發者,下一部分將要通過一個簡單的 應用程序來解釋頁面設計者和應用程序開發者的工作。

一個簡單的JavaServer Faces應用程序

這部分描述開發一個簡單的 JavaServer Faces應用程序的過程,你將要瞭解到一個典型的 JavaServer Faces應用程序有哪些性能,以及在開發過程中每個角色負責哪部分。

開發流程

開發一個簡單的 JavaServer Faces應用程序需要執行這些工作:

·         使用UI組件標籤設計頁面;

·         開發模型對象,這些模型對象將持有數據;

·         開發事件處理器。

這些工作可以同時進行,也可以按任何順序,然而執行這些工作的人在開發過程中應該互相交流,例如,爲了從頁面上能訪問模型對象,頁面開發者需要知道這些模型對象的名字。在這部分的例子中,要求你猜110之間的一個數,第二頁告訴你猜的是否正確,這個例子也檢查輸入的合法性。

創建頁面

創建頁面是頁面設計者的職責。這個工作包括在頁面上擺放UI組件,映射組件到模型對象數據和添加校驗標籤到組件。

這是帶有校驗標籤的greeting.jsp頁面

<HTML>

<HEAD> <title>Hello</title> </HEAD>

<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>

<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

<body bgcolor="white">

<h:graphic_image id="wave_img" url="/wave.med.gif" />

<h2>Hi. My name is Duke.

  I'm thinking of a number from 0 to 10.

  Can you guess it?</h2>

<jsp:useBean id="UserNumberBean"

  class="guessNumber.UserNumberBean" scope="session" />

<f:use_faces>

<h:form id="helloForm" formName="helloForm" >

<h:input_number id="userNo" numberStyle="NUMBER"

  modelReference="UserNumberBean.userNumber">

  <f:validate_longrange minimum="0" maximum="10" />

</h:input_number>

<h:command_button id="submit" label="Submit"

  commandName="submit" /><p>

<h:output_errors id="errors1" clientId="userNo"/>

</h:form>

</f:use_faces>

</HTML>

 

這個頁面展示了你將在大多數JavaServer Faces應用程序中使用的性能:

·         useBean標籤

如果你瞭解JSP技術,jsp:useBean標籤你應該很熟悉,這個標籤實例化一個Server端的JavaBean組件,在這裏,Bean的名字是UserNumberBean,這個Bean必須被包含在你的應用程序中,實例化Bean之後,你可以在這個頁面內訪問它的屬性。

·         form標籤

form標籤代表一個輸入表單,允許用戶輸入一些數據並提交它到Server端,通常通過單擊一個按鈕。代表表單中的那些組件的標籤嵌套在form標籤裏,這些標籤是h:input_text 和 h:command_button.

·         input_number標籤

input_number標籤代表一個文本域組件,用戶可以輸入一個數字。這個標籤由兩個屬性:id  modelReference id 屬性對應於這個標籤所代表的組件對象的ID,id 屬性是可選的,如果 你沒有包含這個屬性, JavaServer Faces的實現將爲你生成一個。modelReference指向模型對象屬性。

·         validate_longrange標籤

input_text標籤也包含一個validate_longrange標籤,這是 JavaServer Faces中標準校驗標 籤之一,這個校驗器檢查組件的本地值是否在某個區域內,這個值必須能被轉化爲long型。 validate_longrange標籤由兩個屬性,一個指定最大值,一個指定最小值,這裏,這個標籤用來確保文本域輸入的必須是一個010的數字。

·         command_button標籤

command_button標籤代表一個按鈕,用來提交輸入到文本域的數據。

·         output_errors標籤

output_errors標籤將顯示一個錯誤信息,如果輸入到文本域的數據不符合校驗器定義的規則,output_errors標籤放到頁面上任何地方錯誤信息都將顯示,clientId屬性指向值校驗失敗的組件。

 

下一部分討論在這個例子中使用的模型對象。

 

開發模型對象

開發模型對象是應用程序開發者的職責。頁面設計者和應用程序開發者可能需要協同工作以確保組件標籤指向正確的對象屬性,對象屬性有正確的屬性,並且還要注意一些其它的細節。

這是UserNumberBean類,它持有greeting.jsp頁上文本域的數據。

 

package guessNumber;

import java.util.Random;

public class UserNumberBean {

Integer userNumber = null;

Integer randomInt = null;

String response = null;

public UserNumberBean () {

Random randomGR = new Random();

randomInt = new Integer(randomGR.nextInt(10));

System.out.println("Duke’s Number: "+randomInt);

}

public void setUserNumber(Integer user_number) {

userNumber = user_number;

System.out.println("Set userNumber " + userNumber);

}

public Integer getUserNumber() {

System.out.println("get userNumber " + userNumber);

return userNumber;

}

public String getResponse() {

if(userNumber.compareTo(randomInt) == 0)

  return "Yay! You got it!";

else

  return "Sorry, "+userNumber+" is incorrect.";

}

}

 

和你看到的一樣,這個Bean和任何JavaBean組件沒有什麼分別:它有一組訪問方法並且每個屬性對應一個私有數據域,這意味着你可以從你的JavaServer Faces頁面引用你寫好的Bean一個特定 的模型對象屬性可以被各種組件引用,模型對象屬性可以是任何基本和參考類型,這包括:Number 、 String、 int、 doublefloat。 JavaServer Faces技術將自動轉換數據到模型對象屬性指定的類 型,你可以應用一個轉化器(Converter)到組件來轉換組件的值到一個它不支持的類型。

UserNumberBean中,userNumber屬性是整形類型(Integer),當你使用input_number標籤更新模型對象這個屬性時, JavaServer Faces實現能夠將包含這個值的字符串請求參數轉換成整形。

處理事件

應用程序開發者另外一個職責就是爲組件事件和應用程序事件寫事件處理器,組件事件如選擇一個checkbox、點擊一個 button,應用程序事件如提交一個表單(form)。

最簡單的多頁應用程序中,當一個表單被提交或訪問一個鏈接時需要定義哪頁要被訪問,應用程序開發者通過定義ApplicationHandler類來爲應用程序定義導航器。

這是用在guessNumber例子中的 BasicApplicationHandler:,

...

public class BasicApplicationHandler implements

ApplicationHandler {

...

if (facesEvent instanceof FormEvent) {

  FormEvent formEvent = (FormEvent) facesEvent;

  if (formEvent.getCommandName().equals(“submit”)) {

    treeId = “/response.jsp”;

  }

...

}

}

 

這一小段代碼檢查是否FormEvent是由greeting.jsp頁面的提交按鈕產生的,如果是,組件樹的ID將被設爲關聯response.jsp頁面的組件樹。

下一部分將要解釋 JavaServer Faces頁面是怎樣被處理的。

JavaServer Faces頁面的生命週期

JavaServer Faces頁面的生命週期和JSP頁面的相似,Client端產生HTTP請求,Server端以HTML頁面  迴應,但是因爲JavaServer Faces提供額外的性能,在整個生命週期中,通過執行這些額外的性能,會 提供一些額外的服務。

在生命週期中,那一部被執行取決於是不是JavaServer Faces應用程序已經產生請求和是不是在 JavaServer Faces生命週期的傳遞階段響應已經產生。這部分首先解釋了不同的生命週期場景,然後用 guessNumber這個例子解釋了生命週期中的每一階段。

請求處理生命週期場景

JavaServer Faces應用程序支持兩種不同的響應和兩種不同的請求:

·         JavaServer Faces響應:請求處理生命週期中傳遞響應階段執行時創建的Servlet響應。

·         非JavaServer Faces響應:不是傳遞響應階段執行時創建的Servlet響應,一個例子就是沒有  JavaServer Faces組件的JSP頁面。

·         JavaServer Faces請求:由先前產生的JavaServer Faces響應發送的Servlet請求。一個例子就是從JavaServer Faces用戶界面組件提交表單,請求的URI標識處理這個請求的JavaServer Faces組件樹。

·         非JavaServer Faces請求:發送到應用程序的Servlet請求,例如Servlet或JSP頁面,而不是指到JavaServer Faces組件樹。

這些不同的請求和響應使得JavaServer Faces應用程序存在三種可能的生命週期場景:

·         場景1:非JavaServer Faces請求產生JavaServer Faces響應

這個場景的一個例子就是點擊HTML頁面上的超鏈打開一個包含 JavaServer Faces組件的頁面 。從一個非 JavaServer Faces請求傳遞一個 JavaServer Faces響應,應用程序必須映射URL 中的FacesServlet到包含 JavaServer Faces組件的頁面,FacesServlet接受請求並傳遞它們 到生命週期的執行中。

·         場景2:JavaServer Faces請求產生非JavaServer Faces響應

有時候 JavaServer Faces應用程序可能需要重定向到不同的Web應用程序或產生一個不 包含JavaServer Faces組件的響應,在這種情況下,開發者必須從應用程序處理中調用 FacesContext.responseComplete方法來忽略傳遞階段(Render Response)。FacesContext 包含關聯到特定 JavaServer Faces請求的所有信息,這個方法可以在應用請求值、處理校驗或更新模型值 階段被調用。

·         場景3:JavaServer Faces請求產生JavaServer Faces響應

這是JavaServer Faces應用程序最普通的場景。這個場景包括JavaServer Faces組件利用 FacesServlet提交到JavaServer Faces應用程序,因爲請求被JavaServer Faces實現處理, 所以應用程序產生響應不需要任何額外的步驟,所有的事件監聽器、校驗器和應用程序處理器在標準生命週期的恰當階段被自動調用。這些將要在下一部分描述。

 

標準請求處理生命週期

標準的請求處理生命週期就是上一部分所描述的場景3大部分的 JavaServer Faces技術用戶並不 需要關心請求處理生命週期。

圖2說明了 JavaServer Faces請求-響應生命週期。

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />CSDN_Dev_Image_2003-5-221142290.png<?xml:namespace prefix = w ns = "urn:schemas-microsoft-com:office:word" />
圖2:JavaServer Faces請求-響應生命週期

 


重建請求樹

CSDN_Dev_Image_2003-5-221142292.png
當一個 JavaServer Faces頁面請求產生時,例如點擊鏈接或按鈕, JavaServer Faces實現開 始進入重建組件樹階段。在這個階段, JavaServer Faces實現建立 JavaServer Faces頁面的組件 樹,捆綁事件處理器和校驗器,保存組件樹到FacesContext。guessNumber例子中greeting.jsp頁面的組件樹從概念上看起來像這樣:

3guessNumber組件樹

應用請求值

一旦組件樹已經建立,組件樹上的每個組件都將通過自身的decode方法從請求參數中提取新值,這個新值將被保存在組件上,如果這個值轉換失敗,一個關聯到這個組件的錯誤信息將產生並排隊在FacesContext上,這個錯誤信息將和校驗階段的校驗錯誤信息一起在傳遞響應階段被顯示。

在這個階段,如果有事件排列,JavaServer Faces實現將廣播事件到感興趣的監聽器。

greeting.jsp頁面userNumber組件的值是區域內輸入的任何值,因爲綁定組件的模型對象屬性是整形類型,JavaServer Faces實現轉換一個字符串到整形。

在這個時候,組件被設置新值,消息和事件已經被排列。

處理校驗

在這個階段,JavaServer Faces實現處理所有註冊到樹上組件的校驗,它檢查被指定校驗規則的屬性,將這些規則和保存在組件上的本地值比較,如果本地值是無效的,JavaServer Faces實現 添加一條錯誤信息到FacesContext.上,並且生命週期直接到傳遞響應階段,帶有錯誤信息顯示的頁面再一次被傳遞,如果在應用請求值時有轉換錯誤,這些錯誤信息也將被顯示。

在這個階段,如果有事件排列,JavaServer Faces實現將廣播事件到感興趣的監聽器。

greeting.jsp頁面,JavaServer Faces實現處理在userNumber input_text標籤上的校驗器, 它校驗用戶輸入在文本域的數據是一個0到10的整數,如果數據是無效的或在應用請求值階段發生轉換錯誤,處理將跳到傳遞響應階段,顯示有校驗和轉換錯誤信息greeting.jsp頁面再次被傳遞。

更新模型值

如果JavaServer Faces實現確定數據是有效的,它將遍歷組件樹並設置組件的本地值到相應的模型對象,僅僅有modelReference表達式的輸入組件纔會被更新。如果本地數據不能被轉換到模型對象屬性所指定的類型,生命週期將直接跳到傳遞響應階段,帶有錯誤信息顯示的頁面再次被傳遞,類似於校驗錯誤發生。

在這個階段,如果有事件排列,JavaServer Faces實現將廣播事件到感興趣的監聽器。

在這個階段,UserNumberBeanuserNumber屬性被設置爲userNumber組件的本地值。

調用應用程序

在這個階段JavaServer Faces實現處理任何應用程序級事件,例如提交表單或鏈接另一頁。

guessNumber例子中,greeting.jsp頁面有一個應用程序級事件,它關聯在Command 組件上。 當處理這個事件時,JavaServer Faces實現根據BasicApplicationHandler來決定哪一頁需要被顯示 ,然後產生這個新頁的響應組件樹,最後,JavaServer Faces實現傳遞控制到傳遞響應階段。

傳遞響應

在傳遞響應階段,JavaServer Faces實現調用組件的encoding功能,並傳遞保存在 FacesContext的組件樹上組件。

如果在應用請求階段、處理校驗階段或更新模型值階段遇到錯誤,初始頁面在這階段將要被傳遞,如果頁面包含output_errors標籤,任何被排列的錯誤信息都將被顯示在頁面上。如果應用程序包含定製的傳遞器,這個定製器定義怎樣傳遞一個組件,那麼新的組件能被加到組件樹上。樹的內容被傳遞之後,樹將被保存,這樣使得後面的請求能訪問它,並且在重建組件樹階段它能夠被利用。

 

 

結論

 

JavaServer Faces 技術提供了一個簡單的編程模型,使得開發Web應用程序變的更加簡單,真正 體現了MVC模式,利用JavaServer Faces技術所提供的程序模型,不同層次的開發 者都能夠迅速並且 容易的開發Web 應用程序。

 

參考資料

 

 

 

關於作者

   王國軍  從事軟件開發工作,對Java技術很感興趣,目前從事Workflow系統的開發工作。您可以直接通過 E-Mail : [email protected] 與他聯繫

發佈了7 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章