熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

集成 Struts、Tiles 和 JavaServer Faces

2022-06-13   來源: Java開源技術 

  將 StrutsTiles 和 JavaServer Faces (JSF) 一起使用開發人員可以實現易於管理和重用的健壯的界面清晰的 Web 應用程序
  
    Struts 框架推出已經有一段時間了它已經成為在開發 JEE Web 應用程序時開發人員所采用的事實上的標准Tiles 框架是在 Struts 之後不久出現的它通過為開發人員提供用組件組裝展示頁面的能力開拓了自己的生存環境JSF 是 Web 應用程序框架中最新的成員它提供了驗證用戶輸入和處理用戶事件的機制最重要的是這是一種以協議無關的方式呈現用戶界面組件的方法(有關這些 技術的概況參見本文相關頁面The major players)
  
    盡管 Struts 和 JSF 中有一些功能是重疊的但是它們在其他方面起到了互為補充的作用這三種技術的結合可以為開發 Web 應用程序組織其展示和以協議無關的方式呈現定制的用戶界面(UI)組件提供一種高效的途徑
  
    為了運行本文中的示例代碼需要 Struts TilesJavaServer Faces Reference Implementation (JSFRI) Early Access Release 以及 StrutsFaces Jakarta 項目提供的 Struts 發行版本將 Struts 和 Tiles 捆綁發布還可以從 Jakarta 項目上下載 StrutsFaces 集成庫JSFRI 是 Sun 的 Web 開發工具包(Web Services Developer Pack)的一部分(在參考資料中有這些下載和示例代碼的鏈接)
  
    現在回到集成三種技術的細節上首先有個壞消息在本文發表的時候這三種技術是不能直接互操作的好消息是在本文中我們展示了集成 StrutsTiles 和 JSF 的方法我們假設您已經了解 Struts 和 Tiles對 JSF 有一些了解會有幫助(參閱 參考資料中提供的 developerWorks 上的 JSF 教程的鏈接)但是不了解也不妨礙對本文的理解
  
  JSF 簡介
    JSF 應用程序是使用 JSF 框架的普通 JEE Web 應用程序JSF 框架提供了豐富的 GUI 組件模型這些模型體現了真正的 GUI 框架內涵您可能聽人們說過盡管某種技術不錯但是它的外觀仍然需要改進是的用 HTML 組件構建平淡無奇的頁面的日子已經過去了如果使用 JSF 的話具有更高級 GUI 外觀的日子就在眼前您會問怎麼做呢?樹形組件菜單組件和圖形是已經存在的 UI 組件這些 JSF 一定要提供更進一步JSF 通過提供容易使用的 API 鼓勵創建自定義組件
  
  注: 這裡所提到的 UI 組件是 Sun 提供的示例的一部分像所有規范一樣實際的實現由不同的提供商完成
  
    在傳統的使用模型視圖控制器(MVC)的 Web 應用程序中GUI 組件是由處理展示和業務邏輯的自定義標記所表示的這樣就出現了必須編寫與客戶機設備打交道的代碼的問題這會產生重復的代碼使用 JSF 就不會有這個問題
  
    JSF 結構將展示邏輯 (什麼)與 UI 組件的業務邏輯 (為什麼如何)分離通過在 JSP 頁面中使用 JSF 標記就可以將 renderer 與 UI 組件關聯在一起一個 UI 組件可以用不同的 renderer 從而以不同的方式呈現特定於 UI 組件的代碼在服務器上運行並且響應用戶操作所產生的事件
  
    JSFRI 提供了一個 render kit它帶有一個自定義標記庫用以從 UI 組件呈現 HTML它還提供了根據需要定制這些組件外觀的能力如果需要特殊的組件那麼可以為特定的客戶機設備構造定制的標記並讓它與一個子 UI 組件和定制的 renderer 相關聯對於不同的設備您所需要做的就是指定不同的 renderer
  
  JSF 和 UI 組件
    您可能已經用 Java AWT 或者 Swing API 創建過 Java GUI 應用程序所以您應該熟悉 JSF 的 UIComponent (它與 AWT 或者 Swing 組件很相像)它儲存其子組件的樹(如果有的話)並為客戶端發生的動作生成標准事件例如單擊一個按鈕以提交表單這些事件緩存在 FacesContext 中您可以用自定義標記關聯每一個這種事件的處理程序例如用一個自定義的 ActionListener 處理用戶單擊或者表單提交
  
  JSF UIComponentRenderer 和標記總是共同工作的所有 JSP 自定義標記都是通過繼承 UIComponentTag 創建的doStart 和 doEnd 方法總是在 UIComponentTag 類中實現您只需在這些標記類中提供其他的功能
  
  自定義標記UI 組件和 renderer 之間的關系客戶機浏覽器訪問用 JSF 標記(jsf:myTag)表示 UI 組件(MyComponent)的 JSP 頁面這個 UI 組件運行在服務器上並用適當的 renderer (MyRenderer)以 HTML 的形式呈現給客戶這個 JSP 頁面表現了在 JSFRI 中使用帶自定義標記的用戶界面組件而不是在 HTML 中對它們進行編碼
  
  展示了 h:panel:group 標記的使用這個標記用於將一個父組件下面的各個組件組織到一起如果與像 panel_grid 和 panel_data 這樣的其他面板標記共同使用那麼它會在運行時生成 HTML 表中的列的標記JSFRI提供的 html_basic 標記庫用於表示像文本字段按鈕這樣的 HTML 組件
  
  JSF 生命周期
  JSF 生命周期包括六個階段一個傳入的請求可能會經歷全部階段也可能不經歷任何階段這取決於請求的類型在生命周期中發生的驗證和轉換錯誤以及響應的類型JSF 框架處理由 JSP 頁生成的 Faces 請求並返回 faces 或者 nonfaces 響應
  
  在提交一個 JSF 表單或者當用戶單擊指向在 URL 中具有 /faces 前綴的 URL 的鏈接時就會出現 faces 響應所有 faces 請求都由一個 FacesServlet 處理 這是 JSF 中的控制器
  
  發送給一個 servlet 或者一個沒有 JSF 組件的 JSP 頁面的請求稱為 nonfaces 請求如果結果頁中有 JSF 標記那麼它就稱為 faces 響應如果沒有 JSF 標記就是 nonfaces 響應
  
  JSF 生命周期有六個階段
  
  重建請求樹
  應用請求值
  進行驗證
  更新模型值
  調用應用程序
  呈現響應
  根據 JSF 規范每一階段表示請求處理生命周期的一個邏輯概念不過在 JSFRI 中這些階段是由具有對應名字的實際類表示的下面一節描述了每一階段是如何對請求進行處理並生成響應的您將首先看到的是處理一個 faces 請求所涉及的階段然後是處理 faces 響應所涉及的階段
  
  處理 faces 請求
  為了理解 JSF 請求處理請看 FlightSearchjsp這是清單 中的一個簡單的 JSF 表單一個 JSF 頁面基本上就是這個樣子的這個 JSF 表單有輸入文本字段 from 和 to citiesdeparture 和 return dates還有提交和重設表單的按鈕(我們會在稍後分析清單中每一個標記的意義)現在假設提交這個表單產生了一個 faces 請求
  
  這個請求被 FacesServlet 所接收並在向客戶發回響應之前通過不同的階段展示了如何對 JSF 請求進行處理讓我們看一看這是如何進行的
  
   接收請求
  FacesServlet 接收請求並從 FacesContextFactory 得到 FacesContext 的一個實例
  
   委托生命周期處理
  FacesServlet 通過對在 faces 上下文中傳遞的 Lifecycle 實現調用 execute 方法將生命周期處理委托給 Lifecycle 接口
  
   Lifecycle 執行每一階段
  Lifecycle 實現執行從重建組件樹階段開始的每一階段
  
   創建的組件樹
  在重建組件樹階段用 travelForm 中的組件創建一個組件樹這個樹以 UIForm 作為根用不同的文本字段和按鈕作為其子組件
  
  fromCity 字段有一個驗證規則它規定其不能為空如 validate_required 標記所示這個標記將 fromCity 文本字段與一個 JSF Validator 鏈接起來
  
  JSF 有幾個內建的驗證器相應的 Validator 是在這個階段初始化的這個組件樹緩存在 FacesContext 中並且這個上下文會在後面用於訪問樹及調用任何一個事件處理程序同時 UIForm 狀態會自動保存所以當刷新這一頁時就會顯示表單的原始內容
  
   從樹中提取值
  在應用請求值階段JSF 實現遍歷組件樹並用 decode 方法從請求中提取值並在本地設置每一個組件如果在這個過程中出現了任何錯誤那麼它們就在 FacesContext 中排隊並在呈現響應階段顯示給用戶
  
  同時在這個階段排隊的所有由像單擊按鈕這樣的用戶操作產生的事件都廣播給注冊的偵聽器單擊 reset 按鈕會將文本字段中的值重新設置為它們原來的值
  
   處理驗證
  在處理驗證階段對在應用請求值階段設置的本地值進行所有與各組件相關的驗證當 JSF 實現對每一個注冊的驗證器調用 validate 方法時就會進入此階段
  
  如果任何一項驗證失敗那麼生命周期就會進入呈現響應階段在那裡呈現帶有錯誤信息的同一頁面在這裡所有在這一階段排隊的事件同樣都會廣播給注冊的偵聽器
  
  JSF 實現處理源字段上的驗證器如果數據是無效的那麼控制就交給呈現響應階段在這個階段重新顯示 FlightSearchjsp 並帶有相關組件的驗證錯誤通過在 JSP 頁面中聲明 output_errors頁面中的所有錯誤都會顯示在頁面的底部
  
   設置模型對象值
  在更新模型值階段成功處理了所有驗證後JSF 實現就通過對每一組件調用 updateModel 方法用有效值設置模型對象值如果在將本地數據轉換為由模型對象屬性所指定的類型時出現任何錯誤那麼生命周期就進入呈現響應階段並將錯誤顯示出來來自表單字段屬性的值會填充為模型對象的屬性值
  
   可以調用 ActionListener
  可以將一個 ActionListener 與一個用戶操作如單擊提交按鈕相關聯如清單 所示在調用應用程序階段對 FlightSea
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28155.html
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.