將 Struts
Tiles 和 JavaServer Faces (JSF) 一起使用
開發人員可以實現易於管理和重用的
健壯的
界面清晰的 Web 應用程序
Struts 框架推出已經有一段時間了
它已經成為在開發 J
EE Web 應用程序時開發人員所采用的事實上的標准
Tiles 框架是在 Struts 之後不久出現的
它通過為開發人員提供用組件組裝展示頁面的能力開拓了自己的生存環境
JSF 是 Web 應用程序框架中最新的成員
它提供了驗證用戶輸入和處理用戶事件的機制
最重要的是
這是一種以協議無關的方式呈現用戶界面組件的方法(有關這些 技術的概況
參見本文相關頁面
The major players
)
盡管 Struts 和 JSF 中有一些功能是重疊的
但是它們在其他方面起到了互為補充的作用
這三種技術的結合可以為開發 Web 應用程序
組織其展示和以協議無關的方式呈現定制的用戶界面(UI)組件提供一種高效的途徑
為了運行本文中的示例代碼
需要 Struts
Tiles
JavaServer Faces Reference Implementation (JSF
RI) Early Access Release
以及 Struts
Faces
Jakarta 項目提供的 Struts
發行版本將 Struts 和 Tiles 捆綁發布
還可以從 Jakarta 項目上下載 Struts
Faces 集成庫
JSF
RI 是 Sun 的 Web 開發工具包(Web Services Developer Pack)的一部分(在參考資料中有這些下載和示例代碼的鏈接)
現在回到集成三種技術的細節上
首先有個壞消息
在本文發表的時候
這三種技術是不能直接互操作的
好消息是
在本文中
我們展示了集成 Struts
Tiles 和 JSF 的方法
我們假設您已經了解 Struts 和 Tiles
對 JSF 有一些了解會有幫助(參閱 參考資料中提供的 developerWorks 上的 JSF 教程的鏈接)
但是不了解也不妨礙對本文的理解
JSF 簡介
JSF 應用程序是使用 JSF 框架的普通 J
EE 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 組件的代碼在服務器上運行
並且響應用戶操作所產生的事件
JSF
RI 提供了一個 render kit
它帶有一個自定義標記庫
用以從 UI 組件呈現 HTML
它還提供了根據需要定制這些組件外觀的能力
如果需要特殊的組件
那麼可以為特定的客戶機設備構造定制的標記並讓它與一個子 UI 組件和定制的 renderer 相關聯
對於不同的設備
您所需要做的就是指定不同的 renderer
JSF 和 UI 組件
您可能已經用 Java AWT 或者 Swing API 創建過 Java GUI 應用程序
所以您應該熟悉 JSF 的 UIComponent (它與 AWT 或者 Swing 組件很相像)
它儲存其子組件的樹(如果有的話)並為客戶端發生的動作生成標准事件
例如單擊一個按鈕以提交表單
這些事件緩存在 FacesContext 中
您可以用自定義標記關聯每一個這種事件的處理程序
例如
用一個自定義的 ActionListener 處理用戶單擊或者表單提交
JSF UIComponent
Renderer 和標記總是共同工作的
所有 JSP 自定義標記都是通過繼承 UIComponentTag 創建的
doStart 和 doEnd 方法總是在 UIComponentTag 類中實現
您只需在這些標記類中提供其他的功能
自定義標記
UI 組件和 renderer 之間的關系
客戶機浏覽器訪問用 JSF 標記(jsf:myTag)表示 UI 組件(MyComponent)的 JSP 頁面
這個 UI 組件運行在服務器上
並用適當的 renderer (MyRenderer)以 HTML 的形式呈現給客戶
這個 JSP 頁面表現了在 JSF
RI 中使用帶自定義標記的用戶界面組件而不是在 HTML 中對它們進行編碼
展示了 h:panel:group 標記的使用
這個標記用於將一個父組件下面的各個組件組織到一起
如果與像 panel_grid 和 panel_data 這樣的其他面板標記共同使用
那麼它會在運行時生成 HTML 表中的列的標記
JSF
RI
提供的 html_basic 標記庫用於表示像文本字段
按鈕這樣的 HTML 組件
JSF 生命周期 JSF 生命周期包括六個階段
一個傳入的請求可能會經歷全部階段
也可能不經歷任何階段
這取決於請求的類型
在生命周期中發生的驗證和轉換錯誤以及響應的類型
JSF 框架處理由 JSP 頁生成的 Faces 請求
並返回 faces 或者 non
faces 響應
在提交一個 JSF 表單
或者當用戶單擊指向在 URL 中具有 /faces 前綴的 URL 的鏈接時
就會出現 faces 響應
所有 faces 請求都由一個 FacesServlet 處理
這是 JSF 中的控制器
發送給一個 servlet 或者一個沒有 JSF 組件的 JSP 頁面的請求稱為 non
faces 請求
如果結果頁中有 JSF 標記
那麼它就稱為 faces 響應
如果沒有 JSF 標記
就是 non
faces 響應
JSF 生命周期有六個階段
重建請求樹
應用請求值
進行驗證
更新模型值
調用應用程序
呈現響應
根據 JSF 規范
每一階段表示請求處理生命周期的一個邏輯概念
不過在 JSF
RI 中
這些階段是由具有對應名字的實際類表示的
下面一節描述了每一階段是如何對請求進行處理並生成響應的
您將首先看到的是處理一個 faces 請求所涉及的階段
然後是處理 faces 響應所涉及的階段
處理 faces 請求 為了理解 JSF 請求處理
請看 FlightSearch
jsp
這是清單
中的一個簡單的 JSF 表單
一個 JSF 頁面基本上就是這個樣子的
這個 JSF 表單有輸入文本字段 from 和 to cities
departure 和 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 實現處理源字段上的驗證器
如果數據是無效的
那麼控制就交給呈現響應階段
在這個階段重新顯示 FlightSearch
jsp 並帶有相關組件的驗證錯誤
通過在 JSP 頁面中聲明 output_errors
頁面中的所有錯誤都會顯示在頁面的底部
設置模型對象值
在更新模型值階段
成功處理了所有驗證後
JSF 實現就通過對每一組件調用 updateModel 方法用有效值設置模型對象值
如果在將本地數據轉換為由模型對象屬性所指定的類型時出現任何錯誤
那麼生命周期就進入呈現響應階段
並將錯誤顯示出來
來自表單字段屬性的值會填充為模型對象的屬性值
可以調用 ActionListener
可以將一個 ActionListener 與一個用戶操作
如單擊提交按鈕相關聯
如清單
所示
在調用應用程序階段
對 FlightSea
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28155.html