`
cuiyadll
  • 浏览: 204726 次
文章分类
社区版块
存档分类
最新评论

如何使用FacesContext类

    博客分类:
  • jsf
 
阅读更多
在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.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()
分享到:
评论

相关推荐

    JSF FacesContext 详解

    在 Faces API 中,FacesContext 和 ExternalContext 是两个经常使用的类,本文将详细介绍 FacesContext 的编程接口和使用方法。 FacesContext 的实例是在 FacesServlet 对象中创建的,每个 JSF 请求都会获取一个 ...

    jsf的facesContext上下文工具类

    jsf的facesContext上下文工具类

    JSF如何使用ExternalContext类

    本文将详细讲解如何在JSF中使用`ExternalContext`类。 首先,`ExternalContext`类主要提供了以下三种方法来获取Servlet环境中的核心对象: 1. **获取ServletContext对象**: - `getContext()`方法返回与当前请求...

    ADF2007导出

    在Java代码中,我们可以看到使用FacesContext和OutputStream来实现文件下载功能。FacesContext是一个JSF(JavaServer Faces)提供的上下文对象,用于管理Web应用程序的状态和会话信息。OutputStream是一个Java流对象...

    第9章 JSF的托管Bean和国际化课件及源程序

    在实际开发中,你可能会创建一个`MessageBundle`类,该类负责加载和返回资源包中的文本,这样就可以在Bean中方便地使用。此外,JSF也支持在XHTML页面上直接使用`<h:outputText>`标签结合`value`属性来显示本地化文本...

    UIUtil.rar_Java编程_Java_

    这个工具类简化了开发过程,避免了频繁地使用FacesContext来获取这些信息。 在JSF中,FacesContext是核心组件之一,它提供了对请求、会话和应用范围的数据访问,以及与视图、导航和外部资源交互的能力。然而,通过...

    创建JSF自定义组件

    将包含组件类、渲染器类和标签文件的JAR文件添加到应用的类路径中,并重新部署应用。现在,你可以在任何JSF页面上使用这个自定义组件。 创建JSF自定义组件是一项复杂但强大的任务,它允许开发者根据项目需求定制Web...

    java server face重定向

    在JSF中,我们可以直接在Managed Bean的方法中使用`FacesContext`的`getExternalContext()`来实现重定向。以下是一个例子: ```java import javax.faces.context.FacesContext; import javax.faces.event....

    j2ee期末考试题下载

    Faces请求生成非Faces响应使用FacesContext.responseComplete 方法来呈现响应阶段,而非Faces请求生成Faces响应使用FacesContext.renderResponse 方法来呈现响应阶段。 在JSP 中,sql 标签不符合分层原则,sql ...

    JSF和Spring集成.doc

    - **findBean 方法**:该方法首先通过 `FacesContext` 获取当前的 `ServletContext`,然后使用 `WebApplicationContextUtils.getRequiredWebApplicationContext` 方法获取 `ApplicationContext` 对象,最后调用 `...

    JSF初学问题

    然而,在学习和使用JSF的过程中,新手经常会遇到各种问题,其中一种常见的异常就是`javax.servlet.jsp.JspException: Cannot find FacesContext`。 #### 二、异常分析 当出现`javax.servlet.jsp.JspException: ...

    java网页格式的所有类的说明

    Java网页格式的所有类的说明主要涉及的是Java编程语言在处理Web页面内容时所用到的各种类和接口。这些类主要用于构建动态网页、处理HTTP...了解和掌握这些类的使用方法,对于成为一名熟练的Java Web开发者至关重要。

    Core JavaServer Faces, Second Edition (JSF)part1

    这部分会解释如何使用FacesContext和其他上下文对象来访问请求参数和执行任务。 9. **实用工具类和辅助类**:JSF提供了一些实用工具类,如FacesUtil,可以帮助开发者更有效地工作。这部分会讨论这些类的功能和用法...

    jsf开发需要的相关jar包

    例如,`javax.faces.context.FacesContext`的实现就包含在这里,它是JSF处理请求和响应的核心类,提供了对当前FacesContext的各种操作。 在JSF开发中,这两个JAR文件通常需要被添加到项目的类路径中,以便运行时...

    java面向对象核心编程

    Java中的继承使用`extends`关键字,一个类只能直接继承一个父类,但可以实现多个接口。 4. **多态**:多态性是对象多种形态的表现,允许不同类的对象对同一消息做出响应。Java的多态性体现在方法重写(Override)和...

    JSF框架中使用的设计模式介绍

    此外,JSF还使用Factory Method模式来创建FacesContext实例,这是通过FacesContextFactory实现的。FacesContextFactory提供了一个getFacesContext方法,该方法由JSF实现来创建FacesContext实例。 ##### 3.4 State...

    自定义 JSF 组件

    创建组件类时,通常我们会选择继承自JSF API中的`UIComponentBase`抽象类或者它的子类。`UIComponentBase`提供了许多组件通用的行为,但直接继承可能会比较复杂,因为其中有大量的抽象方法需要实现。根据组件的特性...

    itext导出word整理

    其中,标题部分使用`Paragraph`类创建,并设置字体大小、样式等属性;内容部分则通过JSON数据解析来填充。 #### 3. JSON数据处理 代码中提到了使用JSON来处理简报内容,这表明简报内容是以JSON格式存储在数据库中。...

Global site tag (gtag.js) - Google Analytics