本文是基于JSF规范的翻译而来,并省掉一些无关紧要的章节。如有不当之处请大家指正。
作者:youfly email:seedcloned-pub@yahoo.com.cn
转载请注明出处: www.jfuns.com www.jfuns.cn http://blog.csdn.net/youfly6Per-Request State Information
在JSF页面的请求处理期间,一个上下文对象用来体现请求的具体信息,也提供了方法应用的服务。本章描述了封装这些上下文信息的类。
6.1 FacesContext
JSF实现定义了javax.faces.context.FacesContext抽象基类来体现提交请求的上文信息,并且创建对应的响应。 一个FacesContext实例在“请求处理生命周期”的开始阶段由JSF实现通过调用FacesContextFactory实例的getFacesContext方法创建,在6.5“FacesContextFactory”.描述。在“请求处理生命周期”完成的时候,JSF实现将调用release方法,这使JSF实现有机会释放获得的资源,也有机会缓冲和重用FacesContext实例,而不需要每次都重建一个新的实例。
6.1.1 Application
public Application getApplication();
作为通过ApplicationFactory来查找Application实例的便利方法,JSF实现必须确保当前web应用可以通过这个方法得到Application实例。
6.1.2 ELContext
public ELContext getELContext();
返回当前FacesContext的ELContext实例。这个ELContext实例具有和FacesContext实现一样的生命周期,并且可能在第一次调用FacesContext实例上的方法时被迟缓(lazily)创建。紧接着ELContext实现的创建,实现必须执行下列的动作:
■ 调用ELContext.putContext(java.lang.Class, java.lang.Object)方法,传递FacesContext.class对象和指向FacesContext自己的this引用。
*如果session还没有存在,则通过Map来访问属性将引起创建对应请求的session。
除上面列出的属性外, ExternalContext对象必须暴露下面的方法。阅读javadocs文档得到更为详细的信息。
public void dispatch(String path) throws IOException;
public void redirect(String url) throws IOException;
dispatch()必须应用上下文对象提供的RequestDispatcher来合并指定context-relative资源的内容。redirect()方法引起发送HTTP Redirect到客户端。
public String encodeActionURL(String url);
public String encodeResourceURL(String url);
返回一个经过必要的编码或者重写的指定URL,来确保这个URL能够正确识别出当前应用可寻址的动作或者资源。
public String encodeNamespace(String value);
返回一个加入前缀的名称,以确保它在当前页面范围内是唯一的。
public void log(String message);
public void log(String message, Throwable throwable);
日志消息及异常的栈跟踪潜在的上下文中。
public String getInitParameter(String name);
返回指定上下文初始化参数的值(如果存在)。
public URL getResource(String path);
public InputStream getResourceAsStream(String path);
分别返回指定web应用资源的URL或者InputStream。
public Set getResourcePaths(String path);
返回匹配指定路径的web应用资源的context-relative路径。
public Object getSession(boolean create);
public boolean isUserInRole(String role);
如果当前登陆的用户包括指定的角色,则返回返回true。
6.1.4 ViewRoot
public UIViewRoot getViewRoot();
public void setViewRoot(UIViewRoot root);
在“请求处理生命周期”的Restore View阶段,JSF实现的状态管理子系统必须确定组件树(如果存在),并且调用setViewRoot()方法来设置它。
6.1.5 Message Queue
public void addMessage(String clientId, FacesMessage message);
在“请求处理生命周期”Apply Request Values, Process Validations, Update Model Values, 和Invoke
Application等各阶段的处理期间,消息能够被加入整个组件树队列(如果clientId为null),或者被关联到clientId的特定组件队列(如果clientId不为null)。
public Iterator<String> getClientIdsWithMessages();
public Severity getMaximumSeverity();
public Iterator<FacesMessage> getMessages(String clientId);
public Iterator<FacesMessage> getMessages();
6.1.6 RenderKit
public RenderKit getRenderKit();
返回当前UIViewRoot的render kit id对应的RenderKit对象(如果存在)。
6.1.7 ResponseStream and ResponseWriter
public ResponseStream getResponseStream();
public void setResponseStream(ResponseStream responseStream);
public ResponseWriter getResponseWriter();
public void setResponseWriter(ResponseWriter responseWriter);
JSF支持的输出流包括byte stream和character stream。UIComponents或者Renderers通过调用getResponseStream()方法来得到具有二进制输出能力的二进制输出流。相应的UIComponents 或Renderers可以通过调用getResponseWriter()方法来得到一个具有字符输出能力的字符输出流。由于servlet API的约束,每个响应都可以使用二进制输出流或者字符输出流,但不能将两者混合使用。参见7.5 “ViewHandler”来获得setResponseWriter()方法和setResponseStream() 方法的详细信息。
6.1.8 Flow Control Methods
public void renderResponse();
public void responseComplete();
public boolean getRenderResponse();
public boolean getResponseComplete();
在通常情况下,“请求处理生命周期”的各个阶段都是按照第二章 “Request Processing Lifecycle.”描述的顺序进行执行。然而components, event listeners及validators可能通过调用上面的这些方法影响流程。
在另一方面,responseComplete()用来通知JSF实现当前请求的HTTP响应已完成,并且在本阶段结束时,当前请求的处理生命周期应该结束。例如,一个事件监听器确定需要执行一个HTTP得定向话,它将执行response对象上的相应动作(也就是调用ExternalContext.redirect()),然后调用再这个方法。
getRenderResponse()和getResponseComplete()方法允许基于JSF的应用确定renderResponse()和responseComplete()方法是否在当前请求中被调用过。
6.1.9 Access To The Current FacesContext Instance
public static FacesContext getCurrentInstance();
public static void setCurrentInstance(FacesContext context);
在大多数的环境里,JSF组件和应用对象都是通过传入的FacesContext实例引用来访问当前请求的FacesContext实例。然而,在有些情况下,并不能得到这个引用。当前web应用里的任何java类都可以通过调用getCurrentInstance()方法得到当前请求的FacesContext实例。JSF实现必须确保在FacesContextFactory返回一个FacesContext实例前正确的设置这个值,并且这个必须是线程安全的。
6.2 FacesMessage
每一个队列在FacesContext里的消息都是一个javax.faces.application.FacesMessage类。它提供了下面的构造器:
public FacesMessage();
public FacesMessage(String summary, String detail);
public FacesMessage(Severity severity, String summary, String detail);
下面的方法可以得到消息的相关属性:
public String getDetail();
public void setDetail(String detail);
public Severity getSeverity();
public void setSeverity(Severity severity);
public String getSummary();
public void setSummary(String summary);
■ detail—本地化的当前FacesMessage的详细文本(如果存在)。这通常是一些附加的文本来帮助用户理解这个FacesMessage所报告的问题,并且提供解决这个问题的建议。
■ severity—一个指定当前FacesMessage报告的问题的严重等级。FacesMessage类定义了四个枚举的类型安全标准级别值(SEVERITY_INFO, SEVERITY_WARN, SEVERITY_ERROR, SEVERITY_FATAL)。
■ summary—本地化的当前FacesMessage的简要说明文本。这通常是一些简直的描述FacesMessage所报告问题特性的描述文本。
6.3 ResponseStream
ResponseStream是一个当前响应的二进制输出流抽象类。它拥有和java.io.OutputStream
类完全一样的方法。
6.4 ResponseWriter
ResponseWriter是一个当前响应的字符出流抽象类。ResponseWriter实例是通过RenderKit定义的工厂方法得到。参阅第八章 “RenderKit”。它支持低级和高级的API来输出基于字符的信息。
public void close() throws IOException;
public void flush() throws IOException;
public void write(char c[]) throws IOException;
public void write(char c[], int off, int len) throws IOException;
public void write(int c) throws IOException;
public void write(String s) throws IOException;
public void write(String s, int off, int len) throws IOException;
6.5 FacesContextFactory
对于每一个运行于servlet或者portlet容器里的基于JSF的web应用,都必须有一个有效的单实例javax.faces.context.FacesContextFactory 对象。这个类主要是被JSF实现所使用—应用不需要直接调用它。工厂实例可以被JSF实现或者应用通过调用下面的代码得到:
FacesContextFactory factory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
FacesContextFactory实现可以通过下面的方法来创建(或者从池里重用)FacesContext实例:
public FacesContext getFacesContext(Object context, Object request, Object response, Lifecycle lifecycle);
创建并返回一个根据指定的参数初始化的 FacesContext 实例,第一个参数是 ServletContext ,第二个参数是 ServletRequest ,第三个参数是 ServletResponse 。