Java Server Faces (JSF) 頁面轉換與驗證(一)

因爲primefaces在國內使用的並非太多,所以,國內對jsf作系統、詳細的介紹的資料不多,即便有一些資料,也僅僅是對國外資料的簡單翻譯或者是僅僅講表面現象(皮毛而已),它們的語句甚至仍是錯誤的,極可能會誤導使用者。html

相對來講,看國內的那些僅僅是翻譯過來的文章或書籍不如直接看國外的官方文檔或資料來的實在,在我講述jsf頁面中如何使用js調用後臺bean方法以前,先給你們說幾個國外的資料。在primefaces官方網站上,你能夠搜索到幾乎全部你須要的東西,primefaces官網爲:http://www.primefaces.org/showcase/index.xhtml 如過以爲本身英語很差的童鞋,能夠前往primefaces國內鏡像網站查閱資料: http://www.primefaces.cn/ ,只是國內的這個網站正在翻譯中,有些東西還不完善;若是有想細緻的瞭解primefaces的朋友,還能夠下載primefaces的官方文檔,最新的官方文檔爲5.2,全英文,我在這裏給你們提供我下載好的primefaces官方文檔:http://pan.baidu.com/s/1mg3i9Ry ,在這個文檔裏你能夠經過他們的示例來組合出來不少有趣的東西。另外我在淘寶上發現了Primefaces官方的JSF框架,官方售價300RMB,淘寶售價才五元,你們能夠前去學習:https://item.taobao.com/item.htm?spm=a1z10.1-c.w4004-12555052969.2.nPXnNz&id=523880497056java

在本文中,咱們將介紹  JSF 轉換和驗證框架的概念,它比您所想的要容易使用得多,也靈活得多。git

首先咱們將介紹應用於 JSF 生命週期的轉換和驗證過程,而後展現一個簡單的 JSF 應用程序中 的默認轉換和驗證過程。接着將展現如何建立和插入自定義的實現,以應對要求更高的場景。正如   Rick 在之前的文章中所說的,咱們會理論與實踐並重,先介紹概念,再用一個實際 例子說明這些概念的應用。示例應用程序將涵蓋大多數轉換和驗證用例,雖然只是初級的。web

注意,示例應用程序的默認編譯環境是 Maven,不過 , 還提供了一個 Ant 腳本。 能夠單擊本頁頂部或者底部的  Code圖標下載示例源代碼。爲了簡便起見,您會發現,該例子的設置與上一篇文章中的同樣。 關於構建環境配置的更多說明,包括在 Ant 環境中而不是在 Maven 環境中編譯和運行 示例應用程序的說明,請參閱 參考資料。框架

轉換和驗證

雖然在 JSF Web 應用程序中使用轉換和驗證不必定要理解 JavaServer  Faces 生命週期的基礎知識,可是在深刻轉換和驗證內容以前,最好對一些基本知識作一回顧。 此外,掌握一點 JSF 生命週期技巧能夠極大地幫助簡化 Web 應用程序的開發 工做。還有助於更好地理解 JSF 的可插入能力。jsp

下面的圖片描繪了咱們所說的「基本 JSF 生命週期」。   基本是在暗示這只是一個典型的處理所提交表單值的請求 - 響應(request-and-response)場景。學習

顯然,不一樣的場景對這裏重點描述的生命週期有不一樣的影響。咱們將在 本文稍後介紹其中一些場景。如今,只須要注意轉換和驗證過程發生在 應用請求值處理驗證呈現響應階段便可。網站

咱們將在稍後介紹爲何轉換和驗證會在這些階段出現,可是首先讓咱們 澄清一個更基本的問題:轉換是什麼?簡單地說,轉換是確保數據擁有正確的對象或者類型的過程。下面是兩個典型的轉換:spa

  • 字符串值能夠轉換爲 java.util.Date
  • 字符串值能夠轉換爲 Float。

    至於 驗證,它用於確保數據包含所指望的內容。下面是兩個 典型的驗證:翻譯

  • java.util.Date 的格式爲 MM/yyyy。

  • Float 在 1.0 和 100.0 之間。

關注生命週期階段

轉換和驗證的主要目的是確保在更新模型數據以前已經通過了正確的 無害處理。以後,當須要調用應用程序方法用這些些數據實際 作一些事情時, 就能夠有把握地假定模型的某些狀態。轉換和驗證使您能夠側重於業務邏輯,而不是側重於對輸入數據進行繁瑣的資格認定,好比 null 檢驗、長度限定、範圍邊界,等等。

所以,在 更新模型數據生命週期階段中,在組件數據被綁定到 backing bean 模型 以前 進行轉換和驗證處理是有道理的。正如圖 1 所示,轉換髮生在應用請求值階段,而驗證發生在 處理驗證階段。下圖突出顯示了這些階段。

關於 immediate 屬性

注意,圖 2 中描繪的轉換和驗證過程表示了將 UIInput組件的  immediate屬性設置爲 false時的應用程序流程。 若是這個屬性設置爲 true,那麼轉換和驗證會發生在生命週期更早的時期,即應用請求值階段(參見圖 3)。對使用 immediate 屬性的詳細討論超出了本文的範圍,可是在某些狀況下,好比管理動態清單(可能您還記得,本系列的上一篇文章中曾介紹過),它頗有用,它甚至能夠繞過驗證(在與 UICommand組件結合使用時)。能想像一個 須要徹底繞過驗證的應用程序嗎?

下面的圖片內容展現了當 immediate屬性設置爲 true時, 在 JSF 應用程序生命週期中的哪些地方進行轉換和驗證。

實際的例子

下面,咱們將用一個示例應用程序展現所討論的概念。本月的示例應用程序 將展現 JSF 的轉換和驗證能力。記住,這個示例應用程序很是簡單,沒有追求一些沒必要要的面面俱到: 不管如何,咱們的目的不是構建一個在真實世界中使用的應用程序!這個示例應用程序 將展現如下幾點:

  • 使用標準 JSF 轉換器轉換表單字段數據。

  • 使用標準 JSF 驗證組件驗證表單字段數據。

  • 如何編寫自定義轉換器和驗證器。

  • 如何在 faces-config.xml 文件中註冊自定義轉換器和驗證器。

  • 如何定製默認錯誤消息。

這個示例應用程序是一個簡單的用戶註冊表單。咱們的目標是收集用戶數據,好比 姓名、年齡、電子郵箱地址和電話號碼。而後,咱們將展現如何利用 JSF 轉換和驗證 確保收集的數據對於模型是適合的。

這個應用程序使用了三個 JSP 頁:

  • index.jsp 將用戶定向到 UserRegistration.jsp。

  • UserRegistration.jsp 包含應用程序的表單字段。

  • results.jsp 通知應用程序用戶已經註冊。

咱們將首先分析編寫 JSF 轉換過程的選擇。

JSF 轉換

如前所述,轉換是確保數據對象或者類型正確的一個過程,所以,咱們將字符串值 轉換爲其餘類型,好比 Date對象、基本浮點型或者  Float對象。可使用自帶的轉換器,也能夠編寫 自定義的轉換器。

JSF 提供了許多標準數據轉換器。也能夠經過實現 Converter接口插入 自定義轉換器,可是這些將在後面進行介紹。下表顯示了 JSF 進行簡單數據轉換所使用的轉換器 id及其對應的實現類。大多數數據轉換是自動發生的。

javax.faces.BigDecimal javax.faces.convert.BigDecimalConverter
javax.faces.BigInteger javax.faces.convert.BigIntegerConverter
javax.faces.Boolean javax.faces.convert.BooleanConverter
javax.faces.Byte javax.faces.convert.ByteConverter
javax.faces.Character javax.faces.convert.CharacterConverter
javax.faces.DateTime javax.faces.convert.DateTimeConverter
javax.faces.Double javax.faces.convert.DoubleConverter
javax.faces.Float javax.faces.convert.FloatConverter

下圖展現了用戶年齡的默認轉換。

JSF 標籤配置以下:

  <h:inputText id="age" value="#{UserRegistration.user.age}"/>

各類狀況的轉換器

UserRegistration.user.age表示一個值綁定屬性,它的類型爲  int。對於基本型或者 BigInteger/   BigDecimal的綁定,JSF 選擇了標準轉換器。不過,還能夠經過  <f:converter/>標籤,利用一個特定的轉換器來增長粒度,以下所示。

 <h:inputText id="age" value="#{UserRegistration.user.age}"> 

             <f:converter id="javax.faces.Short"/> 

 </h:inputText>

在下圖中,能夠看到 JSF 使用標準轉換器的場景。在這種狀況下,雖然 年齡其實是一個有效的整數,但轉換仍然會失敗,由於該值不是短整型的。

選擇日期格式樣式

儘管在默認狀況下,JSF 能夠很好地處理基本型及相似的類型,可是在處理 日期數據時,必須指定轉換標籤 <f:convertDateTime/>。 這個標籤基於  java.text包,並使用短、長和自定義樣式。下面是一 個例子:

 <!-- UserRegistration.jsp --> 
 <h:inputText id="birthDate" value="#{UserRegistration.user.birthDate}"> 
             <f:convertDateTime pattern="MM/yyyy"/> 
 </h:inputText>

這個例子展現瞭如何用  <f:convertDateTime/>確保用戶的生日能夠轉換爲 格式爲 MM/yyyy(月 / 年)的日期對象。請參閱 JSF 的 java.text.SimpleDataFormat (在參考資料中),以獲取模式列表。

其餘樣式

除了能夠轉換日期和時間格式外,JSF 還 提供了處理像百分數或者貨幣數據這類值的特殊轉換器。 這個轉換器處理分組(如逗號)、小數、貨幣符號等。例如, 如下 <f:convertNumber/> 的用法就是處理貨幣的一種技巧:

 <!-- UserRegistration.jsp --> 
 <h:inputText id="salary" value="#{UserRegistration.user.salary}"> 
             <f:convertNumber maxFractionDigits="2"
                       groupingUsed="true"
                       currencySymbol="$"
                       maxIntegerDigits="7"
                       type="currency"/> 
 </h:inputText>

在下圖中,能夠看到一些格式編排不正確的貨幣數據,以及所致使的轉換錯誤。

自定義轉換

若是須要將字段數據轉換爲特定於應用程序的值對象,則須要自定義數據轉換, 以下面例子所示:

  • String 轉換爲 PhoneNumber 對象 (PhoneNumber.areaCode、PhoneNumber.prefix、 ...)。

  • String 轉換爲 Name 對象 (Name.first、Name.last)。

  • String 轉換爲 ProductCode 對象 (ProductCode.partNum、ProductCode.rev、 ...)。

要建立自定義轉換器,必須完成以步驟:

  1. 實現 Converter接口(也就是   javax.faxes.convert.Converter)。

  2. 實現 getAsObject方法,它將一個字段(字符串) 轉換爲一個對象(例如,PhoneNumber)。

  3. 實現 getAsString方法,它將一個對象 (如 PhoneNumber)轉換爲一個字符串。

  4. Faces 上下文中註冊自定義轉換器。

  5. 用  <f:converter/>標籤在 JSP 中插入這個轉換器。

您能夠本身看到如何在 JSF 應用程序生命週期中加入這些步驟。 在下圖 中,JSF 在應用請求值階段調用自定義轉換器的 getAsObject方法。 轉換器必須在這裏將請求字符串轉換爲所需的對象類型,而後返回這個對象,將它存儲在相應的 JSF 組件中。 若是該值被返回呈如今視圖中,那麼 JSF 將在呈現響應階段調用 getAsString方法。 這意味着轉換器還要負責將對象數據轉換回字符串表示形式。

建立自定義轉換器

我將在下一篇博客中國使用一個案例分析來展現 Converter 接口、getAsObjectgetAsString方法的實現,同時還將展現如何在 Faces上下文中註冊這個轉換器。

相關文章
相關標籤/搜索