zk两种分页方式之比较

ZK提供两种分页方式,一种是自带的“mold="paging"”的形式;另一种是采用“<paging>”组件添加分页功能。具体实现如下:

[b]第一种:采用自带的“mold="paging"”:[/b]

infoList.zul:

<zk>
<window id="mainwin" border="normal" width="600px"
apply="${myComposer}">
<listbox id="li" mold="paging" pageSize="5">
<listhead>
<listheader label="Id" sort="auto(Id)"/>
<listheader label="Name" sort="auto(Name)"/>
<listheader label="Address" sort="auto(Address)"/>
<listheader />
</listhead>
<listitem self="@{each=in }">
<listcell id="colId" label="@{in.id }"></listcell>
<listcell id="colName" label="@{in.name }"></listcell>
<listcell id="colAddr" label="@{in.address }"></listcell>
<listcell></listcell>
</listitem>
</listbox>
</window>
</zk>

后台控制类 MyComposer.java:
public class MyComposer extends GenericForwardComposer {

protected Textbox name;
protected Textbox address;
private Listbox li;

private Window mainwin;

private AnnotateDataBinder binder;

private Service service;
private List<Info> infoList;
private int totalsize;

public void setInfoList(List<Info> infoList) {
this.infoList = infoList;
}

public void setService(Service service) {
this.service = service;
}

public void onCreate$mainwin(Event event) throws Exception {
binder = new AnnotateDataBinder(mainwin);
binder.loadAll();
}

public void doAfterCompose(Component component) throws Exception {
super.doAfterCompose(component);

infoList = service.findAllInfos();
totalsize = infoList.size();

li.setModel(new ListModelList(infoList));
li.setItemRenderer(new ListitemRenderer() {
@Override
public void render(Listitem item, Object data) throws Exception {
// TODO Auto-generated method stub
Info itinfo = (Info) data;

Listcell colId = new Listcell();
Listcell colName = new Listcell();
Listcell colAddr = new Listcell();

colId.setLabel(itinfo.getId().toString());
colId.setParent(item);

colName.setLabel(itinfo.getName());
colName.setParent(item);

colAddr.setLabel(itinfo.getAddress());
colAddr.setParent(item);
}
});
}
}

[b]第二种:采用“<paging>”组件进行分页:[/b]

paging.zul:
[code]
<zk>
<window id="pagingWin" title="paging" border="normal"
apply="${paging_ctrl}">
<grid>
<rows>
<row>人员列表:</row>
<row>
<listbox id="li" width="100%">
<listhead>
<listheader label="ID" sort="auto(Id)" />
<listheader label="姓名" />
<listheader label="地址" />
</listhead>
</listbox>
<separator />
</row>
</rows>
</grid>
<paging id="pge" pageSize="10"></paging>
</window>
</zk>[/code]

后台控制类Paging_ctrl.java:
public class Paging_ctrl extends GenericForwardComposer {
private AnnotateDataBinder binder;

private Window pagingWin;
private Listbox li;
private Paging pge;

private List<Info> infoList;
int maxCount = 0;
private Service service;

public void onCreate$pagingWin(Event event) throws Exception {
binder = new AnnotateDataBinder(pagingWin);
binder.loadAll();
}

public void doAfterCompose(Component component) throws Exception {
super.doAfterCompose(component);

maxCount = service.findAllInfos().size();
pge.setTotalSize(maxCount);
final int PAGE_SIZE = pge.getPageSize();

redraw(0, PAGE_SIZE);

pge.addEventListener("onPaging", new EventListener() {
public void onEvent(Event event) {
PagingEvent pe = (PagingEvent) event;
int pgno = pe.getActivePage();// 页数(从零计算)
int start = pgno * PAGE_SIZE;

redraw(start, PAGE_SIZE);
}
});
}

@SuppressWarnings("unchecked")
private void redraw(int offSet, int pageSize) {
li.getItems().clear();

List<Info> list = service.findInfoByPage(offSet, pageSize);

for (Info info : list) {
Listitem item = new Listitem();
item.setValue(info);
item.appendChild(new Listcell("" + info.getId()));
item.appendChild(new Listcell(info.getName()));
item.appendChild(new Listcell(info.getAddress()));
li.appendChild(item);
}
}

public void setService(Service service) {
this.service = service;
}

}


[b][color=brown]分析:
第一种方式是把数据全部加载到内存再进行分页,达到几十W跳数据后将降低性能;
而第二种方式则采用hibernate的分页查询方式,性能将大大加强。因此推荐第二种方式。[/color][/b]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值