JSF中的FacesContext对象详解

 

JSF中的FacesContext对象详解(转)

 

在Faces API中有两个类是要经常使用的. 一个是FacesContext 一个是ExternalContext.首先讲解如何使用FacesContext .

 

对每个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()

现在讲解ExternalContext。

使用ExternalContext类提供的方法可以获取ServletContext、ServletRequest和ServletResponse对象,构造FacesContext实例时需要这些对象。除此之外,ExternalContext实例提供了包装器方法,可以使用这些方法获得原来需要从ServletContext、ServletRequest及ServletResponse对象上调用一些方法获得的信息。

3.3.1  获取ServletContext、ServletRequest和ServletResponse对象

可使用下列方法获取servlet信息:

●       getContext 此方法可获取Web应用中与当前请求相关联的ServletContext对象。其签名如下:

public abstract Object getContext()

●      getRequest 此方法可获取代表当前正在处理的请求的ServletRequest对象。其签名如下:

public abstract Object getRequest()

●       getResponse 此方法可获取代表当前正在呈现的响应的ServletResponse对象。其签名如下:

public abstract Object getResponse()

这些方法都是返回一个java.lang.Object对象,不是servlet特有的类型,这样就可以使JSF实现独立于其运行的环境。比如,JSF既可用于Web容器,也可以用于其他容器,如portlet等。

3.3.2  获取ServletContext特性

getApplicationMap方法返回一个包含ServletContext对象里全部特性名/值对的Map对象。下面是此方法的签名:

public abstract java.util.Map getApplication()

作为一个例子,下面的代码可获取一个名叫databaseUtility的特性:

Object contextAttribute = null;

FacesContext facesContext = FacesContext.getCurrentInstance();

ExternalContext externalContext = facesContext.getExternalContext();

Map contextMap = externalContext.getApplicationMap();

if (contextMap!=null)

contextAttribute = contextMap.get("databaseUtility");

3.3.3  获取Session对象及其特性

通过ExternalContext对象可访问与当前请求相关联的Session对象。getSession方法可取回当前用户的javax.servlet.http.HttpSession对象,如果当前用户没有相应的Session对象,此方法的行为由传入的参数决定:如果为该方法传入了一个true值,它会创建一个Session对象;否则,它会返回null。下面是getSession方法的签名:

public abstract Object getSession(boolean create)

此方法其实是javax.servlet.http.HttpServletRequest接口中getSession方法的包装器。

getSessionMap方法返回一个包含与当前请求相关联的Session对象里所有特性名/值对的Map对象。下面是它的方法签名:

public abstract java.util.getSessionMap()

要获取Session对象里的特性,可调用Map类的get方法,传入要获取的特性名即可。文档中没有指明在当前请求没有相应Session对象的情况下,此方法是返回null还是一个空的Map对象。所以在调用Map的get方法之前,需要先检查Map是否为null。下面的代码是获取Session特性的例子:

Object sessionAttribute = null;

FacesContext facesContext = FacesContext.getCurrentInstance();

ExternalContext externalContext = facesContext.getExternalContext();

Map sessionMap = externalContext.getSessionMap();

if (sessionMap!=null)

sessionAttribute = sessionMap.get(key);

最后一行的key是一个包含特性名的字符串。

3.3.4  获取ServletContext对象的初始参数

getInitParameter方法是ServletContext对象的getInitParameter方法的包装器,用这个方法可以提取在部署描述符(web.xml文件)里用context-init元素指定的初始参数值。此方法的签名如下:

public abstract String getInitParameter(String parameterName)

举例来说,如果在部署描述符声明了如下context-init元素:

<context-param>

<param-name>contactPerson</param-name>

<param-value>Scott Jobim</param-value>

</context-param>

下面代码中的字符串变量initParam的值会是Scott Jobim。

FacesContext facesContext = FacesContext.getCurrentInstance();

ExternalContext externalContext = facesContext.getExternalContext();

String initParam = externalContext.getInitParameter("contactPerson");

getInitParameterMap方法返回一个包含ServletContext对象中全部初始参数的Map对象。其签名如下:

public abstract java.util.Map getInitParameterMap()

为了获取一个初始参数的值,使用Map对象的get方法,同时传递初始参数的名称。比如,下面的代码把初始参数databaseName的值输出到控制台。

FacesContext facesContext = FacesContext.getCurrentInstance();

ExternalContext externalContext = facesContext.getExternalContext();

Map paramMap = externalContext.getInitParameterMap();

if (paramMap!=null) {

System.out.println(paramMap.get("databaseName"));

}

3.3.5  获取Request对象的特性

getRequestMap方法返回一个包含当前Request对象中全部特性名/值对的Map对象。其方法签名如下:

public abstract java.util.Map getRequestMap()

作为一个例子,下面的代码可用来提取Request对象里的特性:

Object requestAttribute = null;

FacesContext facesContext = FacesContext.getCurrentInstance();

ExternalContext externalContext = facesContext.getExternalContext();

Map requestMap = externalContext.getRequestMap();

if (requestMap!=null)

requestAttribute = requestMap.get(key);

最后一行里的Key是一个包含要提取的属性名的字符串。

3.3.6  访问Request对象里的参数名和值

getRequestParameterMap、getRequestParameterNames和getRequestParameterValuesMap方法可用来访问Request对象里的参数名和值。

getRequestParameterMap返回一个包含Request对象里全部参数名/值对的Map对象。其签名如下:

public abstract java.util.Map getRequestParameterMap()

作为一个例子,下面的代码可用来提取名为id的请求参数的值:

String id = null;

FacesContext facesContext = FacesContext.getCurrentInstance();

ExternalContext externalContext = facesContext.getExternalContext();

Map requestParameterMap = externalContext.getRequestParameterMap();

if (requestParameterMap!=null)

id = (String) requestParameterMap.get("id");

getRequestParameterNames方法返回一个包含全部请求参数名的Iterator。此方法其实是ServletRequest.getParameterNames方法的包装器。不同的是,ExternalContext类的getRequestParameterNames返回一个Iterator,而不是java.util.Enumeration。此方法的签名如下:

public abstract java.util.Iterator getRequestParameterNames()

作为一个例子,下面的代码把所有的请求参数名/值对输出到控制台。

FacesContext facesContext = FacesContext.getCurrentInstance();

ExternalContext externalContext = facesContext.getExternalContext();

Map requestParameterMap = externalContext.getRequestParameterMap();

Iterator parameterNames = externalContext.getRequestParameterNames();

while (parameterNames.hasNext()) {

String parameterName = (String) parameterNames.next();

String parameterValue =

(String) requestParameterMap.get(parameterName);

System.out.println(parameterName + " : " + parameterValue);

}

getRequestParameterValuesMap方法返回一个包含Request对象里全部参数名/值对的Map对象。此方法与getRequestParameterMap方法很相似,但getRequestParameterValuesMap可返回全部相同参数名的值。在此方法返回的Map对象上调用get(key)方法,这一点等同于获取当前请求的ServletRequest并在其上调用getParameterValues(key)。也就是说,Map对象返回的是一个字符串数组。GetRequestParameterValuesMap方法的签名如下:

public abstract java.util.Map getRequestParameterValuesMap()

下面例子中的代码把请求参数id的全部值输出到控制台。

String[] id = null;

FacesContext facesContext = FacesContext.getCurrentInstance();

ExternalContext externalContext = facesContext.getExternalContext();

Map requestParameterValuesMap = externalContext.getRequestParameterValuesMap();

if (requestParameterValuesMap!=null) {

id = (String[]) requestParameterValuesMap.get("id");

// print all values of id

for (int i=0; i<id.length; i++) {

System.out.println(id[i]);

}

}

 

你可能感兴趣的:(Web,servlet,浏览器,JSF,网络应用)