如何使用JSF FacesContext

如何使用JSF FacesContext

在Faces API中有两个类是要经常使用的. 一个是FacesContext 一个是ExternalContext, 本篇文章讲解如何使用前者, 在下面的一篇文章中在继续讲解任何使用后者:

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

● javax.servlet.ServletContext
● javax.servlet.ServletRequest
● javax.servlet.ServletResponse
这意味着FacesContext的实例里包含了所有处理JSF请求所需的每个请求的状态信息。
 FacesContext实例及其封装的对象
 获取当前实例一个经常用到的方法是静态的getCurrentInstance方法,它返回当前的FacesContext实例。
此方法的签名如 下:public static FacesContext getCurrentInstance()

下面的代码是一个用此方法获取FacesContext当前实例的例子:
   FacesContext facesContext = FacesContext.getCurrentInstance();

 获取和修改组件树FacesContext实例里最重要的内容是请求页面的组件树。
        组件树是由javax.faces.tree.Tree类来表示的(本 章后面的“使用Tree类”一节会讨论)。
FacesContext实例的tree属性就是Tree对象。要获取或修改Tree对象,可使用tree属性 的读取方法和赋值方法:
           public abstract Tree getTree()public abstract void setTree(Tree tree)

添加和获取消息在请求处理生命周期里,可能会遇到错误。比如,当验证器执行输入验证时,因为用户输入了不正确的值,验证可能失败;当组件试图把输入值转换 为绑定到组件的模型对象所需的类型时,也可能会失败。
所有消息都必须存放到FacesContext实例里以备后面进行处理。比如,您可能希望在页面里显 示错误消息,从而为用户更正错误提供帮助。
错误消息是由javax.faces.application.Message接口(第11章再详细讨论)来表 示的,您可以通过使用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对象。


添加和获取请求处理事件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时的顺序与其在队列中的顺序一致。

 向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)

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

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

操作请求处理生命周期FacesContext类还提供了两个方法与请求处理生命周期进行交互:
● 在当前阶段的处理完成后,调用renderResponse方法通知JSF实现把控制权转到呈现响应阶段。也就是说,处于当前阶段和呈现响应阶段之间的所 有其他阶段都不再执行。
● 调用responseComplete方法,告诉JSF实现此次请求的HTTP响应已经完成(比如在使用了HTTP重定向的情况下)。

因此,当前阶段完成 后,必须中止请求处理生命周期的处理。
这些方法的签名如下:
      public abstract void renderResponse()
     public abstract void responseComplete()

 获取其他请求状态信息其他每个请求的状态信息封装在ExternalContext对象里,可以使用getExternalContext方法获取该对 象:
           public abstract ExternalContext getExternalContext()ExternalContext放在下一节讨论。

你可能感兴趣的:(如何使用JSF FacesContext)