JSF规范(五)

9 篇文章 0 订阅

本文是基于JSF规范的翻译而来,并省掉一些无关紧要的章节。如有不当之处请大家指正。

作者:youfly      email:seedcloned-pub@yahoo.com.cn

转载请注明出处: www.jfuns.com www.jfuns.cn http://blog.csdn.net/youfly

6Per-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();

 

返回当前FacesContextELContext实例。这个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);

返回与当前请求相关联的 session 对象。如果 create 标记被设置成 true ,则当当前请求不存在关联的 sesseion 时,则创建一个新的 session

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等各阶段的处理期间,消息能够被加入整个组件树队列(如果clientIdnull),或者被关联到clientId的特定组件队列(如果clientId不为null)

 

public Iterator<String> getClientIdsWithMessages();

public Severity getMaximumSeverity();

public Iterator<FacesMessage> getMessages(String clientId);

public Iterator<FacesMessage> getMessages();

getClientIdsWithMessages() 方法返回至少拥有一个消息的 clientId 迭代器 ( 每个 clientId 对应一组消息集合 , 加入迭代器的 clientId 对应的消息至少拥有一个消息 ) 迭代器里的 clientId AddMessage() 方法调用顺序排列 getMaximumSeverity() 方法返回所有消息队列里的消息的最高级别,而不管消息是否关联到一个特定的 clientId getMessages(String) 方法返回队列的消息迭代器,如果 clientId 不空,则返回的消息关联到指定的 clientId ,如果 clientId 为空则返回所有没有关联到 clientId 的所有消息。 getMessages() 方法返回所有队列里的消息的迭代器,而不管消息是否关联到一个特定的 clientId 两个不同的 getMessage() 方法返回的迭代器里的元素顺利必须按照调用 addMessage() 方法添加消息顺序来排列。 更多的信息请参考 6.2 “FacesMessage” 节。
6.1.6 RenderKit

public RenderKit getRenderKit();

返回当前UIViewRootrender 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 streamcharacter streamUIComponents或者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 listenersvalidators可能通过调用上面的这些方法影响流程。

 

renderResponse() 告诉 JSF 实现当前阶段的处理已经完成 ( 换句话说,当前阶段的所有处理和事件都已执行完毕 ) ,并跳过期间的各个阶段,控制应该立即转移到 Render Response 阶段。例如,一个用来处理树控制用户界面状态改变 ( 如展开或者收缩树节点 ) 的事件监听器可以通过调用这个方法让当前页面重新刷新,而不是让应用程序处理。

 

在另一方面,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;

ResponseWriter 继承了 java.io.Writer ,因此这些继承的方法可以作为低级的输出 API close() 方法刷新输出流,将抛出在输入字符时发生的 IOException 异常。 flush 方法刷新输出流缓冲区里的数据,并且提交当前响应。 write 方法直接出输出原始的字符。

6.5 FacesContextFactory

对于每一个运行于servlet或者portlet容器里的基于JSFweb应用,都必须有一个有效的单实例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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值