如何使用FacesContext类(转)
vblvbl
2007-03-29
在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请求所需的每个请求的状态信息。图3-1展示了FacesContext实例里封装的其他一些对象。图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类来表示的(本章后面的“使用Tree类”一节会讨论)。FacesContext实例的tree属性就是Tree对象。要获取或修改Tree对象,可使用tree属性的读取方法和赋值方法:public abstract Tree getTree()public abstract void setTree(Tree tree)3.2.3 添加和获取消息在请求处理生命周期里,可能会遇到错误。比如,当验证器执行输入验证时,因为用户输入了不正确的值,验证可能失败;当组件试图把输入值转换为绑定到组件的模型对象所需的类型时,也可能会失败。所有消息都必须存放到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对象。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 获取和设置地区第11章将会讨论到,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()ExternalContext放在下一节讨论。 |
|
nbspnbsp
2007-03-29
分下段就更好了,支持!
|
|
huanghero0663
2007-04-28
看起来很辛苦啊!楼主整理好再发啦~
|
|
wangwenpinghello
2007-06-06
看的的确很累,图在哪呢?
|