版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
JavaServerFaces技術(shù)簡(jiǎn)介主要內(nèi)容JSF簡(jiǎn)介JSF入門(mén)ManagedBeans數(shù)據(jù)轉(zhuǎn)換與驗(yàn)證JSF生命周期事件處理JSF標(biāo)簽JSF簡(jiǎn)介什么是JSFJSF體系結(jié)構(gòu)什么是JSFJavaServerFaces(JSF):JavaServerFaces(JSF)是一種用于構(gòu)建Web應(yīng)用程序的新標(biāo)準(zhǔn)Java框架。它提供了一種以組件為中心來(lái)開(kāi)發(fā)JavaWeb用戶(hù)界面的方法,從而簡(jiǎn)化了開(kāi)發(fā)。JavaServerFaces還引起了廣大Java/Web開(kāi)發(fā)人員的興趣?!捌髽I(yè)開(kāi)發(fā)人員”和Web設(shè)計(jì)人員將發(fā)現(xiàn)JSF開(kāi)發(fā)可以簡(jiǎn)單到只需將用戶(hù)界面(UI)組件拖放到頁(yè)面上,而“系統(tǒng)開(kāi)發(fā)人員”將發(fā)現(xiàn)豐富而強(qiáng)健的JSFAPI為他們提供了無(wú)與倫比的功能和編程靈活性。JSF還通過(guò)將良好構(gòu)建的模型-視圖-控制器(MVC)設(shè)計(jì)模式集成到它的體系結(jié)構(gòu)中,確保了應(yīng)用程序具有更高的可維護(hù)性。最后,由于JSF是通過(guò)JavaCommunityProcess(JCP)開(kāi)發(fā)的一種Java標(biāo)準(zhǔn),因此開(kāi)發(fā)工具供應(yīng)商完全能夠?yàn)镴avaServerFaces提供易于使用的、高效的可視化開(kāi)發(fā)環(huán)境。什么是JSF使用JavaServerFacesTechnology創(chuàng)建一個(gè)JSP頁(yè)面時(shí),在服務(wù)器的內(nèi)存中會(huì)建立一個(gè)組件樹(shù),每一個(gè)組件標(biāo)簽對(duì)應(yīng)樹(shù)中的一個(gè)UIComponent實(shí)例。該框架使用組件樹(shù)來(lái)處理應(yīng)用程序的請(qǐng)求并且創(chuàng)建一個(gè)呈現(xiàn)出的響應(yīng)。當(dāng)用戶(hù)生成一個(gè)事件時(shí),例如,點(diǎn)擊了一個(gè)按鈕,JavaServerFaces生命周期即處理該事件并且產(chǎn)生適當(dāng)?shù)捻憫?yīng)。什么是JSFFacesServlet是進(jìn)入JavaServerFaces框架的入口點(diǎn)。它管理請(qǐng)求,處理生命周期并且用作一個(gè)前端控制器。JavaServerFacesTechnology也有保存重要請(qǐng)求信息的上下文的概念。上下文對(duì)象被稱(chēng)為FacesContext。在JavaServerFacesTechnology生命周期的每個(gè)階段上下文對(duì)象都被修改并且每次請(qǐng)求時(shí)都是有效的。
什么是JSFJSF提供:標(biāo)準(zhǔn)的編程接口豐富可擴(kuò)展的組件庫(kù)一個(gè)核心的JSP標(biāo)記庫(kù)用來(lái)處理事件、執(zhí)行驗(yàn)證以及其他非UI相關(guān)的操作(core)一個(gè)標(biāo)準(zhǔn)的HTML標(biāo)記庫(kù)來(lái)表示UI組件(html)事件驅(qū)動(dòng)模型JSF通過(guò)IDE工具支持拖放式開(kāi)發(fā)。什么是JSF目標(biāo)簡(jiǎn)化開(kāi)發(fā)超越現(xiàn)有Web框架試圖在不同的角度上提供網(wǎng)頁(yè)設(shè)計(jì)人員、應(yīng)用程序設(shè)計(jì)人員、組件開(kāi)發(fā)人員解決方案,讓不同技術(shù)的人員可以彼此合作又不互相干擾JSF體系結(jié)構(gòu)JSF的主要優(yōu)勢(shì)之一就是它既是JavaWeb用戶(hù)界面標(biāo)準(zhǔn)又是嚴(yán)格遵循模型-視圖-控制器(MVC)設(shè)計(jì)模式的框架。用戶(hù)界面代碼(視圖)與應(yīng)用程序數(shù)據(jù)和邏輯(模型)的清晰分離使JSF應(yīng)用程序更易于管理。為了準(zhǔn)備提供頁(yè)面對(duì)應(yīng)用程序數(shù)據(jù)訪(fǎng)問(wèn)的JSF上下文和防止對(duì)頁(yè)面未授權(quán)或不正確的訪(fǎng)問(wèn),所有與應(yīng)用程序的用戶(hù)交互均由一個(gè)前端“Faces”servlet(控制器)來(lái)處理。JSF入門(mén)第一個(gè)JSF程序JSFExpressionLanguage國(guó)際化(I18N)第一個(gè)JSF程序JSF開(kāi)發(fā)所需要的包jsf-api.jar包含有Facesservlet與其它相關(guān)javax.faces包下面的類(lèi)
jsf-impl.jarJSF的參考實(shí)現(xiàn)
jstl.jar包含JavaServerFacesStandardTagLibraryclasses(JSTL)。standard.jar使用JSTL時(shí)需要用到它第一個(gè)JSF程序Web.xml配置JSF應(yīng)用的引擎
<servlet> <servlet-name>FacesServlet</servlet-name><servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>*.faces</url-pattern></servlet-mapping>使用JSF時(shí),所有的請(qǐng)求都透過(guò)FacesServlet來(lái)處理
第一個(gè)JSF程序JSP引入標(biāo)簽庫(kù)<%@tagliburi="/jsf/html"prefix="h"%><%@tagliburi="/jsf/core"prefix="f"%> JSF的core與html標(biāo)簽庫(kù),core是有關(guān)于UI組件的處理,而html則是有關(guān)于HTML的進(jìn)階標(biāo)簽
第一個(gè)JSF程序簡(jiǎn)單的導(dǎo)航Navigation在JSF中是根據(jù)faces-config.xml中<navigation-rule>設(shè)定,以決定在符合的條件成立時(shí),該連結(jié)至哪一個(gè)頁(yè)面,一個(gè)基本的設(shè)定如下
<navigation-rule> <from-view-id>/pages/index.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/pages/welcome.jsp</to-view-id>
</navigation-case>
<navigation-case><from-outcome>failure</from-outcome><to-view-id>/pages/index.jsp</to-view-id></navigation-case></navigation-rule>
第一個(gè)JSF程序在<navigation-rule>中的<from-view-id>是個(gè)選擇性的定義,它規(guī)定了來(lái)源頁(yè)面的條件,<navigation-case>中定義各種導(dǎo)覽條件,<from-outcome>定義當(dāng)Model方法返回的邏輯符合的條件時(shí),各自改導(dǎo)向哪一個(gè)目的頁(yè)面,目的頁(yè)面是在<to-view-id>中定義。
根據(jù)上面的定義,當(dāng)傳回的字符串是“success”時(shí),將前往welcome.jsp,如果“failure”的話(huà),將送回index.jsp。
在JSF中的ViewID是從Web應(yīng)用程序的環(huán)境相對(duì)路徑開(kāi)始計(jì)算,設(shè)定時(shí)都是以/作為開(kāi)頭
JSFExpressionLanguage搭配JSF標(biāo)簽來(lái)使用,是用來(lái)存取數(shù)據(jù)對(duì)象的一個(gè)簡(jiǎn)易語(yǔ)言。以#開(kāi)始,將變量或運(yùn)算式放置在{與}之間。#{userB}對(duì)于Map類(lèi)型對(duì)象,可以使用‘.’運(yùn)算符指定key值來(lái)取出對(duì)應(yīng)的value,也可以使用[與]來(lái)指定。#{param['name']}#{someBean.someMap[]}如果變量是List類(lèi)型或陣列的話(huà),則可以在[]中指定索引。#{someBean.someList[0]}JSFExpressionLanguage也可以指定字面常數(shù),對(duì)于true、false、字符串、數(shù)字,JSFEL會(huì)嘗試進(jìn)行轉(zhuǎn)換。<h:outputTextvalue="#{true}"/><h:outputTextvalue=“#{‘Thisisatest’}”/>在聲明變量名稱(chēng)時(shí),要留意不可與JSF的保留字或關(guān)鍵字同名。truefalsenulldivmodandornoteqneltgtlegeinstanceofempty在EL中可以直接進(jìn)行一些算術(shù)運(yùn)算、邏輯運(yùn)算與關(guān)系運(yùn)算。算術(shù)運(yùn)算符:加法(+),減法(-),乘法(*),除法(/ordiv)與余除(%ormod)三元運(yùn)算:(expression?result1:result2)邏輯運(yùn)算:and(或&&)、or(或!!)、not(或!)關(guān)系運(yùn)算:小于Less-than(<orlt)、大于Greater-than(>orgt)、小于或等于Less-than-or-equal(<=orle)、大于或等于Greater-than-or-equal(>=orge)、等于Equal(==oreq)、不等于NotEqual(!=orne)EL運(yùn)算符的執(zhí)行優(yōu)先順序與Java運(yùn)算符對(duì)應(yīng)國(guó)際化信息JSF的國(guó)際化(Internationalization,簡(jiǎn)寫(xiě)I18N)信息處理是基于Java對(duì)國(guó)際化的支持,可以在一個(gè)信息資源文件中統(tǒng)一管理信息資源,資源文件的名稱(chēng)是.properties,而內(nèi)容是名稱(chēng)與值的配對(duì)。資源文件名稱(chēng)由basename加上語(yǔ)言與地區(qū)來(lái)組成:
perties basename_perties basename_zh_CN.properties信息資源文件必須是ISO-8859-1編碼,所以對(duì)于非西方語(yǔ)系的處理,必須先將之轉(zhuǎn)換為JavaUnicodeEscape格式:
nameText=名稱(chēng)nameText=\u540d\u79f0
使用<f:loadBundle>標(biāo)簽來(lái)指定載入信息資源:
<f:loadBundlebasename="messages"var="msgs"/> <h:outputTextvalue="#{Text}"/>國(guó)際化信息<f:view>可以設(shè)定locale屬性,直接指定所要使用的語(yǔ)系:
<f:viewlocale="zh_CN"> <f:loadBundlebasename="messages"var="msgs"/>也可以在faces-config.xml中設(shè)定語(yǔ)系:
<faces-config> <application> <local-config> <default-locale>zh_CN</default-locale> <supported-locale>en</supported-locale> </local-config></application></faces-config>
甚至可以讓使用者選擇自己的語(yǔ)系:
<f:viewlocale="#{user.locale}"> <f:loadBundlebasename="messages"var="msgs"/>
<h:selectOneRadiovalue="#{user.locale}"> <f:selectItemitemValue="zh_CN"itemLabel="#{msgs.zh_CNText}"/><f:selectItemitemValue="en"itemLabel="#{msgs.enText}"/></h:selectOneRadio>
ManagedBeansJSF使用Bean來(lái)達(dá)到邏輯層與表現(xiàn)層分離的目的,在JSF中的Bean其角色是屬于BackingBean,又稱(chēng)之為GlueBean,其作用在真正的業(yè)務(wù)邏輯Bean及UI組件之間搭起橋梁,上下傳遞數(shù)據(jù)。在BackingBean中會(huì)調(diào)用業(yè)務(wù)邏輯Bean處理瀏覽器的請(qǐng)求,請(qǐng)求的數(shù)據(jù)第一步先提交給BackingBean的相應(yīng)屬性,再將這些屬性的值提交給其所調(diào)用的下層業(yè)務(wù)邏輯進(jìn)行處理,處理完畢,改變BackingBean相應(yīng)屬性值,接著UI組件取出這些屬性的值并將屬性的值顯示在瀏覽器用戶(hù)界面上。Bean的管理集中在faces-config配置文件中,只要修改配置文件,就可以修改Bean之間的相依關(guān)系。ManagedBeans在faces-config.xml中集中管理作用域:application:一直存活 直到應(yīng)用程序結(jié)束位置
session:會(huì)話(huà)過(guò)程 在使用者應(yīng)用程序交互開(kāi)始,直到關(guān)閉瀏覽器或顯示的結(jié)束會(huì)話(huà)(例如退出程序)。
request:請(qǐng)求階段none:需要時(shí),臨時(shí)Beans的配置與設(shè)定JSF預(yù)定義會(huì)讀取faces-config.xml中關(guān)于Bean的定義可在web.xml中利用javax.faces.CONFIG_FILES參數(shù)指定自定義文件:
<web-app> <context-param><param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml,/WEB-INF/beans.xml</param-value> </context-param>... </web-app>
定義文件可以有多個(gè),中間以“,”區(qū)隔:
/WEB-INF/faces-config.xml,/WEB-INF/beans.xml
Beans的配置與設(shè)定Bean的基本定義:名稱(chēng) <managed-bean-name>類(lèi) <managed-bean-class> 存活范圍 <managed-bean-scope>可選設(shè)置屬性的初始值 <managed-property><managed-property> <property-name>user</property-name> <value>#{user}</value></managed-property>Beans上的List
<managed-property><property-name>someProperty</property-name><list-entries><value-class>java.lang.Integer</value-class><value>1</value><value>2</value><value>3</value></list-entries></managed-property>
數(shù)據(jù)轉(zhuǎn)換與驗(yàn)證轉(zhuǎn)換器(Converter)協(xié)助模型與視圖之間的數(shù)據(jù)轉(zhuǎn)換驗(yàn)證器(Validator)協(xié)助進(jìn)行語(yǔ)意檢驗(yàn)(SemanticValidation)標(biāo)準(zhǔn)轉(zhuǎn)換器HTTP字符串Java對(duì)象
Web應(yīng)用程序與瀏覽器之間是使用HTTP進(jìn)行溝通,所有傳送的數(shù)據(jù)基本上都是字符串文字,而Java應(yīng)用程序本身基本上則是對(duì)象,所以對(duì)象數(shù)據(jù)必須經(jīng)由轉(zhuǎn)換傳送給瀏覽器,而瀏覽器送來(lái)的數(shù)據(jù)也必須轉(zhuǎn)換為對(duì)象才能使用。
對(duì)于基本數(shù)據(jù)類(lèi)型(primitivetype)或是其Wrapper類(lèi),JSF會(huì)使用javax.faces.Boolean、javax.faces.Byte……等自動(dòng)進(jìn)行轉(zhuǎn)換對(duì)于BigDecimal、BigInteger,則會(huì)使用javax.faces.BigDecimal、javax.faces.BigInteger自動(dòng)進(jìn)行轉(zhuǎn)換Beans上的Map<managed-property><property-name>someProperty</property-name><map-entries><value-class>java.lang.Integer</value-class><map-entry><key>someKey1</key><value>100</value></map-entry><map-entry><key>someKey2</key><value>200</value></map-entry></map-entries></managed-property>標(biāo)準(zhǔn)轉(zhuǎn)換器標(biāo)準(zhǔn)的JSF轉(zhuǎn)換器轉(zhuǎn)換器javax.faces.BigDecimaljavax.faces.BigIntegerjavax.faces.Boolean
javax.faces.Bytejavax.faces.Characterjavax.faces.DateTimejavax.faces.Doublejavax.faces.Float標(biāo)準(zhǔn)轉(zhuǎn)換器實(shí)現(xiàn)類(lèi)javax.faces.convert.BigDecimalConverterjavax.faces.convert.BigIntegerConverterjavax.faces.convert.BooleanConverterjavax.faces.convert.ByteConverterjavax.faces.convert.CharacterConverterjavax.faces.convert.DateTimeConverterjavax.faces.convert.DoubleConverterjavax.faces.convert.FloatConverter標(biāo)準(zhǔn)轉(zhuǎn)換器對(duì)于DateTime、Number,可以使用<f:convertDateTime>、<f:convertNumber>標(biāo)簽進(jìn)行轉(zhuǎn)換,它們各自提供有一些簡(jiǎn)單的屬性,可以讓我們?cè)谵D(zhuǎn)換時(shí)指定一些轉(zhuǎn)換的格式細(xì)節(jié):
<h:outputTextvalue="#{user.date}"><f:convertDateTimepattern="yyyy/MM/dd"/></h:outputText>自定義轉(zhuǎn)換器實(shí)現(xiàn)javax.faces.convert.Converter接口,這個(gè)接口有兩個(gè)要實(shí)現(xiàn)的方法:publicObjectgetAsObject(FacesContextcontext,UIComponentcomponent,Stringstr);publicStringgetAsString(FacesContextcontext,UIComponentcomponent,Objectobj);在faces-config.xml中注冊(cè):<converter> <converter-id>cn.wiztek.converter.User</converter-id> <converter-class>cn.wiztek.converter.UserConverter </converter-class></converter>在JSF頁(yè)面中通過(guò)converter-id使用轉(zhuǎn)換器:
<h:outputTextvalue="#{guest.user}"converter="cn.wiztek.converter.User"/>標(biāo)準(zhǔn)驗(yàn)證器語(yǔ)法檢驗(yàn)(SynaticValidation)檢查使用者輸入的數(shù)據(jù)是否合乎我們所要求的格式,最基本的就是檢查使用者是否填入了欄目值,或是欄目值的長(zhǎng)度、大小值等等是否符合要求。三種標(biāo)準(zhǔn)驗(yàn)證器:<f:validateDoubleRange><f:validateLongRange><f:validateLength>
標(biāo)準(zhǔn)驗(yàn)證器JSF提供三個(gè)標(biāo)準(zhǔn)檢驗(yàn)組件:
DoubleRangeValidator:組件的本地值必須是數(shù)字類(lèi)型的;必須處于最小值、最大值或這兩者指定的范圍內(nèi)。
LongRangeValidator:組件的本地值必須是數(shù)字類(lèi)型的,并可以轉(zhuǎn)換為long;必須處于最小值、最大值或這兩者指定的范圍內(nèi)。
LengthValidator:類(lèi)型必須是string;長(zhǎng)度必須處于最小值、最大值或這兩者指定的范圍內(nèi)。
自定義驗(yàn)證器實(shí)現(xiàn)javax.faces.validator.Validator接口中的validate()方法,如果驗(yàn)證錯(cuò)誤,則丟出一個(gè)ValidatorException,它接受一個(gè)FacesMessage對(duì)象,這個(gè)對(duì)象接受三個(gè)參數(shù),分別表示信息的嚴(yán)重程度(INFO、WARN、ERROR、FATAL)、信息概述與詳細(xì)信息內(nèi)容,這些信息將可以使用<h:messages>或<h:message>標(biāo)簽顯示在頁(yè)面上。在faces-config.xml中注冊(cè)驗(yàn)證器的標(biāo)識(shí)(ValidaterID)。通過(guò)<f:validator>標(biāo)簽并設(shè)定validatorId屬性來(lái)使用自定義驗(yàn)證器。錯(cuò)誤信息處理預(yù)定義的錯(cuò)誤信息可以使用<h:messages>或<h:message>標(biāo)簽顯示出來(lái)通過(guò)提供一個(gè)信息資源文件可以修改預(yù)定義的錯(cuò)誤信息提供了支持中文的錯(cuò)誤信息文件Messages_zh_CN.properties也可以在程序中使用FacesMessage來(lái)提供信息自定義轉(zhuǎn)換/驗(yàn)證標(biāo)簽使用<f:attribute>標(biāo)簽來(lái)設(shè)定屬性:<f:attributename="pattern"value=".+[0-9]+"/>
在自定義驗(yàn)證器中用下面語(yǔ)句獲取屬性:Stringpattern=(String)component.getAttributes().get("pattern");也可以開(kāi)發(fā)自己的一組驗(yàn)證標(biāo)簽,并提供相關(guān)屬性設(shè)定:<co:passwordValidatorpattern=".+[0-9]+"/>
事件處理動(dòng)作事件(ActionEvent)即時(shí)事件(ImmediateEvent)值變事件(ValueChangeEvent)階段事件(PhaseEvent)動(dòng)作事件(ActionEvent)通過(guò)action屬性綁定一個(gè)事件方法:<h:commandButtonvalue="提交"action="#{user.verify}"/>
通過(guò)actionListener屬性綁定一個(gè)事件方法,action綁定返回結(jié)果的方法:<h:commandButtonvalue="提交"actionListener="#{user.verify}"action="#{user.outcome}"/>用<f:actionListener>標(biāo)簽向組件注冊(cè)事件監(jiān)聽(tīng)器(實(shí)現(xiàn)javax.faces.event.ActionListener接口),action綁定返回結(jié)果的方法:<h:commandButtonvalue="提交"action="#{user.outcome}"><f:actionListenertype="onlyfun.caterpillar.LogHandler"/><f:actionListenertype="onlyfun.caterpillar.VerifyHandler"/></h:commandButton>
即時(shí)事件(ImmediateEvent)即時(shí)事件是指JSF視圖組件在取得請(qǐng)求中該取得的值之后,即立即處理指定的事件,而不再進(jìn)行后續(xù)的轉(zhuǎn)換器處理、驗(yàn)證器處理、更新模型值等流程。
<h:commandButtonvalue="#{msgs.Text}" immediate="true" actionListener="#{user.changeLocale}"/>
值變事件(ValueChangeEvent)使用者改變了JSF輸入組件的值后提交表單,就會(huì)發(fā)生值變事件,丟出一個(gè)javax.faces.event.ValueChangeEvent對(duì)象直接設(shè)定JSF輸入組件的valueChangeListener屬性:
<h:selectOneMenuvalue="#{user.locale}" onchange="this.form.submit();" valueChangeListener="#{user.changeLocale}"> <f:selectItemitemValue="zh_CN"itemLabel="Chinese"/> <f:selectItemitemValue="en"itemLabel="English"/></h:selectOneMenu>
實(shí)現(xiàn)javax.faces.event.ValueChangeListener接口,并定義其processValueChange()方法;然后在JSF頁(yè)面上使用<f:valueChangeListener>標(biāo)簽,并設(shè)定其type屬性:
<h:selectOneMenuvalue="#{user.locale}" onchange="this.form.submit();"> <f:valueChangeListenettype=“cn.wiztek.SomeListener"/><f:selectItemitemValue="zh_CN"itemLabel="Chinese"/><f:selectItemitemValue="en"itemLabel="English"/></h:selectOneMenu>階段事件(PhaseEvent)在每個(gè)階段的前后會(huì)引發(fā)javax.faces.event.PhaseEvent,如果您想嘗試在每個(gè)階段的前后捕捉這個(gè)事件,以進(jìn)行一些處理,則可以實(shí)現(xiàn)javax.faces.event.PhaseListener接口,并向javax.faces.lifecycle.Lifecycle注冊(cè)這個(gè)Listener,以有適當(dāng)?shù)臅r(shí)候通知事件的發(fā)生。
階段事件(PhaseEvent)PhaseListener有三個(gè)必須實(shí)現(xiàn)的方法getPhaseId()、beforePhase()與afterPhase(),其中g(shù)etPhaseId()傳回一個(gè)PhaseId對(duì)象,代表Listener想要被通知的時(shí)機(jī),可以設(shè)定的時(shí)機(jī)有:PhaseId:PhaseId.RESTORE_VIEWPhaseId.APPLY_REQUEST_VALUESPhaseId.PROCESS_VALIDATIONSPhaseId.UPDATE_MODEL_VALUESPhaseId.INVOKE_APPLICATIONPhaseId.RENDER_RESPONSEPhaseId.ANY_PHASEJSF生命周期(LifeCircle)
JSF生命周期總共經(jīng)過(guò)六個(gè)階段:JSF生命周期圖JSF生命週期
一、恢復(fù)視圖(RestoreView)
Toretrievethecomponenttreefortherequestedpageifitwasdisplayedpreviouslyorconstructsanewcomponenttreeifitisdisplayedforthefirsttime.Ifthepagewasdisplayedpreviously,allcomponentsaresettotheirpriorstate.ThismeansthatJSFautomaticallyretainsforminformation.Forexample,whenauserpostsillegaldatathatarerejectedduringdecoding,theoldinputsareredisplayedsothattheusercancorrectthem.Iftherequesthasnoquerydata,theJSFimplementationskipsaheadtotheRenderResponsephase.Thishappenswhenapageisdisplayedforthefirsttime.二、應(yīng)用請(qǐng)求值;處理事件(ApplyRequestValues)
theJSFimplementationiteratesoverthecomponentobjectsinthecomponenttree.Eachcomponentobjectcheckswhichrequestvaluesbelongtoitandstoresthem.
三、處理檢驗(yàn);處理事件(ProcessValidations)
thesubmittedstringvaluesarefirstconvertedto"localvalues,"whichcanbeobjectsofanytype.WhenyoudesignaJSFpage,youcanattachvalidatorsthatperformcorrectnesschecksonthelocalvalues.Ifvalidationpasses,theJSFlifecycleproceedsnormally.However,whenconversionorvalidationerrorsoccur,theJSFimplementationinvokestheRenderResponsephasedirectly,redisplayingthecurrentpagesothattheuserhasanotherchancetoprovidecorrectinputs.JSF生命週期續(xù)四、更新模型值;處理事件(UpdateModelValues)
Aftertheconvertersandvalidatorshavedonetheirwork,itisassumedthatitissafetoupdatethemodeldata.DuringtheUpdateModelphase,thelocalvaluesareusedtoupdatethebeansthatarewiredtothecomponents.五、調(diào)用應(yīng)用程序;處理事件(InvokeApplication)
theactionmethodofthebuttonorlinkcomponentthatcausedtheformsubmissionisexecuted.Thatmethodcancarryoutarbitraryapplicationprocessing.Itreturnsanoutcomestringthatispassedtothenavigationhandler.六、顯示響應(yīng)(RenderResponse) Finally,theRenderResponsephaseencodestheresponseandsendsittothebrowser.Whenausersubmitsaform,clicksonalink,orotherwisegeneratesanewrequest,thecyclestartsanew.JSF生命周期總結(jié)TheRestoreViewphase
recreatestheserver-sidecomponenttreewhenyourevisitaJSFpage.TheApplyRequestValuesphase
copiesrequestparametersintocomponentsubmittedvalues.TheProcessValidationsphase
firstconverts
thosesubmittedvaluesandvalidates
theconvertedvalue.TheUpdateModelValuesphasecopies(convertedandvalidated)valuestothemodel,whichistypicallydenotedinJSFpageswithvaluereferenceexpressions,suchas:<h:inputTextvalue="#{}"/>TheInvokeApplicationphaseinvokes
actionlistenersandactions,inthatorder,forcommandcomponents.Youcanregisteranactionlistenerandanactionwithacomponentlikethis:<h:commandButtonaction="#{bean.action}"actionListener="#{bean.listener}".../>Inthatcase,theJSFimplementationwillinvoke
thebean'slistenermethodfollowedbytheactionmethod.Finally,theRenderResponsephasesaves
stateandloadsthenextview.ForJSP-basedapplicationstheJSFnavigationhandlerforwardsorredirectstoanotherJSPpage.StartingwiththeApplyRequestValuesphases,eventscanbecreatedandplacedonaneventqueueduringeachlife-cyclephase.Afterthosephases,theJSFimplementationbroadcastsqueuedeventstoregisteredlisteners.生命周期6個(gè)階段解釋回復(fù)畫(huà)面(RestoreView)對(duì)于選擇的頁(yè)面如果是初次瀏覽則建立新的組件樹(shù)。如果是會(huì)話(huà)階段,會(huì)從使用者端或服務(wù)器端的數(shù)據(jù)找尋數(shù)據(jù)以回復(fù)每個(gè)組件的狀態(tài)并重建組件樹(shù),如果不包括請(qǐng)求參數(shù),則直接跳過(guò)接下來(lái)的階段直接繪制響應(yīng)。套用申請(qǐng)值(ApplyRequestValues)每個(gè)組件嘗試從到來(lái)的請(qǐng)求中找尋自己的參數(shù)并更新組件值,在這邊會(huì)觸發(fā)ActionEvent,這個(gè)事件會(huì)被排入隊(duì)列中,然后在喚起應(yīng)用程序階段之后才會(huì)真正由事件處理者進(jìn)行處理。然而對(duì)于設(shè)定immeduate為true的命令(Commamnd)組件來(lái)說(shuō),會(huì)立即處理事件并跳過(guò)之后的階段直接繪制響應(yīng),而對(duì)于設(shè)定immediate為true的輸入(Input)組件,會(huì)馬上進(jìn)行轉(zhuǎn)換驗(yàn)證并處理值變事件,之后跳過(guò)接下來(lái)的階段,直接繪制響應(yīng)。執(zhí)行驗(yàn)證(ProcessValidations)進(jìn)行轉(zhuǎn)換與驗(yàn)證處理,如果驗(yàn)證錯(cuò)誤,則會(huì)跳過(guò)之后的階段,直接繪制響應(yīng),結(jié)果是重新呼叫同一頁(yè)繪制結(jié)果。更新模型值(UpdateModelValues)更新每一個(gè)與組件綁定的backingbean或模型對(duì)象。喚起應(yīng)用程序(InvokeApplication)處理動(dòng)作事件,并進(jìn)行后端應(yīng)用程序邏輯。繪制回應(yīng)(RenderResponse)使用繪制器繪制頁(yè)面。JSF標(biāo)簽標(biāo)準(zhǔn)標(biāo)簽輸出類(lèi)標(biāo)簽輸入類(lèi)標(biāo)簽命令類(lèi)標(biāo)簽選擇類(lèi)標(biāo)簽其他標(biāo)簽表格處理生命周期進(jìn)一步解釋這六個(gè)階段是JSF處理表單GUI的一般次序。這個(gè)列表按照每個(gè)階段可能的執(zhí)行次序和事件處理進(jìn)行排列,但是JSF生命周期并不是固定的??梢愿淖儓?zhí)行的次序,跳過(guò)某些階段或完全脫離生命周期。例如,如果一個(gè)無(wú)效的請(qǐng)求值被復(fù)制到組件,那么會(huì)重新顯示當(dāng)前視圖,并可能不執(zhí)行某些階段。還可以選擇完全脫離JSF,比如將處理委托給一個(gè)servlet或另一個(gè)應(yīng)用程序框架。在這種情況下,可以執(zhí)行一個(gè)FacesContext.responseComplete方法調(diào)用,將用戶(hù)重定向到另一個(gè)頁(yè)面或Web資源,然后使用請(qǐng)求調(diào)度器(從FacesContext中的請(qǐng)求對(duì)象獲得)轉(zhuǎn)發(fā)到適當(dāng)?shù)腤eb資源。也可以調(diào)用FacesContext.renderResponse來(lái)重新顯示原來(lái)的視圖。JSF標(biāo)準(zhǔn)標(biāo)簽輸出(Outputs)其名稱(chēng)以output作為開(kāi)頭,作用為輸出指定的信息或綁定值。輸入(Inputs)其名稱(chēng)以input作為開(kāi)頭,其作用為提供使用者輸入框。命令(Commands)其名稱(chēng)以command作為開(kāi)頭,其作用為提供命令或鏈接按鈕。選擇(Selections)其名稱(chēng)以select作為開(kāi)頭,其作用為提供使用者選項(xiàng)的選取。其它包括了form、message、messages、graphicImage等等未分類(lèi)的標(biāo)簽。標(biāo)準(zhǔn)HTML標(biāo)簽的屬性屬性名稱(chēng)適用說(shuō)明id所有組件可指定id名稱(chēng),以讓其它標(biāo)簽或組件參考binding所有組件綁定至UIComponentrendered所有組件是否顯示組件styleClass所有組件設(shè)定Cascadingstylesheet(CSS)value輸入、輸出、命令組件設(shè)定值或綁定至指定的值valueChangeListener輸入組件設(shè)定值變事件處理者converter輸入、輸出組件設(shè)定轉(zhuǎn)換器validator輸入組件設(shè)定驗(yàn)證器required輸入組件是否驗(yàn)證必填輸入框immediate輸入、命令組件是否為即時(shí)事件輸出類(lèi)標(biāo)簽outputLabel產(chǎn)生<label>HTML標(biāo)簽,使用for屬性指定組件的clientID,例如:
<h:inputTextid="user"value="#{}"/> <h:outputLabelfor="user"value="#{}"/>outputLink產(chǎn)生<a>HTML標(biāo)簽,搭配<f:param>可幫鏈結(jié)加上參數(shù),所有的參數(shù)都會(huì)變成name=value的類(lèi)型附加在鏈接后,value所指定的內(nèi)容也可以是JSFEL綁定。例如:
<h:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年茶樓廣告代理合同3篇
- 2024年租賃市場(chǎng)租賃合同押金退還協(xié)議范本3篇
- 2024年版高端房地產(chǎn)公司總經(jīng)理職務(wù)聘用合同版B版
- 2024年跨國(guó)離婚協(xié)議范本
- 2024年私人轎車(chē)借用合同
- 2024年經(jīng)營(yíng)權(quán)轉(zhuǎn)讓協(xié)議3篇
- 2024標(biāo)準(zhǔn)版業(yè)務(wù)經(jīng)理職務(wù)聘任合同書(shū)版B版
- 2024旅游行業(yè)景區(qū)交通保障服務(wù)合同規(guī)范3篇
- 2024年足球俱樂(lè)部教練聘請(qǐng)及培訓(xùn)協(xié)議3篇
- 2024榨菜產(chǎn)業(yè)投資基金合作協(xié)議范本3篇
- 《城市道路工程設(shè)計(jì)規(guī)范》宣貫課件
- 稻盛和夫的實(shí)學(xué)經(jīng)營(yíng)與會(huì)計(jì)
- 視頻監(jiān)控維保項(xiàng)目投標(biāo)方案(技術(shù)標(biāo))
- 椎管內(nèi)腫瘤圍手術(shù)期護(hù)理課件
- 麻醉科主任述職報(bào)告
- PDCA降低護(hù)士針刺傷發(fā)生率
- 申請(qǐng)失業(yè)保險(xiǎn)金承諾書(shū)
- 工程竣工資料整理工程資料服務(wù)合同
- 智能化手術(shù)室介紹strykerisuite課件
- 廣東省佛山市南海區(qū)大瀝鎮(zhèn)2023-2024學(xué)年九年級(jí)上學(xué)期期中物理試卷
- ESD內(nèi)部審核日程計(jì)劃表+內(nèi)審檢查表+內(nèi)審報(bào)告全套資料
評(píng)論
0/150
提交評(píng)論