`

zk最佳实践

    博客分类:
  • 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等实现。
分享到:
评论

相关推荐

    ZK分布式一致性原理与实践

    此外,书中还会涉及Zookeeper在实际项目中的最佳实践,如如何配置和部署Zookeeper集群,如何优化性能,以及在遇到故障时如何进行排查和恢复。这对于开发者和运维人员来说,是非常实用的知识。 总的来说,《从PAXOS...

    zkframework Eclipse插件 zkstudio ZK Studio

    4. **ZK应用向导**:快速创建新的ZK项目和组件,引导开发者按照最佳实践进行开发。 5. **ZUL文件支持**:ZK的视图文件通常以.ZUL为扩展名,ZK Studio提供了对ZUL文件的语法高亮和错误检查。 6. **调试工具**:集成ZK...

    ZK安装 ZK入门 开发 讲解 共3个pdf

    最后,"ZK-3.0.0 devguide.pdf"是ZK 3.0.0版本的开发指南,它提供了更深入的技术细节和最佳实践。这份文档不仅包含基础组件的用法,还涵盖了高级特性和定制化开发,例如自定义组件、国际化、权限控制、移动支持以及...

    ZK中文开发手册 html

    通过阅读和实践《ZK开发手册(中文)》,开发者不仅能掌握ZK框架的基本用法,还能深入了解其高级特性和最佳实践,从而更高效地开发出高质量的Web应用程序。对于那些希望提升Web应用用户体验、减少前端复杂性的开发者来...

    ZK Style Guide

    指南通常会包含大量的代码示例和最佳实践,帮助开发者理解如何在实际项目中应用样式。这些示例涵盖了从基础组件样式到复杂布局的多种场景。 7. **性能优化** 在处理大量组件和复杂样式时,性能优化是必不可少的。...

    ajax框架 zk开发手册

    ZK开发最佳实践** - **组件重用**:合理设计组件,提高代码复用率,减少重复工作。 - **性能优化**:注意页面加载和更新的性能,合理使用缓存和异步请求。 - **错误处理**:良好的错误处理机制能提升应用的稳定...

    zk框架demo

    通过阅读和运行这个项目,开发者可以更直观地理解ZK的工作方式,并从中学习到实际开发中的最佳实践。 **四、总结** ZK框架以其简洁的API、强大的组件库和优秀的用户体验,成为了开发富客户端Web应用的有力工具。...

    zk.zip_zk

    通过阅读这本书,开发者可以全面掌握ZK 5的核心技术和最佳实践,从而在Web开发领域中游刃有余。 总之,ZK 5是一个强大且易用的Web开发框架,它的事件驱动模型、丰富的组件库、灵活的布局管理以及ZUL脚本语言,都极...

    ZK 8.5.1API

    在API文档中,开发者可以找到关于优化应用性能的提示和最佳实践。 最后,ZK 8.5.1的API文档还会包含关于国际化、权限控制、数据绑定和AJAX集成等方面的信息,这些都是构建现代Web应用不可或缺的部分。开发者可以...

    zk组件封装demo

    10. **最佳实践**:学习和遵循ZooKeeper的最佳实践,例如合理设置会话超时时间,避免频繁的Watcher注册和取消等。 通过这个"zk组件封装demo",开发者可以学习如何在具体项目中高效地集成和使用ZooKeeper,提高代码...

    zk框架所需jar包

    了解以上知识点后,你可以通过解压提供的"zk-3.6.1"文件,获取到运行ZooKeeper所需的JAR包,将它们添加到你的项目类路径中,然后根据ZooKeeper的API和最佳实践来构建和使用分布式协调服务。在使用过程中,确保理解...

    ZK.rar_zk_zk study

    8. **最佳实践**:分享使用ZooKeeper时的一些经验教训,如数据一致性策略、性能优化建议等。 9. **案例研究**:可能会有具体的案例分析,展示如何解决特定问题或实现特定功能。 10. **进阶话题**:可能涵盖更高级...

    zk中文开发手册pdf版(基于3.5.1)

    8. **最佳实践**:书中还包含了性能优化技巧、错误排查方法以及项目部署建议,帮助你构建高效稳定的ZK应用。 9. **ZK生态系统**:除了核心框架,ZK还有丰富的扩展库和插件,如ZK Spring、ZK Mobile等,手册会介绍...

    zk-src-5.0.7.1(zk源码)

    通过分析Zookeeper的内部实现,我们可以学习如何构建高可用、高一致性的分布式服务,这对于理解分布式系统的设计思想和最佳实践至关重要。在实际开发中,结合源码分析可以更好地解决遇到的问题,提升系统性能,保障...

    zk开发全套资料(插件,开发手册,jar包,笔记和程序事例)

    4. **笔记**:个人笔记通常包含了开发者在学习和实践ZK过程中总结的经验和技巧,可能是解决特定问题的方法、性能优化建议或者对某些复杂概念的通俗解释。这些笔记对于初学者来说非常宝贵,能帮助他们避免常见错误,...

    ZK 开发下向导ZK的开发说明

    6. **最佳实践** - **合理设计ZNode结构**:避免过多深层节点,保持简洁清晰。 - **处理好Watcher**:避免无限递归或大量事件导致的性能问题。 - **正确处理版本冲突**:更新节点时注意版本匹配,防止并发操作...

    腾讯云TDSQL独立部署最佳实践

    以下将结合提供的内容,详细说明TDSQL独立部署的最佳实践。 1. 环境规划 在开始独立部署前,需要做好环境规划。这包括创建四台云主机或本地虚拟机,规划主机名称和IP地址,包括公网和内网地址,并确定部署的服务。...

    ZK开发手册 3.06 Word版

    13. **最佳实践**:手册中可能会包含一系列最佳实践,帮助开发者遵循良好的编程习惯,提高代码质量和可维护性。 通过深入学习《ZK开发手册 3.06 Word版》,开发者不仅能掌握ZK框架的基本用法,还能理解其内在设计...

    ZK 3.6.0快速指南英文PDF版

    8. **最佳实践和示例**:提供实用的代码示例和最佳实践,帮助开发者快速上手。 **提供的文档** - **ZK-quickstart-3.0.0-cn.doc**:这可能是ZK 3.0.0版本的中文快速启动指南,虽然版本号与标题中的3.6.0不符,但...

Global site tag (gtag.js) - Google Analytics