richlet是一段java小程序,它可以形成UI,也可以为用户的请求服务。
当用户的url请求到来时,zk会根据web.xml中的url-pattern来检查这是要请求一个zul或者是richlet。当用户的请求是一个zul的时候,就和我们前面所讲的一样。如果用户的请求是一个richlet,那么zk loader 会将处理任务交给richlet,这时,ui的形成就全部由richlet决定。
到底是用richlet还是zuml page来形成用户界面完全取决于你的个人喜好,我们不必考虑是用zuml page的性能问题,因为zuml page的形成过程是经过优化的。
用richlet形成用户界面有两个步骤,一是在你的java class中实现richlet,二是将url映射到你已经写好的richlet上。
Implements a Richlet as Java Class
一个richlet必须实现Richlet接口,但是我们通常不去实现这个接口,我们会用更加快捷方便的方式,那就是去继承这个接口的一个实现类GenericRichlet,当我们继承这个类后,我们所要做的仅仅是去重写service方法
package com.jing.zk;
import org.zkoss.zk.ui.GenericRichlet;
import org.zkoss.zk.ui.Page;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.event.Events;
import org.zkoss.zul.*;
public class TestRichlet extends GenericRichlet{
@Override
public void service(Page page) throws Exception {
page.setTitle("Richlet Test");
final Window w = new Window("Richlet Test", "normal", false);
new Label("hello world").setParent(w);
final Label l = new Label();
l.setParent(w);
final Button btn = new Button("Change");
btn.addEventListener(Events.ON_CLICK, new EventListener() {
int count;
@Override
public void onEvent(Event event) throws Exception {
l.setValue(""+ ++count);
}
});
btn.setParent(w);
w.setPage(page);
}
}
值得注意的是,richlet必须是线程安全的,因为如果我们将一个component共享的话,那么献一次请求到来的时候,这个component已经实例化过了,再将它指定给另一个page将会抛出异常。
Map a URL to a Richlet
将url映射到richlet上同样也需要经过两个步骤:一是在web.xml中打开richlet支持的开关;二是在zk.xml中关联映射
在web.xml中你可以添加下面的代码,你也可以写成/do/*,但是千万不能写成*.do,因为这会被当成ZUML page
<servlet-mapping>
<servlet-name>zkLoader</servlet-name>
<url-pattern>/zk/*</url-pattern>
</servlet-mapping>