JSF规范(八)

9 篇文章 0 订阅

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

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

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

11Lifecycle Management

在第二章 “Request Processing Lifecycle,” 里,描述了“请求处理生命周期”里每个阶段所要具备的功能。在本章描述了JSF实现用来管理、执行生命周期的标准API。这些类及接口都是javax.faces.lifecycle包的一部分。页面的作者,组件编写者及应用开发者通常都不需要关心生命周期的管理API它们主要是被工具提供商及JSF实现者所关注。

 

11.1 Lifecycle

对于当前web应用接收到的每一个指向JSF的请求,JSF实现都必须得到一个当前web应用的Lifecycle实现,并且调用它上面的execute()render()方法来执行请求处理生命周期。Lifecycle实例调用相应的处理逻辑来实现“请求处理生命周期”每个阶段要求的功能,各阶段的功能请参见2.2 “Standard Request Processing Lifecycle Phases”

 

public void execute(FacesContext context) throws FacesException;

public void render(FacesContext context) throws FacesException;

 

execute()方法执行各个阶段直到Render Response,但不包括Render Response阶段。render()方法执行Render Response 阶段。这个分开职责的方式使在基于portlet环境的JSF处理变得容易。在每一个阶段处理完毕,注册的PhaseListener实例将被触发。每个阶段一般都处理如下:

从注册的PhaseListener实例集合里,选出一个关联到当前阶段PhaseListener这里“关联”指的是PhaseListener的方法返回当前阶段的phaseId,或者返回特定的值PhaseId.ANY_PHASE

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

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

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

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

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

public void addPhaseListener(PhaseListener listener);

public void removePhaseListener(PhaseListener listener);

这些方法用来注册在“请求处理生命周期”各个标准阶段被处理前或者处理后的PhaseListener监听器。Webapp的作者可能使用应用配置文件的phase-listener元素注册PhaseListener监听器。

 

11.2 PhaseEvent

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

public PhaseEvent(FacesContext context, PhaseId phaseId, Lifecycle lifecycle);

构造一个体现“请求处理生命周期”各个具体执行阶段的PhaseEvent 实例,并传递封装了reuqest信息的FacesContext实例。Lifecycle实例必须是处理当前请求的FacesServlet对应的lifecycle,它将作为当前事件的事件源。

 

public FacesContext getFacesContext();

public PhaseId getPhaseId();

返回当前事件实例的相关属性。调用getSource()(从基类EventObject继承过来)方法将得到lifecycle实例。

11.3 PhaseListener

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

public PhaseId getPhaseId();

这个方法用来指出PhaseListener 实例希望得到“请求处理生命周期”哪个阶段的通知。如果返回PhaseId.ANY_PHASE,则这个监听器将得到每个阶段的通知。

 

public void beforePhase(PhaseEvent event);

public void afterPhase(PhaseEvent event);

beforePhase()方法将在各个具体阶段的标准处理被执行前调用,但afterPhase()方法则在每个阶段的标准处理完成后被调用。JSF实现必须保证如果beforePhase()方法被调用,则相应的afterPhase()方法也必须被调用,而不管在生命周期各个阶段的实际执行过程中是否抛出异常。例如,有三个PhaseListeners分别以下面的顺序注册到生命周其中:A, BCA.beforePhase()方法被调用,并且执行成功。B.beforePhase()方法被调用,但抛出一个异常。任何在beforePhase()方法里抛出的异常都必须被捕捉和记录。这个例子中,C.beforePhase()方法必须不能被调用。然后执行再实现的生命周期阶段。任何实际阶段执行期间所抛出的异常都不能被捕求。当生命周期阶段由于异常或者正常结束时,监听器的afterPhase()方法必须以beforePhase()方法相反的顺序被调用。由于C.beforePhase()方法没有被调用,因此C.afterPhase()方法也不应该被调用。由于B.beforePhase方法没有被成功的执行,因此B.afterPhase()不应该被调用。A.afterPhase()方法必须被调用。在监听器的afterPhase()方法里抛出的任何异常都必须被捕捉和记录。

 

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

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

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

 

11.4 LifecycleFactory

对于每一个运行于servlet或者portlet容器里的基于JSFweb应用,都必须有一个有效的单实例javax.faces.lifecycle.LifecycleFactory对象。这个类主要是被JSF实现所使用应用不需要直接调用它。工厂实例可以被JSF实现或者应用通过调用下面的代码得到:

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

 

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

public void addLifecycle(String lifecycleId, Lifecycle lifecycle);

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

 

public Lifecycle getLifecycle(String lifecycleId);

LifecycleFactory实现类提供这个方法来创建(如果需要)并返回一个Lifecycle实例。所有相同的lifecycleId的方法调用都将返回相同的lifecycle实例,返回的lifecycle实例必须是线程安全的。

每一个JSF实现都必须为默认的lifecycleId提供一个Lifecycle实例,默认的lifecycleId通过字符串常量LifecycleFactory.DEFAULT_LIFECYCLE来指定。对于高级用户,JSF实现可以提供附加的lifecycle实例,并用唯一的lifecycleId为它命名。

 

public Iterator<String> getLifecycleIds();

这个方法返回这个工厂所支持的lifecycleId迭代器。返回的迭代器中必须包含LifecycleFactory.DEFAULT_LIFECYCLE 指定的值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值