如何使用FacesContext类

      在Faces API中有两个类是要常常使用的,一个是FacesContext ;一个是ExternalContext。本篇文章讲解如何使用FacesContext java

      对每一个JSF请求,FacesServlet对象都会为其获取一个javax.faces.context.FacesContext类的实例。FacesServlet对象将下列3个取自Web容器的对象传给javax.faces.context.FacesContextFactory对象的getFacesContext方法,以此来作到这一点: 浏览器

      ● javax.servlet.ServletContex 网络

     t● javax.servlet.ServletRequest app

      ● javax.servlet.ServletResponse spa

      这意味着FacesContext的实例里包含了全部处理JSF请求所需的每一个请求的状态信息。图3-1展现了FacesContext实例里封装的其余一些对象。       component

                                       

                                            图3-1  FacesContext实例及其封装的对象 对象

      3.2.1 获取当前实例 接口

      一个常常用到的方法是静态的getCurrentInstance方法,它返回当前的FacesContext实例。此方法的签名以下: 生命周期

      public static FacesContext getCurrentInstance() 队列

      下面的代码是一个用此方法获取FacesContext当前实例的例子:

      FacesContext facesContext = FacesContext.getCurrentInstance();

      3.2.2 获取和修改组件树

      FacesContext实例里最重要的内容是请求页面的组件树。组件树是由javax.faces.tree.Tree类来表示的。FacesContext实例的tree属性就是Tree对象。要获取或修改Tree对象,可以使用tree属性的读取方法和赋值方法:

      public abstract Tree getTree()

      public abstract void setTree(Tree tree)

      3.2.3 添加和获取消息

      在请求处理生命周期里,可能会遇到错误。好比,当验证器执行输入验证时,由于用户输入了不正确的值,验证可能失败;当组件试图把输入值转换为绑定到组件的模型对象所需的类型时,也可能会失败。全部消息都必须存放到FacesContext实例里以备后面进行处理。好比,您可能但愿在页面里显示错误消息,从而为用户更正错误提供帮助。错误消息是由javax.faces.application.Message接口来表示的,您能够经过使用FacesContext类的addMessage方法向FacesContext实例里添加Message对象。这个方法的签名以下:

      public abstract void addMessage(UIComponent component, Message message)

      若是component不为空,新加入的message就关联到component上。不然,它就不与任何特定组件的实例相关。举例来讲,验证器在验证组件值失败时可调用FacesContext的addMessage方法,传入值无效的组件及一个包含特定错误消息的Message对象。全部添加到FacesContext实例的Message对象都被加入到一个集合里。可经过调用getMessages方法的两个重载方法之一来获取加入的Message对象:

      public abstract Iterator getMessages()

      public abstract Iterator getMessages(UIComponent component)

      第一种形式的调用在一个Iterator里返回全部Message对象,而第二种形式的调用则仅返回与给定UIComponent相关联的Message对象。

      3.2.4 添加和获取请求处理事件

      UIComponent能够生成FacesEvent对象。好比,当单击一个UICommand组件时,它会生成一个ActionEvent对象(ActionEvent类是FacesEvent类的子类)。这个FacesEvent对象须要在FacesContext实例里保存起来,以备请求处理生命周期里的下一步处理事件时所用。可经过使用FacesContext类的addFacesEvent方法向FacesContext实例添加FacesEvent对象。此方法的签名以下:

      public abstract void addFacesEvent(FacesEvent event)

      要提取先前添加的FacesEvent对象,可调用getFacesEvents方法,其签名以下:

      public abstract Iterator getFacesEvents()

      此方法返回FacesEvent时的顺序与其在队列中的顺序一致。

      3.2.5 向Response对象里写入信息

      为了向Response对象里写入信息,FacesContext类提供了两个属性,一个是javax.faces.Context.ResponseStream类型,另外一个是javax.faces.context.ResponseWriter类型。ResponseStream类型的对象用于输出二进制数据,而ResponseWriter类型的对象则用于输出字符。这些属性的读取方法和赋值方法以下:

      public abstract ResponseStream getResponseStream()

      public abstract void setResponseStream(ResponseStream responseStream)

      public abstract ResponseWriter getResponseWriter()

      public abstract void setResponseWriter(ResponseWriter responseWriter)

      3.2.6 获取和设置地区

      JSF支持国际化和本地化,这意味着您能够根据用户的地区决定发送什么样的回应信息。locale属性里存放了当前处理中所用的Locale对象。初始情况下,locale属性的值和网络浏览器里指定的地区是同样的,但能够修改这个值,从而发送输出所使用的地区将独立于浏览器所使用的地区。此属性的读取方法和赋值方法以下:

      public abstract Locale getLocale()

      public abstract void setLocale(Locale locale)

      3.2.7 操做请求处理生命周期

      FacesContext类还提供了两个方法与请求处理生命周期进行交互:

      ● 在当前阶段的处理完成后,调用renderResponse方法通知JSF实现把控制权转到呈现响应阶段。也就是说,处于当前阶段和呈现响应阶段之间的全部其余阶段都再也不执行。

      ● 调用responseComplete方法,告诉JSF实现这次请求的HTTP响应已经完成(好比在使用了HTTP重定向的状况下)。所以,当前阶段完成后,必须停止请求处理生命周期的处理。这些方法的签名以下:

      public abstract void renderResponse()

      public abstract void responseComplete()

      3.2.8  获取其余请求状态信息

      其余每一个请求的状态信息封装在ExternalContext对象里,可使用getExternalContext方法获取该对象:

      public abstract ExternalContext getExternalContext()

相关文章
相关标签/搜索