架构概况

 

架构概况

ZK包括一种基于AJAX机制用来实现自动的交互性,一套丰富的基于XUL的组件用以丰富可用性,和一种的标记语言用来简化开发。

基于AJAX的机制包括三个部分,描绘如下:ZK 加载器(ZK loader),ZK AU引擎(ZK AU Engine) [17] ,和ZK客户端引擎(ZK Client Engine)。

架构概况

基于用户的请求,ZK 加载器(ZK loader)加载一个ZK页面,解释它,并将结果送到HTML页面来响应URI请求。ZK页面是用一种被称为ZUML的标记语言写成的。ZUML,就像HTML,被用来描述什么组件被创建,以及如何把它们呈现出来。这些组件一旦被创建,就会一直处于可用状态知道会话超时。

然后ZK AU[18] 引擎(ZK AU Engine )和ZK客户端引擎(ZK Client Engine)作为投手和捕手一起工作。它们将在浏览器端发生的事件送到运行在服务器端的应用程序,然后更新浏览器段的DOM树,基于组件如何被应用程序操纵。这种方式即所谓的事件驱动编程模型。

执行流

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

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

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

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

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

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

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

     

    sunflower注:

    下面是我选择tree组件的一个行捕获的数据

    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事件鼠标的位置

     

     

    sunflower注:

    ZK 加载器:web.xml 

     

    <servlet>
    		<description>ZK loader for ZUML pages</description>
    		<servlet-name>zkLoader</servlet-name>
    		<servlet-class>org.zkoss.zk.ui.http.DHtmlLayoutServlet</servlet-class>
    		<!--
    			Must. Specifies URI of the update engine (DHtmlUpdateServlet). It
    			must be the same as <url-pattern> for the update engine.
    		-->
    		<init-param>
    			<param-name>update-uri</param-name>
    			<param-value>/zkau</param-value>
    		</init-param>
    		<!--
    			Optional. Specifies whether to compress the output of the ZK loader.
    			It speeds up the transmission over slow Internet. However, if you
    			configure a filter to post-processing the output, you might have to
    			disable it. Default: true <init-param>
    			<param-name>compress</param-name> <param-value>true</param-value>
    			</init-param>
    		-->
    		<!--
    			Optional. Specifies the default log level: OFF, ERROR, WARNING, INFO,
    			DEBUG and FINER. If not specified, the system default is used.
    			<init-param> <param-name>log-level</param-name>
    			<param-value>OFF</param-value> </init-param>
    		-->
    		<load-on-startup>1</load-on-startup><!-- Must -->
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>zkLoader</servlet-name>
    		<url-pattern>*.zul</url-pattern>
    	</servlet-mapping>
    	<servlet-mapping>
    		<servlet-name>zkLoader</servlet-name>
    		<url-pattern>*.zhtml</url-pattern>
    	</servlet-mapping>
    	<servlet-mapping>
    		<servlet-name>zkLoader</servlet-name>
    		<url-pattern>*.svg</url-pattern>
    	</servlet-mapping>
    	<servlet-mapping>
    		<servlet-name>zkLoader</servlet-name>
    		<url-pattern>*.xml2html</url-pattern>
    	</servlet-mapping>
    	<!-- Optional. Uncomment it if you want to use richlets.
    	-->
    	<servlet-mapping>
    		<servlet-name>zkLoader</servlet-name>
    		<url-pattern>/zk/*</url-pattern>
    	</servlet-mapping>
     

     

    ZK AU( asynchronous update)引擎:web.xml

    	<servlet>
    		<description>The asynchronous update engine for ZK</description>
    		<servlet-name>auEngine</servlet-name>
    		<servlet-class>org.zkoss.zk.au.http.DHtmlUpdateServlet</servlet-class>
    		<!--
    			[Optional] Specifies the AU processor for particular prefix.
    			<init-param> <param-name>processor0</param-name>
    			<param-value>/upload=com.my.MyUploader</param-value> </init-param>
    		-->
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>auEngine</servlet-name>
    		<url-pattern>/zkau/*</url-pattern>
    	</servlet-mapping>
    
     

     


 

你可能感兴趣的:(应用服务器,Ajax,servlet,浏览器,zk)