一 模板方法模式簡介(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的原理
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>
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
