- 浏览: 1899204 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
July01:
最近了解到一款StratoIO打印控件,功能如下:1、Html ...
jquery打印指定的div -
GentlemanQc:
...
quartz系列(二)spring3.2.5与quartz2.1.7集群版集成简要说明 -
静夜独窗:
你好,能说一下server.xml增加的配置是怎么影响性能的吗 ...
tomcat7.0性能优化-挑战极限精简版 -
beyondfengyu:
beyondfengyu 写道如果每个客户进程的时间不同步,时 ...
java并发(二十二)分布式锁 -
beyondfengyu:
如果每个客户进程的时间不同步,时间超前的进程是不是更容易得到锁 ...
java并发(二十二)分布式锁
一 模板方法模式简介(Template Method Pattern Introduction)
模板方法模式主要用于对算法或者行为逻辑进行封装,如果多个类中存在某些相似的算法逻辑或者行为逻辑,可以通过将这些相似的逻辑提取到模板方法类中实现,然后让相应的子类根据需要实现某些自定义的逻辑。
二 ZK的原理
1)ZK是一个页面对应着一个类,而每个页面,基本上都有很多的相似操作.例如:增加,删除,修改,查询等等.因此我们很容易想到如何把相同的逻辑抽去出来呢?模板方法模式为我们提供了良好的解决方案.下我给出所有的代码.
下面的解决方案只代表特殊,不代表普遍,具体的模板还需要根据项目中的应用具体设计.^-^
模板类可以被多个页面继承,而不需要重新编写,如果个位读者实在没有明白,我在近几日内更新文章,写出一个具体的例子与大家分享.
2)结构说明,下面的图是我这个例子中用到的项目情况
index.zul和index2.zul,对应着数据库中的2个表.他们的后台代码IndexUI.java和IndexUI2.java中,却没有增加按钮的事件,而是写到了父类中,public final void onClick$btnInsert() ;这样所有的增加操作就可以共享一个代码了.删除,修改等原理也是如此.略
mysql数据库表结构
IndexUI.java 书籍后台管理类
index2.zul 光盘管理
Book.java 书籍实体类
Disk.java 光盘实体类
Template.java
persistence.xml JPA配制文件
好的,明天我给补充上~,~ 晚上我回去酝酿
看了你的建议以后,我把代码再次更新了。这次把全部代码都贴出来了
如果有深度使用ZK的朋友,一定能体会我这个模板方法带来的优越性
恩,长期从事J2EE的开发工作
模板方法模式主要用于对算法或者行为逻辑进行封装,如果多个类中存在某些相似的算法逻辑或者行为逻辑,可以通过将这些相似的逻辑提取到模板方法类中实现,然后让相应的子类根据需要实现某些自定义的逻辑。
二 ZK的原理
1)ZK是一个页面对应着一个类,而每个页面,基本上都有很多的相似操作.例如:增加,删除,修改,查询等等.因此我们很容易想到如何把相同的逻辑抽去出来呢?模板方法模式为我们提供了良好的解决方案.下我给出所有的代码.
下面的解决方案只代表特殊,不代表普遍,具体的模板还需要根据项目中的应用具体设计.^-^
模板类可以被多个页面继承,而不需要重新编写,如果个位读者实在没有明白,我在近几日内更新文章,写出一个具体的例子与大家分享.
2)结构说明,下面的图是我这个例子中用到的项目情况
index.zul和index2.zul,对应着数据库中的2个表.他们的后台代码IndexUI.java和IndexUI2.java中,却没有增加按钮的事件,而是写到了父类中,public final void onClick$btnInsert() ;这样所有的增加操作就可以共享一个代码了.删除,修改等原理也是如此.略
mysql数据库表结构
CREATE TABLE `book` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `title` varchar(255) DEFAULT NULL, PRIMARY KEY (`Id`) ) CREATE TABLE `disk` ( `Id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `MB` varchar(255) DEFAULT NULL, PRIMARY KEY (`Id`) )index.zul 图书管理
<?page title="Auto Generated index.zul"?> <window title="书籍信息" border="normal" width="200px" apply="com.huaxin.ui.IndexUI"> <hbox> <label value="作者" /> <textbox id="name" /> </hbox> <hbox> <label value="标题" /> <textbox id="title" /> </hbox> <button id="btnInsert" label="增加" /> <button id="btnReset" label="重置" /> <button id="btnUpdate" label="修改" /> <button id="btnDelete" label="删除" /> </window>
IndexUI.java 书籍后台管理类
package com.huaxin.ui; import org.zkoss.zk.ui.Component; import org.zkoss.zul.Textbox; import com.huaxin.entity.Book; import com.huaxin.template.Template; public class IndexUI extends Template { Textbox name; Textbox title; public IndexUI() { super(); } public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); comp.setVariable(comp.getId() + "Ctrl", this, true); // 测试打印,访问父类初始化的属性 System.out.println(super.webappPath); } public Book getInstance() { Book book = new Book(); book.setName(name.getValue()); book.setTitle(title.getValue()); return book; } public <Book> void setInstance(Book obj) { } }
index2.zul 光盘管理
<?page title="Auto Generated index.zul"?> <window title="光盘信息" border="normal" width="200px" apply="com.huaxin.ui.IndexUI2"> <hbox> <label value="名称" /> <textbox id="name" /> </hbox> <hbox> <label value="容量" /> <textbox id="MB" /> </hbox> <button id="btnInsert" label="增加" /> <button id="btnReset" label="重置" /> <button id="btnUpdate" label="修改" /> <button id="btnDelete" label="删除" /> </window>
IndexUI2.java 光盘后台管理类 package com.huaxin.ui; import org.zkoss.zk.ui.Component; import org.zkoss.zul.Textbox; import com.huaxin.entity.Disk; import com.huaxin.template.Template; public class IndexUI2 extends Template { Textbox name; Textbox MB; public IndexUI2() { super(); } public void doAfterCompose(Component comp) throws Exception { super.doAfterCompose(comp); comp.setVariable(comp.getId() + "Ctrl", this, true); // 测试打印,访问父类初始化的属性 System.out.println(super.webappPath); } public Disk getInstance() { Disk disk = new Disk(); disk.setName(name.getValue()); disk.setMB(MB.getValue()); return disk; } public <Disk> void setInstance(Disk obj) { } }
Book.java 书籍实体类
package com.huaxin.entity; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity public class Book { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="Id") private int id; @Basic private String name; @Basic private String title; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
Disk.java 光盘实体类
package com.huaxin.entity; import javax.persistence.Basic; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity public class Disk { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="Id") private int id; @Basic private String name; @Basic private String MB; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getMB() { return MB; } public void setMB(String mB) { MB = mB; } }
Template.java
package com.huaxin.template; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import javax.persistence.Query; import org.zkoss.zk.ui.Execution; import org.zkoss.zk.ui.Executions; import org.zkoss.zk.ui.util.GenericForwardComposer; import org.zkoss.zkplus.databind.AnnotateDataBinder; import org.zkoss.zul.Button; import com.huaxin.entity.Book; public abstract class Template extends GenericForwardComposer { /* * private 私有 public 公有 friendly 默认的,同包内访问 protected 具有friendly权限,同时子类可以访问 */ // e.g. /HDPYWeb protected String webappPath = ""; // e.g. http://localhost:80/HDPYWeb/ protected String basePath = ""; // 取得request对象 protected Execution request = Executions.getCurrent(); // 刷新 protected AnnotateDataBinder binder; protected Button btnReset; // 重置 protected Button btnInsert;// 增加 protected Button btnUpdate;// 更新 protected Button btnDelete;// 删除 protected Class<?> clazz; public Template() { webappPath = request.getContextPath(); basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + webappPath + "/"; } // 方法必须为public,否则无法调用(反射) // 增加 public final void onClick$btnInsert() { EntityManagerFactory factory = Persistence.createEntityManagerFactory("mysql"); EntityManager em = factory.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); em.persist(getInstance()); tx.commit(); } // 删除----方法没有用public修饰,所以不起作用 protected final void onClick$btnDelete() { { // 真正使用的时候,此处要添加数据库操作代码 alert("delete"); } } // 修改 public final void onClick$btnUpdate() { { // 真正使用的时候,此处要添加数据库操作代码 alert("update"); } } // 重置 public final void onClick$btnReset() { { // 真正使用的时候,此处要添加数据库操作代码 alert("reset"); } } // 取得页面输入数据,泛型方法,子类继承以后,返回的类型可以自定义 public abstract <T> T getInstance(); // 取得页面输入数据 public abstract <T> void setInstance(T obj); }
persistence.xml JPA配制文件
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0"> <!-- persistence-unit的name属性提供了创建EntityManagerFacotry时的 关键字 transaction-type则指定了使用的事务管理类型 这里使 用'RESOURCE_LOCAL'参数表示使用本地事务 --> <persistence-unit name="mysql" transaction-type="RESOURCE_LOCAL"> <!-- JPA的提供类,OpenJPA的设置如下 如果使用其它的JPA实现,这里 的内容需要修改成相应的提供类 --> <provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider> <!-- OpenJPA容器中管理的实体类列表 --> <class>com.huaxin.entity.Book</class> <class>com.huaxin.entity.Disk</class> <!-- OpenJPA容器访问数据库的参数 --> <properties> <property name="openjpa.ConnectionURL" value="jdbc:mysql://127.0.0.1/test" /> <property name="openjpa.ConnectionDriverName" value="com.mysql.jdbc.Driver" /> <property name="openjpa.ConnectionUserName" value="root" /> <property name="openjpa.ConnectionPassword" value="root" /> </properties> </persistence-unit> </persistence>
评论
14 楼
cczakai
2011-03-02
模板用来将不变的行为抽离为父类,去除子类中重复代码。
目前MVC很多都要去Dao
其实我们在写Dao时候可以抽象出一些不变的方法比如:
add
update
delete
query
或者get/set
放入抽象父类中实现代码,
Dao:Interface
AbstractDao implements Dao{
public void add(){
getInstance().add();
}
public void update(){
System.out.println("Dao update");
}
public Dao getInstance();
}
ConrectaDao extend AbstractDao {
public void add(){
System.out.println("ConrectaDao+add()");
}
public void mymethod(){
System.out.println("ConrectaDao+mymethod()");
}
public Dao getInstance(){
return this;
}
}
}
client:
ConrectaDao dao = new ConrectaDao();
dao.add();
dao.update();
dao.mymethod();
目前MVC很多都要去Dao
其实我们在写Dao时候可以抽象出一些不变的方法比如:
add
update
delete
query
或者get/set
放入抽象父类中实现代码,
Dao:Interface
AbstractDao implements Dao{
public void add(){
getInstance().add();
}
public void update(){
System.out.println("Dao update");
}
public Dao getInstance();
}
ConrectaDao extend AbstractDao {
public void add(){
System.out.println("ConrectaDao+add()");
}
public void mymethod(){
System.out.println("ConrectaDao+mymethod()");
}
public Dao getInstance(){
return this;
}
}
}
client:
ConrectaDao dao = new ConrectaDao();
dao.add();
dao.update();
dao.mymethod();
13 楼
jimoshutong
2011-03-02
我们也在用ZK,是3.6.4版本。不过感觉有的地方还是很不习惯,强制转换太多了。
12 楼
cknet
2010-09-20
<p>和ZK比较相似,国内开源的Javaweb框架,更多突出业务积累</p>
<p> </p>
<p><a href="http://code.google.com/p/simpleframework/">http://code.google.com/p/simpleframework/</a></p>
<p> </p>
<p>demo: </p>
<p><a href="http://222.35.91.208:9000/">http://222.35.91.208:9000/</a></p>
<p> </p>
<p><a href="http://code.google.com/p/simpleframework/">http://code.google.com/p/simpleframework/</a></p>
<p> </p>
<p>demo: </p>
<p><a href="http://222.35.91.208:9000/">http://222.35.91.208:9000/</a></p>
11 楼
KimHo
2010-09-20
这个模板方法模式,貌似跟ZK没多大关系吧
10 楼
85977328
2010-08-12
szbaony 写道
简单扼要,建议补充下,在项目开发中这么处理,有何好处,主要是针对新手,帮新手理解原理
好的,明天我给补充上~,~ 晚上我回去酝酿
9 楼
szbaony
2010-08-12
简单扼要,建议补充下,在项目开发中这么处理,有何好处,主要是针对新手,帮新手理解原理
8 楼
85977328
2010-08-12
tiger860709 写道
LZ,这个例子有点简单,看不出来ZK到底有多么神奇。。。。呵呵
看了你的建议以后,我把代码再次更新了。这次把全部代码都贴出来了
如果有深度使用ZK的朋友,一定能体会我这个模板方法带来的优越性
7 楼
tiger860709
2010-08-11
LZ,这个例子有点简单,看不出来ZK到底有多么神奇。。。。呵呵
6 楼
85977328
2010-08-11
1927105 写道
观摩了,没用过,lz是做J2EE的么?
恩,长期从事J2EE的开发工作
5 楼
shore1111
2010-08-11
模板其实跟重写差不多
4 楼
robyjeffding
2010-08-11
ZK是一套以 AJAX/XUL/Java 为基础的网页应用程式开发框架,用於丰富网页应用程式的使用界面。最大的好处是,在设计AJAX网路应用程式时,轻松简便的操作就像设计桌面程式一样。 ZK包含了一个以AJAX为基础、事件驱动(event-driven)、高互动性的引擎,同时还提供了多样丰富、可重复使用的XUL与HTML组件,以及以 XML 为基础的使用介面设计语言 ZK User-interfaces Markup Language (ZUML)。 ZK 提供超过60个XUL组件及80个XHMTL组件。举凡listbox, slider, audio, slider, tree, combobox, tabbox, auto-completion等均有支援。ZK 亦提供 FCKeditor 和 Dojo的组件,让使用者直接以Java控制,无须使用 JavaScript。 ZK是一套开放源码、相容於 XUL/HTML 标准、Java写成的开发工具。
3 楼
IcedCoffee
2010-08-11
zk是好东西...
2 楼
IcedCoffee
2010-08-11
这就是模板?未免太简单了吧?
1 楼
1927105
2010-08-11
观摩了,没用过,lz是做J2EE的么?
发表评论
-
evernote international无法同步、无法登陆问题
2020-04-24 11:10 1315今天在记录日记的时候,发现印象笔记evernote国际 ... -
云计算
2019-10-18 12:53 400好久没写文章了,这个图把iaas,paas,saas说的很透彻 ... -
CentOS/RHEL 5/6/7上安装svn1.8
2017-04-06 09:02 1404CentOS/RHEL 5/6/7上安装svn1.8 1)安装 ... -
chrome开发javaee服务端常用插件
2015-10-28 15:51 929Advanced REST client:调试http插件 h ... -
java职业生涯规划
2015-10-03 10:10 1293只上一个图,你就明白 参考文章 http://blog.s ... -
关闭 TSVNCache.exe 进程
2015-04-05 09:55 2857在Windows下使用SVN,通常都会安装Tortoi ... -
eclipse中alt+/失效解决办法
2014-02-26 13:56 10911、Eclipse下进入Windows ->Preper ... -
svn-强行忽略与externals
2013-12-12 08:45 1416提交文件,强行添加SVN忽略的文件 svn add * --f ... -
关于技术和业务
2013-12-10 10:27 0没有架构师,没有技术经理,没有代码评审。一说纯技术,就用系统进 ... -
ab的用法
2013-12-09 20:19 1000带head的请求,URL要用单引号,否则会报错 ./ab -n ... -
关于研发过程中的思路
2013-07-04 10:10 1399一般我们在研发过程中,控制会议,会遇到很多问题。有些人看的很长 ... -
如果你迷茫,请看看学习路线
2013-06-05 10:12 1569技术一定要俩头抓, 往下深谙原理(语言, 汇编, 内存 ... -
软件追求的几个特性
2012-12-07 00:00 1330看了大话设计模式,里面总结的挺精辟 可维护性:改只需要修改的 ... -
几种比较有特点的项目管理模式
2012-09-17 14:31 2280第一种 thoughtworks 有好多工程师,分DEV,QA ... -
windows自动关机
2012-06-21 17:34 1469Windows XP的定时关机命令是由Shutdown.exe ... -
Eclipse中@author的修改
2012-06-01 11:42 1832换了电脑后eclipse中的@author变了,于是找了下 ... -
firefox开发javaee服务端常用插件
2012-02-15 17:52 1664CSS调试插件:Web Developer 客户端UA模拟插件 ... -
REST关键原则
2011-09-21 14:40 1509REST(Representational State ... -
算法3-递归
2011-08-04 23:13 1187/** * 时间:2010-02-07 * @au ... -
算法2-大数相乘
2011-08-04 23:09 1427import java.io.*; //数据类封 ...
相关推荐
ZK 的核心优势在于其基于组件的开发模式,这使得开发者可以像使用桌面应用程序一样来构建 Web 应用,极大地提高了开发效率和用户体验。 **快速入门指南**主要面向初次接触 ZK 的开发者,帮助他们快速上手,并通过...
- **MVVM(Model-View-ViewModel)模式**:ZK也支持MVVM架构模式,这为开发者提供了一种更加现代化的方法来构建复杂的Web应用。 - **ViewModel**:ViewModel充当View和Model之间的桥梁,它负责处理用户界面的数据...
ZK支持使用ECMAScript(JavaScript的标准化版本)进行客户端脚本编写,这使得开发者可以在不离开浏览器环境的情况下,实现更复杂的功能和逻辑。 5. **XML布局** ZK采用XML作为界面布局的语言,这样可以使界面设计...
手册中阐述了ViewModel中的初始化、数据和集合的操作,以及如何在ViewModel中使用@Init、@AfterCompose、@NotifyChange等注解来控制数据的更新。 ZK框架还提供了多种内置的Model组件,例如ListModel、ModelGroups、...
ZK 6.5 Essentials通过一系列示例应用程序来展示框架的特性和使用方法。这些示例涵盖了从简单的UI布局到复杂的数据库集成,帮助开发者逐步掌握ZK的各种功能。通过实际的编码和调试,开发者可以更好地理解和应用ZK的...
6. **事件处理**:ZK的事件处理机制是其核心特性之一,手册将详细介绍如何监听和处理用户交互事件,以及自定义事件的使用方法。 7. **国际化与本地化**:ZK提供了强大的国际化支持,手册会展示如何配置多语言环境,...
ZK的数据绑定机制基于MVC(Model-View-Controller)设计模式,通过数据绑定API实现了视图和模型之间的双向同步。这意味着当模型数据发生变化时,视图会自动更新,反之亦然。ZK的数据绑定主要涉及三个类:`Binding`, ...
- **模板方法模式**:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。 学习和理解这些设计模式对于提升编程技能和编写高质量的代码至关重要。每个模式都有其特定的适用场景和优缺点,理解和熟练运用...
通过上述内容,我们可以看出 ZK 不仅提供了一套完整的工具链来构建高度交互的 Web 应用程序,而且通过其独特的设计理念和架构模式,大大降低了开发复杂度。对于希望快速开发出具有良好用户体验的 Web 应用程序的开发...
ZK插件提供了模板和编码辅助,使开发过程更加便捷。同时,Eclipse的Maven或Gradle支持可以帮助管理依赖,确保Hibernate和ZK库的正确引入。 **总结** 通过这个"ZK入门例子",您可以学习到如何结合Eclipse、ZK、...
会员关系图2019-05-19 重构分润核心代码,增加分段计算分润的方式,让分润更加精准化,防止因分润带来财务风险2019-05-08 新增账务使用模板方法,新增账务更加快捷2019-02-26 数据清理,一键初始化数据库2019-02-12 ...
- **班级**:计算机应用ZK0901 - **学习目标**: - 掌握GUI图形用户界面设计方法及其事件处理流程。 - 深入理解Java线程的创建与管理。 - 熟练应用Java IO技术。 - 实现数据库访问技术进行数据的增删改查操作。 ...
本文件中提到了单件模式、工厂模式、抽象工厂模式、访问者模式、状态模式、命令模式、解释器模式、备忘录模式、观察者模式、桥接模式、建造者...迭代器模式、责任链模式、模板模式、组合模式和原型模式等多种设计模式...
- 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 - 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。 - 观察者模式:定义对象间的一种一对多的依赖关系。 - ...
只需熟悉开发包中的示例代码,理解API的使用方法,就能轻松实现指纹识别功能,从而在各种项目中发挥生物识别技术的优势。因此,掌握这款开发包的使用,对于提升项目开发效率,以及在生物识别领域深化技术应用具有...
这里提到的 "zk" 可能是指配置 Kafka 时需要的 Zookeeper 实例,虽然现在大多数新部署的 Kafka 集群使用内置的元数据管理。 **2. Spring Kafka 的配置** 配置 Spring Kafka 主要涉及以下几个方面: - **Bootstrap...
1. "指纹保存方法.docx":这是一个文档,详细介绍了如何使用ZKFinger SDK来保存用户的指纹数据。文档可能包含步骤说明、代码示例以及注意事项,帮助开发者理解如何在系统中存储和管理用户的生物特征信息。 2. ...
2. Java内存模型:理解堆、栈、方法区、本地方法栈、程序计数器等内存区域,以及垃圾回收机制。 3. 设计模式:常见的23种设计模式,如单例、工厂、观察者、装饰者等,及其在实际项目中的应用。 4. Java并发编程:...
在Java基础面试中,还会涉及到设计模式的问题,如代理模式、工厂模式、单例模式、模板模式和观察者模式等。代理模式常用于AOP(面向切面编程);工厂模式在Spring中用于对象的创建和初始化;单例模式在Spring中广泛...