`

Zk中两个核心Servlet的区别

    博客分类:
  • ZK
阅读更多



zk中有两个核心Servlet,org.zkoss.zk.ui.http.DHtmlLayoutServlet和org.zkoss.zk.au.http.DHtmlUpdateServlet


zk的术语:DHtmlLayoutServlet称之为加载器,DHtmlUpdateServlet称之为异步更新引擎(The asynchronous update engine,又简称为AU engine)



在讨论这两个核心Servlet之前,先看一下zk请求的执行流,以帮助理解



 

执行流(详见)

  1. 当用户在浏览器中键入一个URL点击一个超链接时,一个请求便被送到了Web服务器,如果URI符合ZK的配置,ZK 加载器则援引担任这一要求 。

  2. ZK 加载器(ZK loader)加载指定的页面然后解释它,以据此创建和适的组件。

  3. 当解释完整个页面后,ZK 加载器(ZK loader)将结果送到一个HTML页面。然后这个HTML页面被送回浏览器和ZK客户端引擎(ZK Client Engine)一起。

  4. ZK客户端引擎(ZK Client Engine)坐落在浏览器,以监视由客户的活动触发的事件,例如挪动鼠标,或改变某个值。一旦监测到,它就通知ZK AU引擎通过发送一个ZK请求。

  5. 当从客户端引擎接到ZK请求后,如果有需要的话AU引擎就更新相应组件的内容。然后,AU引擎通过调用相关的事件处理程序(如果有的话)来通知应用程序。

  6. 如果应用程序选择改变组件的内容,添加或移动组件,AU引擎通过ZK响应(ZK responses)将更新后组件的新内容送至客户端引擎。

  7. 这些ZK响应实际上是一些命令,这些命令指示客户端引擎如何更新DOM树的内容。



仔细看完后,我们逐字分析,其实也不难理解其中的道理,但是官方doc有些东西是比较粗略的,

对于一个zk进阶类型的开发者来说,一些概念还是不够清晰,那么现在我们逐句分析


分析之前,需要说明的是:


在web.xml人为修改 zkLoader的serlvet-mapping让其处理au request,或者让auEngine的servlet-mapping处理符合zkLoader mapping的请求,或者非浏览器客户端,不再此讨论范围


1,我们看当用户在浏览器中键入一个URL或点击一个超链接时,这句话概括的不够全面和清晰,这里可以这么说:导致浏览器文档完全刷新的请求(不都是人,可能是定时器行为),均由ZkLoader处理,那么什么操作可以导致浏览器文档完全刷新呢?


  • 用户在地址栏内输入地址,回车
  • 用户点击a标签的超链接时,发送的url请求
  • 当用户执行一个AU request时,服务器端响应重定向状态码,导致浏览器重新请求重定向的url
  • 用户F5刷新或者点击浏览器的刷新按钮等
  • js改变浏览器地址栏地址,让浏览器重新请求新页面
  • 修改iframe或者frame src属性



2,ZK 加载器(ZK loader)加载指定的页面并解释它,初始化页面,创建组件,事件处理(见加载页面的生命周期



3,解释完页面后,ZK 加载器(ZK loader)将生成的html发送到客户端浏览器,html中包括js 客户端引擎


4,ZK客户端引擎(ZK Client Engine)坐落在浏览器,以监视由客户的活动触发的事件,例如挪动鼠标,或改变某个值。一旦监测到,它就发送一个ZK请求通知ZK AU引擎

   这里需要解释的是:ZK客户端引擎  其实就是js编写的脚本代码。监视客户端触发的事件这里我们主要讲一下,zk中的事件并不是所有的事件,有些是需要发送到服务器端,有些却不要。凡是通过Component.addEventListener或onXXX给组建注册的事件都会发送到服务器端,其他的事件都不会发送到服务器端。

一旦监测到,它就发送一个ZK请求通知ZK AU引擎。这句话里的通知其实是一些json格式的字符串命令

命令类似如下

 

dtid=zd_8c&cmd_0=onSelect&uuid_0=z_d__9

&data_0={"items":["z_d__b"],"reference":"z_d__b","clearFirst":true,"pageX":89,"pageY":141,"which":1,"x":83,"y":12}

 

其中

dt是desktop的缩写 ,完整为desktopid=zd_8c,zd_是固定格式

cmd_0是命令,当前命令是选择命令,

uuid_0是组建的id,在浏览器中可以看到的id,

剩余的是一些当前onSelect事件鼠标的位置

 

另外这句话隐含了一个重要的内容,实际上zk也是这么处理的:客户端引擎与服务器端AU引擎通信,而导致浏览器文档完全刷新的url请求与ZkLoader通信,需要注意的是这里没有用绝对的口吻说客户端引擎与服务器端通信全部是由事件触发的,只能说大部分,其中特殊的是,当ZkLoader响应给客户页面后,像图片,js动态创建的script src=“”,js创建的图片等等资源,浏览器会发生请求获得这些资源,这样的请求全部由AU Engine处理,ZkLoader仅负责导致浏览器文档完全刷新请求的响应另外一些AU request来自上传组件和动态多媒体请求(如Dynamic Image)等

 

下面是zk AU引擎的源代码,从第8行到71行,第8行if (withpi && pi.startsWith(ClassWebResource.PATH_PREFIX)) 判断是否是资源请求

而43行if(withpi)是判断一些特殊服务请求(上传组建和动态多媒体请求(如Dynamic Image))

73行//AU以下代码是为客户端事件服务的

 

 

protected
	void doGet(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {
		final String pi = Https.getThisPathInfo(request);
//		if (log.finerable()) log.finer("Path info: "+pi);

		final boolean withpi = pi != null && pi.length() != 0;
		if (withpi && pi.startsWith(ClassWebResource.PATH_PREFIX)) {
			//use HttpSession to avoid loading SerializableSession in GAE
			//and don't retrieve session if possible
			final ClassWebResource cwr = getClassWebResource();
			final HttpSession hsess =
				shallSession(cwr, pi) ? request.getSession(false): null;
			Object oldsess = null;
			if (hsess == null) {
				oldsess = SessionsCtrl.getRawCurrent();
				SessionsCtrl.setCurrent(new SessionResolverImpl(_ctx, request));
				//it might be created later
			}

			WebApp wapp;
			Session sess;
			final Object old = hsess != null?
				(wapp = WebManager.getWebAppIfAny(_ctx)) != null &&
				(sess = SessionsCtrl.getSession(wapp, hsess)) != null ?
					I18Ns.setup(sess, request, response, "UTF-8"):
					I18Ns.setup(hsess, request, response, "UTF-8"):
				Charsets.setup(null, request, response, "UTF-8");
			try {
				cwr.service(request, response,
						pi.substring(ClassWebResource.PATH_PREFIX.length()));
			} finally {
				if (hsess != null) I18Ns.cleanup(request, old);
				else {
					Charsets.cleanup(request, old);
					SessionsCtrl.setRawCurrent(oldsess);
				}
			}
			return; //done
		}

		final Session sess = WebManager.getSession(_ctx, request, false);
		if (withpi) {
			final AuExtension aue = getAuExtensionByPath(pi);
			if (aue == null) {
				response.sendError(response.SC_NOT_FOUND);
				log.debug("Unknown path info: "+pi);
				return;
			}

			Object oldsess = null;
			if (sess == null) {
				oldsess = SessionsCtrl.getRawCurrent();
				SessionsCtrl.setCurrent(new SessionResolverImpl(_ctx, request));
				//it might be created later
			}

			final Object old = sess != null?
				I18Ns.setup(sess, request, response, "UTF-8"):
				Charsets.setup(null, request, response, "UTF-8");
			try {
				aue.service(request, response, pi);
			} finally {
				if (sess != null) I18Ns.cleanup(request, old);
				else {
					Charsets.cleanup(request, old);
					SessionsCtrl.setRawCurrent(oldsess);
				}
			}
			return; //done
		}

		//AU
		if (sess == null) {
			response.setIntHeader("ZK-Error", response.SC_GONE); //denote timeout

			//Bug 1849088: rmDesktop might be sent after invalidate
			//Bug 1859776: need send response to client for redirect or others
			final String dtid = request.getParameter("dtid");
			if (dtid != null)
				sessionTimeout(request, response,
					WebManager.getWebManager(_ctx).getWebApp().getConfiguration(),
					dtid);
			return;
		}

		final Object old = I18Ns.setup(sess, request, response, "UTF-8");
		try {
			process(sess, request, response);
		} finally {
			I18Ns.cleanup(request, old);
		}
	}
 

 

5,6,7基本没什么,这里就不讲了



 

0
0
分享到:
评论

相关推荐

    zk核心jar最新的zk核心jar用到zk的可以下载

    最新的zk核心jar用到zk的可以下载很实用的东西

    ZK(核心包)

    zookeeper核心包之一 ZK Studio是一个可视化的集成开发环境,提供了跨越整个项目生命周期的直观的工具

    zk中文人员开发手册.rar

    ZK 是一个基于组件的 Java Web 用户界面框架,专为构建富互联网应用程序(RIA)而设计。它提供了一种简单、直观的方式来创建交互式用户界面,无需掌握复杂的 JavaScript 或 AJAX 技术。ZK 的核心特性包括事件驱动的...

    zk框架学习中文手册

    在开发过程中,ZK提供了一个强大的IDE插件支持,如Eclipse和IntelliJ IDEA,使得开发、调试和部署更加高效。同时,ZK的文档和社区资源丰富,尤其是中文文档的存在,对于中文开发者来说,学习和解决问题变得更加方便...

    ZK中文开发手册 html

    9. **ZK Studio和ZK Debugger**:这两个工具是ZK开发的利器,手册会说明如何使用它们进行开发和调试。 10. **性能优化**:提供一些最佳实践和技巧,帮助开发者提高ZK应用的性能和响应速度。 11. **安全与认证**:...

    ZK开发手册中文3.5.1版

    这个版本特别强调了与两个主流Java框架——Spring和Hibernate的整合,这极大地拓展了ZK的应用场景和功能。 首先,关于ZK框架的基础知识,ZK的核心理念是将UI设计与业务逻辑分离,通过事件驱动的模型简化Web应用的...

    ZK中文开发手册chm

    ZK中文开发手册ZK中文开发手册ZK中文开发手册ZK中文开发手册ZK中文开发手册ZK中文开发手册ZK中文开发手册ZK中文开发手册ZK中文开发手册ZK中文开发手册ZK中文开发手册

    Zk中注解的使用(ZkDemo系列)

    在ZK框架中,注解的使用是提升开发效率和代码可读性的重要手段。ZK是一个基于组件模型的Java Web开发框架,它允许开发者创建富客户端用户界面,而无需处理复杂的JavaScript和浏览器兼容性问题。本文将深入探讨ZK中...

    zk中文开发手册pdf版(基于3.5.1)

    2. **组件使用**:书中详细介绍了各种组件的属性、事件和方法,帮助你熟练掌握每个组件的用法。 3. **事件处理**:讲解如何绑定事件监听器,处理客户端与服务器之间的交互,以及自定义事件的创建和传播。 4. **...

    zk 安装框架

    ZKStudio和REM是两个与ZK紧密集成的插件,分别针对Eclipse和NetBeans。 #### 快速入门:创建并运行首个ZK应用 ZK提供了多种方式来创建和运行你的第一个应用,无论你是使用Eclipse、NetBeans还是手动设置,都能找到...

    ZK开发文档中文HTML版

    在这个"ZK开发文档中文HTML版"中,你将找到关于如何使用ZK框架进行开发的详细指南。 首先,文档会介绍ZK的基本概念,包括组件系统、事件处理和布局管理。ZK的组件库丰富,涵盖了各种常见的UI元素,如按钮、表格、树...

    zk入门.web框架

    然后,在web.xml中添加ZK的Servlet配置,以便服务器能够识别ZK的应用。 **三、常用功能** 1. **页面文本框校验**:可以为文本框设置约束,例如`(^[0-9a-zA-z]{3,5})?/: 航班号格式错误 !" >`,在Java代码中同样...

    zk 插件(包括需要使用的包)

    这些jar包通常包含了ZK框架的核心类库,以及其他可能的依赖,如Servlet API、JSP API等,它们是运行ZK应用的基础。 关于"zk eclipse jar"这三个标签,我们可以理解为: 1. **zk**:代表ZK框架,它是基于事件驱动的...

    ZK中文手册v3.5.1PDF

    此外,ZK还与Spring框架有良好的整合,Spring作为一个全面的企业级应用框架,可以提供依赖注入、AOP(面向切面编程)等服务,"spring"的标签表明手册中会有关于这两个框架协同工作的指导。 ZK中文手册v3.5.1的"第二...

    zk框架demo

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

    zk(ajax框架)中文手册

    综上所述,ZK框架是Java开发中的一个强大工具,特别适合那些希望简化AJAX应用开发的开发者。通过结合使用ZK、Dojo和JSF等技术,可以构建出功能丰富的、具有高度交互性的Web应用。同时,通过学习"zk手册3.5.1.chm"和...

    zk学习开发

    ZK是一个基于Java的轻量级MVC框架,专注于构建富客户端用户界面,尤其在Web应用中表现出色。它的设计目标是简化UI开发,提供直观、高效的用户交互体验,同时保持服务器端的高效处理能力。ZK通过事件驱动模型和组件...

    ZK32-1_library_zk_thinkkrz_zk32+9999zk.com_

    ZK32 SDK是ZK Software公司提供的一个工具集,它包含了必要的API(Application Programming Interface)和示例代码,帮助开发者在Windows环境下集成生物识别技术,比如指纹识别、面部识别等,到他们的应用程序中。...

Global site tag (gtag.js) - Google Analytics