JSF规范(三)

9 篇文章 0 订阅

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

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

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

2.3 Common Event Processing

 

JSF完整的事件处理模型请参考3.4 Event and Listener Model”节.

 

就像在2.2Standard Request Processing Lifecycle Phases”节所描述的那样,一些可能发生的被加入队列的事件(通过调用UIComponent实例的queueEvent()方法,或者FacesEvent实例的queue()方法),必须广播到感兴趣的事件队列中。广播将在当前组件树根实例UIViewRoot的相应生命周期管理方法中执行((processDecodes(),processValidators(), processUpdates(), processApplication())

 

对于每一个被队列的事件,必须通过调用事件源UIComponent上的broadcast()方法来广播事件到所有注册的感兴趣事件队列中,然后从事件队列里移除事件。参考API  UIComponent.broadcast() 方法的API文档来得到更详细的功能需求。

 

当然,在处理“请求处理生命周期”的当前阶段,事件监听器可能会添加新的事件到事件队列中。因此必须在完成原始的事件广播及生命周期管理方法返回前,根据这些事件在队列里的顺序进行广播。

 

2.4 Common Application Activities

 

下面的各个子章节描述了采用JSF来处理请求和响应的应用程序必须保证的通用活动。它们的用法在2.1 Request Processing Lifecycle Scenarios”节里描述,每个请求处理生命周期假定的活动都是相关的。

 

2.4.1 Acquire Faces Object References

 

这个阶段只有在一个被处理的请求不是从先前的响应中提交上来的时候才是需要的。因此不需要初始化JFS请求(Faces Request)生成JSF响应(Faces Response)的过程。为了生成JSF响应,应用首先必须取到JSF实现提供的一些对象引用。描述如下。

2.4.1.1 Acquire and Configure Lifecycle Reference

 

就像在11.1 Lifecycle”节描述的那样,JSF实现必须提供javax.faces.lifecycle.Lifecycle对象实例,这个实例用来管理请求处理的生命周期。一个应用可以通过便捷的方式来获取这个对象的引用,如下:

 

LifecycleFactory lFactory = (LifecycleFactory)

FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);

Lifecycle lifecycle =

lFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);

 

当然你也可以通过指定你所使用的JSF实现所支持的不同生命周期ID(lifecycle identifier)作为getLifecycle()方法的参数来取得lifecycle实例。然而使用非默认的生命周期ID(lifecycle identifier),会影响程序的可移植性,不易于移植的其他的JSF实现中。

 

2.4.1.2 Acquire and Configure FacesContext Reference

 

6.1 FacesContext”节所描述的那样,JSF实现必须提供javax.faces.context.FacesContext实例来存放每个请求和响应的状态信息。如果一个应用处理非JSF请求(Non-Faces Request),但需要生成JSF响应(Faces Response),则必须通过如下的方式取得一个FacesContext实例

 

FacesContextFactory fcFactory = (FacesContextFactory)

FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);

FacesContext facesContext =fcFactory.getFacesContext(context, request, response,lifecycle);

 

这里context, request, response对象表现为应用环境的对应实例。例如, 基于servlet的应用,它们是当前请求的ServletContext, HttpServletRequest,HttpServletResponse实例。

 

2.4.2 Create And Configure A New View

JSF响应被创建或者应用程序决定它需要创建和配置一个新的最终输出视图时,它可能根据下面描述的步骤来设置这个将要被使用的视图。你必须从当前请求的FacesContext实例引用开始。

 

2.4.2.1 Create A New View

视图表现为由javax.faces.component.UIViewRoot为根的数据结构,并由在“请求处理生命周期”的Render Response阶段使用,依赖于ViewHandler的实现viewId决定ViewHandler提供了工厂方法来创建组件树。如下:

FacesContextFactory fcFactory = (FacesContextFactory)FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);

FacesContext facesContext =fcFactory.getFacesContext(context, request, response,lifecycle);

String viewId = ...identifier of the desired Tree...;

ViewHandler viewHandler = application.getViewHandler();

UIViewRoot view = viewHandler.createView(facesContext, viewId);

 

JSF实现提供的createView()方法至少应该返回包含一个UIViewRootUIViewRoot实例,并且该实例必须封闭实现相关的所必须的管理组件。可选的,一个JSF实现的ViewHandler可以支持自动组装附加的组件到返回的UIViewRoot实例中,组装可以基于一些外部的元数据描述文件。

 

ViewHandler.createView()方法的调用者必须将得到的UIViewRoot设置到FacesContext对象中。应用必须确保可以安全的丢失保存在UIViewRoot对象中的任何状态信息。

 

3. The default ViewHandler implementation performs a RequestDispatcher.forward call to the web

application resource that will actually perform the rendering, so it expects the tree identifier to be the context-relative path (starting with a / character) of the web application resource

 

2.4.2.2 Configure the Desired RenderKit

前一节所描述的由ViewHandler提供的UIViewRoot实现,必须利用JSF实现提供的默认javax.faces.render.RenderKit实现进行配置,在8.1 “RenderKit”节介绍。为了让你的应用更具可移植性,本规范将在后面描述RenderKit必须支持的标准组件及Renders

 

当然,根据需要,RenderKit能够用JSF实现(或者add-on libaray)提供的不同的 RenderKit实例进行替换。通过标准的RenderKitFactory可以取到一个RenderKit引用,并且将这个引用设置到先前创建的UIViewRoot实例中。 如下:

String renderKitId = ... identifier of desired RenderKit ...;

RenderKitFactory rkFactory = (RenderKitFactory)FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);

RenderKit renderKit = rkFactory.getRenderKit(renderKitId,facesContext);

view.setRenderKitId(renderKitId);

 

就如第八章所描述的那样,改变RenderKit就是改变执行实际的decodingencoding活动的一集Renders。因为组件它自己只保存了一个rendererType属性(一个具体Renderer的逻辑标识符),因此在它们支持相同的类型的Renderers时,可以很方便的在不同的RenderKits间切换。

 

默认的ViewHandler实现必须调用它自身的calculateRenderKitId()方法,并将结果设置到UIViewRootrenderKitId属性中。这就允许应用程序基于每个视图动态的切换RenderKits

 

2.4.2.3 Configure The View’s Components

在任何时候一个应用程序都可以从视图中添加或删除一个组件,或者更新已存在组件的属性。例如,一个新的FooComponent(实现UIComponent)组件能够作为UIViewRoot的子节点被添加到组件树中。如下:

 

FooComponent component = ...create a FooComponent instance...;

facesContext.getViewRoot().getChildren().add(component);

 

2.4.2.4 Store the new View in the FacesContext

一旦一个视图被创建和配置,必须调用当前请求的FacesContext实例的setViewRoot()方法,使该实例能够得到相关的ViewRoot

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值