基于AJAX和JSF打造丰富的互联网组件之Mabon篇(1)(2)
Mabon LifecyclePhase是所有生命周期阶段的基类。
•ApplyRequestValuesPhase,InvokeApplicationPhase和RenderResponsePhase类―既然你仅想取回数据而不想以任何方式修改组件层次或底层模型,那么你不需要包括Restore View,Process Validations和Update Model阶段。Mabon阶段执行类似于缺省的生命周期的操作,例如解码一个输入的请求,调用应用程序逻辑,并且生成响应。
•FacesLifecycleServlet类―这是一个可重用的servlet,它将初始化FacesContextFactory并且在它的第一次请求期间查找MabonLifecycle。它将创建FacesContext,然后调用作为MabonLifecycle的一部分的三个生命周期阶段。由Web应用程序所定义的Servlet映射将把Mabon请求直接转发到这个FacesLifecycleServlet。
•LifecycleFactoryImpl类―这个类的唯一目的是添加第二个生命周期―MabonLifecycle。
•MabonViewHandler类―在初始生成期间,一个定制的屏幕生成器必须提供一个到支持bean的路径―该bean可能被FacesLifecycleServlet拦截和使用,在InvokeApplicationPhase调用这个参考支持bean期间。通过使用Mabon协议,组件创作者可以从能够被生成到客户端的MabonViewHandler中得到一个唯一的路径。如果组件创作者使用ViewHandler.getResourceURL()方法的路径参数传递字符串(显示于代码示例1中),那么MabonViewHandler将返回显示于代码示例2中的可以被写向客户端的字符串。
代码示例1:Mabon协议:
|
代码示例2:Mabon评估Mabon协议后返回的字符串:
|
在一个AJAX请求期间,这个URL根据请求发送并且被FacesLifecycleServlet所拦截。
十一、Mabon:初始化请求
Mabon实现是特别为AJAX请求设计的并且使用JSON语法实现一种通讯通道。这种方案让使用托管bean的AJAX组件取数据并且与服务器进行通讯而不必经历一个完整的JSF生命周期。那么,它是如何工作的呢?在应用程序启动时,Mabon将把MabonLifecycle作为JSF LifecycleFactory上下文的一部分添加。
在起始请求时,Mabon仅被代理到基本的JSF实现,并且,如果需要的话,仅在生成器响应阶段是活动的。
在图3的序列图中,一个包含一个定制的AJAX组件的页面被执行。为了能够工作,这个AJAX组件必须从一个底层支持bean中获取数据。在encodeBegin()期间,该组件的AJAX生成器将使用Mabon协议(mabon:/)输出(写)引用该支持bean的一个目标URL。为了得到这个URL,生成器将调用ViewHandler上的getResourceURL()方法。它将传递一个匹配该方法(它负责为支持bean(例如,mabon:/managedBean.getSuggestions)绑定表达式)的字符串。在MabonViewHandler中的这个getResourceURL()方法将返回一个完整的路径:
/
十二、Mabon:数据取请求
在页面被生成到客户端后,它包含一个目标URL―指向AJAX组件取回数据所需要的支持bean(例如,/
一旦提交一个支持AJAX的组件,即创建一个新的XMLHttpRequest对象,它能够与服务器异步通讯以从托管bean中取回数据。这个请求被FacesLifecycleServlet所拦截,这将通过Mabon生命周期而不是默认的JSF生命周期实现路由请求。
当FacesLifecycleServlet拦截该请求时,通过顺序地调用每个Mabon生命周期阶段,开始执行请求处理。首先,你执行ApplyRequestValuesPhase,这将解码该请求并且得到托管bean参考和该请求的托管bean需要的方法参数。其次,你执行InvokeApplicationPhase―它将基于托管bean参考创建一个MethodBinding,并调用这个MethodBinding以传递任何参数,并且返回结果。第三,Render-ResponsePhase使用这个结果并把它写回到客户端。
十三、Mabon API
接下来的部分,我们将讨论一些可用的API以及如何在一个应用程序中进行Mabon注册。








