JSF规范八.docx

上传人:b****5 文档编号:30266128 上传时间:2023-08-13 格式:DOCX 页数:5 大小:16.81KB
下载 相关 举报
JSF规范八.docx_第1页
第1页 / 共5页
JSF规范八.docx_第2页
第2页 / 共5页
JSF规范八.docx_第3页
第3页 / 共5页
JSF规范八.docx_第4页
第4页 / 共5页
JSF规范八.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

JSF规范八.docx

《JSF规范八.docx》由会员分享,可在线阅读,更多相关《JSF规范八.docx(5页珍藏版)》请在冰豆网上搜索。

JSF规范八.docx

JSF规范八

JSF规范(八)

本文是基于JSF规范的翻译而来,并省掉一些无关紧要的章节。

如有不当之处请大家指正。

作者:

youfly   email:

seedcloned-pub@

转载请注明出处:

11LifecycleManagement

在第二章“RequestProcessingLifecycle,”里,描述了“请求处理生命周期”里每个阶段所要具备的功能。

在本章描述了JSF实现用来管理、执行生命周期的标准API。

这些类及接口都是javax.faces.lifecycle包的一部分。

页面的作者,组件编写者及应用开发者通常都不需要关心生命周期的管理API—它们主要是被工具提供商及JSF实现者所关注。

 

11.1Lifecycle

对于当前web应用接收到的每一个指向JSF的请求,JSF实现都必须得到一个当前web应用的Lifecycle实现,并且调用它上面的execute()和render()方法来执行请求处理生命周期。

Lifecycle实例调用相应的处理逻辑来实现“请求处理生命周期”每个阶段要求的功能,各阶段的功能请参见2.2“StandardRequestProcessingLifecyclePhases”。

 

publicvoidexecute(FacesContextcontext)throwsFacesException;

publicvoidrender(FacesContextcontext)throwsFacesException;

 

execute()方法执行各个阶段直到RenderResponse,但不包括RenderResponse阶段。

render()方法执行RenderResponse阶段。

这个分开职责的方式使在基于portlet环境的JSF处理变得容易。

在每一个阶段处理完毕,注册的PhaseListener实例将被触发。

每个阶段一般都处理如下:

■从注册的PhaseListener实例集合里,选出一个关联到当前阶段PhaseListener。

这里“关联”指的是PhaseListener的方法返回当前阶段的phaseId,或者返回特定的值PhaseId.ANY_PHASE。

■按监听器的注册顺序调用关联监听器PhaseListener的beforePhase()方法。

■如果如没有监听器FacesContext.renderResponse()或FacesContext.responseComplete()方法,则执行本阶段要求的相关功能。

■按照监听器注册的相反顺序调用关联监听器PhaseListener的afterPhase()方法。

■如果在处理当前请求的时候调用了FacesContext.responseComplete()方法,或者我们已完成RenderResponse阶段,则请求处理生命周期的后续阶段都将不再执行。

■如果在处理当前请求的时候调用了FacesContext.renderResponse()方法,并且我们没有执行“请求处理生命周期”的RenderResponse阶段,则要保证接下去执行RenderResponse阶段。

publicvoidaddPhaseListener(PhaseListenerlistener);

publicvoidremovePhaseListener(PhaseListenerlistener);

这些方法用来注册在“请求处理生命周期”各个标准阶段被处理前或者处理后的PhaseListener监听器。

Webapp的作者可能使用应用配置文件的phase-listener元素注册PhaseListener监听器。

 

11.2PhaseEvent

这个类代表了“请求处理生命周期”各个具体阶段的开始和结束,并传递封装了reuqest信息的FacesContext实例到它的构造器中。

publicPhaseEvent(FacesContextcontext,PhaseIdphaseId,Lifecyclelifecycle);

构造一个体现“请求处理生命周期”各个具体执行阶段的PhaseEvent实例,并传递封装了reuqest信息的FacesContext实例。

Lifecycle实例必须是处理当前请求的FacesServlet对应的lifecycle,它将作为当前事件的事件源。

 

publicFacesContextgetFacesContext();

publicPhaseIdgetPhaseId();

返回当前事件实例的相关属性。

调用getSource()(从基类EventObject继承过来)方法将得到lifecycle实例。

11.3PhaseListener

如果希望得到“请求处理生命周期”各个具体阶段的开始或者结束通知,则需要实现这个接口。

PhaseListener的实现类必须是线程安全的。

publicPhaseIdgetPhaseId();

这个方法用来指出PhaseListener实例希望得到“请求处理生命周期”哪个阶段的通知。

如果返回PhaseId.ANY_PHASE,则这个监听器将得到每个阶段的通知。

 

publicvoidbeforePhase(PhaseEventevent);

publicvoidafterPhase(PhaseEventevent);

beforePhase()方法将在各个具体阶段的标准处理被执行前调用,但afterPhase()方法则在每个阶段的标准处理完成后被调用。

JSF实现必须保证如果beforePhase()方法被调用,则相应的afterPhase()方法也必须被调用,而不管在生命周期各个阶段的实际执行过程中是否抛出异常。

例如,有三个PhaseListeners分别以下面的顺序注册到生命周其中:

A,B和C。

A.beforePhase()方法被调用,并且执行成功。

B.beforePhase()方法被调用,但抛出一个异常。

任何在beforePhase()方法里抛出的异常都必须被捕捉和记录。

这个例子中,C.beforePhase()方法必须不能被调用。

然后执行再实现的生命周期阶段。

任何实际阶段执行期间所抛出的异常都不能被捕求。

当生命周期阶段由于异常或者正常结束时,监听器的afterPhase()方法必须以beforePhase()方法相反的顺序被调用。

由于C.beforePhase()方法没有被调用,因此C.afterPhase()方法也不应该被调用。

由于B.beforePhase方法没有被成功的执行,因此B.afterPhase()不应该被调用。

A.afterPhase()方法必须被调用。

在监听器的afterPhase()方法里抛出的任何异常都必须被捕捉和记录。

 

PhaseListener实现可能会通过以下的几个途径来影响剩余请求处理生命周期:

■调用当前请求的FacesContext实例上的renderResponse()方法将引起控制直接进入“请求处理生命周期”的RenderResponse阶段,一旦当前阶段完成。

■调用当前请求的FacesContext实例上的responseComplete()方法,则一旦当前阶段完成就结束请求处理生命周期。

 

11.4LifecycleFactory

对于每一个运行于servlet或者portlet容器里的基于JSF的web应用,都必须有一个有效的单实例javax.faces.lifecycle.LifecycleFactory对象。

这个类主要是被JSF实现所使用—应用不需要直接调用它。

工厂实例可以被JSF实现或者应用通过调用下面的代码得到:

LifecycleFactoryfactory=(LifecycleFactory)FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);

 

LifecycleFactory实现类支持下列的方法:

publicvoidaddLifecycle(StringlifecycleId,Lifecyclelifecycle);

根据lifecycleId注册一个新的lifecycle实现,并且使它能够通过getLifecycle()方法被当前web应用后续的生命期所得到。

 

publicLifecyclegetLifecycle(StringlifecycleId);

LifecycleFactory实现类提供这个方法来创建(如果需要)并返回一个Lifecycle实例。

所有相同的lifecycleId的方法调用都将返回相同的lifecycle实例,返回的lifecycle实例必须是线程安全的。

每一个JSF实现都必须为默认的lifecycleId提供一个Lifecycle实例,默认的lifecycleId通过字符串常量LifecycleFactory.DEFAULT_LIFECYCLE来指定。

对于高级用户,JSF实现可以提供附加的lifecycle实例,并用唯一的lifecycleId为它命名。

 

publicIteratorgetLifecycleIds();

这个方法返回这个工厂所支持的lifecycleId迭代器。

返回的迭代器中必须包含LifecycleFactory.DEFAULT_LIFECYCLE指定的值。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1