`
zuiyanwangyue
  • 浏览: 167152 次
  • 性别: 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 是一个基于 Java 的轻量级Web框架,专门用于构建富客户端的Web应用程序。它提供了丰富的用户界面组件和事件处理机制,使得开发者能够轻松创建交互式的Web应用。本篇文章将深入探讨ZK框架的基本概念、开发环境的...

    zookeeper工作原理 小总结.doc

    #### 二、ZooKeeper的工作原理 **2.1 原子广播与ZAB协议** ZooKeeper的核心技术是原子广播(Atomic Broadcast),它确保所有Server之间数据的一致性和同步性。这一机制的实现依赖于ZAB协议,ZAB协议有两大模式: ...

    zk-manager.zip

    本项目"zk-manager.zip"包含了一个完整的ZK Manager源代码,通过解压并分析这个压缩包,我们可以深入理解其工作原理和实现细节,这对于开发和维护Zookeeper集群至关重要。 首先,ZK Manager的核心功能包括: 1. ...

    12.2.2 zk中zab的工作原理.md

    12.2.2 zk中zab的工作原理

    ZK安装 ZK入门 开发 讲解 共3个pdf

    这份文档将带你逐步了解ZK的基本概念和工作原理,包括ZK组件的使用、事件处理机制、数据绑定以及Ajax通信等。通过快速启动示例,你可以快速学会如何创建一个简单的ZK应用,并且理解ZK如何简化Web前端开发。 最后,...

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

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

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

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

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

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

    zk整合bootstrap

    标题“zk整合bootstrap”指的是将ZK框架与Bootstrap前端UI库进行集成,以创建更美观、响应式的Web应用。ZK是一个Java开发的轻量级、基于组件的服务器端框架,专注于提供丰富的用户界面和交互体验。而Bootstrap是...

    zk框架demo

    在本文中,我们将深入探讨ZK框架的核心特性、工作原理以及如何使用ZK进行Web应用开发。 **一、ZK框架的核心特性** 1. **事件驱动的组件模型**:ZK框架采用事件驱动的组件模型,使得Web界面的交互更加灵活。开发者...

    启动zk的脚本.sh

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

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

    《ZK分布式一致性原理与实践》是一本深入探讨分布式一致性解决方案的著作,主要围绕PAXOS算法和Zookeeper(ZK)系统展开。在分布式计算领域,一致性是保证系统可靠性和正确性的关键因素,而Zookeeper作为Apache软件...

    zk 6 学习资料

    这本书籍可能涵盖了ZK 6的基础知识,包括ZK的工作原理、基本组件的使用、事件处理机制以及数据绑定等,适合初学者入门。 通过这些文档,无论是初学者还是有经验的开发者,都能系统地学习和提升ZK 6的技能。了解并...

    zkstudio_2.0.0_indigo JAVA Web前端框架

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

    zk studio eclipse plugin

    ZK框架是一种基于组件模型的Java Web应用框架,它简化了用户界面的构建和维护,提供了丰富的客户端组件和事件处理机制,同时支持服务器端的数据绑定。ZK Studio插件则将ZK的开发功能整合到了Eclipse IDE中,极大地...

Global site tag (gtag.js) - Google Analytics