zk学习总结

发布时间:   来源:文档文库   
字号:

ZK框架学习总结

一、zk的简介
ZK框架是一个用JAVA实现的简单但是功能强大的表现层框架。它包括了一个基于Ajax的事件驱动引擎、这也是它的最大特色。可以做到没有JavaScript,只通过ZUML(ZKUserInterfaceMarkupLanguage这种标识语言即可做到界面创建和事件响应。
ZK的实现完全用java实现,开发过程中不会有任何的JavaScript代码,但是通过将zul文件(ZK的源文件,类似于jsp文件)通过ZK引擎编译后查看页面源代码,结果还是可以看到,ZK实现的本质还是通过JavaScript+CSS来处理异步请求的。
组件是ZK中最常见的元素。有点类似于JAVASwing或者VB这样的基于组件的编程。结合ZKStudio,可以达到可视化和动态地查看页面效果。
特征
1.它是一个表现层工具。可以与hibernatespring等结合构建一个完整的WEB应用。2.以服务端为中心的框架。它封装了Ajax的后台处理技术。服务端由两个重要部分
实现:ZK加载器,ZK异步更新引擎。前者负责解析URL请求,生成HTML页面;后者负责监听和处理客户端的Ajax请求,同时更新ZK组件的属性,然后将Ajax应发回给客户端。3.基于组件的GUI页面的可视部分都是由组件构成。类似于HTML标签,但是比HTML
标签更灵活。不足之处:
1.ZKJAVA结合紧密。由于ZK的组件都是由JAVA实现,所以对组件的控制也仅限
于用JAVA语言。无法与控制层解耦。
2.学习资料和文档比较少。最全面的ZK应用其实还是官方的DEMOZK框架——
Ajax开发实践》一书都是用的官方例子。所以对有些事件或者属性只有自己探索。3.ZK的测试比较薄弱。对页面无法用工具进行测试。只能用手动测试。调试也不方
便。
二、安装部署zk开发环境
1JDK
2Tomcat5.5及版本以上3Eclipse3.4及以上的版本
4zk插件(zkstudio_1.0.1_ganymede.zip5、官網:http://www.zkoss.org

第一种方法:借助于Eclipse的向导来安装插件。通过Help/SoftwareUpdates/FindandInstall,在弹出的菜单中选择“Searchfornewfeaturestoinstall,点“Next,在下一菜单中
选择“NewLocalSite”或“NewArchivedSite,找到你下载的插件所在目录,选中安装即可。
第二种方法:在Eclipse的主目录(%ECLIPSE_HOME%)下有一个plugins目录和features目录。将插件解压缩后,在解压缩后的文件夹里一般可以看到plugins文件夹,有的插件解压缩后还可以看到一个features文件夹。一般将plugins文件夹下的内容直接拷贝到%ECLIPSE_HOME%\plugins目录下,如果解压缩后的插件目录下还有features文件夹,则把该文件夹下的内容也拷贝到%ECLIPSE_HOME%\features下。重新启动Eclipse之后就可以使用刚刚安装的插件了。
5、配置ZK环境(ZK库)
1.打开Eclipse(前提条件是已经安装好了ZKstudio插件,如果没有安装,请先按照前面的介绍安装插件;
2.点击菜单Window->Preferences
3.在打开的这个窗口上选择ZK->ZKPackages
4.点击AddDiretory选择到你下载的ZKLibrary(zk-bin-5.0.7.1,不用解压,直接是ZIP文件,如下图:


三、创建第一個zk項目
1、环境都配置好了后,new一个zkproject




项目创建完成


WEB-INF/web.xml定义了必须的servlet,及运行ZK应用程序所需要的监听器;
Web.xml
xmlversion="1.0"encoding="UTF-8"?><web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID"version="2.5">
<display-name>zktestdisplay-name><listener>
<description>
Usedtocleanupwhenasessionisdestroyeddescription><display-name>ZKSessioncleanerdisplay-name>
<listener-class>org.zkoss.zk.ui.http.HttpSessionListenerlistener-class>listener>

<servlet>
<description>
TheZKloaderforZUMLpagesdescription><servlet-name>zkLoaderservlet-name><servlet-class>
org.zkoss.zk.ui.http.DHtmlLayoutServletservlet-class>
<init-param>
<param-name>update-uriparam-name><param-value>/zkauparam-value>init-param>
<load-on-startup>1load-on-startup>servlet><servlet>
<description>
TheasynchronousupdateengineforZKdescription><servlet-name>auEngineservlet-name><servlet-class>
org.zkoss.zk.au.http.DHtmlUpdateServletservlet-class>
servlet>
<servlet-mapping>
<servlet-name>zkLoaderservlet-name><url-pattern>*.zulurl-pattern>servlet-mapping><servlet-mapping>
<servlet-name>zkLoaderservlet-name><url-pattern>*.zhtmlurl-pattern>servlet-mapping><servlet-mapping>
<servlet-name>auEngineservlet-name><url-pattern>/zkau/*url-pattern>servlet-mapping><welcome-file-list>
<welcome-file>index.htmlwelcome-file><welcome-file>index.htmwelcome-file><welcome-file>index.jspwelcome-file><welcome-file>default.htmlwelcome-file><welcome-file>default.htmwelcome-file><welcome-file>default.jspwelcome-file><welcome-file>index.zulwelcome-file>welcome-file-list>

web-app>
小结:
上面的web.xml文件包括了zk应用在运行时所需要的一个监听器和两个servlet的配置信息。这两个servletDHmtlLayoutServletDHtmlUpdateServlet其中DHmtlLayoutServlet命名为zkLoader,它负责加载zuml页面。同时,当servlet容器接受到来自浏览器的请求时,会根据页面的定义来创建这些组件。DHtmlUpdateServlet被命名为:auEngine,它负责处理zk的事件请求。这里要注意的是:zkLoaderupdate-uri必须和auEngineuri-pattern保持一致,否则web应用不能正常运行。
WEB-INF/zk.xmlZK的配置描述文件;
Zk.xml
xmlversion="1.0"encoding="UTF-8"?>

<zk>
<device-config>
<device-type>ajaxdevice-type>
<timeout-uri>/timeout.zultimeout-uri>device-config>
<system-config>
<disable-event-thread>falsedisable-event-thread>system-config>
zk>
小结:
Zk.xml中主要的是一些自定义的配置,timeout是针对会话超时的一种配置。
disable-event-thread配置是对zk事件使用状态的一种判断。在zk3.6版本的时候此配置如果不配置则默认为fasle,但是在zk5.0及以上版本的时候如果不配置则默认为true,因本版本为zk5.0.7.1的版本,所以需要加上此配置,否则,某些event则会被禁止,停止工作。
WEB-INF/lib包括了ZK的必须库文件;④该应用程序所需的重要jar包文件说明:.bsh.jarBeanShellJava代码解释器
.commons-el.jarApacheEL表达式解释器.zcommon.jarZK的通用库.zhtml.jarXHTML相关组件

.zk.jarZK核心代码
.zkplus.jar:与AcegiSecurity,Spring,Hibernate,databinding集成的代码.zul.jarXML相关组件
.zweb.jarweb相关功能代码
四、zk组件的介绍和使用
1ID属性的使用
注意:zk所有的组件名称均为小写字母组成
为了读取Java代码或EL表达式中的组件,我们可以使用id属性来标识它。在下面的例子中,我们为label设置了一个标识,这样当一个按钮被按下时,我们就可以操纵label的值了。如下面两个例子可以让你领会id的作用
title="testuseid"
contentType="text/html;charset=UTF-8"?>
DoyoulikeZK?

当按下“Yes”按钮的时候,可以看到如下效果。

id属性在EL表达式中的应用,如下代码:

这段代码实现的是将文本框中的值赋给标签,source”就代表着文本框,我们只需对其进行操作就相当于对文本框操作了。


2forEach属性的使用
forEach属性用来控制要创建多少个组件,如果你为这个对象指定一个对象集合,ZK载机(ZKloader将为每个被指定的集合项目创建一个组件。在下面的ZUML页面中,listitem元素将被赋值三次(分别为"Monday","Tuesday""Wednesday"然后产生三个list项目。
title="newpagetitle"
contentType="text/html;charset=UTF-8"?>

contacts=newString[]{"Monday","Tuesday","Wednesday","Thursday",
"Friday","Saturday","Sunday"};


draggable="true"/>
代码运行的效果如下:

小结:
除了使用foreach,还可以通过forEachBeginforEachEnd来控制迭代(iteration

3useapply的使用
*useapply是使Zul页面和Java类关联的关键,可以实现zkMVC
use:
use是一个组件类,对应的是每一个组件实体。使用use,对应的类需要extendsWindow
使<windowtitle="HelloWorld!!"border="normal"use="com.zhb.control.Index">
apply:
apply是一个帮助类,帮助use完成一系列动作。Apply需要implementscomposer或者extendsGenericForwardComposer
使<windowtitle="HelloWorld!!"border="normal"apply="com.zhb.control.Index">
小结:
com.zhb.control是指对应的packageIndex是对应package下面的Java类。zul页面加载到useapply的时候会根据包名并加载包下面的Java类。
1、我们先看下没有使用useapplyzul页面page
title="new
page
title"
contentType="text/html;charset=UTF-8"?><zk><window
id="win"
title="new
page
title"
border="normal">
<vboxid="a">vbox><zscript>

String[]
data={"welcome!","Nice
to
meet
you!","Helloevery!"};
for(inti=0;i{Labell=newLabel(data[i];l.maxlength=9;//最大长度
l.parent=a;//Label控件绑定到vbox中去}]]>
zscript>window>
<windowid="main"title="NotUse"border="normal"onCreate='main.setTitle("不同use"'><button
label="cancel"
onClick='main.setTitle("Cancel"'>button><labelid="label">label><zscript>
label.setValue("大家好";zscript>window>zk>

小结:
Java代码和zul页面混杂在一起,不利于页面、代码的维护和拓展。2、使用usezul页面和JavaZul页面:
pagetitle="use_simple"contentType="text/html;charset=UTF-8"?><zk><windowid="win"title=""border="normal"use="com.zhb.control.Use_simple"onCreate="win.init("><buttonid="ok"forward="onOk">button>
<buttonid="cancel"onClick="win.onCancel(">button>window>zk>
Java类:
packagecom.zhb.control;
importorg.zkoss.zul.Button;importorg.zkoss.zul.Window;
publicclassUse_simpleextendsWindow{/**
*加载方法*/
publicvoidinit({
this.setTitle("use_simple!";//windowtitle属性赋值//根据id获取zul组件对象并给Label属性赋值
Buttonok_btn=(Buttonthis.getFellow("ok";ok_btn.setLabel("OK";
//根据id获取zul组件对象并给Label属性赋值
Buttoncancel_btn=(Buttonthis.getFellow("cancel";cancel_btn.setLabel("Cancel";}/**
*OK方法*/
publicvoidonOk({
//windowtitle属性赋值
this.setTitle("helloworld!";


}/**
*Cancel方法*/
publicvoidonCancel({
//windowtitle属性赋值
this.setTitle("hiworld!";}}
3、使用applyzul页面和JavaImplementsComposer接口页面:
pagetitle="composer"contentType="text/html;charset=UTF-8"?><zk><windowid="win"title="composer"border="normal"apply="com.zhb.control.MyComposer">
<labelid="show_label"forward="onClick=onShow_label">label><buttonlabel="apply"onClick='alert("Areyouclear?"'/>
window>zk>
Java类:
packagecom.zhb.control;
importorg.zkoss.zk.ui.Component;importorg.zkoss.zk.ui.event.Event;
importorg.zkoss.zk.ui.event.EventListener;importorg.zkoss.zk.ui.util.Composer;importorg.zkoss.zul.Label;importorg.zkoss.zul.Window;
publicclassMyComposerimplementsComposer{
privateLabelshow_label;@Override
publicvoiddoAfterCompose(ComponentcompthrowsException{//TODOAuto-generatedmethodstub
((Windowcomp.setTitle("applayisbest!";

show_label=(Labelcomp.getFellow("show_label";//id

组件的对象
show_label.setValue("大家好!";//赋值//添加事件
comp.addEventListener("onShow_label",newEventListener({
@Override
publicvoidonEvent(EventeventthrowsException{//TODOAuto-generatedmethodstub
}
show_label.setValue("我不好!";}};
小结:
和使用useextendsWindow一样的麻烦。下面介绍一种更为简单的方法。
extendsGenericForwardComposerZul页面:
pagetitle="apply_simple"contentType="text/html;charset=UTF-8"?><zk><windowtitle="apply_simple"border="normal"apply="com.zhb.control.Apply_simple"><vbox>
<labelid="first_label">label><labelid="second_label">label><buttonid="count_button">button>vbox>window>zk>
Java类:
packagecom.zhb.control;
importorg.zkoss.zk.ui.Component;
importorg.zkoss.zk.ui.util.GenericForwardComposer;importorg.zkoss.zul.Button;importorg.zkoss.zul.Label;
publicclassApply_simpleextendsGenericForwardComposer{
//定义组件
privateLabelfirst_label;//Label


privateLabelsecond_label;
privateButtoncount_button;//Button/**
*加载方法*/
@Override
publicvoiddoAfterCompose(ComponentcompthrowsException{//TODOAuto-generatedmethodstubsuper.doAfterCompose(comp;
first_label.setValue("我是第一个Label";second_label.setValue("我是第二个Label";count_button.setLabel("我是Button";}/**
*按钮点击事件*/
publicvoidonClick$count_button(Eventevent{
first_label.setValue("我变身啦!";second_label.setValue("我也变身啦!";}}
小结:
当我们extendsGenericForwardComposer类后,doAferComposer将替我们注入上面定义的组件。所以我们省略了getFollow(Stringid这个方法。至于forwardGenericForwardComposer类则自动帮你完成forward的工作,所以页面中完全不需要再使用forward了。在按钮事件中Eventevent我们可以省略不写。这样我们就真正的实现了zkMVC。页面和逻辑代码的分离。使zulJava代码可以更好的维护和拓展。
4ComboboxGrid的使用Zul页面:
pagetitle="zk学习总结"?>
<windowtitle="Helloapply="com.zhb.control.Index">
<vbox>
World!!"
border="normal"
<comboboxid="myCombobox">combobox>
<buttonid="myButton">button>

vbox>
<separatorheight="20px">separator>
<gridid="myGrid">grid>
<buttonid="button"label="">button>
<buttonid="url_btn"label="">button>
window>
Java类:
packagecom.zhb.control;
importjava.util.HashMap;importjava.util.List;importjava.util.Map;
importorg.zkoss.zk.ui.Component;importorg.zkoss.zk.ui.Executions;importorg.zkoss.zk.ui.event.Event;
importorg.zkoss.zk.ui.event.EventListener;importorg.zkoss.zk.ui.event.Events;
importorg.zkoss.zk.ui.util.GenericForwardComposer;importorg.zkoss.zul.Button;importorg.zkoss.zul.Cell;importorg.zkoss.zul.Column;importorg.zkoss.zul.Columns;importorg.zkoss.zul.Combobox;importorg.zkoss.zul.Comboitem;importorg.zkoss.zul.Div;importorg.zkoss.zul.Grid;importorg.zkoss.zul.Label;
importorg.zkoss.zul.ListModel;importorg.zkoss.zul.Messagebox;importorg.zkoss.zul.Row;
importorg.zkoss.zul.RowRenderer;importorg.zkoss.zul.Rows;
importorg.zkoss.zul.SimpleListModel;
publicclassIndexextendsGenericForwardComposer{

//定义控件
privateComboboxmyCombobox;//下拉控件privateButtonmyButton;//按钮privateGridmyGrid;//Grid
privateButtonbutton;//获取
privateButtonurl_btn;//跳转页面/**
*加载方法*/
publicvoiddoAfterCompose(ComponentcompthrowsException{super.doAfterCompose(comp;//加载ComboboxComboitemcomb=null;for(inti=0;i<3;i++{if(i==0{
comb=newComboitem(;}
comb.setLabel("小说";comb.setValue("004";}elseif(i==1{
comb=newComboitem(;comb.setLabel("呐喊";comb.setValue("005";}elseif(i==2{
comb=newComboitem(;comb.setLabel("彷徨";comb.setValue("006";}
myCombobox.appendChild(comb;
//设置默认选中项
myCombobox.setSelectedIndex(0;//加载Grid表头
Columnscolums=newColumns(;for(inti=0;i<4;i++{
Columncolumn=newColumn(;if(i==0{
column.setLabel("#";}elseif(i==1{
column.setLabel("序号";}elseif(i==2{
column.setLabel("名称";}elseif(i==3{
column.setLabel("操作";


}
colums.appendChild(column;}
myGrid.appendChild(colums;
//新增按钮
myButton.setLabel("新增";//跳转按钮
button.setLabel("跳转";
Stringmodel[][]=newString[3][3];model[0][0]="1";model[0][1]="001*";model[0][2]="";model[1][0]="2";model[1][1]="002*";model[1][2]="";model[2][0]="3";model[2][1]="003*";
model[2][2]="";
myGrid.setWidth("100%";//设置Gridwidth
ListModellistmodel=newSimpleListModel(model;//model转化成Grid需要的格式(Array
myGrid.setModel(listmodel;//将数ListModel放入Grid
myGrid.setRowRenderer(newindex_Renderer(;//指定类并将数据放入到Row
myGrid.setMold("paging";//启动Grid分页功能myGrid.setPageSize(10;//每页显示10条数据}
/**
*新增按钮
*@throwsInterruptedException*/
publicvoidonClick$myButton(throwsInterruptedException{Stringxuhao=myCombobox.getSelectedItem(.getLabel(;String
name=myCombobox.getSelectedItem(.getValue(.toString(;

ListModellstmodel=myGrid.getModel(;//获取GridListModelString[][]models=newString[lstmodel.getSize(+1][3];Rowsrows=myGrid.getRows(;//获取grid中所有的行
Listrow_lst=rows.getChildren(;//获得Rows下所有的子控件的集合for(inti=0;i
models[i]=(String[]lstmodel.getElementAt(i;//得到每一列

的数据
}
booleanbool=true;
for(intj=0;jif(models[j][2]!=null{
if(models[j][2].equals(xuhao{
Messagebox.show("Grid","",Messagebox.OK,Messagebox.EXCLAMATION;return;}}}

//添加一条数据到数组中
models[models.length-1][0]=String.valueOf(models.length+1;models[models.length-1][1]=name+"*";models[models.length-1][2]=xuhao;
ListModellistModel=newSimpleListModel(models;//将数据转化成Grid需要的格式(Array
myGrid.setModel(listModel;//将数ListModel放入Grid
}/**
*获取Grid内数据*/
publicvoidonClick$button({
ListModellm=myGrid.getModel(;//获取GridListModel内的数据Rowsrows=myGrid.getRows(;//获取grid中所有的行
Listrow_lst=rows.getChildren(;//获得Rows下所有的子控件的集合for(inti=0;iRowr=(Rowrow_lst.get(i;Listr_lst=r.getChildren(;
for(intk=0;k}}
Stringnames=r_lst.get(k.getClass(.getName(;//获取控件的类if(names.equals("org.zkoss.zul.Cell"{Cellcell=(Cellr_lst.get(k;
Labellabel=(Labelcell.getFirstChild(;label.getValue(;
System.out.println("-------"+label.getValue(;}

}/**
*页面跳转**/
publicvoidonClick$url_btn({
//this.page.removeComponents(;Mapmap=newHashMap(;map.put("key","value";map.put("key1","value1";
//创建一个组件达到跳转的目地
Executions.getCurrent(.createComponents("control.zul",nullap;
//jsp中的跳转方式
Executions.sendRedirect("control.zul?value=123&name=234";}}/**
*加载grid控件*@authornj**/
classindex_RendererimplementsRowRenderer{
@Override
publicvoidrender(Rowrow,ObjectdatathrowsException{//TODOAuto-generatedmethodstubString[]data_=(String[]data;//流水帐号
newLabel(data_[0].setParent(row;//序号
newLabel(data_[1].setParent(row;//名称
Cellcell=newCell(;
LabellabelNum=newLabel("1";labelNum.setVisible(false;
Labellabel=newLabel(data_[2];cell.appendChild(labelNum;cell.appendChild(label;cell.setParent(row;
Buttonbutton=newButton(;

button.setLabel("删除";
,m
button.addEventListener(Events.ON_CLICK,Index_onDelete(;
button.setParent(row;}}/**
*删除
*@authornj**/
classIndex_onDeleteimplementsEventListener{
@Override
publicvoidonEvent(EventeventthrowsException{//TODOAuto-generatedmethodstub
new
intnum=Messagebox.show("?","",Messagebox.YES|Messagebox.NO,Messagebox.QUESTION;if(num==Messagebox.YES{

Buttonbutton=(Buttonevent.getTarget(;//获取点击事件的对象Rowrow=(Rowbutton.getParent(;//获取Button上一级控件Labellabel=(Labelrow.getFirstChild(;Stringvalue=label.getValue(;Rowsrows=(Rowsrow.getParent(;Gridgrid=(Gridrows.getParent(;
Listlist=grid.getRows(.getChildren(;ListModellistmodel=grid.getModel(;
String[][]model=newString[list.size(-1][3];intindex=0;
for(inti=0;i
String[]data=(String[]listmodel.getElementAt(i;if(!value.equals(data[0]{
data[0]=String.valueOf(index+1;model[index]=data;index++;}}
ListModellistModel=newSimpleListModel(model;grid.setModel(listModel;
row.detach(;//使row分离}}

}
5ZK的几种跳转页面的方法及传值方法
1jsp跳转方式
传值要传参数可以使用基本的httpservlet的方式
Executions.sendRedirect("control.zulvalue=123&name=456";zul页面初始化时候取值方式:
Executions.getCurrent(.getParameter("value";Executions.getCurrent(.getParameter("name";2zk
跳转方式
创建一个组件达到跳转的目地
Executions.createComponents(URLnull,map
取值:
Executions.getCurrent(.getArg(.get(Objectkey;



本文来源:https://www.2haoxitong.net/k/doc/8b9bfc1214791711cc791788.html

《zk学习总结.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式