在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放在下一节讨论。