zk最佳实践

转载:http://hi.baidu.com/jspring/blog
zk开发时,如果在zul页面中写大量的script,这样写起来非常不方便也很容易出错,而且官方也有说明这样性能会有所下降。因此建议将script还是尽量写到java类中。

一个zul页面包括一个window,然后对应一个window java文件。

<?xml version="1.0" encoding="utf-8"?>
<window title="------" border="normal" use="XXX.RawBackWindow">
<style src="/css/main.css"></style>
<label value="时间:" /><datebox id="db_st" /><label value="至" style="padding:0 3px;"/><datebox id="db_et" style="margin-right:3px;"/><listbox mold="select" id="ls_reason" rows="1" style="margin-right:3px;"/><button label="搜索" forward="onSearch" /><space bar="false" spacing="100px"/><label id="ctotal"></label>
<separator/>
<grid id="gd_rawback">
   <columns>
    <column label="物料代码" width="20%"/>
    <column label="物料名称" width="40%"/>
    <column label="退货原因" width="20%"/>
    <column label="数量" width="20%"/>
   </columns>
</grid>
<paging id="pg"/>
</window>

对应的window类

public class RawBackWindow extends PageWindow {
private Map cond = new HashMap();
private RawBackService rawBackService;
private MetaContentService metaService;
private Grid gd_rawback;
private Paging pg;
private Datebox db_st;
private Datebox db_et;
private Listbox ls_reason;
private Label ctotal;


public void onCreate() {
   rawBackService= (RawBackService)SpringUtil.getBean("rawBackService");
   metaService= (MetaContentService)SpringUtil.getBean("metaService");
   ls_reason = (Listbox)getFellow("ls_reason");
   ctotal = (Label)getFellow("ctotal");
   windowInit();
}

private void windowInit() {
   gd_rawback = (Grid)getFellow("gd_rawback");
   gd_rawback.setRowRenderer(new RawBackRenderer());
   pg = (Paging)getFellow("pg");
   db_st = (Datebox)getFellow("db_st"); 
   db_et = (Datebox)getFellow("db_et");
   db_st = (Datebox)getFellow("db_st"); 
   db_st.setFormat(Constants.DATE_FORMAT);
   db_et = (Datebox)getFellow("db_et");
   db_et.setFormat(Constants.DATE_FORMAT);
   initLsReason();
   //默认统计当前月前一月的数据
   db_st.setValue(TimeUtil.toDate(TimeUtil.getLastMonthDate()));
   db_et.setValue(TimeUtil.toDate(TimeUtil.getNowDate()));
   setConditionAndRefreshData();
}

/**
* 查询方法
* @throws InterruptedException
*/
public void onSearch() throws InterruptedException {
   pg.setActivePage(0);
   setConditionAndRefreshData();
}

/**
* 默认的翻页事件处理方法
* @throws InterruptedException
*/
public void onPaging() throws InterruptedException {
   setConditionAndRefreshData();
}


private void refreshData(List results) {
   ctotal.setValue(ls_reason.getSelectedItem().getLabel()+"汇总:"+rawBackService.getGroupByTotal());
   ctotal.setStyle("color:red");
   gd_rawback.setModel(new ListModelList(results));
}

/**
* 设置数据条件
*/
private void setConditionAndRefreshData() {
   cond.clear();
   cond.put("start",db_st.getValue());
   cond.put("end",db_et.getValue());
   cond.put("reason_id",ls_reason.getSelectedItem().getValue());
   refreshData(handlePaging(rawBackService,pg,cond));
}

/**
* 初始化退货原因下拉选择框
*/
private void initLsReason(){
   List<MetaContent> reasons = metaService.getByDefineId(Constants.EXPRESS_RETURN);
   ls_reason.appendItem("所有退货原因", "");
   ls_reason.setSelectedIndex(0);
   for(MetaContent reason : reasons){
    ls_reason.appendItem(reason.getValue(),String.valueOf(reason.getId()));
   }
}
}

//grid数据渲染器

public class RawBackRenderer implements RowRenderer {
private MetaContentService metaService;

public void render(Row row, Object data) throws Exception {
   metaService= (MetaContentService)SpringUtil.getBean("metaService");
   RawBack rawBack = (RawBack)data;
   bindData(row,rawBack.getK3Code());
   bindData(row,rawBack.getName());
   bindData(row,metaService.getMetaValue(Constants.EXPRESS_RETURN,rawBack.getReturnReasonId()));
   bindData(row,rawBack.getNum()+"");
}

private void bindData(Row row,String d ){
   new Label(d).setParent(row);
}
}


//扩展window类,实现分页

public abstract class PageWindow extends Window {
private final static String GET_TOTAL = "getTotal";//获取分页的总记录数方法名
private final static String PAGINATE = "paginate";//获取分页数据的方法名
/**
* 默认翻页事件处理方法
* 子类如果实现分页则需要重写此方法
* @throws InterruptedException
* @author Pure
*/
public void onPaging() throws InterruptedException{
   throw new UnsupportedOperationException("你尚未实现分页方法");
}

/**
* 处理分页数据
* @param service 业务操作对象
* @param totalMethodName 数据总记录获取方法名
* @param dataMethodName 数据获取方法名
* @param target zk翻页条对象
* @param handleMethod zk翻页条翻页处理方法名
* @param cond 获取条件
* @return 分页数据后的数据
* @author yookien、Pure
*/
public List handlePaging(UdoooPaging service,String totalMethodName,String dataMethodName,Paging target,String handleMethod,Map cond){
   if(null == service || null == totalMethodName || null == dataMethodName)return null;
   MethodInvoker mi = new MethodInvoker();
   mi.setTargetObject(service);
   target.addForward(ON_PAGING, "/", handleMethod);
   target.setPageSize(Constants.PAGE_SIZE);
   try {
    //获取总记录数
    mi.setTargetMethod(totalMethodName);
    mi.setArguments(new Object[]{cond});
    mi.prepare();
    target.setTotalSize((Integer)mi.invoke());
    target.setAutohide((target.getTotalSize()> 0)?false:true);
    target.setDetailed((target.getTotalSize()> 0)?Constants.PAGING_DETAILED:false);

    //获取一页的数据
    mi.setTargetMethod(dataMethodName);
    mi.setArguments(new Object[]{target.getActivePage()*target.getPageSize(),target.getPageSize(),cond});
    mi.prepare();
    return (List)mi.invoke();
   } catch (Exception e) {
    e.printStackTrace();
    return null;
   }
}

/**
* 处理分页数据
* @param service 业务操作对象
* @param totalMethodName 数据总记录获取方法名
* @param dataMethodName 数据获取方法名
* @param target zk翻页条对象
* @param cond 获取条件
* @return 分页数据后的数据
* @author Pure
*/
public List handlePaging(UdoooPaging service,String totalMethodName,String dataMethodName,Paging target,Map cond){
   return handlePaging(service,totalMethodName,dataMethodName,target,ON_PAGING,cond);
}

/**
* 处理分页数据
* @param service 业务操作对象
* @param target zk翻页条对象
* @param cond 获取条件
* @return 分页数据后的数据
* @author Pure
*/
public List handlePaging(UdoooPaging service,Paging target,Map cond){
   return handlePaging(service,GET_TOTAL,PAGINATE,target,ON_PAGING,cond);
}


/**
* 处理分页数据
* @param service 业务操作对象
* @param dataMethodName 数据获取方法名
* @param target zk翻页条对象
* @param cond 获取条件
* @return 分页数据后的数据
* @author Pure
*/
public List handlePaging(UdoooPaging service,String dataMethodName,Paging target,Map cond){
   return handlePaging(service,GET_TOTAL,dataMethodName,target,ON_PAGING,cond);
}
}



程序不多作介绍,这样分功很明确,zul是不是很干净?window这个类相当于struts2等框架的action层了,其它的业务层还是采用spring等来实现,数据持久化层采用Hibernate等实现。

你可能感兴趣的:(spring,Hibernate,框架,Blog,zk)