亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 2081 0
一 模板方法模式簡介(Template Method Pattern Introduction)
??? 模板方法模式主要用于對算法或者行為邏輯進行封裝,如果多個類中存在某些相似的算法邏輯或者行為邏輯,可以通過將這些相似的邏輯提取到模板方法類中實現,然后讓相應的子類根據需要實現某些自定義的邏輯。

二 ZK的原理
1)ZK是一個頁面對應著一個類,而每個頁面,基本上都有很多的相似操作.例如:增加,刪除,修改,查詢等等.因此我們很容易想到如何把相同的邏輯抽去出來呢?模板方法模式為我們提供了良好的解決方案.下我給出所有的代碼.
??? 下面的解決方案只代表特殊,不代表普遍,具體的模板還需要根據項目中的應用具體設計.^-^
??? 模板類可以被多個頁面繼承,而不需要重新編寫,如果個位讀者實在沒有明白,我在近幾日內更新文章,寫出一個具體的例子與大家分享.
2)結構說明,下面的圖是我這個例子中用到的項目情況
ZK經典用法---模板方法模式(更新)
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>
  

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


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 寡妇野外啪啪一区二区 | 欧美亚洲天堂 | 天天操天天插 | 日韩中文字幕一在线 | 亚洲国产中文字幕 | 久久美女精品国产精品亚洲 | 日韩欧国产精品一区综合无码 | 中文字幕精品一区二区三区在线 | 国产一级高清 | 亚洲综合伦理一区 | 成人久久久精品乱码一区二区三区 | 欧美xxxxx九色视频免费观看 | 亚洲欧美日韩国产一区图片 | 日韩欧美亚洲中字幕在线播放 | 亚洲欧美中文字幕 | 色综合天天色综合 | 国产一区二区三区影院 | 欧美久久超级碰碰碰二区三区 | 欧美日本在线视频 | 大片刺激免费播放视频 | 香蕉国产综合久久猫咪 | 91久久精品日日躁夜夜躁欧美 | 四虎影院黄色 | 中文字幕最新中文字幕中文字幕 | 一级特黄aaa大片 | 国产亚洲一级精品久久 | 国自产拍在线天天更新2019 | 奇米线在人线免费视频 | 99精品欧美一区二区三区美图 | 色偷偷91综合久久噜噜 | 日本免费在线视频 | 亚洲欧美精品 | 天天做天天爱夜夜大爽完整 | 成人影院vs一区二区 | 国产亚洲欧美在线观看的 | 国产高清在线精品一区二区 | 国产欧美日韩一区 | 爱做久久久久久久久久 | 亚洲精品久久久久久久福利 | 亚色在线视频 | 久久久久一区二区三区 |