转载: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等实现。
分享到:
相关推荐
此外,书中还会涉及Zookeeper在实际项目中的最佳实践,如如何配置和部署Zookeeper集群,如何优化性能,以及在遇到故障时如何进行排查和恢复。这对于开发者和运维人员来说,是非常实用的知识。 总的来说,《从PAXOS...
4. **ZK应用向导**:快速创建新的ZK项目和组件,引导开发者按照最佳实践进行开发。 5. **ZUL文件支持**:ZK的视图文件通常以.ZUL为扩展名,ZK Studio提供了对ZUL文件的语法高亮和错误检查。 6. **调试工具**:集成ZK...
最后,"ZK-3.0.0 devguide.pdf"是ZK 3.0.0版本的开发指南,它提供了更深入的技术细节和最佳实践。这份文档不仅包含基础组件的用法,还涵盖了高级特性和定制化开发,例如自定义组件、国际化、权限控制、移动支持以及...
通过阅读和实践《ZK开发手册(中文)》,开发者不仅能掌握ZK框架的基本用法,还能深入了解其高级特性和最佳实践,从而更高效地开发出高质量的Web应用程序。对于那些希望提升Web应用用户体验、减少前端复杂性的开发者来...
指南通常会包含大量的代码示例和最佳实践,帮助开发者理解如何在实际项目中应用样式。这些示例涵盖了从基础组件样式到复杂布局的多种场景。 7. **性能优化** 在处理大量组件和复杂样式时,性能优化是必不可少的。...
ZK开发最佳实践** - **组件重用**:合理设计组件,提高代码复用率,减少重复工作。 - **性能优化**:注意页面加载和更新的性能,合理使用缓存和异步请求。 - **错误处理**:良好的错误处理机制能提升应用的稳定...
通过阅读和运行这个项目,开发者可以更直观地理解ZK的工作方式,并从中学习到实际开发中的最佳实践。 **四、总结** ZK框架以其简洁的API、强大的组件库和优秀的用户体验,成为了开发富客户端Web应用的有力工具。...
通过阅读这本书,开发者可以全面掌握ZK 5的核心技术和最佳实践,从而在Web开发领域中游刃有余。 总之,ZK 5是一个强大且易用的Web开发框架,它的事件驱动模型、丰富的组件库、灵活的布局管理以及ZUL脚本语言,都极...
在API文档中,开发者可以找到关于优化应用性能的提示和最佳实践。 最后,ZK 8.5.1的API文档还会包含关于国际化、权限控制、数据绑定和AJAX集成等方面的信息,这些都是构建现代Web应用不可或缺的部分。开发者可以...
10. **最佳实践**:学习和遵循ZooKeeper的最佳实践,例如合理设置会话超时时间,避免频繁的Watcher注册和取消等。 通过这个"zk组件封装demo",开发者可以学习如何在具体项目中高效地集成和使用ZooKeeper,提高代码...
了解以上知识点后,你可以通过解压提供的"zk-3.6.1"文件,获取到运行ZooKeeper所需的JAR包,将它们添加到你的项目类路径中,然后根据ZooKeeper的API和最佳实践来构建和使用分布式协调服务。在使用过程中,确保理解...
8. **最佳实践**:分享使用ZooKeeper时的一些经验教训,如数据一致性策略、性能优化建议等。 9. **案例研究**:可能会有具体的案例分析,展示如何解决特定问题或实现特定功能。 10. **进阶话题**:可能涵盖更高级...
8. **最佳实践**:书中还包含了性能优化技巧、错误排查方法以及项目部署建议,帮助你构建高效稳定的ZK应用。 9. **ZK生态系统**:除了核心框架,ZK还有丰富的扩展库和插件,如ZK Spring、ZK Mobile等,手册会介绍...
通过分析Zookeeper的内部实现,我们可以学习如何构建高可用、高一致性的分布式服务,这对于理解分布式系统的设计思想和最佳实践至关重要。在实际开发中,结合源码分析可以更好地解决遇到的问题,提升系统性能,保障...
4. **笔记**:个人笔记通常包含了开发者在学习和实践ZK过程中总结的经验和技巧,可能是解决特定问题的方法、性能优化建议或者对某些复杂概念的通俗解释。这些笔记对于初学者来说非常宝贵,能帮助他们避免常见错误,...
6. **最佳实践** - **合理设计ZNode结构**:避免过多深层节点,保持简洁清晰。 - **处理好Watcher**:避免无限递归或大量事件导致的性能问题。 - **正确处理版本冲突**:更新节点时注意版本匹配,防止并发操作...
以下将结合提供的内容,详细说明TDSQL独立部署的最佳实践。 1. 环境规划 在开始独立部署前,需要做好环境规划。这包括创建四台云主机或本地虚拟机,规划主机名称和IP地址,包括公网和内网地址,并确定部署的服务。...
13. **最佳实践**:手册中可能会包含一系列最佳实践,帮助开发者遵循良好的编程习惯,提高代码质量和可维护性。 通过深入学习《ZK开发手册 3.06 Word版》,开发者不仅能掌握ZK框架的基本用法,还能理解其内在设计...
8. **最佳实践和示例**:提供实用的代码示例和最佳实践,帮助开发者快速上手。 **提供的文档** - **ZK-quickstart-3.0.0-cn.doc**:这可能是ZK 3.0.0版本的中文快速启动指南,虽然版本号与标题中的3.6.0不符,但...