`
zuiyanwangyue
  • 浏览: 164456 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类
最新评论

ZK工作原理启动篇(二)WebManager的职责

阅读更多

其实在ZK的早期版本中是没有WebManager这个类的,它负责的功能都在DHtmlLayoutServlet中,后来许是开发者觉得这样DHtmlLayoutServlet的责任就太重了,所以按照每个类只做一件事情的思想把有些功能转移到了WebManager中,这也使得ZK软件本身的层次更加清晰。正如ZK文档中所描述的WebManager是Web服务器和ZK之间的桥梁,每一个使用zk的web应用程序都有一个独立且唯一的WebManager实例。WebManager初始化(通过构造方法)

WebManager(ServletContext ctx, String updateURI){……}

主要完成以下工作:

第一、从metainfo/zk/config.xml(位于ZK的发行包中)和WEB-INF/zk.xml中加载配置,config.xml的源码如下

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<config-name>zk</config-name><!-- used to resolve dependency -->
	<version>
		<version-class>org.zkoss.zk.Version</version-class>
		<version-uid>3.5.0</version-uid>
	</version>

	<!-- Note: zscript-config is applied to the whole system. Not just this language.
	-->
	<zscript-config>
		<language-name>Java</language-name>
		<interpreter-class>org.zkoss.zk.scripting.bsh.BSHInterpreter</interpreter-class>
	</zscript-config>

	<device-config>
		<device-type>ajax</device-type>
		<device-class>org.zkoss.zk.device.AjaxDevice</device-class>
		<unavailable-message><![CDATA[
<p style="color:red">Sorry, JavaScript must be enabled.<br/>Change your browser options, then <a href="">try again</a>.</p>
		]]></unavailable-message>
	</device-config>
</config>

它配置的信息包括版本、脚本语言解释器以及设备,可以看出Java是zk默认的脚本语言,除此之外通过引入解释器这一概念,zk还支持Javascript、Groovy及Ruby语言等,在此不做详细介绍;Device描述了客户端的设备类型,其中使用Ajax的HTML浏览器被称作AjaxDevice,XML输出被称作org.zkoss.zml.device.XmlDevice。

第二、往Labels中注册一个新的LabelLocator并设置变量解析器为ServletLabelResovler。

Labels.register(new ServletLabelLocator(_ctx));
Labels.setVariableResolver(new ServletLabelResovler())

其中,VariableResolver用于指定表达式(org.zkoss.xel.Expression)在计算时解析变量引用的方式;Labels是用于访问标签(Label)的帮助类,一个Label就是一个与Local有关的字符串,被存放在类似i3-label*.properties的文件中,一旦一个LabelLocator被注册到Labels中,LabelLoader就会通过调用locate(java.util.Locale)去定位任何额外的资源,例如下面是ServletLabelLocator中的部分源码:

//-- LabelLocator --//
public URL locate(Locale locale) throws IOException {
	return _ctx.getResource("/WEB-INF/"+getI3LabelName(locale));
}
/** Returns the filename of i3-label.properties. */
private static final String getI3LabelName(Locale locale) {
	return locale.equals(Locale.ENGLISH) ?
			"i3-label.properties": "i3-label_" + locale + ".properties";
}

可以看出ServletLabelLocator主要用于加载WEB-INF/下所有与i3-label相关的property属性文件,

和我们一般的本地化策略有所不同,假如属性文件中的信息是中文这里没必要通过native2ascii命令将中文转换为ascii码,例如下面分别是zkdemo中WEB-INF/下i3-label.properties与i3-label_zh_CN.properties的源码

#--------------------#
# Label for zkdemo #
#--------------------#

username=Username
password=Password

 

#--------------------#
# Label for zkdemo #
#--------------------#

username=用户
password=密码

第三、创建一个WebApp实例(默认为org.zkoss.zk.ui.http.SimpleWebApp)并初始化

((WebAppCtrl)_wapp).init(_ctx, config);

第四、初始化ClassWebResource并加载适当的Extendlet(作为ClassWebResource的插件用于处理特殊的内容)。

_cwr = ClassWebResource.getInstance(_ctx, _updateURI);
_cwr.setCompress(new String[] {"js", "css", "html", "xml"});
_ctx.setAttribute(ATTR_WEB_MANAGER, this);
_cwr.setDebugJS(config.isDebugJS());
//Register resource processors for each extension
//FUTURE: Extendlet can be specified in zk.xml
//Note: getAll loads config.xml, which must be processed before zk.xml
ZumlExtendlet extlet = null;
for (Iterator it = LanguageDefinition.getAll().iterator();it.hasNext();) {
	final LanguageDefinition langdef = (LanguageDefinition)it.next();
	final List exts = langdef.getExtensions();
	if (!exts.isEmpty()) {
		if (extlet == null)
			extlet = new ZumlExtendlet();
		_cwr.addExtendlet((String)exts.get(0), extlet);
		//Add to the first extension only (the main one)
	}
}

第五、删除所有与ServletContext相关的WebManagerActivationListener并对要删除的每个WebManagerActivationListener调用didActivate(WebManager webman)方法。

((WebManagerActivationListener)it.next()).didActivate(this);

附:WebManager所持有重要私有属性  

/** Map(ServletContext, List(WebManagerActivationListener)). */
private static final Map _actListeners = new HashMap();
private final ServletContext _ctx;
private final WebApp _wapp;
private final String _updateURI;
private final ClassWebResource _cwr;
分享到:
评论

相关推荐

    zk入门.web框架

    zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架 zk web框架

    ZK Ajax MVC原理

    详细讲述ZK MVC实现原理的文档,中文版,让你深入理解ZK的工作原理

    zookeeper工作原理 小总结.doc

    zookeeper工作原理 ,选主流程,同步流程,leader follower的工作流程 小总结

    12.2.2 zk中zab的工作原理.md

    12.2.2 zk中zab的工作原理

    搭建ZK Ajax Web应用开发环境

    myEclipse上搭建ZK Ajax Web应用开发环境

    ZK分布式一致性原理与实践

    从PAXOS到ZK分布式一致性原理与实践 从PAXOS到ZK分布式一致性原理与实践

    关于zk框架的基于java的web学生管理系统开发

    现在zk是一个刚刚兴起的框架,网络上关于zk框架的资源还是很少的,我学习这个碰到了不少的问题,不过还是慢慢的解决了,上传我的运用zk框架基于java的一个web学生管理系统开发给大家参考,希望能对学习zk框架的朋友...

    计算机原理硬件实验二(使用8259中断实现定时/计数器实验)(北理工)

    1) 掌握定时/计数器8254的基本工作原理和编程方法; 2) 利用TPC-ZK-II实验板上的 8254向中断源发出中断申请,其中断请求用IRQ3 (系统总线区的IRQ); 3) 了解七段数码管显示原理,掌握其显示接口技术,了解数字...

    hbase zk异常启动不了.docx

    hbase zk异常启动不了

    ZK ajax 利用ZK框架设计你的web应用程序

    利用ZK框架设计的web应用程序具备丰富的胖客户端特性和简单的设计模型.ZK包括一个基于AJAX可自动进行交互式操作的事件驱动引擎和一套兼容XUL的UI组件.利用直观的事件驱动模型,你可以用具有XUL特性的组件来表示你的...

    启动zk的脚本.sh

    集群启动zk的脚本,只需要改集群参数就可以了集群启动zk的脚本,只需要改集群参数就可以了集群启动zk的脚本,只需要改集群参数就可以了

    zkstudio_2.0.0_indigo JAVA Web前端框架

    ZK是一套以 AJAX/XUL/Java 为基础的网页应用程式开发框架,用于丰富网页应用程式的使用接口。最大的好处是,在设计AJAX网络应用程式时,轻松简便的操作就像设计桌面程式一样。 ZK包含了一个以AJAX为基础、事件驱动...

    ZK型低压真空断路器的原理与故障处理

    以当前煤矿井下广泛应用的隔爆型低压真空馈电开关流行配置的一种电磁操动机构低压交流真空断路器为例,对ZK2-500/1.14-9型断路器的结构、组成、工作原理进行了全面系统阐述。结合常见故障进行分析处理,并研发了专用...

    web界面设计和开发指南(基于ZK技术)

    1、本指南描述了如何设计友好可用的web界面,并介绍如何基于ZK技术实现界面。遵循本指南可使得基于 ZK技术的web应用界面达到美观、规范、一致,并符合可用、无障碍原则。2、提供一个zk换肤演示Demo,供ZK开发的朋友...

    zk-manager.zip

    zk管理工具代码

    zk框架zk7api

    zk后台api很全的,对于学习ZK很有用的。

    ZK开发手册(HTML版)

    有了ZK,您可以利用XUL和XHTML的丰富特性来呈现您的Web 应用,操纵它们来处理因用户活动而引发的事件,就像在桌面应用程序中那样。不同于大多数其它框架,就ZK而言,AJAX是一种幕后(behind- the-scene)技术,组件...

    ZK框架_J2EE技术(有胜于SSH的WEB与手机框架)

    ZK框架_J2EE技术(有胜于SSH的WEB与手机框架) ZK框架_J2EE技术(有胜于SSH的WEB与手机框架) ZK框架_J2EE技术(有胜于SSH的WEB与手机框架)

    ZK开发手册 ZK开发手册

    ZK开发手册 ZK开发手册 ZK开发手册 ZK开发手册 ZK开发手册

    ZK开发手册(中文教程)

    ZK开发手册(Developer's Guide)的中文翻译版一部分已经公开在zk-devguide 开发手册全部共有14章,超过200页,信息非常齐全: 第1到3章是ZK的简介以及基础构造的说明, 第4,5章介绍组件的周期以及如何处理事件....

Global site tag (gtag.js) - Google Analytics