org.myapp.html net.java.dev.weblets.packaged.PackagedWeblet 1.0 package org.myap" />
龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

基于AJAX和JSF打造丰富的互联网组件之Weblets篇(1)(2)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
列表2:使用1.0版本控制的Weblets配置文件以便提高软件生效效率 http://weblets.dev.java.net/config " > org.myapp.html net.java.dev.weblets.packaged.PackagedWeblet 1.0 package org.myap
列表2:使用1.0版本控制的Weblets配置文件以便提高软件生效效率


http://weblets.dev.java.net/config" >

org.myapp.html
net.java.dev.weblets.packaged.PackagedWeblet
1.0

package
org.myapp.faces.renderer.html.resources



org.myapp.html
/myapp/*

我们的组件库把资源打包到org.myapp.faces.renderer.html.resources中,并且通过使用默认的URL映射(/myresources/*)使其可用于浏览器中。

PackagedWeblet是一个内置Weblet实现,可以使用ClassLoader从一个特定的Java包中读它并且把相应的结果“流回”到浏览器端。包初始化参数告诉PackagedWeblet,当实现Weblet托管的资源请求时,应该把哪一个Java包作为根使用。

五、Weblet版本控制

Weblets还为组件库的版本控制提供内置的支持。这用于允许浏览器在可能的情况下缓存打包的资源(例如myScript.js),从而阻止不必要的与Web服务器之间的来回通讯。

在每次浏览器生成页面时,它都确保所有的为该页面所用的资源可以使用。在该页面的初始生成期间,通过从Web服务器下载一个新的副本,浏览器用每一个资源URL的内容填充它的缓存。当它这样做时,浏览器从响应信息头部记下Last-Modified和Expires时间戳。如果当前时间比Expires时间戳还晚,那么被缓冲的内容已经到期。

在下一次生成这一页面时,浏览器检查是否本地缓冲资源已经过期。如果它没有过期,则重用本地缓冲的副本。否则,将向Web服务器发出一种新的请求,包括在If-Modified-Since请求头中的Last-Modified信息。通过指示浏览器缓存尚待更新,或者通过使用响应头中的更新的Last-Modified和Expires时间戳把新的资源内容“流回”到浏览器,Web服务器作出响应。

Weblets使用版本控制机制来利用浏览器缓存行为,这样,打包的资源就可以被下载并且被尽可能有效地缓冲。当缓存被“倒空”或当组件库在Web服务器端已经升级时,浏览器仅仅需要检查新的更新即可。

列表2说明了Weblets版本控制情况―通过把一个1.0版本添加到我们的org.myapp.html Weblet中。

通过指定一个Weblet版本,你可以指示被打包的资源不会发生改变,直到版本号发生改变为止。因此,版本号作为在运行时刻由WebletsViewHandler(例如,/myresources$1.0/myScript.js)决定的资源URL的一部分被包括在内。当WebletContainer服务这一请求时,它从URL中提取版本号并且确定资源应该被缓冲并且从未到期。一旦一个新版本的组件库被发布到Web应用程序,在运行时刻由WebletsViewHandler创建的资源URL(例如,/myresources$2.0/myScript.js)就会改变,这样浏览器中的myScript.js的缓冲副本版本1.0不再有效,因为URL已经发生变化。

在开发期间,被打包资源的内容可能经常发生变化,所以,使浏览器保持回检以便使Web服务器检测最新的资源URL目录是非常重要的。默认情况下,每当生成主Web页面(且Weblet版本被从weblets-config.xml中忽略时)时,即进行这种检查。

作为选择,Weblet配置允许组件创作者把-SNAPSHOT添加到版本号上。例如,1.0-SNAPSHOT(见下面的代码)说明这个文件正处于开发中。


http://weblets.dev.java.net/config" >

org.myapp.html
net.java.dev.weblets.packaged.PackagedWeblet
1.0-SNAPSHOT
...

...

安全性

当从一个JAR中服务打包资源时,特别注意一定不要使Java类文件或另外的敏感信息为URL所存取。在桌面Java应用程序中,资源文件经常存储在一个子包“resources”中,它位于使用资源文件的Java实现类的下面。同样的策略也适于在JSF组件库中打包的资源,并且还具有安全方面的优点―可以确保仅有资源文件可为URL所存取。所有另外的JAR文件内容,包括Java实现类,都不是URL可存取的,因为“resources”包和任何“resources”的子包中都不存在Java类。

Weblets协议

在讨论了如何配置Weblets后,现在我们来看一下如何在我们的生成器中引用由Weblet所定义的资源。这个由Weblet合同所定义的语法用于返回一个到JSF页面的适当的URL,如下所示:

在此,prefix指示这是一种Weblet托管的资源,而且它的后面即跟着Weblet名字和要求的资源。

以前,在我们的Renderer类中,我们把URL /myresources/myScript.js作为一个参数传递到ViewHandler的getResourceURL()方法。在下面的示例代码中,我们通过使用Weblet协议也可以实现这一功能。

ViewHandler handler = context.getApplication().getViewHandler();
String resourceURL = handler.getResourceURL(context, "weblet://org.myapp.html/myScript.js");
out.startElement("script", null);
out.writeAttribute("type", "text/javascript", null);
out.writeAttribute("src", resourceURL, null);
out.endElement("script");

这种类似Weblet协议的语法方便使用而且也很容易理解。这种语法以weblet://开始,后面跟着Weblet名,例如org.myapp.html,最后跟着路径信息或资源文件,例如/myScript.js。注意,URL映射和版本号都没有包括到Weblet资源语法中。Weblet URL映射和版本号由WebletsViewHandler所使用来创建一种该Weblet将会服务的资源URL。

当组件创作者没有使用Weblets时,他不会使用weblet://资源路径语法并且将发行一个独立的可安装的zip。当组件创作者使用Weblets时,他开始在生成器中使用weblet://资源路径语法,并且把这些资源包括到JAR中。实际上,在同一个组件库中的相同版本的资源中混合使用这些方法并无多大益处。

六、在JSF应用程序中使用Weblets

为了帮助Web开发者简化安装,组件创作者应该为它们的组件库选择一个缺省的URL映射。组件创作者不需要把任何Weblet特定的配置添加到web.xml文件,因为WebletsPhaseListener能够被自动激活以服务于针对Weblet托管资源的输入请求。

七、小结

作为一个新的开源工程,Weblets为Web客户端和JSF组件开发社区提供一种“事实上”通用的和可配置的资源加载工具。这种工具的主要优点在于,它能够简化JSF组件及其资源的打包,并用最小开支来安装和建立针对特定Web应用程序工程的JSF组件库。

总之,本文探讨了一种打包JSF组件资源的新方式。现在,通过包括一个合适的weblets-config.xml文件并使用weblet://协议风格的语法来引用Weblet托管的资源,你应该能够在你自己的组件库中利用Weblets。

在本系列的下一篇中,我们将讨论如何使用AJAX和Weblets技术来设计JSF组件。

(责任编辑:铭铭 mingming_ky@126.com TEL:(010)68476636)
精彩图集

赞助商链接