JSF生命周期.docx
- 文档编号:30834411
- 上传时间:2024-01-30
- 格式:DOCX
- 页数:33
- 大小:29.47KB
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" " onlyfun.caterpillar.TableBean onlyfun.caterpillar.UserBean 我們可以如下使用 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表格標籤如下: 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項,如果設定為pageDirectcaterpillar 123456 momor 654321 becky 7890
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JSF 生命周期