JSF生命周期.docx
《JSF生命周期.docx》由会员分享,可在线阅读,更多相关《JSF生命周期.docx(33页珍藏版)》请在冰豆网上搜索。
JSF生命周期
JSF专题
JSF生命周期
JSF的每個元件基本上都是可替換的,像是轉換器(Converter)、驗證器(Validator)、元件(Component)、繪製器(Renderer)等等,每個元件都可以替換讓JSF在使用時更有?
椥裕鄬Φ乃冻龅木褪窃M合時的複雜性,為此,最基本的,如果您打算自訂一些JSF元件,那麼您對於JSF處理請求的每個階段必須要有所瞭解。
下圖是JSF處理請求時的每個階段與簡單說明,起始狀態即使用者端發出請求時,終止狀態則相當於繪製器發出回應時:
扣除事件處理,JSF總共必須經過六個階段:
回?
彤嬅妫≧estoreView)
對於選擇的頁面如果是初次瀏覽則建立新的元件樹。
如果是會話階段,會?
氖褂谜叨嘶蛩欧鞫说馁Y料找尋資料以回?
兔總€元件的狀態?
K重建元件樹,如果不包括請求參數,則直接跳過接下?
淼碾A段直接繪製回應。
套用申請值(ApplyRequestValues)
每個元件嘗試?
牡?
淼恼埱笾姓覍ぷ约旱膮?
K更新元件值,在這邊會觸發ActionEvent,這個事件會被排入?
辛兄校会嵩趩酒饝贸淌诫A段之後才會真正由事件處理者進行處理。
然而對於設定immeduate為true的命令(Commamnd)元件?
碚f,會立即處理事件?
K跳過之後的階段直接繪製回應,而對於設定immediate為true的輸入(Input)元件,會馬上進行轉換驗證?
K處理值變事件,之後跳過接下?
淼碾A段,直接繪製回應。
執行驗證(ProcessValidations)
進行轉換與驗證處理,如果驗證錯誤,則會跳過之後的階段,直接繪製回應,結果是重新呼叫同一頁繪製結果。
更新模型值(UpdateModelValues)
更新每一個與元件綁定的backingbean或模型物件。
喚起應用程式(InvokeApplication)
處理動作事件,?
K進行後端應用程式邏輯。
繪製回應(RenderResponse)
使用繪製器繪製頁面。
如果您只是要「使用」JSF,則您最基本的只需要知道「執行驗證」、「更新模型值」、與「喚起應用程式」這三個階段及中間的事件觸發,JSF參考?
作將這三個階段之外的其它階段之複雜性隱藏起?
砹耍恍枰肋@幾個階段的處理細?
。
然而如果您要自訂元件,則您還必須知道「回?
彤嬅妗埂ⅰ柑子谜埱笾怠古c「繪製回應」這些階段是如何處理的,這幾個階段相當複雜,所幸的是您可以使用JSF所提供的框架?
磉M行元件自訂,JSF提供的框架已經很大程度上降低了元件製作的複雜性。
當然,即使JSF框架降低了複雜性,但?
際上要處理JSF自訂元件還是很複雜的一件事,在嘗試開發自訂元件之前,您可以先搜尋一些網站,像是ApacheMyFaceshttp:
//myfaces.apache.org/,看看是不是已經有相關?
似的元件已經開發完成,省去您重新自訂元件的氣力。
AddComment
发表于@2005年12月05日3:
59PM|评论(0)
表格标签
很多資料經常使用表格?
肀憩F,JSF提供dataTable>標籤讓您得以列舉資料?
K使用表格方式?
沓尸F,舉個?
際的例子?
砜矗僭O您撰寫了以下的兩個?
別:
UserBean.java
packageonlyfun.caterpillar;
publicclassUserBean{
privateStringname;
privateStringpassword;
publicUserBean(){
}
publicUserBean(Stringname,Stringpassword){
this.name=name;
this.password=password;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
}
TableBean.java
packageonlyfun.caterpillar;
importjava.util.*;
publicclassTableBean{
privateListuserList;
publicListgetUserList(){
if(userList==null){
userList=newArrayList();
userList.add(
newUserBean("caterpillar","123456"));
userList.add(
newUserBean("momor","654321"));
userList.add(
newUserBean("becky","7890"));
}
returnuserList;
}
}
在TableBean中,我們假設getUserList()方法?
際上是?
馁Y料庫中查詢出UserBean的內容,之後傳回List物件,若我們的faces-config.xml如下:
faces-config.xml
xmlversion="1.0"encoding="UTF-8"?
>
DOCTYPEfaces-configPUBLIC"-//SunMicrosystems,
Inc.//DTDJavaServerFacesConfig1.0//EN"
"
tableBean
onlyfun.caterpillar.TableBean
request
userBean
onlyfun.caterpillar.UserBean
request
我們可以如下使用dataTable>?
懋a生表格資料:
index.jsp
<%@tagliburi="prefix="h"%>
<%@tagliburi="prefix="f"%>
view>
dataTablevalue="#{tableBean.userList}"var="user">
column>
outputTextvalue="#{user.name}"/>
column>
column>
outputTextvalue="#{user.password}"/>
column>
dataTable>
view>
dataTable>的value值綁定tableBean的userList方法,它會一個一個取出List中的資料?
K設定給var設定的user,之後在每一個column中我們可以顯示所列舉出的user.name與user.password,程式的結果會如下所示:
所產生的HTML表格標籤如下:
caterpillar |
123456 |
momor |
654321 |
becky |
7890 |
dataTable>的value值綁定的對象可以是以下的型態:
陣列
java.util.List的?
例
java.sql.ResultSet的?
例
javax.servlet.jsp.jstl.sql.Result的?
例
javax.faces.model.DataModel的?
例
dataTable>配合column>?
硪员砀竦姆绞斤@示資料,column>中只能包括JSF元件或者是facet>,JSF支援兩種facet:
header與footer。
分別用以設定表格的表頭與表尾文字,一個設定的例子如下:
dataTablevalue="#{tableBean.userList}"var="user">
column>
facetname="header">
outputTextvalue="Name"/>
facet>
outputTextvalue="#{user.name}"/>
facetname="footer">
outputTextvalue="****"/>
facet>
column>
column>
facetname="header">
outputTextvalue="Password"/>
facet>
outputTextvalue="#{user.password}"/>
facetname="footer">
outputTextvalue="****"/>
facet>
column>
dataTable>
所產生的表格如下所示:
另外,對於表頭、表尾仍至於每一行列,都可以分別設定CSS風格,例如下面這個styles.css摘錄自CoreJSF一書:
styles.css
.orders{
border:
thinsolidblack;
}
.ordersHeader{
text-align:
center;
font-style:
italic;
color:
Snow;
background:
Teal;
}
.evenColumn{
height:
25px;
text-align:
center;
background:
MediumTurquoise;
}
.oddColumn{
text-align:
center;
background:
PowderBlue;
}
可以在我們的頁面中如下加入:
....
....
dataTablevalue="#{tableBean.userList}"var="user"
styleClass="orders"
headerClass="ordersHeader"
rowClasses="evenColumn,oddColumn">
column>
facetname="header">
outputTextvalue="Name"/>
facet>
outputTextvalue="#{user.name}"/>
facetname="footer">
outputTextvalue="****"/>
facet>
column>
column>
facetname="header">
outputTextvalue="Password"/>
facet>
outputTextvalue="#{user.password}"/>
facetname="footer">
outputTextvalue="****"/>
facet>
column>
dataTable>
則顯示的表格結果如下:
在簡單的表格中曾經提過,dataTable>可以列舉以下幾種型態的資料:
陣列
java.util.List的?
例
java.sql.ResultSet的?
例
javax.servlet.jsp.jstl.sql.Result的?
例
javax.faces.model.DataModel的?
例
對於前四種型態,JSF?
際上是以javax.faces.model.DataModel加以包裝,DataModel是個抽象?
別,其子?
別都是位於javax.faces.model這個package下:
ArrayDataModel
ListDataModel
ResultDataModel
ResultSetDataModel
ScalarDataModel
如果您想要對表格資料有更多的控制,您可以直接使用DataModel?
碓O定表格資料,呼叫DataModel的setWrappedObject()方法可以讓您設定對應型態的資料,呼叫getWrappedObject()則可以取回資料,例如:
TableBean.java
packageonlyfun.caterpillar;
importjava.util.*;
importjavax.faces.model.DataModel;
importjavax.faces.model.ListDataModel;
publicclassTableBean{
privateDataModelmodel;
privateintrowIndex=-1;
publicDataModelgetUsers(){
if(model==null){
model=newListDataModel();
model.setWrappedData(getUserList());
}
returnmodel;
}
privateListgetUserList(){
ListuserList=newArrayList();
userList.add(newUserBean("caterpillar","123456"));
userList.add(newUserBean("momor","654321"));
userList.add(newUserBean("becky","7890"));
returnuserList;
}
publicintgetSelectedRowIndex(){
returnrowIndex;
}
publicStringselect(){
rowIndex=model.getRowIndex();
return"success";
}
}
在這個Bean中,我們直接設定DataModel?
,將userList設定給它,如您所看到的,我們還可以取得DataModel?
的各個變項,在這個例子中,select()將作為點選表格之後的事件處理方法,我們可以藉由DataModel?
的getRowIndex()?
砣〉盟c選的是哪一row的資料,例如:
index.jsp
<%@tagliburi="prefix="h"%>
<%@tagliburi="prefix="f"%>
view>
form>
dataTablevalue="#{tableBean.users}"var="user"
styleClass="orders"
headerClass="ordersHeader"
rowClasses="evenColumn,oddColumn">
column>
facetname="header">
outputTextvalue="Name"/>
facet>
commandLinkaction="#{tableBean.select}">
outputTextvalue="#{user.name}"/>
commandLink>
facetname="footer">
outputTextvalue="****"/>
facet>
column>
column>
facetname="header">
outputTextvalue="Password"/>
facet>
outputTextvalue="#{user.password}"/>
facetname="footer">
outputTextvalue="****"/>
facet>
column>
dataTable>
form>
SelectedRow:
outputText
value="#{tableBean.selectedRowIndex}"/>
view>
DataModel的rowIndex是?
?
開始計算,當處理ActionEvent時,JSF會逐次遞增rowIndex的值,這讓您可以得知目前正在處理的是哪一個row的資料,一個執行的圖示如下:
发表于@2005年12月05日3:
55PM|评论(0)
选择表单标签
選擇?
的標籤可略分為單選標籤與多選標籤,依外型的不同可以分為單選鈕(Radio)、核取方塊(CheckBox)、列示方塊(ListBox)與選單(Menu),以下分別先作簡單的說明。
selectBooleanCheckbox>
在視圖上呈現一個核取方塊,例如:
我同意selectBooleanCheckboxvalue="#\{user.aggree\}"/>
value所綁定的屬性必須接受與傳回boolean型態。
這個元件在網頁上呈現的外觀如下:
selectOneRadio>、selectOneListbox>、selectOneMenu>
這三個標籤的作用,是讓使用者?
钠渌峁┑倪x項中選擇一個項目,所不同的就是其外觀上的差別,例如:
selectOneRadiovalue="#{user.education}">
selectItemitemLabel="高中"itemValue="高中"/>
selectItemitemLabel="大學"itemValue="大學"/>
selectItemitemLabel="研究所以上"itemValue="研究所以上"/>
selectOneRadio>
value所綁定的屬性可以接受字串以外的型態或是自訂型態,但記得如果是必須轉換的型態或自訂型態,必須搭配標準轉換器或自訂轉換器?
磙D換為物件,selectOneRadio>的外觀如下:
您也可以設定layout屬性,可設定的屬性是lineDirection、pageDirection,預設是lineDirection,也就是由左到右?
砼帕羞x項,如果設定為pageDirect