基于AJAX和JSF打造丰富的互联网组件之Weblets篇(1)
在上一篇中,我们讨论了怎样在不牺牲Web开发者构建RIA效率的前提下使用JSF来满足新一代描述层开发的需要。我们讨论了JSF组件创作者如何利用AJAX和Mozilla XUL等技术来提供给Web开发者以丰富的交互的和可重用的组件。
为了在JSF开发中联合使用AJAX和Mozilla XUL技术,组件创建者必须提供这些技术所需要的任何资源文件(例如图象,式样表或脚本等)。为一个JSF组件库提供资源文件的标准方式是直接从Web应用程序根文件系统中提供服务。这些资源通常用一个档案文件(如一个ZIP文件)打包,并且独立于JSF组件库发行。
本篇将介绍一种新的开源工程Weblets(http://weblets.dev.java.net)。这个工程的目标是,为JSF组件开发者提供一种工具以便开发者可以直接从JAR中提取资源文件,而不是从Web应用程序根文件系统中提供相应的服务。不象使用定义在web.xml文件中的静态配置的URL映射的传统Web应用程序,它们需要一种基于现有的组件库JAR文件进行动态配置的URL映射。实质上,Weblets为开发者提供了一种非常容易的打包Web应用程序的方法―Web应用程序实现代码可以与其资源文件驻留在同一个Java JAR文件中。
一、资源装载
让我们假定,我们有一个JSF组件,它需要有一个JavaScript文件myScript.js服务于客户端。这个JavaScript文件为组件所用以实现与用户某种程度的丰富交互。传统情况下,这个JavaScript文件是由Web应用程序服务的―经由一个硬编码到JSF组件的实际的生成器代码中的相对路径确定。这样以来,需要Web开发者发布以独立文档文件形式交付和打包的其它相关资源。
值得注意的是,JSF HTML基本RenderKit并没有任何图象,式样,或脚本;因此,在Faces资源打包问题方面没有标准的解决方案。
下面的示例生成器代码展示了一种从Web应用程序根文件系统下提供一个JavaScript文件(/myresources/myScript.js)服务的可安装方法。
|
尽管这种可安装的方法方便了JSF组件作者,但是它也确实增加了Web开发者的安装负担―他们必须记住:每当把该组件库升级到一个新的版本时都要提取可安装的文档。因此,我们非常需要一种新的方法来把我们程序的其它资源打包到相同的包含Renderer类的JAR文件中,以便简化Web开发者使用我们的组件库进行发布的问题。
二、使用Weblets
这个开源Weblets工程的主要思想是,用一种通用的可扩展的方式解决资源打包问题,以便它可以被所有JSF组件创作者所利用,而同时把最小的安装任务交给Web开发者来完成。
其实,一个Weblet充当一个“调停人”的作用―它解释来自于客户端的请求,并且使用简短的Web URL从一个JAR文件中提供资源服务。不同于Servlet或Filter方式,一个Weblet可以在一个JAR内部进行注册和配置,这样以来组件库生成器、它们的资源文件还有Weblet配置文件(weblets-config.xml)都可以被打包到相同的JAR文件中。对所有的组件库来说,Weblet容器只能在Web应用程序配置文件(web.xml)中注册一次。当把组件库升级到新版本时,不需要独立地发布其它可安装程序。
值得注意的是,所有由Weblets所服务的资源都是内部资源,只能为生成器所使用。任何由应用程序所提供的资源(例如图像),都以组件属性值方式提供并且从根上下文中作为外部资源加载。
三、Weblet架构分析
尽管Weblets被设计由任何Web客户端所使用,但是,通过使用一种定制的ViewHandler和WebletsViewHandler,Weblets实现已经与JSF集成到一起,详见图1。在主JSF页面生成期间,WebletsViewHandler负责把Weblet特定的资源URL转换成实际的由浏览器使用以请求Weblet托管的资源的URL。
图1.Weblet架构高级视图
在收到为主页面生成的标注后,浏览器使用一个独立的请求下载其它各个资源。这其中的每个请求(下载一种Weblet托管的资源)被WebletsPhaseListener所拦截,这样以来,WebletContainer必须把Weblet托管的资源文件进行“流化”而从组件库JAR中导出。
WebletContainer的设计目的是,尽可能利用浏览器缓存。这样以来,通过最小化Weblet托管的资源文件的请求数量,从而可以大大提高整体数据生成性能。
为了确保灵活性和进行优化,并且避免与现有Web应用程序资源发生冲突,Web开发者可以配置Weblets以覆盖由组件作者所提供的任何缺省的设置。
四、把Weblets应用于组件库
Weblets是使用weblets-config.xml文件进行配置的,它必须存储在组件库JAR的/META-INF目录下。配置一个Weblet类似于配置一个Servlet或一个过滤器(Filter)。在weblets-config.xml文件中的每一个Weblet入口都有一个Weblet名字、实现类和初始化参数(见列表1)。Weblet映射把一个特别的URL模式与一个特定的Weblet名(例如,org.myapp.html)相关联。Weblet名和默认的URL模式定义该Weblet托管的资源的公共API。特别注意,在你的组件库的各个发行版本之间不应修改这些名称和URL模式以便实现向后兼容性。
列表1:Weblets配置文件weblets-config.xml
|






