zk兩種分頁方式之比較

ZK提供兩種分頁方式,一種是自帶的“mold="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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章