java zk框架_ZK框架 - btbear3 - 博客园

先简单介绍一下ZK框架: 是个ajax框架,事件驱动框架,最大优点免去了编写js这种痛苦的工作,并且像开发桌面程序一样来开发web应用,简单明了。(虽然以后可能普遍html5,可是这还是需要一定时间的过渡)。缺点:虽然是台湾的开源框架,可是国内貌似不怎么火爆,也就是说资源比较少,意味着英语要不错,且要有专研精神。官方论坛的small talk是不错的,ZK框架的好资源基本在那里,中文的参考手册却有部分的错误(ps,参考手册的一个错误曾让我抓狂)。还有一个缺点是开源框架普遍存在的一个缺点,就是版本更新了,文档却没有更新。当改动比较大的时候,有时比较难找到对应的文档。(必须要时刻关注着)。

先说下ZK的原理,在客户端第一次访问ZK web应用的时候,客户端浏览器会download的ZK框架在客户端的运行部分(ZK客户端),而ZK客户端会检测用户在客户端的动作,然后发送对应的ZK request 到服务端,而ZK框架的Au Service (更新服务)会根据ZK request来发送ZK response给ZK客户端接收,ZK客户端然后进行处理。

在java web应用开发的时候就会感觉到就像是开发java 桌面程序一样。对web 界面上的button进行监听,当发生onClick事件的时候就发送ZK request 到服务端,服务端就自动调用对应的java 处理程序。(这点让人很happy~让人觉得前端和后台无差别开发)。

技术上总结:

ZK框架有很多组件,组件有对应的类。

web界面的开发有两种方式,第一种 完全ZK化,界面使用ZK 提供的前端开发的语言进行开发(不用担心,ZK前端开发的语言和html非常相似,学习不难),且可以在完全ZK界面上面嵌入html和js以及其他的脚本语言。第二种是将ZK组件嵌入到html页面上面。(不怎么喜欢这种,觉得没啥意义,只是ZK框架为了多种需求而已)。

在开发的时候主要使用的是第一种方式。

用一个案例进行开发,比许a.zul 可是使其有对应的java处理类。a.zul 在界面中使用 属性apply 可以指定对应的java处理类A.java。 可是A.java得继承或实现ZK框架中的类,有几种方式:

1,a.zul界面使用属性use ,a.java 继承Windows类。

a.zul 界面:

Java代码9cf6668a236faaf156f78d3fe65e91ea.gif 997f366a55f3b0a46c276caede2ed847.png

74b95437dd1a73d052cb0aae258cf340.gif

use="org.rjb.com.custom.CustomWin" width="300px">

model="${win.customers}" />

width="200px"  onFocus="win.onFocusName()" />

use="org.rjb.com.custom.CustomWin" width="300px">

model="${win.customers}" />

width="200px" onFocus="win.onFocusName()" />

注意: window里面有一个属性use, 事件onFocus 的处理【window 的id】.【a.java的处理方法】

a.java

Java代码9cf6668a236faaf156f78d3fe65e91ea.gif 997f366a55f3b0a46c276caede2ed847.png

74b95437dd1a73d052cb0aae258cf340.gif

public class CustomWin extends Window{

DataSource _dr=new DataSource();

public ListModel getCustomers(){

return _dr.getCustomers();

}

//事件处理方法

public void onFocusName(){

final Textbox text=(Textbox) this.getFellow("text");

final Listbox list=(Listbox)this.getFellow("list");

text.setValue("Dear:"+(list.getSelectedItem()==null?"NULL":

list.getSelectedItem().getValue().toString()));

}

}

public class CustomWin extends Window{

DataSource _dr=new DataSource();

public ListModel getCustomers(){

return _dr.getCustomers();

}

//事件处理方法

public void onFocusName(){

final Textbox text=(Textbox) this.getFellow("text");

final Listbox list=(Listbox)this.getFellow("list");

text.setValue("Dear:"+(list.getSelectedItem()==null?"NULL":

list.getSelectedItem().getValue().toString()));

}

}

注意:继承Window类这种方法,可以通过this.getFellow(“ 组件id”);这种方法来得到对应的组件,且操作它。

第二中方法:

a.zul里面使用apply属性

Zul代码9cf6668a236faaf156f78d3fe65e91ea.gif 997f366a55f3b0a46c276caede2ed847.png

74b95437dd1a73d052cb0aae258cf340.gif

apply="org.rjb.com.custom.MyAutoWireComposer" width="300px">

forward="onFocus=onFocusName" />

apply="org.rjb.com.custom.MyAutoWireComposer" width="300px">

forward="onFocus=onFocusName" />

注意:apply属性使用后,对应组件的forward方法,指定事件onFocus 这里注意到事件处理必须以on开头。(至少我开发的时候,曾经因为这个出现了错误。)

a.java对于这种方式可以有多种继承:

早期的:      使用GenericAutoComposer可以自动检测到组件,不用手动输入得到组件。但是要指定对应的事件处理的。

Java代码9cf6668a236faaf156f78d3fe65e91ea.gif 997f366a55f3b0a46c276caede2ed847.png

74b95437dd1a73d052cb0aae258cf340.gif

public class MyAutoWireComposer extends GenericAutowireComposer{

private Listbox list;

private Textbox text;

//在界面生成以后的处理

public void doAfterCompose(Component comp)throws Exception{

super.doAfterCompose(comp);

DataSource _dr=new DataSource();

ListModel lm=_dr.getCustomers();

list.setModel(lm);

}

public void onFocusName(){

StringBuffer stf=new StringBuffer("Dear:");

stf.append(list.getSelectedItem()==null?"NULL":list.getSelectedItem().getValue().toString());

System.out.println(stf.toString());

text.setValue(stf.toString());

}

}

public class MyAutoWireComposer extends GenericAutowireComposer{

private Listbox list;

private Textbox text;

//在界面生成以后的处理

public void doAfterCompose(Component comp)throws Exception{

super.doAfterCompose(comp);

DataSource _dr=new DataSource();

ListModel lm=_dr.getCustomers();

list.setModel(lm);

}

public void onFocusName(){

StringBuffer stf=new StringBuffer("Dear:");

stf.append(list.getSelectedItem()==null?"NULL":list.getSelectedItem().getValue().toString());

System.out.println(stf.toString());

text.setValue(stf.toString());

}

}

近期一直使用的方法,

GenericForwardComposer类,可是将事件也自动的绑定,不需要zul界面上指定:

Java代码9cf6668a236faaf156f78d3fe65e91ea.gif 997f366a55f3b0a46c276caede2ed847.png

74b95437dd1a73d052cb0aae258cf340.gif

public class LoginComposer extends GenericForwardComposer{

private Textbox login_name;

//事件监听方法,注意方法名 且要注意这个组件有这种事件(参考手册)

public void onClick$loginBtn(Event event){

sessionScope.put("login_name", login_name.getText());

Executions.getCurrent().sendRedirect("index.zul");

}

}

public class LoginComposer extends GenericForwardComposer{

private Textbox login_name;

//事件监听方法,注意方法名 且要注意这个组件有这种事件(参考手册)

public void onClick$loginBtn(Event event){

sessionScope.put("login_name", login_name.getText());

Executions.getCurrent().sendRedirect("index.zul");

}

}

以上是ZK总结的一部分,ZK资料的不齐全以及资料和版本之间差异,让我寸步难行,第一次发文,文章中也许有些错误和不对的,欢迎大家来指正。


版权声明:本文为weixin_39969881原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。