- 浏览: 762233 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (241)
- 个人思考 (1)
- 数据库 (5)
- java基础 (32)
- 软件工程 (2)
- zk开源框架 (15)
- 设计模式 (25)
- javascript (12)
- css (9)
- UML (2)
- CMMI软件需求 (3)
- CMMI软件设计 (2)
- CMMI软件实现 (1)
- CMMI软件测试 (1)
- 正则表达式 (4)
- 系统日志配置 (4)
- 应用服务器 (1)
- spring (7)
- XML (6)
- java web (10)
- Ajax (3)
- RichFaces (14)
- 问题 (1)
- 评论文章 (2)
- fushioncharts (2)
- MAVN (4)
- jquery (26)
- Ext js学习 (2)
- 学习心得 (2)
- CSS兼容问题 (3)
- XSL-FOP (1)
- Quartz (0)
- OSGI (1)
- spring--security (6)
- apache tools (1)
- eclispe 小技巧 (2)
- Ant (1)
- 杂记 (1)
- spring3系列 (5)
- java cache (4)
- EffectiveJava (2)
- 代码重构 (0)
最新评论
-
psz6696:
可以说是超级简单的Demo了,可惜没有演示设值注入和构造注入两 ...
模拟spring中的ClassPathXmlApplicationContext类的实现 -
ziyourJava:
[flash=200,200][img][url][list] ...
spring security进级篇 V 自定义标签控制显示 -
ztw1122:
...
zk组件开发指南(目录) -
zjysuv:
容我说一句 在座的各位都是垃圾 spring 3.2以后的@C ...
三. spring mvc 异常统一处理 -
chengwu1201:
二 基于Spring的异常体系处理
原文:http://www.iteye.com/topic/285373
Zk是一个direct RIA框架。它借用了xul来描述界面,在xul的基础上做了一些扩展,改了一个名字叫zul,不使用
javascript也能做出类似extjs那样的界面来。我一开始觉得只是把javascript替换成xml意义不是太大,因为没有哪个美工
会用zul来做界面,说到底最终界面还是要靠程序员来做的,但是换个角度用 extjs那样的方式来不可以避免把很多逻辑带
入到界面中来,这点zk的zul就要好些,正如zk宣传的那样,不需要java,javascript也能做出RIA的界面来。Zk的另一个好
处就是把ajax前后台通讯部分也用事件的方式封装起来了,这比用extjs好多了,不用自己再搞一套了前后台机制了。
看完《ZK开发手册》 ,也跟着做了一些例子,测试了一下与spring、hibernate集成都没有问题。于是,开始尝试用zk
的listbox来做一个结合spring+hibernate的分页数据显示。刚一动手就遇到了麻烦,zul在控件中显示数据的方式主要有三
种:
1、用EL表达式作为zul标签的属性;
2、为zul控件指定model;
3、通过注释进行数据绑定;
为了在数据库查询的时候实现分页,无法使用第1种方式,这种方式listbox是对forEach属性EL表达式中的list进行迭代来
创建 listitem,有多少数据就创建多少个listitem,只有数据条数大于每页显示的数据条数并且listbox的
mold=“paging”时才能分页,而数据库查询每页需要显示多少数据才从数据库中取多少数据,显然第1种方式无法使用。本
来第2种方式是java开发人员最熟悉的方式,几乎和swing一样,但是这种方式需要写一个org.zkoss.zul.ListitemRenderer
的实现类,在这个类里用java代码的方式定义每行的显示样式,这样混用zul和java的来定制界面不是理想的方式。
那现在只剩下第3种方式,这种方式是现在最为流行注释方式,就是对zul的标记用进行注释来把数据绑定到zul控件
上,这里的注释不是通用的xml注释<!-- ... -->而是一些特殊的zul标记和@开头的特殊属性例如model="@{userList}"表示
用@{userList}对model这个属性进行了注释(这个地方有点奇怪)。用注释绑定数据的代码如下:
- <listbox id="userListBox" mold="paging" model="@{userList}"
- selectedItem="@{selectedUser}">
- <listhead>
- <listheader label="登陆名" sort="auto" />
- <listheader label="中文名" sort="auto" />
- </listhead>
- <listitem self="@{each=user}">
- <listcell label="@{user.loginname}" />
- <listcell label="@{user.truename}" />
- </listitem>
- </listbox>
<listbox id="userListBox" mold="paging" model="@{userList}" selectedItem="@{selectedUser}"> <listhead> <listheader label="登陆名" sort="auto" /> <listheader label="中文名" sort="auto" /> </listhead> <listitem self="@{each=user}"> <listcell label="@{user.loginname}" /> <listcell label="@{user.truename}" /> </listitem> </listbox>
用注释方式的数据绑定与直接用EL设置listbox的model属性对listbox来说都是把一个实现了org.zkoss.zul.ListModel
接口的对象赋值给listbox的model属性,唯一的区别就是注释方式还可以给listitem、listcell绑定数据,也就是说数据绑
定可以迭代 model并把每个model中的每个元素都与对应的listcell进行数据绑定,对应使用EL设置model的方式来说做同
样的事情还需要实现org.zkoss.zul.ListitemRenderer接口 。
把数据和listbos绑定在一起只是第1步,接下要用hibernate实现对数据库进行分页查询了。
要想分页查询最初的想法是监听listbox的 onPage之类的事件来实现分页,但是很遗憾我没有试验成功,哪位tx搞出来
给我留个言分享一下。注释数据绑定可以自动地把一个 java.util.List构造成ListModel的实现类,上面代码中的userList
就是一个java.util.List,实现分页查询的第二条思路就是从list下手,自己写一个能够使用hibernate实现分页的list,我
正是这样做的。
当然不是从头开始写一个list的实现类而是采用Proxy模式把通过Hibernate查询出来的list对象包裹一下,首先需要通
过hibernate查询出一个list来作为被代理的对象,这个list保存了本页要显示的数据,如果每页显示20条数据,那么这个
list的长度就是20,接着需要当前页最后一条记录序号保存起来,最后重写get方法,根据最后记录序号、每页显示条数判
断是否需要分页以及是向前翻页还是向后翻页。get方法的代码如下:
- @Override
- public Object get(int index) {
- if(index>=last||index<=last-limit*2){
- this.fullData(index, limit);
- index = 0;
- if(list.size()==0)
- return null;
- else
- return list.get(index);
- }else{
- index = index-(last-limit);
- if(list.size()==0)
- return null;
- else
- return list.get(index);
- }
- }
@Override public Object get(int index) { if(index>=last||index<=last-limit*2){ this.fullData(index, limit); index = 0; if(list.size()==0) return null; else return list.get(index); }else{ index = index-(last-limit); if(list.size()==0) return null; else return list.get(index); } }
其中list就是被代理的对象,last就是最后一条记录的序号,limit是每页显示的记录数,fullData是具体执行分页查询的方
法。调用get时传入记录下标index如果大于等于最后一条记录的序号(记录序号是从1开始计数的)那么就向后翻页,如果
index小于等于上一页起始记录序号,那么需要向后翻页,不管是向后翻页还是向前翻页都需要重新查询从index到
index+limit的记录。数据实际上是放在被代理的list中的,要从被代理的list取出数据,那么下标始终是从0开始,所以需
要把这里传入的index转化成0开始的相对下标,下面就是进行转化的代码
index=index-(last-limit);
如果仅仅是对全表数据进行分页显示,这样做完全没有问题,但实际工作往往是需要对数据进行过滤的,也就是说这个分页
的list需要能够保证分页的时候能够执行带过滤条件的分页查询,所以这个分页list中用list来保存hibernate的Criterion对
象,在fullData新建一个criteria把这些Criterion都加进去。下面是fullData的代码:
- public void fullData(int start, int limit) {
- this.last = start + limit;
- this.limit = limit;
- list = new ArrayList(limit);
- SessionFactory sf = (SessionFactory) SpringUtil
- .getBean("sessionFactory");
- Session session = sf.openSession();
- Criteria criteria = session.createCriteria(clazz);
- for (Criterion crierion : listCriteria) {
- criteria.add(crierion);
- }
- criteria.setFirstResult(start);
- criteria.setMaxResults(start + limit);
- List result = criteria.list();
- if (result != null) {
- Iterator iterator = result.iterator();
- while (iterator.hasNext()) {
- list.add(iterator.next());
- }
- }
- session.close();
- }
public void fullData(int start, int limit) { this.last = start + limit; this.limit = limit; list = new ArrayList(limit); SessionFactory sf = (SessionFactory) SpringUtil .getBean("sessionFactory"); Session session = sf.openSession(); Criteria criteria = session.createCriteria(clazz); for (Criterion crierion : listCriteria) { criteria.add(crierion); } criteria.setFirstResult(start); criteria.setMaxResults(start + limit); List result = criteria.list(); if (result != null) { Iterator iterator = result.iterator(); while (iterator.hasNext()) { list.add(iterator.next()); } } session.close(); }
fullData还有一个重要的作用就是初始化被代理的list,这段代码都是hibernate的操作。
下面就把完整的代码贴出来,实体类就不贴附件里有代码。
1、memberList.zul
- <?xml version="1.0" encoding="UTF-8"?>
- <?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?>
- <?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" arg0="./demo"?>
- <window id="demo">
- <zscript language="javascript" src="memberList.js">
- </zscript>
- <groupbox id="main" mold="3d" width="100%">
- <caption label="View">
- <button label="新 增" height="18px"
- onClick="newUserWin.doModal();" />
- <button label="查 询" height="18px"
- onClick="queryUserWin.doModal();" />
- <button label="修 改" height="18px"
- onClick="updateUserWin.doModal();" />
- </caption>
- <window id="userWin">
- <listbox id="userListBox" mold="paging"
- model="@{memberList}" selectedItem="@{selectedMember}">
- <listhead>
- <listheader label="登陆名" sort="auto" />
- <listheader label="中文名" sort="auto" />
- <listheader label="注册日期" sort="auto" />
- </listhead>
- <listitem self="@{each=member}">
- <listcell label="@{member.loginname}" />
- <listcell label="@{member.truename}" />
- <listcell label="@{member.registDate}" />
- </listitem>
- </listbox>
- </window>
- </groupbox>
- <window id="newUserWin" visible="false" width="480px">
- <groupbox mold="3d" width="100%">
- <caption label="新增用户"></caption>
- <grid>
- <rows>
- <row>
- <label value="帐 号" />
- <textbox id="user_loginname"
- value="@{member.loginname}" constraint="/.{2,4}/:长度在2,4之间" />
- </row>
- <row>
- <label value="用户名" />
- <textbox id="user_truename"
- value="@{member.truename}" />
- </row>
- <row>
- <label value="密 码" />
- <textbox id="user_password"
- value="@{member.password}" />
- </row>
- </rows>
- </grid>
- <separator />
- <hbox spacing="10px">
- <space bar="false" spacing="10px" />
- <button label="确 定" onClick="save()" />
- <button label="取 消"
- onClick="newUserWin.setVisible(false);" />
- </hbox>
- </groupbox>
- </window>
- <window id="queryUserWin" visible="false" width="480px">
- <groupbox mold="3d" width="100%">
- <caption label="查询用户"></caption>
- <grid>
- <rows>
- <row>
- <label value="帐 号" />
- <textbox id="query_loginname" />
- </row>
- <row>
- <label value="用户名" />
- <textbox id="query_truename" />
- </row>
- </rows>
- </grid>
- <separator />
- <hbox spacing="10px">
- <space bar="false" spacing="10px" />
- <button label="查 询" onClick="javascript:query();" />
- <button label="取 消"
- onClick="queryUserWin.setVisible(false);" />
- </hbox>
- </groupbox>
- </window>
- <window id="updateUserWin" visible="false" width="480px">
- <groupbox mold="3d" width="100%">
- <caption label="修改用户"></caption>
- <grid>
- <rows>
- <row>
- <label value="帐 号" />
- <textbox value="@{selectedUser.loginname}" />
- </row>
- <row>
- <label value="用户名" />
- <textbox value="@{selectedUser.truename}" />
- </row>
- <row>
- <label value="密 码" />
- <textbox value="@{selectedUser.password}" />
- </row>
- </rows>
- </grid>
- <separator />
- <hbox spacing="10px">
- <space bar="false" spacing="10px" />
- <button label="确 定" onClick="javascript:update();" />
- <button label="取 消"
- onClick="updateUserWin.setVisible(false);" />
- </hbox>
- </groupbox>
- </window>
- </window>
<?xml version="1.0" encoding="UTF-8"?> <?variable-resolver class="org.zkoss.zkplus.spring.DelegatingVariableResolver"?> <?init class="org.zkoss.zkplus.databind.AnnotateDataBinderInit" arg0="./demo"?> <window id="demo"> <zscript language="javascript" src="memberList.js"> </zscript> <groupbox id="main" mold="3d" width="100%"> <caption label="View"> <button label="新 增" height="18px" onClick="newUserWin.doModal();" /> <button label="查 询" height="18px" onClick="queryUserWin.doModal();" /> <button label="修 改" height="18px" onClick="updateUserWin.doModal();" /> </caption> <window id="userWin"> <listbox id="userListBox" mold="paging" model="@{memberList}" selectedItem="@{selectedMember}"> <listhead> <listheader label="登陆名" sort="auto" /> <listheader label="中文名" sort="auto" /> <listheader label="注册日期" sort="auto" /> </listhead> <listitem self="@{each=member}"> <listcell label="@{member.loginname}" /> <listcell label="@{member.truename}" /> <listcell label="@{member.registDate}" /> </listitem> </listbox> </window> </groupbox> <window id="newUserWin" visible="false" width="480px"> <groupbox mold="3d" width="100%"> <caption label="新增用户"></caption> <grid> <rows> <row> <label value="帐 号" /> <textbox id="user_loginname" value="@{member.loginname}" constraint="/.{2,4}/:长度在2,4之间" /> </row> <row> <label value="用户名" /> <textbox id="user_truename" value="@{member.truename}" /> </row> <row> <label value="密 码" /> <textbox id="user_password" value="@{member.password}" /> </row> </rows> </grid> <separator /> <hbox spacing="10px"> <space bar="false" spacing="10px" /> <button label="确 定" onClick="save()" /> <button label="取 消" onClick="newUserWin.setVisible(false);" /> </hbox> </groupbox> </window> <window id="queryUserWin" visible="false" width="480px"> <groupbox mold="3d" width="100%"> <caption label="查询用户"></caption> <grid> <rows> <row> <label value="帐 号" /> <textbox id="query_loginname" /> </row> <row> <label value="用户名" /> <textbox id="query_truename" /> </row> </rows> </grid> <separator /> <hbox spacing="10px"> <space bar="false" spacing="10px" /> <button label="查 询" onClick="javascript:query();" /> <button label="取 消" onClick="queryUserWin.setVisible(false);" /> </hbox> </groupbox> </window> <window id="updateUserWin" visible="false" width="480px"> <groupbox mold="3d" width="100%"> <caption label="修改用户"></caption> <grid> <rows> <row> <label value="帐 号" /> <textbox value="@{selectedUser.loginname}" /> </row> <row> <label value="用户名" /> <textbox value="@{selectedUser.truename}" /> </row> <row> <label value="密 码" /> <textbox value="@{selectedUser.password}" /> </row> </rows> </grid> <separator /> <hbox spacing="10px"> <space bar="false" spacing="10px" /> <button label="确 定" onClick="javascript:update();" /> <button label="取 消" onClick="updateUserWin.setVisible(false);" /> </hbox> </groupbox> </window> </window>
注意zul文件开头处理指令variable-resolver指定了org.zkoss.zkplus.spring.DelegatingVariableResolver来处理
EL中的变量,使用这个类可以在EL中直接使用spring定义的bean id,例如
<variables mService="${memberService}" />
就是引用spring ApplictionContext中id为memberService的bean来定义名为mService的变量。init指令初始化了
org.zkoss.zkplus.databind.AnnotateDataBinderInit,这个类用来就是用来实现数据绑定的,至于是怎么实现的我
也不太清楚,只知道初始化后就可以使用数据绑定了。
2、memberList.js
- var member = new com.liyuan.spore.entity.Member();
- var memberList = memberService.queryAllUser();
- var selectedMember = memberList.get(0);
- function save(){
- if(memberService.userIsExist(member.loginname)){
- memberService.saveNewUser(member);
- newUserWin.setVisible(false);
- }else
- throw new WrongValueException(user_loginname, "账号已存在!");
- }
- function query(){
- var loginname=queryUserWin.getFellow("query_loginname").value;
- var truename=queryUserWin.getFellow("query_truename").value;
- var queryUser = new com.liyuan.spore.entity.Member();
- if(!"".equals(loginname))
- queryUser.setLoginname("%"+loginname+"%");
- if(!"".equals(truename))
- queryUser.setTruename("%"+truename+"%");
- ulist = main.getFellow("userWin").getFellow("userListBox");
- newList = new org.zkoss.zkplus.databind.BindingListModelList(memberService.query(queryUser),true);
- ulist.setModel(newList);
- selectedMember = newList.getElementAt(0);
- queryUserWin.setVisible(false);
- }
- function update(){
- memberService.modify(selectedUser);
- }
var member = new com.liyuan.spore.entity.Member(); var memberList = memberService.queryAllUser(); var selectedMember = memberList.get(0); function save(){ if(memberService.userIsExist(member.loginname)){ memberService.saveNewUser(member); newUserWin.setVisible(false); }else throw new WrongValueException(user_loginname, "账号已存在!"); } function query(){ var loginname=queryUserWin.getFellow("query_loginname").value; var truename=queryUserWin.getFellow("query_truename").value; var queryUser = new com.liyuan.spore.entity.Member(); if(!"".equals(loginname)) queryUser.setLoginname("%"+loginname+"%"); if(!"".equals(truename)) queryUser.setTruename("%"+truename+"%"); ulist = main.getFellow("userWin").getFellow("userListBox"); newList = new org.zkoss.zkplus.databind.BindingListModelList(memberService.query(queryUser),true); ulist.setModel(newList); selectedMember = newList.getElementAt(0); queryUserWin.setVisible(false); } function update(){ memberService.modify(selectedUser); }
第2行,调用memberService.queryAllUser()获取一个可以分页的list在memberList.zul中又通过注释的方式把数据绑
定到了listbox上。这里的memberService是直接通过org.zkoss.zkplus.spring.DelegatingVariableResolver引用
的spring ApplicationContext中定义的bean。
3、MemberService
- package com.liyuan.spore.zkdemo;
- import java.math.BigDecimal;
- import java.util.List;
- import org.hibernate.Criteria;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.criterion.Example;
- import org.hibernate.criterion.Projections;
- import org.hibernate.criterion.Restrictions;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Qualifier;
- import org.springframework.context.annotation.Scope;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Propagation;
- import org.springframework.transaction.annotation.Transactional;
- import com.liyuan.spore.entity.Member;
- @Service("memberService")
- @Scope("request")
- public class MemberService {
- private SessionFactory sessionFactory;
- @Autowired
- public void setSessionFactory(@Qualifier("sessionFactory")
- SessionFactory sessionFactory) {
- this.sessionFactory = sessionFactory;
- }
- @Transactional(readOnly = true, propagation = Propagation.REQUIRED)
- public PagingList queryAllUser() {
- Session session = sessionFactory.getCurrentSession();
- Query query = session.createSQLQuery("select count(*) from T_MEMBER");
- BigDecimal size = (BigDecimal) query.uniqueResult();
- PagingList plist = new PagingList(Member.class, size.intValue());
- plist.fullData(0, 20);
- return plist;
- }
- @Transactional(readOnly = true, propagation = Propagation.REQUIRED)
- public boolean userIsExist(String loginname) {
- Session session = sessionFactory.getCurrentSession();
- List list = session.createCriteria(Member.class).add(
- Restrictions.eq("loginname", loginname)).list();
- return list.isEmpty();
- }
- @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
- public void saveNewUser(Member user) {
- Session session = sessionFactory.getCurrentSession();
- session.save(user);
- }
- @Transactional(readOnly = true, propagation = Propagation.REQUIRED)
- public PagingList query(Member user) {
- Session session = sessionFactory.getCurrentSession();
- Example example = Example.create(user);
- example.enableLike();
- example.excludeZeroes();
- example.excludeNone();
- Criteria criteria = session.createCriteria(Member.class);
- criteria.setProjection(Projections.rowCount()).add(example);
- Integer size = (Integer) criteria.uniqueResult();
- PagingList plist = new PagingList(Member.class, size.intValue());
- plist.addCriterion(example);
- plist.fullData(0, 20);
- return plist;
- }
- @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
- public void modify(Member user) {
- Session session = sessionFactory.getCurrentSession();
- session.update(user);
- }
- }
package com.liyuan.spore.zkdemo; import java.math.BigDecimal; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Example; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import com.liyuan.spore.entity.Member; @Service("memberService") @Scope("request") public class MemberService { private SessionFactory sessionFactory; @Autowired public void setSessionFactory(@Qualifier("sessionFactory") SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @Transactional(readOnly = true, propagation = Propagation.REQUIRED) public PagingList queryAllUser() { Session session = sessionFactory.getCurrentSession(); Query query = session.createSQLQuery("select count(*) from T_MEMBER"); BigDecimal size = (BigDecimal) query.uniqueResult(); PagingList plist = new PagingList(Member.class, size.intValue()); plist.fullData(0, 20); return plist; } @Transactional(readOnly = true, propagation = Propagation.REQUIRED) public boolean userIsExist(String loginname) { Session session = sessionFactory.getCurrentSession(); List list = session.createCriteria(Member.class).add( Restrictions.eq("loginname", loginname)).list(); return list.isEmpty(); } @Transactional(readOnly = false, propagation = Propagation.REQUIRED) public void saveNewUser(Member user) { Session session = sessionFactory.getCurrentSession(); session.save(user); } @Transactional(readOnly = true, propagation = Propagation.REQUIRED) public PagingList query(Member user) { Session session = sessionFactory.getCurrentSession(); Example example = Example.create(user); example.enableLike(); example.excludeZeroes(); example.excludeNone(); Criteria criteria = session.createCriteria(Member.class); criteria.setProjection(Projections.rowCount()).add(example); Integer size = (Integer) criteria.uniqueResult(); PagingList plist = new PagingList(Member.class, size.intValue()); plist.addCriterion(example); plist.fullData(0, 20); return plist; } @Transactional(readOnly = false, propagation = Propagation.REQUIRED) public void modify(Member user) { Session session = sessionFactory.getCurrentSession(); session.update(user); } }
这段代码没有什么好解释的。
4、PagingList.java
- package com.liyuan.spore.zkdemo;
- import java.util.AbstractList;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.LinkedList;
- import java.util.List;
- import java.util.ListIterator;
- import org.hibernate.Criteria;
- import org.hibernate.Session;
- import org.hibernate.SessionFactory;
- import org.hibernate.criterion.Criterion;
- import org.zkoss.zkplus.spring.SpringUtil;
-
public class PagingList extends AbstractList implements java.io.Serializable { </
- CodeSpore.rar (8.4 KB)
- 下载次数: 77
发表评论
-
采用java.util.concurrent.Semaphore 类实现对资源限制访问量
2010-10-27 14:59 1953package com.citicbank.vipfund.w ... -
zk中message的封装
2009-06-14 16:23 1967最近,用zk的message老感觉填写东西很麻烦,就对它做了此 ... -
zk如何调用本地javascript代码向服务器端发送数据
2009-06-11 20:55 4846今天,折腾了一个上午,加下午1个小时,终于实现了zk页面中,如 ... -
使用zk的bandbox和listbox实现的一个具有搜索功能的combobox(实现后台分页)
2009-06-10 14:37 3948在图片附件中有效果图,可以先看一下. 先说下来由:因 ... -
根据sql查询实现zk Listbox翻页显示数据
2009-06-10 14:07 2403最近一直在研究如何封装zk的Listbox,实现简单的 ... -
zk中定义布局模版实现
2009-06-02 23:03 3095在项目的开发过程中,有些布局是固定的,为了布局的统一,通常会制 ... -
zk中动态产生多个组件的实现
2009-06-02 22:34 3478zk动态产生多个页面的例子代码: /** * * ... -
zk框架中常见问题的解决续
2009-06-02 21:02 30761、局部刷新 /** * 刷新页面* */ ... -
zk框架中常见问题的解决
2009-06-01 22:10 119111、打开浏览器窗口常用于超链接 /** * 重新打开 ... -
zk中zul页面中组件的id和java类中的变量绑定实现
2009-06-01 21:58 7101zul 页面 index.zul <?xml ver ... -
zk组件开发指南(3)
2009-06-01 21:01 50713.展现层 在客户端,展 ... -
zk组件开发指南(2)
2009-06-01 20:52 43112. 句柄Handle 句柄是运行在服务器端可以被应 ... -
zk组件开发指南(1)
2009-06-01 20:09 37881.简介 ... -
zk组件开发指南(目录)
2009-06-01 19:40 2803声明:本人翻译水平有限,有误之处请多指教。 ...
相关推荐
本话题主要探讨如何在ZK框架下,结合MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)两种设计模式来实现动态分页功能。 首先,我们来了解一下ZK框架。ZK是一款基于Java的开源富客户端用户界面框架,它...
ZK通过事件驱动机制,使得用户在界面上的操作能够即时反映到服务器,实现了真正的富客户端体验。 2. **JSP(JavaServer Pages)** JSP是Java Web开发中的视图层技术,用于生成动态网页。它允许我们在HTML代码中...
本文将深入探讨ZK树的递归实现及其相关知识点。 首先,我们需要理解什么是零知识证明(Zero-Knowledge Proof)。这是一种密码学概念,使得证明者可以在不泄露任何有用信息的情况下,向验证者证明自己知道某个秘密。...
在分布式系统中,确保数据的一致性和正确性是至关重要的,而ZooKeeper与Curator的结合使用就是解决这一问题的有效方案。ZooKeeper是一个高度可靠的分布式协调服务,它提供了诸如分布式锁、队列和配置管理等核心功能...
使用方法: 1.解压后classes\foo\jmtest目录 直接覆盖在 被测的ZK平台对应目录中(WEB-INF下)。 2.修改zk.xml文件,添加下面内容(WEB-INF下) <system-config> <id-generator-class>foo.jmtest....
该源代码对应本人博文《zk-SNARKs实战:使用circom和snarkjs实现简单版的Tornado(含源码)》,如要看该文章,可直接在百度中根据题目搜索
主要介绍了zk+spring+hibernate的使用方法 早期使用的是 hibernate的配置文件 后来 被改成了 引用注释的方式 老的绑定文件也没有删除,sql下面由数据库文件 导入mysql就可以,不错的教学例子 学习起来很简单
结合`ZK`和`jQuery`,我们可以利用`jQuery`的强大力量来实现动态效果,同时利用`ZK`的组件特性和服务器端处理能力。在描述中提到的博文中,作者可能讲解了如何在`ZK`组件上绑定`jQuery`的事件,以及如何通过`jQuery`...
4. **Ajax通信**:理解ZK如何使用Ajax技术实现无刷新交互,提升用户体验。 5. **ZUL脚本**:学习ZK特有的ZUL(ZK User Interface Language)脚本,用于定义用户界面布局和交互逻辑。 6. **ZK Studio的使用**:熟练...
在使用ZK作为UI框架时,推荐使用ZK提供的JSP标签,可以适当结合ZUML语言。为了在JSP页面中使用ZK标签,需要引用相关的jar包,并进行相应的配置。ZK的JSP标签jar包位于项目的lib文件夹下,例如zk601是ZK 6.0.1版本的...
2. **ZUL页面与Window类的交互**:可以使用`<window id="win" use="com.cares.MyWindow">`或`<window id="win" apply="com.cares.MyApply">`将ZUL页面与自定义的Java类关联起来,实现数据绑定和业务逻辑处理。...
- **MyBatis集成**:ZK与MyBatis结合,可以便捷地处理数据库操作,实现数据持久化。 - **WebSocket支持**:ZK提供了WebSocket支持,可用于实现实时通信功能。 **5. ZK开发最佳实践** - **组件重用**:合理设计...
4. **配置ZK-Spring**:需要引入ZK-Spring的库,这是一个连接ZK和Spring的桥梁,它提供了Spring的ApplicationContext到ZK Session的绑定,使得ZK组件可以直接使用Spring的Bean。 5. **事务管理**:由于Spring对事务...
与ZK结合使用时,Spring可以管理ZK组件的生命周期,提供更强大的控制和灵活性。ZK-Spring桥接器jar是连接这两者的桥梁,它允许你在Spring容器中配置和管理ZK组件。 再者,Hibernate4是ORM(对象关系映射)工具,...
本压缩包“zk:redis分布式锁.zip”提供了基于Zookeeper(zk)和Redis两种分布式锁实现的示例和相关资料。 首先,我们来看Zookeeper(zk)的分布式锁。Zookeeper是Apache的一个开源项目,提供了一个高可用的、高性能...
总结来说,ZK Framework结合ZK Studio为Java Web开发者提供了一个高效、便捷的开发环境,通过Eclipse插件的形式,简化了ZK应用的创建、调试和维护过程,使得开发者能够更专注于业务逻辑,而不是底层的技术细节。
ZK框架的独特之处在于它结合了Ajax技术与桌面应用的交互体验,使开发者能够通过简单的代码实现复杂的用户界面。在本文中,我们将深入探讨ZK框架的核心特性、工作原理以及如何使用ZK进行Web应用开发。 **一、ZK框架...
3. **开发环境**:使用ZK32 SDK时,开发者通常需要有合适的开发环境,如Visual Studio或其他支持C/C++编程的IDE,以便能够编译和调试利用这些库的代码。 4. **生物识别技术**:ZK32库的核心功能可能涉及多种生物...
- **与Java紧密结合**:虽然这一点是ZK的优势之一,但也意味着对于组件的定制和扩展只能通过Java语言来实现,缺乏与业务逻辑层的解耦。 - **学习资源有限**:尽管ZK框架功能强大,但相较于其他主流框架,其学习...