`
85977328
  • 浏览: 1899204 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ZK经典用法---模板方法模式(更新)

阅读更多
一 模板方法模式简介(Template Method Pattern Introduction)
    模板方法模式主要用于对算法或者行为逻辑进行封装,如果多个类中存在某些相似的算法逻辑或者行为逻辑,可以通过将这些相似的逻辑提取到模板方法类中实现,然后让相应的子类根据需要实现某些自定义的逻辑。

二 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>
  • 大小: 31.1 KB
分享到:
评论
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();


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>
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的么?

相关推荐

    ZK-quickstart-3.6.1

    ZK 的核心优势在于其基于组件的开发模式,这使得开发者可以像使用桌面应用程序一样来构建 Web 应用,极大地提高了开发效率和用户体验。 **快速入门指南**主要面向初次接触 ZK 的开发者,帮助他们快速上手,并通过...

    grovvy Reference zk

    - **MVVM(Model-View-ViewModel)模式**:ZK也支持MVVM架构模式,这为开发者提供了一种更加现代化的方法来构建复杂的Web应用。 - **ViewModel**:ViewModel充当View和Model之间的桥梁,它负责处理用户界面的数据...

    ZK开发手册 中文版 3.50 -荐

    ZK支持使用ECMAScript(JavaScript的标准化版本)进行客户端脚本编写,这使得开发者可以在不离开浏览器环境的情况下,实现更复杂的功能和逻辑。 5. **XML布局** ZK采用XML作为界面布局的语言,这样可以使界面设计...

    ZK框架开发手册

    手册中阐述了ViewModel中的初始化、数据和集合的操作,以及如何在ViewModel中使用@Init、@AfterCompose、@NotifyChange等注解来控制数据的更新。 ZK框架还提供了多种内置的Model组件,例如ListModel、ModelGroups、...

    ZK 6.5 Essentials

    ZK 6.5 Essentials通过一系列示例应用程序来展示框架的特性和使用方法。这些示例涵盖了从简单的UI布局到复杂的数据库集成,帮助开发者逐步掌握ZK的各种功能。通过实际的编码和调试,开发者可以更好地理解和应用ZK的...

    ZK开发手册 3.06 Word版

    6. **事件处理**:ZK的事件处理机制是其核心特性之一,手册将详细介绍如何监听和处理用户交互事件,以及自定义事件的使用方法。 7. **国际化与本地化**:ZK提供了强大的国际化支持,手册会展示如何配置多语言环境,...

    zk 数据绑定(grid进行嵌套显示数据)

    ZK的数据绑定机制基于MVC(Model-View-Controller)设计模式,通过数据绑定API实现了视图和模型之间的双向同步。这意味着当模型数据发生变化时,视图会自动更新,反之亦然。ZK的数据绑定主要涉及三个类:`Binding`, ...

    23种设计模式

    - **模板方法模式**:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。 学习和理解这些设计模式对于提升编程技能和编写高质量的代码至关重要。每个模式都有其特定的适用场景和优缺点,理解和熟练运用...

    ZK Dev Guide 2.4.1 English Version

    通过上述内容,我们可以看出 ZK 不仅提供了一套完整的工具链来构建高度交互的 Web 应用程序,而且通过其独特的设计理念和架构模式,大大降低了开发复杂度。对于希望快速开发出具有良好用户体验的 Web 应用程序的开发...

    ZK入门例子

    ZK插件提供了模板和编码辅助,使开发过程更加便捷。同时,Eclipse的Maven或Gradle支持可以帮助管理依赖,确保Hibernate和ZK库的正确引入。 **总结** 通过这个"ZK入门例子",您可以学习到如何结合Eclipse、ZK、...

    EDEN-MACE:微服务下的分销管理利器,更加灵活的管理佣金,涵盖并且总结了目前流行的分销模式,让分销更加简单,后期开发立足于产业互联网,致力于打通产业内部之间的联系,有问题可以加qq 3174667330

    会员关系图2019-05-19 重构分润核心代码,增加分段计算分润的方式,让分润更加精准化,防止因分润带来财务风险2019-05-08 新增账务使用模板方法,新增账务更加快捷2019-02-26 数据清理,一键初始化数据库2019-02-12 ...

    java聊天程序报告模板

    - **班级**:计算机应用ZK0901 - **学习目标**: - 掌握GUI图形用户界面设计方法及其事件处理流程。 - 深入理解Java线程的创建与管理。 - 熟练应用Java IO技术。 - 实现数据库访问技术进行数据的增删改查操作。 ...

    C语言设计模式.pdf

    本文件中提到了单件模式、工厂模式、抽象工厂模式、访问者模式、状态模式、命令模式、解释器模式、备忘录模式、观察者模式、桥接模式、建造者...迭代器模式、责任链模式、模板模式、组合模式和原型模式等多种设计模式...

    搜狐&&美团旅行面试题.docx

    - 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 - 策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。 - 观察者模式:定义对象间的一种一对多的依赖关系。 - ...

    中控指纹仪驱动及开发包demo(C/S模式)

    只需熟悉开发包中的示例代码,理解API的使用方法,就能轻松实现指纹识别功能,从而在各种项目中发挥生物识别技术的优势。因此,掌握这款开发包的使用,对于提升项目开发效率,以及在生物识别领域深化技术应用具有...

    spring-kafka

    这里提到的 "zk" 可能是指配置 Kafka 时需要的 Zookeeper 实例,虽然现在大多数新部署的 Kafka 集群使用内置的元数据管理。 **2. Spring Kafka 的配置** 配置 Spring Kafka 主要涉及以下几个方面: - **Bootstrap...

    ZKFinger SDK

    1. "指纹保存方法.docx":这是一个文档,详细介绍了如何使用ZKFinger SDK来保存用户的指纹数据。文档可能包含步骤说明、代码示例以及注意事项,帮助开发者理解如何在系统中存储和管理用户的生物特征信息。 2. ...

    Spring、Java、redis、zk、MySQL等面试题总结

    2. Java内存模型:理解堆、栈、方法区、本地方法栈、程序计数器等内存区域,以及垃圾回收机制。 3. 设计模式:常见的23种设计模式,如单例、工厂、观察者、装饰者等,及其在实际项目中的应用。 4. Java并发编程:...

    2020年JavaEE全部面试题目.docx

    在Java基础面试中,还会涉及到设计模式的问题,如代理模式、工厂模式、单例模式、模板模式和观察者模式等。代理模式常用于AOP(面向切面编程);工厂模式在Spring中用于对象的创建和初始化;单例模式在Spring中广泛...

Global site tag (gtag.js) - Google Analytics