一 模板方法模式簡介(Template Method Pattern Introduction)
??? 模板方法模式主要用于對算法或者行為邏輯進(jìn)行封裝,如果多個(gè)類中存在某些相似的算法邏輯或者行為邏輯,可以通過將這些相似的邏輯提取到模板方法類中實(shí)現(xiàn),然后讓相應(yīng)的子類根據(jù)需要實(shí)現(xiàn)某些自定義的邏輯。
二 ZK的原理
1)ZK是一個(gè)頁面對應(yīng)著一個(gè)類,而每個(gè)頁面,基本上都有很多的相似操作.例如:增加,刪除,修改,查詢等等.因此我們很容易想到如何把相同的邏輯抽去出來呢?模板方法模式為我們提供了良好的解決方案.下我給出所有的代碼.
??? 下面的解決方案只代表特殊,不代表普遍,具體的模板還需要根據(jù)項(xiàng)目中的應(yīng)用具體設(shè)計(jì).^-^
??? 模板類可以被多個(gè)頁面繼承,而不需要重新編寫,如果個(gè)位讀者實(shí)在沒有明白,我在近幾日內(nèi)更新文章,寫出一個(gè)具體的例子與大家分享.
2)結(jié)構(gòu)說明,下面的圖是我這個(gè)例子中用到的項(xiàng)目情況
index.zul和index2.zul,對應(yīng)著數(shù)據(jù)庫中的2個(gè)表.他們的后臺(tái)代碼IndexUI.java和IndexUI2.java中,卻沒有增加按鈕的事件,而是寫到了父類中,public final void onClick$btnInsert() ;這樣所有的增加操作就可以共享一個(gè)代碼了.刪除,修改等原理也是如此.略
mysql數(shù)據(jù)庫表結(jié)構(gòu)
IndexUI.java 書籍后臺(tái)管理類
index2.zul 光盤管理
Book.java 書籍實(shí)體類
Disk.java? 光盤實(shí)體類
Template.java
persistence.xml?? JPA配制文件
??? 模板方法模式主要用于對算法或者行為邏輯進(jìn)行封裝,如果多個(gè)類中存在某些相似的算法邏輯或者行為邏輯,可以通過將這些相似的邏輯提取到模板方法類中實(shí)現(xiàn),然后讓相應(yīng)的子類根據(jù)需要實(shí)現(xiàn)某些自定義的邏輯。
二 ZK的原理
1)ZK是一個(gè)頁面對應(yīng)著一個(gè)類,而每個(gè)頁面,基本上都有很多的相似操作.例如:增加,刪除,修改,查詢等等.因此我們很容易想到如何把相同的邏輯抽去出來呢?模板方法模式為我們提供了良好的解決方案.下我給出所有的代碼.
??? 下面的解決方案只代表特殊,不代表普遍,具體的模板還需要根據(jù)項(xiàng)目中的應(yīng)用具體設(shè)計(jì).^-^
??? 模板類可以被多個(gè)頁面繼承,而不需要重新編寫,如果個(gè)位讀者實(shí)在沒有明白,我在近幾日內(nèi)更新文章,寫出一個(gè)具體的例子與大家分享.
2)結(jié)構(gòu)說明,下面的圖是我這個(gè)例子中用到的項(xiàng)目情況
index.zul和index2.zul,對應(yīng)著數(shù)據(jù)庫中的2個(gè)表.他們的后臺(tái)代碼IndexUI.java和IndexUI2.java中,卻沒有增加按鈕的事件,而是寫到了父類中,public final void onClick$btnInsert() ;這樣所有的增加操作就可以共享一個(gè)代碼了.刪除,修改等原理也是如此.略
mysql數(shù)據(jù)庫表結(jié)構(gòu)
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="標(biāo)題" />
<textbox id="title" />
</hbox>
<button id="btnInsert" label="增加" />
<button id="btnReset" label="重置" />
<button id="btnUpdate" label="修改" />
<button id="btnDelete" label="刪除" />
</window>
IndexUI.java 書籍后臺(tái)管理類
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 光盤后臺(tái)管理類
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 書籍實(shí)體類
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? 光盤實(shí)體類
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 默認(rèn)的,同包內(nèi)訪問 protected 具有friendly權(quán)限,同時(shí)子類可以訪問
*/
// 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,否則無法調(diào)用(反射)
// 增加
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() {
{
// 真正使用的時(shí)候,此處要添加數(shù)據(jù)庫操作代碼
alert("delete");
}
}
// 修改
public final void onClick$btnUpdate() {
{
// 真正使用的時(shí)候,此處要添加數(shù)據(jù)庫操作代碼
alert("update");
}
}
// 重置
public final void onClick$btnReset() {
{
// 真正使用的時(shí)候,此處要添加數(shù)據(jù)庫操作代碼
alert("reset");
}
}
// 取得頁面輸入數(shù)據(jù),泛型方法,子類繼承以后,返回的類型可以自定義
public abstract <T> T getInstance();
// 取得頁面輸入數(shù)據(jù)
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屬性提供了創(chuàng)建EntityManagerFacotry時(shí)的 關(guān)鍵字
transaction-type則指定了使用的事務(wù)管理類型
這里使 用'RESOURCE_LOCAL'參數(shù)表示使用本地事務(wù) ?
-->
<persistence-unit name="mysql" transaction-type="RESOURCE_LOCAL">
<!--
JPA的提供類,OpenJPA的設(shè)置如下
如果使用其它的JPA實(shí)現(xiàn),這里 的內(nèi)容需要修改成相應(yīng)的提供類
-->
<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>
<!-- OpenJPA容器中管理的實(shí)體類列表 ?-->
<class>com.huaxin.entity.Book</class>
<class>com.huaxin.entity.Disk</class>
<!-- OpenJPA容器訪問數(shù)據(jù)庫的參數(shù) ?-->
<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>
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

