JSF在Web開(kāi)發(fā)中的應(yīng)用_第1頁(yè)
JSF在Web開(kāi)發(fā)中的應(yīng)用_第2頁(yè)
JSF在Web開(kāi)發(fā)中的應(yīng)用_第3頁(yè)
JSF在Web開(kāi)發(fā)中的應(yīng)用_第4頁(yè)
JSF在Web開(kāi)發(fā)中的應(yīng)用_第5頁(yè)
已閱讀5頁(yè),還剩74頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第三章JSF入門(mén)Email:lihonglhl@163.com

信息類專業(yè)課程西北農(nóng)林科技大學(xué)1精選2021版課件主要內(nèi)容JSF簡(jiǎn)介JSF入門(mén)JSF標(biāo)簽JSF開(kāi)發(fā)環(huán)境2精選2021版課件Web開(kāi)發(fā)技術(shù)Web架構(gòu)用超文本技術(shù)(HTML)實(shí)現(xiàn)信息與信息的連接;用統(tǒng)一資源定位技術(shù)(URI)實(shí)現(xiàn)全球信息的精確定位;用新的應(yīng)用層協(xié)議(HTTP)實(shí)現(xiàn)分布式的信息共享。靜態(tài)動(dòng)態(tài)客戶端技術(shù)HTML、JavaApplets、JavaScript、ActiveX、CSS、DHTML、XHTML服務(wù)端技術(shù)CGI(CommonGatewayInterface)C、C++、PascalPerl、PythonPHP、ASP、Servlet(JSP)+JavaBean3精選2021版課件最新發(fā)展JavaWeb框架Struts、SpringMVC、WebWork、TapestryJSFAJAX(AsynchronousJavaScriptandXML)XHTML和CSS的標(biāo)準(zhǔn)表示;使用文檔對(duì)象模型DOM實(shí)現(xiàn)動(dòng)態(tài)顯示及用戶交互;使用XML、XSLT和XMLHttpRequest進(jìn)行數(shù)據(jù)交換及操作;使用javascript將所有技術(shù)綁定在一起。AgileWebRubyonRailsPython(Django、TurboGears、Pylons)4精選2021版課件二、JSF簡(jiǎn)介什么是JSFJSF的特性JSF與其它框架的比較JSF實(shí)現(xiàn)JSF示例5精選2021版課件什么是JSFJavaServerFaces(JSF):符合JavaEE5標(biāo)準(zhǔn)的JavaWeb應(yīng)用框架。目標(biāo):簡(jiǎn)化開(kāi)發(fā)。JSF提供:標(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ā)。6精選2021版課件JSF的由來(lái)和目標(biāo)由來(lái)EJB2的失敗非官方Web框架的興起目標(biāo)簡(jiǎn)化開(kāi)發(fā)超越現(xiàn)有Web框架試圖在不同的角度上提供網(wǎng)頁(yè)設(shè)計(jì)人員、應(yīng)用程序設(shè)計(jì)人員、組件開(kāi)發(fā)人員解決方案,讓不同技術(shù)的人員可以彼此合作又不互相干擾7精選2021版課件JSF體系結(jié)構(gòu)JSF的主要優(yōu)勢(shì)之一就是它既是JavaWeb用戶界面標(biāo)準(zhǔn)又是嚴(yán)格遵循模型-視圖-控制器(MVC)設(shè)計(jì)模式的框架。用戶界面代碼(視圖)與應(yīng)用程序數(shù)據(jù)和邏輯(模型)的清晰分離使JSF應(yīng)用程序更易于管理。為了準(zhǔn)備提供頁(yè)面對(duì)應(yīng)用程序數(shù)據(jù)訪問(wèn)的JSF上下文和防止對(duì)頁(yè)面未授權(quán)或不正確的訪問(wèn),所有與應(yīng)用程序的用戶交互均由一個(gè)前端“Faces”servlet(控制器)來(lái)處理。8精選2021版課件JSF的特性技術(shù)特性一流的UI組件和事件模型POJO依賴注入(又稱控制反轉(zhuǎn))客戶端獨(dú)立性

使用或者不使用工具可擴(kuò)展的導(dǎo)航(類似于Struts導(dǎo)航,注:Page導(dǎo)航)強(qiáng)大的擴(kuò)展能力(如Shale)

完全的集成(如集成Spring、JPA)本地化和易理解性9精選2021版課件JSF的特性市場(chǎng)和商業(yè)特性廣泛的采用,包括SUN,Oracle,IBM,BEA,Apache,EDS作為JavaEE5.0的組成部分大型第三方組件市場(chǎng)(iLog,BusinessObjects,Oracle,Sun,IBM)業(yè)內(nèi)領(lǐng)先的工具支持(SunJavaStudioCreator,NetBeans,OracleJDeveloper,IBMWSAD,BEAWorkshop,ExadelStudio)10精選2021版課件與其它框架的比較(來(lái)自TSS)技術(shù)特性商業(yè)使用JSF4.83.9WebWork4.23.1Shale4.951.3Tapestry4.752.8Wicket--0.7Struts4.24.611精選2021版課件JSF的優(yōu)勢(shì)UI組件(UI-component)事件驅(qū)動(dòng)模式用戶界面到業(yè)務(wù)邏輯的直接映射程序員和網(wǎng)頁(yè)設(shè)計(jì)人員的分工請(qǐng)求處理生命周期的多階段劃分全面的用戶自定義支持Web開(kāi)發(fā)的官方標(biāo)準(zhǔn)之一大量的IDE工具支持

12精選2021版課件JSF實(shí)現(xiàn)JSF是標(biāo)準(zhǔn)實(shí)現(xiàn)SunJSFRIApacheMyFaces組件庫(kù)TomahawkADFFaces(fromOracle)Tobago13精選2021版課件JSF示例<%@tagliburi="/jsf/core"prefix="f"%><%@tagliburi="/jsf/html"prefix="h"%><%@pagecontentType="text/html;charset=GB2312"%><html><head> <title>第一個(gè)JSF程序</title></head><body><f:view><h:form><h3>請(qǐng)輸入您的名稱</h3> 名稱:<h:inputTextvalue="#{}"/><p> <h:commandButtonvalue=“提交"action="login"/> </h:form></f:view></body></html>14精選2021版課件二、JSF入門(mén)第一個(gè)JSF程序JSFExpressionLanguage國(guó)際化(I18N)ManagedBeans數(shù)據(jù)轉(zhuǎn)換與驗(yàn)證事件處理15精選2021版課件第一個(gè)JSF程序JSF開(kāi)發(fā)環(huán)境EclipseWTPJSF插件JSF實(shí)現(xiàn)(MyFaces)TomcatManaged-BeanJSP頁(yè)面PagesNavigation16精選2021版課件JSF應(yīng)用一:輸入頁(yè)面<!--開(kāi)始使用JSF的視圖輸出--><f:view><!--輸出國(guó)際化資源文件中的國(guó)際化信息--><h:outputTextvalue="#{msg.loginHeader}"/><!--輸出loginBean的err屬性--><b><h:outputTextvalue="#{login.err}"/></b><h:formid="loginForm"> <!--輸出國(guó)際化資源文件中的國(guó)際化信息--> <h:outputTextvalue="#{Prompt}"/> <!--將下面單行輸入框的值綁定到loginBean的name屬性--> <h:inputTextvalue="#{}"/><br/> <!--輸出國(guó)際化資源文件中的國(guó)際化信息--> <h:outputTextvalue="#{msg.passPrompt}"/> <!--將下面單行輸入框的值綁定到loginBean的pass屬性--> <h:inputTextid="pass"value="#{login.pass}"/><br/> <!--將下面按鈕的動(dòng)作綁定到loginBean的valid方法--> <h:commandButtonaction="#{login.valid}“value="#{msg.buttonTitle}"/></h:form></f:view>17精選2021版課件f:loadBundlebasename="messages"var="msg"/>用于臨時(shí)加載國(guó)際化資源的語(yǔ)言包<h:outputTextvalue="#{Prompt}"/>輸出指定key對(duì)應(yīng)的國(guó)際化消息JSF應(yīng)用一:輸入頁(yè)面18精選2021版課件JSF應(yīng)用二:開(kāi)發(fā)托管Bean從作用上看托管Bean類似struts2的Action,但作用模式不同。對(duì)于struts2的Action而言,應(yīng)用通過(guò)表單提交方式把請(qǐng)求提交到struts2的Action;但JSF的托管Bean,系統(tǒng)直接將JSF中的UI組件的行為綁定到托管Bean的屬性或方法。如:

<h:inputTextvalue="#{}"/>

該文本框的行為綁定到loginBean的name屬性。<h:commandButtonaction="#{login.valid}“value="#{msg.buttonTitle}"/>

該按鈕的行為直接綁定到loginBean的valid方法上19精選2021版課件JSF應(yīng)用二:開(kāi)發(fā)托管Beanpublic

classLoginBean{//下面的三個(gè)屬性都會(huì)直接與JSF標(biāo)簽綁定privateStringname;privateStringpass;privateStringerr;...//該方法被綁定到UI組件(按鈕)的action屬性publicStringvalid(){if(name.equals("crazyit")&&pass.equals("leegang")){return"success";}setErr("您的用戶名和密碼不符合");return"failure";}}20精選2021版課件JSF應(yīng)用三:定義導(dǎo)航規(guī)則

JSF以導(dǎo)航規(guī)則來(lái)決定邏輯視圖與物理視圖資源之間的對(duì)應(yīng)關(guān)系;

JSF導(dǎo)航規(guī)則可以指定系統(tǒng)從哪個(gè)頁(yè)面開(kāi)始,以該頁(yè)面的提交按鈕綁定的值作為 邏輯視圖;

JSF使用標(biāo)準(zhǔn)的配置文件定義導(dǎo)航規(guī)則;

JSF允許每個(gè)表單域單獨(dú)觸發(fā)事件,JSF常用的兩類事件:

ValueChange事件:表單域的值發(fā)生改變時(shí)觸發(fā)該事件;

Action事件:用戶單擊按鈕或超鏈接時(shí)觸發(fā)這類事件。

21精選2021版課件JSF應(yīng)用三:定義導(dǎo)航規(guī)則<?xmlversion="1.0"encoding="GBK"?><!--JSF配置文件的根元素,并指定Schema信息--><faces-configxmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-facesconfig_1_2.xsd“version="1.2"><navigation-rule><!--導(dǎo)航規(guī)則的輸入頁(yè)面--><from-view-id>/login.jsp</from-view-id><!--如果login.jsp中Action方法的處理結(jié)果是success,則跳轉(zhuǎn)到視圖頁(yè)greeting.jsp--><navigation-case><from-outcome>success</from-outcome><to-view-id>/greeting.jsp</to-view-id></navigation-case><!--如果login.jsp中Action方法的處理結(jié)果是failure,則跳轉(zhuǎn)到視圖頁(yè)login.jsp--><navigation-case><from-outcome>failure</from-outcome><to-view-id>/login.jsp</to-view-id></navigation-case></navigation-rule></faces-config>faces-config-nav.xml22精選2021版課件JSF應(yīng)用四:解讀JSF配置對(duì)于大部分JSF初級(jí)開(kāi)發(fā)者而言,常作的兩件事是:定義托管Bean,配置XML文件。配置核心控制器

Web應(yīng)用基本上是請(qǐng)求--響應(yīng)架構(gòu),即:用戶向Web應(yīng)用發(fā)請(qǐng)求,Web應(yīng)用處理請(qǐng)求,處理完成后將請(qǐng)求送回客戶端。

JSF與傳統(tǒng)的MVC框架一樣,,也提供了一個(gè)核心控制器負(fù)責(zé)處理所有用戶請(qǐng)求,即javax.faces.webapp.FacesServlet,它就是JSF的核心控制器。

FacesServlet是一個(gè)標(biāo)準(zhǔn)的Servlet,因此,它的配置與普通Servlet沒(méi)有太大區(qū)別,同樣是先配置Servlet,再配置Servlet映射的URL,配置文件時(shí)web.xml。23精選2021版課件JSF應(yīng)用四:解讀JSF配置<!--配置JSF的核心控制器:FacesServlet--><servlet> <servlet-name>FacesServlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup></servlet><!--配置JSF核心FacesServlet的映射--><servlet-mapping> <servlet-name>FacesServlet</servlet-name> <url-pattern>*.jsf</url-pattern></servlet-mapping>配置FacesServlet的代碼片段如下:上面配置片段指定使用FacesServlet來(lái)攔截所有已.jsf結(jié)尾的請(qǐng)求,值得注意的是FacesServlet攔截的URL不一定是*.jsf,完全可以有用戶隨意指定。如:*.faces、*.do等。24精選2021版課件JSF應(yīng)用四:解讀JSF配置<context-param><param-name>javax.faces.CONFIG_FILES</param-name><!--多個(gè)配置文件之間以“,”隔開(kāi)--><param-value>/WEB-INF/faces-config-beans.xml,/WEB-INF/faces-config-nav.xml</param-value></context-param><!--配置JSF程序狀態(tài)的保存位置--><context-param><param-name>javax.faces.STATE_SAVING_METHOD</param-name><!--將程序狀態(tài)保存在客戶端--><param-value>client</param-value></context-param><context-param></param-name>:為整個(gè)web用于配置參數(shù)25精選2021版課件JSF應(yīng)用四:解讀JSF配置JSF有效參數(shù)名及其作用如下:

javax.faces.STATE_SAVING_METHOD:指示是在客戶端(client)還是在服務(wù) 器端(server)保存UI組件的狀態(tài)。JSF有保存頁(yè)面中組件狀態(tài)的能力,以便 在頁(yè)面被重新顯示時(shí)記住用戶輸入的信息。組件狀態(tài)可以保存在客戶端也可保 存在服務(wù)器端,這取決于javax.faces.STATE_SAVING_METHOD

參數(shù)的設(shè)置值。 可能的取值是client和server(默認(rèn)值)。

javax.faces.DEFAULT_SUFFIX:該參數(shù)指定JSF映射視圖資源時(shí)的默認(rèn)后綴 名,默認(rèn)值是.jsp,不需要改變參數(shù)的值。26精選2021版課件JSF應(yīng)用四:解讀JSF配置

javax.faces.CONFIG_FILES:該參數(shù)指定JSF配置文件的存放位置。默認(rèn)情 況下JSF會(huì)自動(dòng)加載位于WEB_INF下的faces-config.xml文件。如果包含多個(gè) JSF配置文件,則需要指定該參數(shù),通過(guò)逗號(hào)分割不同的(相對(duì)路徑)配置文 件;如果只有一個(gè)JSF配置文件,且文件為位于WEB_INF下的faces-config.xml, 則可以省略該參數(shù)。

javax.faces.LIFECYCLE_ID:該參數(shù)指定JSF所管理的生命周期實(shí)例的標(biāo)識(shí) 符,該參數(shù)通常無(wú)需修改。27精選2021版課件JSF應(yīng)用四:解讀JSF配置

com.sun.faces.verifyObjects:該參數(shù)用于指定是否需要驗(yàn)證自定義組件。 當(dāng)JSF應(yīng)用中定義了自定義組件、轉(zhuǎn)換器、校驗(yàn)器時(shí),可以設(shè)置應(yīng)用啟動(dòng)時(shí)驗(yàn) 證這些自定義組件。該參數(shù)的值只能是true或false。

com.sun.faces.validateXml:該參數(shù)指定是否需要驗(yàn)證JSF應(yīng)用中的xml文件。

com.sun.faces.NUMBER_OF_VIEWS_IN_SESSON:當(dāng)狀態(tài)保存方法設(shè)置為server 時(shí),控制會(huì)話中保存的視圖數(shù)量,當(dāng)設(shè)置為-1時(shí)表示沒(méi)有限制。28精選2021版課件JSF配置文件結(jié)構(gòu)JSF配置文件根元素都是<faces-config...>元素,JSF應(yīng)用配置總體分為三種:分別針對(duì)日常應(yīng)用開(kāi)發(fā),UI擴(kuò)展開(kāi)發(fā)(編寫(xiě)組件,呈現(xiàn)器,轉(zhuǎn)換器或者驗(yàn)證器)和高級(jí)開(kāi)發(fā)。最常見(jiàn)的兩個(gè)元素是:

<managed-bean…/>:JSF應(yīng)用中所有托管Bean都在該元素下配置、管理。

<navigation-rule…/>:該元素用于管理JSF應(yīng)用的導(dǎo)航規(guī)則。

29精選2021版課件類別特征XML元素日常應(yīng)用配置和高級(jí)擴(kuò)展的注冊(cè)應(yīng)用配置。用于指定支持的語(yǔ)言,定制應(yīng)用消息的位置,默認(rèn)的呈現(xiàn)包,以及高級(jí)的可插入組件<application>受管bean創(chuàng)建工具。<managed-bean>控制在特定范圍的對(duì)象的自動(dòng)創(chuàng)建被引用的bean<referenced-bean>用來(lái)告訴IDE其它可以訪問(wèn)的對(duì)象的導(dǎo)航規(guī)則,控制一個(gè)頁(yè)面到另一個(gè)頁(yè)面的應(yīng)用流<navigation-rule>用戶界面擴(kuò)展注冊(cè)組件注冊(cè)。用于向系統(tǒng)注冊(cè)組件<component>呈現(xiàn)包和呈現(xiàn)器注冊(cè)。用于向呈現(xiàn)包添加呈現(xiàn)器或者定義整個(gè)新的呈現(xiàn)包<render-kit>驗(yàn)證器注冊(cè)。用于向系統(tǒng)注冊(cè)驗(yàn)證器<validator>轉(zhuǎn)換器注冊(cè)。用于向系統(tǒng)注冊(cè)轉(zhuǎn)換器<converter>高級(jí)擴(kuò)展特征的配置階段監(jiān)聽(tīng)器注冊(cè)。向系統(tǒng)注冊(cè)階段監(jiān)聽(tīng)器<phase-listener>工廠配置。定義實(shí)例化核心JSF類的工廠<factory>JSF配置文件結(jié)構(gòu)30精選2021版課件三、JSFExpressionLanguage搭配JSF標(biāo)簽來(lái)使用,是用來(lái)存取數(shù)據(jù)對(duì)象的一個(gè)簡(jiǎn)易語(yǔ)言。以#開(kāi)始,將變量或運(yùn)算式放置在{與}之間。#{userB}EL的變量名也可以程序執(zhí)行過(guò)程中所聲明的名稱,或是JSFEL預(yù)定義的隱含對(duì)象。#{}對(duì)于Map類型對(duì)象,可以使用‘.’運(yùn)算符指定key值來(lái)取出對(duì)應(yīng)的value,也可以使用[與]來(lái)指定。#{param['name']}#{someBean.someMap[]}如果變量是List類型或陣列的話,則可以在[]中指定索引。#{someBean.someList[0]}31精選2021版課件也可以指定字面常數(shù),對(duì)于true、false、字符串、數(shù)字,JSFEL會(huì)嘗試進(jìn)行轉(zhuǎn)換。<h:outputTextvalue="#{true}"/><h:outputTextvalue=“#{‘Thisisatest’}”/>在聲明變量名稱時(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)三、JSFExpressionLanguage32精選2021版課件四、國(guó)際化信息JSF的國(guó)際化(Internationalization,簡(jiǎn)寫(xiě)I18N)信息處理是基于Java對(duì)國(guó)際化的支持,可以在一個(gè)信息資源文件中統(tǒng)一管理信息資源,資源文件的名稱是.properties,而內(nèi)容是名稱與值的配對(duì)。資源文件名稱由basename加上語(yǔ)言與地區(qū)來(lái)組成:

perties basename_perties basename_zh_CN.properties信息資源文件必須是ISO-8859-1編碼,所以對(duì)于非西方語(yǔ)系的處理,必須先將之轉(zhuǎn)換為JavaUnicodeEscape格式:

nameText=名稱nameText=\u540d\u79f0

使用<f:loadBundle>標(biāo)簽來(lái)指定載入信息資源: <f:loadBundlebasename="messages"var="msgs"/> <h:outputTextvalue="#{Text}"/>33精選2021版課件<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></f:view>四、國(guó)際化信息34精選2021版課件五、ManagedBeansJSF使用Bean來(lái)達(dá)到邏輯層與表現(xiàn)層分離的目的,Bean的管理集中在配置文件中,只要修改配置文件,就可以修改Bean之間的相依關(guān)系。BackingBean,GlueBean:在真正的業(yè)務(wù)邏輯Bean及UI組件之間搭起橋梁,在BackingBean中會(huì)呼叫業(yè)務(wù)邏輯Bean處理使用者的請(qǐng)求,或者是將業(yè)務(wù)處理結(jié)果放置其中,等待UI組件取出當(dāng)中的值并顯示結(jié)果給使用者。35精選2021版課件五、ManagedBeans在faces-config.xml中集中管理作用域:application:一直存活session:會(huì)話過(guò)程request:請(qǐng)求階段none:需要時(shí),臨時(shí)36精選2021版課件Managed-Bean類型簡(jiǎn)稱典型的有效域ModelManaged-Beanmodel-beansession描述:這種類型的Managed-Bean充當(dāng)MVC設(shè)計(jì)模式中的"模型(Model)"部分。當(dāng)你看到"模型"一詞————可以把它想象為"數(shù)據(jù)"。一個(gè)JSF的model-bean應(yīng)該是一個(gè)遵循JavaBean規(guī)范的,以getter/setter方式封裝了各種屬性的普通JAVA對(duì)象。model-bean最常見(jiàn)的使用場(chǎng)景是作為一個(gè)數(shù)據(jù)庫(kù)實(shí)體,或簡(jiǎn)單地代表了數(shù)據(jù)庫(kù)查詢結(jié)果集中的一系列行數(shù)據(jù)。BackingManaged-Beanbacking-beanrequest描述:這種類型的Managed-Bean充當(dāng)MVC設(shè)計(jì)模式中的"視圖(View)"部分。backing-bean的目的是支持UI邏輯,(通常)與一個(gè)JSF視圖或Facelet聚合中的JSF表單保持一一對(duì)應(yīng)的關(guān)系。雖然它通常具有一些遵循JavaBean風(fēng)格并關(guān)聯(lián)了getter/setter的屬性,但這些屬性是對(duì)應(yīng)"視圖"中的值,而不對(duì)應(yīng)底層的應(yīng)用數(shù)據(jù)模型。JSF的backing-bean可以具有JSF的actionListener和valueChangeListener方法。ControllerManaged-Beancontroller-beanrequest描述:這種類型的Managed-Bean充當(dāng)MVC設(shè)計(jì)模式中的"控制器(Controller)"部分。controllerbean的目的是執(zhí)行某些業(yè)務(wù)邏輯并返回一個(gè)導(dǎo)航結(jié)果給JSF的導(dǎo)航處理器。JSFcontroller-bean通常具有JSF的action方法(而不是actionListener方法)SupportManaged-Beansupport-beansession/application描述:這種類型的bean為MVC設(shè)計(jì)模式中的"視圖(View)"部分中的一個(gè)或多個(gè)視圖提供"支持"。典型的應(yīng)用場(chǎng)景是提供一個(gè)ArrayList<SelectItem>給JSF的h:selectOneMenu下拉列表,而且這個(gè)下拉列表將在多個(gè)JSF視圖中出現(xiàn)。如果這個(gè)下拉列表的數(shù)據(jù)是用戶特定的,那么這個(gè)bean就應(yīng)該放在session范圍中。但是,如果數(shù)據(jù)是提供給所有用戶的(例如一個(gè)選擇省份的下拉列表),那么這個(gè)bean就應(yīng)該放在application范圍中。UtilityManaged-Beanutility-beanapplication描述:這種bean為一個(gè)或多個(gè)JSF視圖提供"工具"。例如一個(gè)能在多個(gè)Web應(yīng)用中復(fù)用的FileUploadbean。Managed-Bean類型37精選2021版課件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/beans.xml</param-value> </context-param>... </web-app>定義文件可以有多個(gè),中間以“,”區(qū)隔:

/WEB-INF/navigation.xml,/WEB-INF/beans.xml38精選2021版課件Beans的配置與設(shè)定Bean的基本定義:名稱 <managed-bean-name>類 <managed-bean-class> 存活范圍 <managed-bean-scope>可選設(shè)置屬性的初始值 <managed-property><managed-property> <property-name>user</property-name> <value>#{user}</value></managed-property>39精選2021版課件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>

40精選2021版課件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>41精選2021版課件訪問(wèn)ManagedBeans如果要在其它類中取得Bean對(duì)象,則可以先取得javax.faces.context.FacesContext,它代表了JSF目前的執(zhí)行環(huán)境對(duì)象,接著嘗試取得javax.faces.el.ValueBinding對(duì)象,從中取得指定的Bean對(duì)象:

FacesContextcontext=FacesContext.getCurrentInstance(); ValueBindingbinding=context.getApplication(). createValueBinding("#{user}"); UserBeanuser=(UserBean)binding.getValue(context);取得Bean的某個(gè)屬性:

FacesContextcontext=FacesContext.getCurrentInstance(); ValueBindingbinding=context.getApplication(). createValueBinding("#{}"); Stringname=(String)binding.getValue(context);

42精選2021版課件六、JSF標(biāo)簽標(biāo)準(zhǔn)標(biāo)簽輸出類標(biāo)簽輸入類標(biāo)簽命令類標(biāo)簽選擇類標(biāo)簽其他標(biāo)簽表格處理43精選2021版課件JSF標(biāo)準(zhǔn)標(biāo)簽輸出(Outputs)其名稱以output作為開(kāi)頭,作用為輸出指定的信息或綁定值。輸入(Inputs)其名稱以input作為開(kāi)頭,其作用為提供使用者輸入框。命令(Commands)其名稱以command作為開(kāi)頭,其作用為提供命令或鏈接按鈕。選擇(Selections)其名稱以select作為開(kāi)頭,其作用為提供使用者選項(xiàng)的選取。其它包括了form、message、messages、graphicImage等等未分類的標(biāo)簽。44精選2021版課件標(biāo)準(zhǔn)HTML標(biāo)簽的屬性屬性名稱適用說(shuō)明id所有組件可指定id名稱,以讓其它標(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í)事件45精選2021版課件輸出類標(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的類型附加在鏈接后,value所指定的內(nèi)容也可以是JSFEL綁定。例如: <h:outputLinkvalue=“../index.jsp”> <h:outputTextvalue=“LinktoIndex”/> <f:paramname=“name”value=“MyName”/> </h:outputLink>

outputFormat 產(chǎn)生指定的文字信息,可以搭配<f:param>來(lái)設(shè)定信息的參數(shù)以格式化文字信息,例如: <h:outputFormatvalue="{0},Yournameis{1}."> <f:paramvalue="Hello"/> <f:paramvalue="Guest"/> </h:outputFormat>outputText簡(jiǎn)單的顯示指定的值或綁定的信息,例如:

<h:outputTextvalue="#{}"/>

46精選2021版課件輸入類標(biāo)簽inputText顯示單行輸入框,即輸出<input>HTML標(biāo)簽,其type屬性設(shè)定為text,例如:

<h:inputTextvalue="#{}"/>

inputTextarea 顯示多行輸入文字區(qū)域,即輸出<textarea>HTML標(biāo)簽,例如:

<h:inputTextareavalue="#{mand}"/>

inputSecret顯示密碼輸入框,即輸出<input>HTML標(biāo)簽,其type屬性設(shè)定為password,例如:

<h:inputSecretvalue="#{user.password}"/>

inputHidden隱藏輸入框,即輸出<input>HTML標(biāo)簽,其type屬性設(shè)定為hidden,隱藏輸入框的值用于保留一些信息于客戶端,以在下一次發(fā)送表單時(shí)一并提交,例如:

<h:inputHiddenvalue="#{user.hiddenInfo}"/>47精選2021版課件命令類標(biāo)簽commandButton 顯示一個(gè)命令按鈕,即輸出<input>HTML標(biāo)簽,其type屬性可以設(shè)定為button、submit或reset,預(yù)設(shè)是submit,按下按鈕會(huì)觸發(fā)javax.faces.event.ActionEvent,例如:

<h:commandButtonvalue="提交“ action="#{user.verify}"/>commandLink

產(chǎn)生超鏈接,會(huì)輸出<a>HTML標(biāo)簽,而href屬性會(huì)有‘#’,而onclick屬性會(huì)含有一段JavaScript程序,這個(gè)JavaScript的目的是按下鏈接后自動(dòng)提交表單,具體來(lái)說(shuō)其作用就像按鈕,但外觀卻是超鏈接,例如:

<h:commandLinkvalue="#{mandText}" action="#{user.verify}"/>

48精選2021版課件選擇類標(biāo)簽選取框<h:selectBooleanCheckbox>單選單選按鈕<h:selectOneRadio>單選列表<h:selectOneListbox>單選菜單<h:selectOneMenu>復(fù)選復(fù)選框<h:selectManyCheckbox>復(fù)選列表<h:selectManyListbox>復(fù)選菜單<h:selectManyMenu>49精選2021版課件選擇類標(biāo)簽的選項(xiàng)<f:selectItem>itemLabelitemValue或者value綁定一個(gè)傳回javax.faces.model.SelectItem的方法<f:selectItems>value綁定至一個(gè)提供傳回SelectItem的列表(數(shù)組)的方法 SelectItem:value,labelvalue綁定至一個(gè)提供傳回Map對(duì)象的方法 Map:label,value50精選2021版課件其他標(biāo)簽<h:messages>或<h:message><h:graphicImage>圖片<h:panelGrid>排版本體間只能包括JSF組件,如果想要放入非JSF組件,例如簡(jiǎn)單的樣版(template)文字,則要使用<f:verbatim>包括住。<h:panelGroup>包裝組件51精選2021版課件表格處理<h:dataTable>配合<h:column>實(shí)現(xiàn)以表格的方式顯示數(shù)據(jù)<f:facet>header與footer分別表示表頭和表尾使用DataModel處理復(fù)雜的數(shù)據(jù)52精選2021版課件七、事件處理動(dòng)作事件(ActionEvent)即時(shí)事件(ImmediateEvent)值變事件(ValueChangeEvent)階段事件(PhaseEvent)53精選2021版課件動(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>

54精選2021版課件即時(shí)事件(ImmediateEvent)即時(shí)事件是指JSF視圖組件在取得請(qǐng)求中該取得的值之后,即立即處理指定的事件,而不再進(jìn)行后續(xù)的轉(zhuǎn)換器處理、驗(yàn)證器處理、更新模型值等流程。

<h:commandButtonvalue="#{msgs.Text}" immediate="true" actionListener="#{user.changeLocale}"/>

55精選2021版課件值變事件(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>56精選2021版課件階段事件(PhaseEvent)重建視圖(RestoreView) 依客戶端傳來(lái)的session數(shù)據(jù)或服務(wù)器端上的session數(shù)據(jù),重建JSF視圖組件。套用請(qǐng)求值(ApplyRequestValues) JSF視圖組件各自獲得請(qǐng)求中的屬于自己的值,包括舊的值與新的值。執(zhí)行驗(yàn)證(ProcessValidations) 轉(zhuǎn)換為對(duì)象并進(jìn)行驗(yàn)證。更新模型值(UpdateModelValues) 更新Bean或相關(guān)的模型值。喚起應(yīng)用程序(InvokeApplication) 執(zhí)行應(yīng)用程序相關(guān)邏輯。繪制響應(yīng)頁(yè)面(RenderResponse) 對(duì)先前的請(qǐng)求處理完之后,產(chǎn)生頁(yè)面以反應(yīng)客戶端執(zhí)行結(jié)果。57精選2021版課件階段事件(PhaseEvent)在每個(gè)階段的前后會(huì)引發(fā)javax.faces.event.PhaseEvent實(shí)現(xiàn)javax.faces.event.PhaseListener,并向javax.faces.lifecycle.Lifecycle登記這個(gè)Listener,便可捕獲事件getPhaseId()、beforePhase()與afterPhase()PhaseId:PhaseId.RESTORE_VIEWPhaseId.APPLY_REQUEST_VALUESPhaseId.PROCESS_VALIDATIONSPhaseId.UPDATE_MODEL_VALUESPhaseId.INVOKE_APPLICATIONPhaseId.RENDER_RESPONSEPhaseId.ANY_PHASE58精選2021版課件八、數(shù)據(jù)轉(zhuǎn)換與驗(yàn)證轉(zhuǎn)換器(Converter)協(xié)助模型與視圖之間的數(shù)據(jù)轉(zhuǎn)換驗(yàn)證器(Validator)協(xié)助進(jìn)行語(yǔ)意檢驗(yàn)(SemanticValidation)59精選2021版課件1.標(biāo)準(zhǔn)轉(zhuǎn)換器HTTP字符串Java對(duì)象對(duì)于基本數(shù)據(jù)類型(primitivetype)或是其Wrapper類,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)換對(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>

60精選2021版課件2.自定義轉(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"/>61精選2021版課件3.標(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>

62精選2021版課件4.自定義驗(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)證器。63精選2021版課件5.錯(cuò)誤信息處理預(yù)定義的錯(cuò)誤信息可以使用<h:messages>或<h:message>標(biāo)簽顯示出來(lái)通過(guò)提供一個(gè)信息資源文件可以修改預(yù)定義的錯(cuò)誤信息MyFaces提供了支持中文的錯(cuò)誤信息文件Messages_zh_CN.properties也可以在程序中使用FacesMessage來(lái)提供信息64精選2021版課件6.自定義轉(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]+"/>

65精選2021版課件九、傳統(tǒng)請(qǐng)求/響應(yīng)驅(qū)動(dòng)的處理周期請(qǐng)求/響應(yīng)驅(qū)動(dòng)的處理周期66精選2021版課件傳統(tǒng)請(qǐng)求/響應(yīng)處理模型的不足控制器缺乏對(duì)頁(yè)面的控制力控制能力僅限于頁(yè)面導(dǎo)航頁(yè)面缺乏對(duì)模型的控制力原則上頁(yè)面只應(yīng)負(fù)責(zé)從模型中提取數(shù)據(jù)并顯示,若直接設(shè)置模型數(shù)據(jù),則繞過(guò)了控制器中的轉(zhuǎn)換校驗(yàn)邏輯。頁(yè)面與控制器之間缺乏有效溝通基于面向?qū)ο蟮目刂破麟y以適應(yīng)基于文本流的頁(yè)面。溝通形式局限于傳遞簡(jiǎn)單的請(qǐng)求參數(shù),修改共享數(shù)據(jù)(例如JavaBean或Session屬性等)頁(yè)面對(duì)控制器的通信需要由客戶端發(fā)起請(qǐng)求,溝通形式受限于傳輸協(xié)議(例如HTTP的GET方式)對(duì)一個(gè)請(qǐng)求/響應(yīng)循環(huán)的邏輯缺乏細(xì)致劃分,導(dǎo)致校驗(yàn)、轉(zhuǎn)換、展現(xiàn)的代碼糾纏在一起。程序員必須自己去關(guān)心進(jìn)行這些動(dòng)作的時(shí)機(jī),次序以及出錯(cuò)后的行為。67精選2021版課件JSF提供的解決方案JSF引擎負(fù)責(zé)維護(hù)視圖的組件樹(shù)模型類似于瀏覽器的DOM模型,JSF組件樹(shù)模型為基于文本流的視圖提供了一個(gè)面向?qū)ο蟮挠成???刂破骺梢栽L問(wèn)、修改組件樹(shù)中的元素,從而獲取請(qǐng)求發(fā)起時(shí)的視圖狀態(tài),或者影響最終的響應(yīng)結(jié)果。JSF引擎負(fù)責(zé)發(fā)起校驗(yàn),轉(zhuǎn)換行為,程序員只需提供相關(guān)的邏輯,而不需要關(guān)心時(shí)機(jī)同時(shí),JSF實(shí)現(xiàn)提供了常用的校驗(yàn)與轉(zhuǎn)換邏輯。引入延遲求值EL表達(dá)式,令視圖可以以受控的方式調(diào)用、修改模型。JSF引擎管理對(duì)延遲求值EL表達(dá)式的賦值,調(diào)用等明確劃分首次請(qǐng)求與postback(對(duì)同一個(gè)視圖的后續(xù)請(qǐng)求),JSF引擎管理postback時(shí)的組件樹(shù)與模型更新。統(tǒng)一了視圖與控制器,從而消除了溝通問(wèn)題。68精選

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論