JSF规范八.docx
《JSF规范八.docx》由会员分享,可在线阅读,更多相关《JSF规范八.docx(5页珍藏版)》请在冰豆网上搜索。
![JSF规范八.docx](https://file1.bdocx.com/fileroot1/2023-8/13/fcc407d4-d894-4f11-a570-86f1ccff2597/fcc407d4-d894-4f11-a570-86f1ccff25971.gif)
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指定的值。