gembin

          OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

          HBase, Hadoop, ZooKeeper, Cassandra

          Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

          There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

          About Me

           

          如何使用JSF FacesContext

          在Faces API中有兩個(gè)類是要經(jīng)常使用的. 一個(gè)是FacesContext 一個(gè)是ExternalContext, 本篇文章講解如何使用前者, 在下面的一篇文章中在繼續(xù)講解任何使用后者:

          對(duì)每個(gè)JSF請(qǐng)求,F(xiàn)acesServlet對(duì)象都會(huì)為其獲取一個(gè)javax.faces. context. FacesContext類的實(shí)例。
          FacesServlet對(duì)象將下列3個(gè)取自Web容器的對(duì)象傳給javax.faces.context.FacesContextFactory對(duì)象的getFacesContext方法,以此來(lái)做到這一點(diǎn):

          ● javax.servlet.ServletContext
          ● javax.servlet.ServletRequest
          ● javax.servlet.ServletResponse
          這意味著FacesContext的實(shí)例里包含了所有處理JSF請(qǐng)求所需的每個(gè)請(qǐng)求的狀態(tài)信息。
           FacesContext實(shí)例及其封裝的對(duì)象
           獲取當(dāng)前實(shí)例一個(gè)經(jīng)常用到的方法是靜態(tài)的getCurrentInstance方法,它返回當(dāng)前的FacesContext實(shí)例。
          此方法的簽名如 下:public static FacesContext getCurrentInstance()

          下面的代碼是一個(gè)用此方法獲取FacesContext當(dāng)前實(shí)例的例子:
             FacesContext facesContext = FacesContext.getCurrentInstance();

           獲取和修改組件樹FacesContext實(shí)例里最重要的內(nèi)容是請(qǐng)求頁(yè)面的組件樹。
                  組件樹是由javax.faces.tree.Tree類來(lái)表示的(本 章后面的“使用Tree類”一節(jié)會(huì)討論)。
          FacesContext實(shí)例的tree屬性就是Tree對(duì)象。要獲取或修改Tree對(duì)象,可使用tree屬性 的讀取方法和賦值方法:
                     public abstract Tree getTree()public abstract void setTree(Tree tree)

          添加和獲取消息在請(qǐng)求處理生命周期里,可能會(huì)遇到錯(cuò)誤。比如,當(dāng)驗(yàn)證器執(zhí)行輸入驗(yàn)證時(shí),因?yàn)橛脩糨斎肓瞬徽_的值,驗(yàn)證可能失敗;當(dāng)組件試圖把輸入值轉(zhuǎn)換 為綁定到組件的模型對(duì)象所需的類型時(shí),也可能會(huì)失敗。
          所有消息都必須存放到FacesContext實(shí)例里以備后面進(jìn)行處理。比如,您可能希望在頁(yè)面里顯 示錯(cuò)誤消息,從而為用戶更正錯(cuò)誤提供幫助。
          錯(cuò)誤消息是由javax.faces.application.Message接口(第11章再詳細(xì)討論)來(lái)表 示的,您可以通過(guò)使用FacesContext類的addMessage方法向FacesContext實(shí)例里添加Message對(duì)象。

               這個(gè)方法的簽名如 下:public abstract void addMessage(UIComponent component, Message message)

          如果component不為空,新加入的message就關(guān)聯(lián)到component上。否則,它就不與任何特定組件的實(shí)例相關(guān)。舉例來(lái) 說(shuō),驗(yàn)證器在驗(yàn)證組件值失敗時(shí)可調(diào)用FacesContext的addMessage方法,傳入值無(wú)效的組件及一個(gè)包含特定錯(cuò)誤消息的Message對(duì) 象。

          所有添加到FacesContext實(shí)例的Message對(duì)象都被加入到一個(gè)集合里。
          可通過(guò)調(diào)用getMessages方法的兩個(gè)重載方法之一來(lái)獲取 加入的Message對(duì)象:
                   public abstract Iterator getMessages()
                   public abstract Iterator getMessages(UIComponent component)
          第一種形式的調(diào)用在一個(gè)Iterator里返回所有Message對(duì)象,
          第二種形式的調(diào)用則僅返回與給定UIComponent相 關(guān)聯(lián)的Message對(duì)象。


          添加和獲取請(qǐng)求處理事件UIComponent可以生成FacesEvent對(duì)象。
                比如,當(dāng)單擊一個(gè)UICommand組件時(shí),它會(huì)生成一個(gè) ActionEvent對(duì)象(ActionEvent類是FacesEvent類的子類)。
               這個(gè)FacesEvent對(duì)象需要在FacesContext 實(shí)例里保存起來(lái),以備請(qǐng)求處理生命周期里的下一步處理事件時(shí)所用。
               可通過(guò)使用FacesContext類的addFacesEvent方法向 FacesContext實(shí)例添加FacesEvent對(duì)象。

               此方法的簽名如下:public abstract void addFacesEvent(FacesEvent event)

               要提取先前添加的FacesEvent對(duì)象,可調(diào)用getFacesEvents方法,
               其簽名如下:public abstract Iterator getFacesEvents()
              此方法返回FacesEvent時(shí)的順序與其在隊(duì)列中的順序一致。

           向Response對(duì)象里寫入信息為了向Response對(duì)象里寫入信息,F(xiàn)acesContext類提供了兩個(gè)屬性,
          一個(gè)是 javax.faces.Context.ResponseStream類型,
          另一個(gè)是 javax.faces.context.ResponseWriter類型。

          ResponseStream類型的對(duì)象用于輸出二進(jìn)制數(shù)據(jù),而 ResponseWriter類型的對(duì)象則用于輸出字符。
          這些屬性的讀取方法和賦值方法如下:
                   public abstract ResponseStream getResponseStream()
                   public abstract void setResponseStream(ResponseStream responseStream)
                   public abstract ResponseWriter getResponseWriter()
                  public abstract void setResponseWriter(ResponseWriter responseWriter)

          獲取和設(shè)置地區(qū),JSF支持國(guó)際化和本地化。這意味著您可以根據(jù)用戶的地區(qū)決定發(fā)送什么樣的回應(yīng)信息。
          locale屬性里存放了當(dāng)前處 理中所用的Locale對(duì)象。初始狀況下,locale屬性的值和網(wǎng)絡(luò)瀏覽器里指定的地區(qū)是一樣的,但可以修改這個(gè)值,從而發(fā)送輸出所使用的地區(qū)將獨(dú)立于 瀏覽器所使用的地區(qū)。
          此屬性的讀取方法和賦值方法如下:

                public abstract Locale getLocale()
                public abstract void setLocale(Locale locale)

          操作請(qǐng)求處理生命周期FacesContext類還提供了兩個(gè)方法與請(qǐng)求處理生命周期進(jìn)行交互:
          ● 在當(dāng)前階段的處理完成后,調(diào)用renderResponse方法通知JSF實(shí)現(xiàn)把控制權(quán)轉(zhuǎn)到呈現(xiàn)響應(yīng)階段。也就是說(shuō),處于當(dāng)前階段和呈現(xiàn)響應(yīng)階段之間的所 有其他階段都不再執(zhí)行。
          ● 調(diào)用responseComplete方法,告訴JSF實(shí)現(xiàn)此次請(qǐng)求的HTTP響應(yīng)已經(jīng)完成(比如在使用了HTTP重定向的情況下)。

          因此,當(dāng)前階段完成 后,必須中止請(qǐng)求處理生命周期的處理。
          這些方法的簽名如下:
                public abstract void renderResponse()
               public abstract void responseComplete()

           獲取其他請(qǐng)求狀態(tài)信息其他每個(gè)請(qǐng)求的狀態(tài)信息封裝在ExternalContext對(duì)象里,可以使用getExternalContext方法獲取該對(duì) 象:
                     public abstract ExternalContext getExternalContext()ExternalContext放在下一節(jié)討論。

          posted on 2008-05-08 15:21 gembin 閱讀(1308) 評(píng)論(0)  編輯  收藏 所屬分類: JSF

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類(440)

          隨筆檔案(378)

          文章檔案(6)

          新聞檔案(1)

          相冊(cè)

          收藏夾(9)

          Adobe

          Android

          AS3

          Blog-Links

          Build

          Design Pattern

          Eclipse

          Favorite Links

          Flickr

          Game Dev

          HBase

          Identity Management

          IT resources

          JEE

          Language

          OpenID

          OSGi

          SOA

          Version Control

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          free counters
          主站蜘蛛池模板: 九龙坡区| 江陵县| 大关县| 呼玛县| 临泉县| 林芝县| 新余市| 报价| 平顺县| 兖州市| 甘德县| 乐陵市| 敦化市| 南丰县| 河南省| 独山县| 水城县| 始兴县| 平和县| 长宁区| 沁水县| 永修县| 抚宁县| 杭锦旗| 桃园县| 会理县| 庆元县| 河东区| 从江县| 南京市| 云林县| 新郑市| 类乌齐县| 吉林省| 滨州市| 古丈县| 江达县| 舟曲县| 额济纳旗| 江口县| 阳西县|