上一篇文章我介紹了通過JBoss Tools的向導生成一個簡單的Seam工程Seam的中文意思就是縫合線 銜接口 接縫所以大家可以將Seam當成一條能將EJBJSF等框架有機地結合起來的紐帶如下圖所示
由上圖可以看出Seam會涉及很多技術不過大家不必驚慌因為其中有些技術不是必須的然而要學好Seam掌握JSF是必不可少的Seam基於JSF作了一些擴展使JSF更易用另外在上圖中JSF上層有JSPFacelets和Portal這三個框框這三種技術是JSF的視圖(View)技術三者可任選其一現在JSF默認是使用JSP作為視圖技術不過我早前在TSS上看過一篇關於JSF 的文章這方面會有所改變——Facelets將會取而代之因為Facelets對比JSP要優越許多
Facelets使用XHTML規范省卻了一大堆JSP的<f:verbatim />
更強的性能
Facelets實現模板(Template)功能這個可以稱得上是殺手锏功能因為幾乎每個應用都要使用這個功能
Facelets還可以方便地創建自定義標簽和EL函數
所以Facelets成為Seam的不二之選通過上面的講述我想大家應該了解SeamJSF與Facelets的關系故我介紹使用Facelets作為視圖技術的JSF
基本的XHTML構成
如果大家可以通過上一篇文章可以順利創建Seam工程可以在WebContent文件夾下看到一些XHTML文件不過這些XHTML都並不是獨立的需要依賴模板頁面下面讓我們來看一個完整的XHTML
<?xml version= encoding=utf?>
<!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN transitionaldtd>
<html xmlns= xmlns:h=>
<head>
<meta content=text/html; charset=utf httpequiv=ContentType/>
<title>
Hello World
</title>
</head>
<body>
<h><h:outputText value=Hello World! /></h>
</body>
</html>
這個文件的構成很簡單與普通的XHTML區別就是引入了命名空間這個URI正是JSF常用的組件(Component在JSF裡的稱呼可以理解為JSP中的標簽)的URI<houtputText />就是其中之一
另外需要指出的是上述文件並沒有<fviewRoot />這個在以JSP作為視圖技術的JSF的頁面中是必需的因為JSF的頁面其實在內存中模型就是一棵樹如下圖所示理解這點非常重要所以是必須有根節點Facelets的FaceletViewHandler會自動創建一個UIViewRoot如果XHTML中沒有定義的話
常用的JSF組件
常用的JSF組件可以分為以下幾大類表單輸入組件命令組件輸出組件數據組件和輔助組件
除了輔助組件之外有些屬性是組件共有的
id屬性正如我前邊所說JSF的頁面其實在內存中模型就是一棵樹每個組件對應一個節點每個節點都有一個唯一標識這就是id屬性如果你沒有顯式地設置idJSF會自動幫你生成一個
binding屬性只能設置一個EL為值它作用是可以將組件對應的對象綁定到後台的Managed Bean當我們拿到這個對象後我們可以通過JSF的API改變其行為這個會在以後文章詳細講述
rendered屬性用於指定該組件是否會被輸出到頁面中
下面我分別對每類組件進行概述
常用的表單輸入組件
對於表單輸入組件都會有一個叫value的屬性通常被設置為一個EL表達式如#{myBeanmyProperty}在JSF中有一個概念叫雙向綁定即是在提交表單的時候JSF通過EL將用戶輸入的值綁定到後台的Managed Bean中同樣地請求完成後渲染頁面時JSF亦會通過EL將Managed Bean的值輸出相應的位置
常用的表單輸入組件有如下
h:inputText
h:inputSecret
h:inputTextarea
h:selectBooleanCheckbox
h:selectManyCheckbox
h:selectOneRadio
h:selectOneListbox
h:selectManyListbox
h:selectOneMenu
h:selectManyMenu
在這我就不一一介紹這些組件的詳細用法大家可以找一下《Core JavaServer Faces nd Edition》來看一下
命令組件
JSF的命令組件有<h:commandButton />和<h:commandLink />分別輸出一個<input type=submit />和<a />它們都有兩個屬性action和actionListener可以綁定到Managed Bean的事件處理方法例如
<h:commandButton action=#{myBeanmyEvent} value=Click Me />
<h:commandButton actionListener=#{myBeanmyActionListener} value=Click Me />
對應的JAVA代碼
public String myEvent() {
return null;
}
public void myActionListener(ActionEvent event) {
}
常用的輸出組件
這些組件輸出一些常用的HTML元素如<span /><a /><div />和<table />等其中最常用的應該是<h:outputText /><h:panelGroup />和<h:panelGrip />
h:outputText當idstyle和styleClass等屬性不為空時它會輸出<span />包住value另外它還有一個屬性叫escape用於指示是否需要對值進行HTML編碼默認為true對值進行HTML可以從一定程序上防止XSS(Cross Site Scripting跨站腳本)攻擊
h:panelGroup當idstyle和styleClass行屬性不為空且layout不為block時它輸出<span />而當上述屬性不為空且layout為block時它會輸出<div />不過當上述屬性為空時它將什麼也不輸出可能有的朋友會問如果什麼不輸出那要它何用?這個問題稍後再答
hpanelGrid輸出<table />它的用法有點奇怪它有屬性叫columns默認為它將包含在其內的JSF組件分別放到<td />元素輸出有時我可能需要將兩個或多個JSF組件放到同一個td中定位就需要使用到hpanelGroup了此時我們不用對<hpanelGroup/>設置任何屬性這就是上個問題的答案<hpanelGroup />用於將兩個或多個JSF組件當作一個使用統一設置它們是否rendered等例如
<h:panelGrid columns=>
<h:outputText value= />
<h:outputText value= />
<h:panelGroup>
<h:outputText value= />
<h:outputText value= />
<h:outputText value= />
</h:panelGroup>
<h:outputText value= />
</h:panelGrid>
的輸出如下圖所示
常用的數據組件
JSF的數據組件有<h:dataTable />它的使用相對比較簡單可以將綁定到集合類型如
<h:dataTable value=#{myBeanmyProps} var=_prop>
<h:column>
<f:facet name=header>
<h:outputText value=Header />
</f:facet>
<h:outputText value=#{_propmyProp} />
</h:column>
</h:dataTable>
常用的輔助組件
這些組件一般不能單獨使用而是作為輔助用在不同的組件中其作用也有所不同它們的命名空間是xmlnsf=通常以f為前綴如ffacetfparam
小結
本文大概地介紹了一下JSF的組件雖然JSF默認已經有這麼多的組件但是對於時下盛行的富客戶端的浏覽器應用而言還是杯水車薪因此許多軟件廠商都開發各式各樣的第三方組件以方便大家構建AJAX應用如RichfacesIceFaces等至於這些組件的詳細用法大家可以在日後的學習中慢慢熟悉
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28275.html