2011年12月26日 星期一

【BlazeDS】ResultEvent.result null value

在這裡分享一個問題我遇到的問題

當時開發的Flex SDK 是 4.0 的,其中有運用 BlazeDS 去乎較遠端的J2EE程式

不過當呼叫完成後需要取值將它轉成 Flex 的 ArrayCollection 的時候

遇到點問題

我在 Debug 的模式下觀看取得結果的狀態

例如以下片段程式


private function onGetSuggestGiftResult(event:ResultEvent):void
{
    dgData = (event.result) as ArrayCollection;
}


在 event.result 的時候其實是還有數筆資料的

但是當 FLEX 值型將它轉換成 ArrayCollection 型態時  瞬間變成 null 值

這問題困惱我很久

之後不知道為什麼覺得是 SDK的問題 ((靈機乍現

把SDK調成 4.1 之後  這樣的 bug 就沒了

不知道為什麼  不過在這邊分享出來給大家摟

2011年12月22日 星期四

【Flex】outerDocument 介紹

在 Flex 的程式中可以透過 outerDocumet 來呼叫複葉面所宣告的方法或變數

以下用一個 DataGrid 的範例,其中有一個 DataGridColumn 中會運用一個 itemRenderer

並表示一個 CheckBox 元件 如下所示


<mx:DataGridColumn dataField="gift_id" headerText="選擇" textAlign="center">
    <mx:itemRenderer>
        <mx:Component>
            <mx:HBox>
                <mx:CheckBox />
            </mx:HBox>
        </mx:Component>
    </mx:itemRenderer>
</mx:DataGridColumn>


這時候 CheckBox 這個原件所存在的 Component 就並非 DataGrid 元件的Component

如果要做到當 CheckBox 被選擇時,要將被選擇的物件加入到一個集合(ArrayCollection)

就可以稍為運用一下 outerDocument,如下所示:

<mx:CheckBox click="outerDocument.handleClick(event);"/>

這時候父頁面就需要提供一個 handleClick 的 function


public function handleClick(event:Event):void
{

    if(event.target.selected == true){
        selGiftTemp.addItem(dg.selectedItem);
    }else{
        var index:int = selGiftTemp.getItemIndex(dg.selectedItem);
        selGiftTemp.removeItemAt(index);
    }
}

2011年12月21日 星期三

【DWR】使用 DWR 取得 JavaBean

這篇介紹在DWR的運用下,透過 Javascript 乎教遠端的 Java 方法

並回傳一個 JavaBean 的物件,最後呈現在網頁上

這也是一個典型的 Java 與 Javascript 物件之件的轉換,以下來看看範例吧

首先環境就不多說了,可以看,上一篇文章

一開始我們先定義一個 JavaBean

package org.bean;
public class PersonBean 
{
    private String name;
    private String dollar;
 
    public PersonBean(){}
 
    // getter&setter 省略
}
接著同樣的要定義一個遠端的服務,透過Javascript 呼叫 它會建立一個 PersonBean 並將這個物件回傳回去
package org.service;
import org.bean.PersonBean;
public class PersonService{
    public PersonBean getPerson(){
        PersonBean personbean = new PersonBean();
        personbean.setDollar("1000");
        personbean.setName("Allen");
        return personbean;
    }
}
最後要定義 dwr.xml

2011年12月19日 星期一

【DWR】範例

最近因為打工又要學一些東西,這次是 DWR。以下先介紹它一下巴

簡單說它簡化了AJAX的開發在一個以Java為主的WEB應用上

它的範疇主要是在 Javascript to Java 的一種 RPC 框架  跟ZK比起來就比較不一樣了

更進一步解釋就是它能夠讓你在前端的網頁程式中運用 Javascript 遠端呼叫

Java 的程式,也可以讓Javascript 接收 Java 端自定義的 Bean。

以下用一個簡單的範例來呈現 DWR

首先環境是 Apache Tomcat 6,並去http://directwebremoting.org/dwr/downloads/ 下載JAR檔

額外補充的是 DWR 需要用到 Apache 的開源套件 commons-logging

所以還是要去 http://commons.apache.org/logging/download_logging.cgi 在下載JAR檔

下載完成後同樣先透過 Eclipse 建立一個 Dynamic Web Project

並將這兩個 JAR 檔放到 WEB-INF/lib 裡,完成後就可以寫個 Hello world 的程式

第一步驟要先在 WEB-INF/web.xml 加上一段程式

2011年12月8日 星期四

Hibernate 教學 - org.hibernate.exception.SQLGrammarException: could not load an entity

這是小弟我第一次這麼想發文.... 原因有點無言

不過跟大家分享一下  今天在寫 Spring + Hibernate 的範例與文件 資料庫用的是 MySQL

當我在加載一個類別 Order 時發生了以下錯誤


org.springframework.dao.InvalidDataAccessResourceUsageException: could not load an entity: [org.model.Order#1]; SQL [select order0_.orderId as orderId2_0_, order0_.orderTitle as orderTitle2_0_, order0_.orderDate as orderDate2_0_, order0_.orderReceiver as orderRec4_2_0_ from ORDER order0_ where order0_.orderId=?]; nested exception is org.hibernate.exception.SQLGrammarException: could not load an entity: [org.model.Order#1]
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException


一開始爬文有人說是映射文件與Order類別的關聯可能有寫錯

例如屬性名稱打錯之類的....

但是檢查了老半天都沒錯阿

2011年12月6日 星期二

設計模式 - Builder

關於 Design Pattern 的 Builder(生成器)模式,有以下幾個特點

1. 將物件的複雜建立過程封裝起來,不讓Client知道

2. 能將複雜的組件建立與組件的操作分開

3. 每個 Builder 都是各自獨立,維護方便

4. 使用相同的建造過程但是產生不同的物件

底下用一個 Java 範例來呈現 Builder 模式 的範例

首先一個電腦 (AbstractComputer) 會由很多組件(AbstractComputerItem)所組成

這些組件例如以下
處理器(AbstractCpu)
螢幕(AbstractMonitor)
應用程式(AbstractApp)
硬碟(AbstractDisk)
鍵盤(AbstractKeyboard)

2011年11月21日 星期一

【Flex】Remote Object 運用多個方法

介紹一下在 Flex 中的 RemoteObject 物件的運用

通常隻前都習慣一個 service 都由一個 RemoteObject 負責處理其成功及失敗的情況

例如取得所有書籍好了,如果現在在一個 BlazeDS 的情況下

後台有一個 BookService 讓 RemoteObject 呼叫,

如果 BookService 今天定一了多個方法呢? ((EX : 新增 刪除...

這樣要如何指定義一個 RemoteObject 來負責這些遠端方法?

如下程式片段


<mx:RemoteObject id="bookROdestination="bookServiceDestination">
    <mx:method name="getBook" result="onViewsResult(event)" fault="onViewsFault(event)" />
    <mx:method name="addBook" result="onAddResult(event)" fault="onAddFault(event)/>
</mx:RemoteObject>


2011年11月14日 星期一

【Java Web】載入Spring 的 ApplicationContext

如果要在 Java web project 的初始階段就完成 Spring 的 ApplicationContext 的建立

那麼這裡提供一個簡單的方法,首先先建立 AppContext.java

package org.util;
import org.springframework.context.ApplicationContext;
public class AppContext 
{
    private static ApplicationContext ctx;  
 
    public static void setApplicationContext(ApplicationContext applicationContext) {  
        ctx = applicationContext;  
    }  
 
    public static ApplicationContext getApplicationContext() {  
        return ctx;  
    }  
}

2011年11月7日 星期一

【Java Web】JNDI 配置

本篇介紹如何運用 JNDI 的方式來存取資料庫資源

以下以 Tomcat 5.5 為環境 資料庫為 MySQL

首先需要在你的 Tomcat 5.5 的目錄下,例如以下

C:\Program Files\Apache Software Foundation\Tomcat 5.5\conf\server.xml

將 server.xml 開啟並加入以下的 Resource 資源訊息
 ((記得放在 GlobalNamingResources 的標籤當中


<Resource name="jdbc/mxsql/datasource"
      factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
      type="javax.sql.DataSource"
      driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
url="jdbc:sqlserver://{Your ip}:1400;DatabaseName={Your db name}"
      username="test"         
      password="test"
      maxIdle="2"
      maxWait="1000"              
      maxActive="4"
              />

2011年10月23日 星期日

【Java Web】Tomcat 5.5 無法表示 EL 表達式

最近用 Tomcat 5.5 遇到 EL 無法表示的問題

雖然我在 web.xml 中設定了 el-ignored 標籤 還是不行

這裡提供兩種方法

1. 修改 web.xml 的 schema 的版本改為 2.4

2. 在要運用 EL 的 JSP 中加上  isELIgnored="false" 



2011年10月18日 星期二

Java 產生 Excel 檔

這裡分享一段程式碼  運用 Java Excel 建立一份 Excel 檔案

而 Java Excel API 並不侷限在 Windows 的環境下

以下是簡單的範例程式

    int row=0;
    File execlFile = new File(EXCEL_PATH);  //建立Excel的檔案路徑
    WritableWorkbook workbook = Workbook.createWorkbook(execlFile);  //建立檔案
    WritableSheet sheet = workbook.createSheet("class info", 0);   //新增一個 Sheet
     
    Label label = new Label(0, row, "課程編號");  //新增一個 label 表示 title
    sheet.addCell(label);
     
    label = new Label(1, row, "課程名稱");  //新增一個 label 表示 title
    sheet.addCell(label);
    row++;

    for(Iterator it = classvos.iterator(); it.hasNext();row++){
      ClassVO classvo = it.next();
      label = new Label(0, row, classvo.getClass_no());
      sheet.addCell(label);
      
      label = new Label(1, row, classvo.getClass_name());
      sheet.addCell(label);
    }
    workbook.write(); 
    workbook.close(); 

2011年10月13日 星期四

【Axis2】Java Web Services 資料庫範例

這邊來介紹 Java Web Services 存取資料庫的範例

以下 demo 的資料庫是用 SQL Server  所以要先去下載適當的 JDBC Driver

下載下來後將JAR檔放到 Tomcat 5.5 安裝目錄下的 common\lib 裡面

接著要設定資料庫連線的參數

一樣開啟 Tomcat 5.5 安裝目錄下的 webapps\axis2\WEB-INF\conf\axis2.xml 檔案

並將以下相關參數寫入


<parameter name="DB_driverClassName">com.microsoft.sqlserver.jdbc.SQLServerDriver</parameter>
<parameter name="DB_url">jdbc:sqlserver://xxx.xxx.xx.xxx:1400;DatabaseName=test</parameter>
<parameter name="DB_username">XXXX</parameter>
<parameter name="DB_password">123456</parameter>


完成之後建立一個 Server 端的程式  開啟 Eclipse

2011年10月10日 星期一

【Axis2】Java Web Services 範例

上一篇【Axis2】Java Web Services 環境配置  介紹了 Axis2 的環境配置之後

接著就來寫一個簡單的 Hello World 範例

第一步先建立 Server 端的部分

1. 建立一個一般的 Java project 名稱為 HelloWorld4WS

2. 匯入 Axis2 的 Library

3.接著建立一個簡單的 HelloService 類別

package org.service;
public class HelloService 
{
        // method : sayHello, return String
        public String sayHello(){
                return "Hello Web Services";
        }
}

接著要定義一個 services.xml 來說明你的 Web service 提供哪些服務及服務名稱

在 project 的目錄下建立一個資料夾 名為 META-INF

並在該資料夾內新增一個  services.xml 檔案

2011年10月9日 星期日

【Axis2】Java Web Services 環境配置

這邊帶大家用一個簡單的 Hello World 的例子來介紹 Java Web Service 的開發

首先我們運用 Apache 的 AXIS2 當作 Web service

前置作業:

l   Sun JDK 1.5已安裝且環境變數已設定完成

l   Apache Tomcat 5.5已安裝完成
     註:若無安裝Server RuntimeEclipse會無法建立Web Services Client


首先先配置 Client 的部分


第一步:先安裝 AXIS2

先到這裡下載 AXIS2 下載     ((選擇1.5版的

下載完成後解壓縮放到適當位置 例如 C:\axis2-1.5

在該目錄下的 lib 是 AXIS2 所有能用到的 JAR 檔

接下來設定一下環境變數

2011年9月25日 星期日

Struts 教學 - 檔案下載

在 Struts 架構下要實現檔案下載時,程式的 Action 不能實做 org.apache.struts.action.Action 介面

而是必須實做  org.apache.struts.actions.DownloadAction   並實現  getStreamInfo() method


如果你想要自行設定緩衝大小的話  你也可以覆寫 getBufferSize() method 


而 Strust 預設的緩衝大小為 4096


接著來介紹兩種不同的做法來實現 Strust 的檔案下載  同樣都是 implements DownloadAction


1.  FileStreamInfo 
     主要是針對主機上的檔案


2.  ResourceStreamInfo
     主要是針對你的 Web AP 的路徑下的檔案


以下個別來看看他的範例

2011年9月24日 星期六

【iText】建立 PDF 表格

這裡介紹一下如何運用 iText 這個套件來建立 PDF 檔中的表格

首先要先去下載 iText   

目錄下有兩個 folder 一個是 iText 的 library 另一個是額外會用到的

在 extrajars 目錄下可以下載 iTextAsin 這個 JAR 檔  他能夠用來解決中文問題

完成配置之後就可以來建立一個簡單的 PDF 且內涵表格

也順帶說明如何解決中文文字的問題

//設定 PDF 大小為 A4 樣式
Document document = new Document(PageSize.A4);
// PDF_PATH 為你的 PDF 檔的輸出路徑/
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(PDF_PATH));
PdfPTable table = new PdfPTable(2);  //建立一個只有兩個欄位的表格
table.setWidthPercentage(100f);    //設定表格寬
table.setWidths(new float[]{0.20f, 0.90f});    //課定這兩個欄位的比例大小

//中文字的解決
BaseFont bfChinese = BaseFont.createFont("c:\\windows\\fonts\\kaiu.ttf", "Identity-H", BaseFont.NOT_EMBEDDED);
Font FontChinese = new Font(bfChinese, 12, Font.NORMAL);

PdfPCell cell = new PdfPCell();   //建立一個儲存格
//透過 Paragraph 物件增加元素及指定編碼, 也可以直接存入字串
cell.addElement(new Paragraph("課程代碼", FontChinese));  
table.addCell(cell);
		
cell = new PdfPCell();
cell.addElement(new Paragraph("課程名稱", FontChinese));
table.addCell(cell);

document.add(table);    //將表格加入 PDF 檔案裡
document.close();

2011年9月23日 星期五

SQL Server 2005 遠端連線

如果要讓本機的 SQL server 連到外部的資料庫  就必須透過一些設定才能完成

首先 如果已經有安裝 SQL Server 2005 及 SQL Server Managerment Studio 的話就如下

首先先從開始 > 程式集 > SQL Server 2005 > 組態工具

並選擇 "服務與連接的介面區組態"



接著 展開左邊的 SQLEXPRESS > Database Engine > 點選遠端連線

並切換成 "使用 TCP/IP和具名的管道"

最後左邊區塊切回服務 點選暫停後再點選啟動  以重新啟動服務

接著再 從開始 > 程式集 > SQL Server 2005 > 組態管理員



並選擇左邊欄的 SQLEXPRESS 的通訊協定之後


在右方區塊對 "TCP/IP" 點選右鍵 > 內容  








2011年9月21日 星期三

SQL Server Managerment Studio 29506 錯誤

最近因為要弄某些需求   碰了我從來沒弄過的東西  "微軟"

好吧  問題來了只好做了  .....

首先我的環境是 Win 7 須架起 SQL Server 2005 的版本

這裡我選擇下載了  Microsoft SQL Server 2005 Express Edition Service Pack 3

記得沒錯的話  Win 7 需要安裝 Service Pack 3 以上的版本

至於載點在這裡  http://www.microsoft.com/download/en/details.aspx?id=15291

下載並安裝執行  完成後 我們需要一個看資料表和執行 SQL 的介面
這時候可以選擇安裝 SQL Server Managerment Studio Express 2005
SQL Server Managerment Studio Express 2005

如果再安裝時   如果出現 29506 的錯誤的話

那可以用以下的方法解決

1. 新建一個記事本  內容為
    msiexec /i  path\SQLServer2005_SSMSEE.msi
    path 為你剛剛下載下來的安裝檔的路徑  ((檔名或許要換一下喔
    最後將他另存成 .cmd 檔


2. 用系統管理員的身分執行該 .cmd 檔他就會開始安裝過程了

2011年9月19日 星期一

Spring 教學 - Bean 的自動裝配

關於自動裝配在 Spring 中提供了一個規則來對 Bean 進行自動裝配

進而無須透過在 XML 顯式的方法進行設定,而 Spring IoC 容器會自動協調這個 Bean

之間的關連關係  一般而言有分為四種自動裝配的做法

1. byName 
    根據這個 Bean 的 id 值去對照物件的屬性名稱是否相同
    通常較常用的是這個

2. byType
    如果容器中存在一個與指定屬性型態相同的 Bean  如果相同就會自動裝配
    如果有多個相同型態的 Bean 將會丟出例外

3. constructor
    有點類似 byType,只是他是透過建構子的參數帶入而已

2011年9月17日 星期六

Spring 教學 - Bean 的基本裝配

針對前一篇 所述的 IoC

Spring IoC 設計的核心即是 Bean 容器

前一篇內容說到  我們會把所以實現 Car 介面的實作類別交由 Spring 管理


並由 Spring 來將不同種類的車子(BMW or Benz)注入給 Driver 這個類別

再來注入有兩種主要方法

1. Setter Injection   2. Constructor Injection

首先先來看看 第一種注入方法  程式如前一篇所示了  這邊不在多述

只提醒一點就是 要使用 Setter Injection 時,以此為例就需要再 Driver 類別內

替 car 這個 attribute 設定 getter/setter

直接看看 Bean 的配置檔如何進行

&lt;bean id="bmw" class="org.BMW"&gt;
&lt;/bean&gt;

&lt;bean id="benz" class="org.Benz"&gt;
&lt;/bean&gt;

&lt;bean id="driver" class="org.Driver"&gt;
    &lt;property name="car"&gt;
        &lt;ref local="benz"/&gt;
    &lt;/property&gt;
&lt;/bean&gt;

2011年9月15日 星期四

Spring 教學 - IoC 的介紹

IoC 是 Spring 的核心,讓 Spring 能夠有效地整合 J2EE 個層級的物件 

在物件的設計方面,讓各層物件的呼叫都面對 "介面" 當系統有一天需要進行變更時,

能夠大大減少對程式碼的修改 只需新增適當的新物見並修改 bean 的配置檔即可 

而 IoC 的觀念即是 "控制反轉" 更進一步說 就是相依關係的轉移 

例如以往的應用程式多半為 高層模組直接相依於低層模組

這樣會造成低層模組的變動必須修改高層模組的程式碼   

加上高層模組多半為那些上頁邏輯的物件所組成的,其設計本應當具有重用性 

也更不能依賴於低層的實現模組

回到前幾句的 "相依關係的轉移 "

可以這樣思考為 實現必須依賴於抽象,而不是抽象依賴於實現


假設 A 相依於 B   那麼代表了 B 擁有控制權,這樣我們需要轉移這種關係

讓控制權由實現的這方轉移到抽象的這方 使應用程式的元件獲得更多的可用性

以 IoC 來說,如果你以 Spring 容器的角度看它  即是 Don't call me,I'll call you

就是你不需要像容器要任何資源物件,容器會自動將它給你

2011年8月8日 星期一

Java 網路程式 - HttpClient 實現 Get 請求

以下透過 org.apache.commons.httpclient 來模擬一個 GET 請求


httpclient 提供了一些簡單的 API 讓程式設計師可以使用一些簡單的HTTP溝通


底下透過一個範例來介紹 Get 請求的作法

//.....
String targetUrl = "http://localhost:8080/test/LoginAction.do"  //請求路徑
HttpClient client = new HttpClient();  //建立一個 HttpClient 物件
HttpMethod method = new GetMethod(targetUrl );  //建立一個 Get Http method

NameValuePair param1 = new NameValuePair("account","tester1");  //加入請求參數
NameValuePair param2 = new NameValuePair("password","123456")   //加入請求參數

method.setQueryString(new NameValuePair[]{param1 ,param2});  //設定所有請求參數

int statusCode = client.executeMethod(method);  //發出 Request,並返回 Http 狀態碼

System.out.println("Http status : " + HttpStatus.getStatusText(statusCode));
method.getResponseBodyAsString();  //取得回應內容 為String
// or
method,getResponseBodyAsStream();   // 取得回應的輸入串流
method.releaseConnection();



2011年8月7日 星期日

Java 網路程式 - org.apache.commons.httpclient 傳送檔案給 Servlet

本篇介紹運用 apache commons 中的 httpClient 模擬一個 Http Post 的方法

關於 詳情可以看 RFC1867:

他同樣是運用 Form-based File Upload in HTML

將檔案送到一個 Servlet,在 Servlet 中運用 apache commons 的 fileUpload 執行存檔動作

以下為簡圖說明之











在 Client 端部分不限於 Servlet 裡,已下看看Client程式的sample

2011年8月6日 星期六

【JACOB】Office 轉 HTM、MHT

本篇來介紹一下 MS Office 的轉檔案例,以下會說明要如何將 word、ppt、excel

透過 JACOB 操作 Office 進行轉檔的過程,而最終產出結果為 HTM 檔

接著就以一個 Word 操作的 Sample 來介紹

//.....
String officeFilePath = "C:\\abc.doc";   //word 檔
String HtmFilePath = "C:\\abc.htm";   //轉出檔
//初始化  Wrod 
ActiveXComponent activeX_App = new ActiveXComponent("Word.Application");
try{
    //將操作 office 的過程設定為背景執行
    activeX_App.setProperty("Visible", new Variant(false)); 
    // 取得 該 Word 的Dispatch 物件,透過設置Property 為 "Documents"
    Dispatch prop = activeX_App.getProperty("Documents").toDispatch();  
    
    //載入 word 檔案並開啟  運用 Dispatch.invoke(...).toDispatch() 返回一個 Dispatch 物件
    Dispatch office = Dispatch.invoke(
                 prop,
                 "Open",
                 Dispatch.Method,
                 new Object[] {officeFilePath, new Variant(false),
                                     new Variant(true) }, 
                 new int[1]).toDispatch();

    //將 word 文件另存成 HTM 檔
    Dispatch.invoke(office, 
                            "SaveAs",
                            Dispatch.Method,
                            new Object[] {mhtFilePath, new Variant(8)},   //WORD 轉 HTM 的代碼為 8
                            new int[0]);
	
    Dispatch.call(office, "Close");  //關閉 Word

    }catch(Exception e){
	e.printStackTrace();
    }finally{
        activeX_App.invoke("Quit");   
    }

2011年8月5日 星期五

【JACOB】Java-COM Bridge 介紹

在說到 JACOB 之前先來談談 Java 特性

首先 大家都知道的 Java 優點中 其中一項即是 "跨平台"

Java 將程式設計師與底層的作業系統隔開  讓 Java 程式能夠在不同的平台上開發、運行

說到這個優點,也就因為如此導致 Java 與底層的作業系統變的毫無關係

這樣的情況讓 Java 需要透過底層的作業系統操作或運用某些函式庫是格外困難

例如最近遇到的需求,我們需要將 MS office 的檔案轉檔成 HTM

如果 AP 存在於 Window OS 下,要如何透過 Java 實現?有幾種方法

其中一個的解決方案可以透過 JNI 另外一種可以考慮一下 JACOB

JACOB 是透過 C 語言寫成的,並提供一個 Java bridge 讓你的 Java 程式可以呼叫

執行環境需要在 Window OS 下,在 Linux 是不 work 的

因為在使用 JACOB 時,除了導入相關的 JAR 以外,還需將 jacob.dll

2011年7月30日 星期六

【ZK】更換 window 及 listbox 的樣式

本篇繼續分享有關 ZK 的style 設定

其實不管任何元件的預設樣式都可以在 ZK 的官網找到

相對的也提供了讓開發者能夠客制化的 UI 呈現樣式

就先以 listbox 為例,如下圖就是他預設的樣式,藍白交錯









如果需要變換顏色的話,則可以如下所示

<style>
    div.z-listbox-body{
        background: #F7E7B4;
    }
    tr.z-listbox-odd {
        background: #F0F0F0;
    }
</style>

div.z-listbox-body 的 background 

可以更換基數牌的背景顏色,相對的

tr.z-listbox-odd 的 background

則能夠更換偶數排的背景顏色,結果如下圖

2011年7月18日 星期一

【ZK】Javascript 開新視窗

本篇繼上一篇 【ZK】開新視窗 的應用之後

這邊我來介紹一下如何運用 Javascript 的技巧開啟一個新的視窗

當然 ZK 也能夠支援 Javascript 的運作

再運用 Javascript 開心視窗時,程式通常如下

window.open('目標 URL', '', '');  總共可帶三個參數進去

延續之前的例子,當 User select 某個 item 的時候就要開新一個視窗的話

可以在 listbox 的 onSelect 時,執行你所需要的 Javascript

程式大致如下 :


<attribute name="onSelect">    
       <![CDATA[
              String acc_id = Executions.getCurrent().getDesktop().getAttribute("select_id");
              String acc_name = Executions.getCurrent().getDesktop().getAttribute("select_name");
              String userId = Executions.getCurrent().getDesktop().getAttribute("loginId");

2011年7月7日 星期四

Hibernate 教學 - HQL 基本介紹

HQL 為 Hibernate 的查詢語句,他很類似於 SQL 但是比所能達到的功能有些許限制

重點是 HQL 為一種物件導向式的查詢語言,簡單說 HQL 是可以直接針對實體物件進行查詢、修改...等

而不像 SQL 是針對 Table,以下用一個最簡單的 select...from 來介紹 HQL

一般的 SQL 的 select * from t_product --- 指 撈出 t_product 這個 table 的所有欄位資料

如果是 HQL 會這樣寫 select p from Product p --- 這裡的 Product 為一個實體物件

以上這樣的寫法 可以簡化成 from Product as p 或是 from Product p

甚至還可以這樣寫 from Product

只要記得的是 from 後面接的是一個 Java 的實體類別,如果只是要撈出 t_product 的 name 欄位呢?

HQL : select p.name from Product --- 注意這裡的 p.name

p 目前唯一個 Product 的物件,p.name 表示了 p 物件的 name 屬性

2011年7月2日 星期六

【ZK】開新視窗

在前一篇的【ZK】Radiogroup 中介紹了如何透過 radiogroup 篩選 listbox 裡的資料

這邊我們繼續介紹當使用者選擇了 listbox 中的某一列時,需要開一個新的視窗,並傳入參數

這邊採用的方法是運用 selectedItem 屬性

所以先設定 listbox 的 selectedItem 屬性,如下所示:


<listbox id="box" multiple="true" rows="10"
             model="@{win$composer.allCountry}"
             selectedItem="@{win$composer.current}">


還記得原來的這個 Controller,程式可以在第一篇中找到【ZK】資料庫應用

接著在這個 Controller :DataHandleController.java 中這定 getter/setter

2011年7月1日 星期五

【ZK】Radiogroup

本篇繼續上一篇的 ZK 資料庫應用,這邊我們以一組 Radiogroup 來過濾 listbox 元件中的資料

首先先來看看 radiogroup 與 radio 的寫法


<radiogroup id="accountGroup" apply="org.controller.AccountGroupRetriver">
        <radio label="select1" selected="true"/>
        <radio label="select2"/>
        <radio label="select3"/>
radiogroup>

大致上跟一般在寫 HTML 是差不多的

注意 apply 屬性會對應到類似一個 controller 的 Java 程式,專門對這個 radiogroup

做事件偵測並篩選資料,這也是 ZK 的好處之一

它能夠跟針對各個的元件做類似服務的請求或是初始化的應用,相當方便。

接者就來看看這段程式吧

2011年6月25日 星期六

【ZK】資料庫應用

本篇範例將介紹在一個以 ZK 為基礎的 UI 下,讀取資料庫並顯示結果在 UI 上

首先先介紹 ZK 長用於顯示資料的 listbox 元件,如下圖








通常一個顯示資料的元件 listbox 來有包含兩個子元件 listhead、listitem

顧名思義 listhead 就是顯示最上面顯示欄位名稱的地方 listitem 則是顯示每筆資料的元件


<listbox id="box" multiple="true" rows="10" >
        <listhead>
            <listheader label="countryID"/>
            <listheader label="locationNO" />
            <listheader label="locationName" />
            <listheader label="countryName" />
        </listhead>
        <listitem>
            <listcell />
            <listcell />
            <listcell />
            <listcell />
        </listitem>
</listbox>   

2011年6月24日 星期五

【pureMVC】教學範例(三)

最後一篇要來介紹 Proxy 的內容了,通常在一般的 Proxy 會與遠端做連接

並處理一些邏輯,在針對做後的結果發出 Notification,以下的範例我並沒有用遠端的方法

來和後台要資源,以簡化這個 pureMVC 的範例

LoginProxy.as

package org.model
{
    import org.puremvc.as3.interfaces.IProxy;
    import org.puremvc.as3.patterns.proxy.Proxy;
    //繼承 Proxy, 並實作 IProxy 介面
    public class LoginFormProxy extends Proxy implements IProxy
    {
        public static const NAME:String = "LoginFormProxy";
        public static const LOGIN_SUCCESS:String = "login_success";
        public static const LOGIN_FAIL:String = "login_fail";
        public function LoginFormProxy()
        {
            super(NAME, null);
        }
       
        public function login(account:String):void
        {
            if(account == "tester1"){
                //發出登入成功事件
                sendNotification( LOGIN_SUCCESS, "welcome " + account);
            }else{
                //發出登入失敗事件
                sendNotification( LOGIN_FAIL, "login fail");
            }
        }
       
    }
}

2011年6月19日 星期日

【pureMVC】教學範例(二)

在第一篇我們已經將 UI 的元件分割出來後,就可以分別依照各個 Component 來建立 Mediator

以下先來看登入元件 "LoginForm.mxml" 的 Mediator -- LoginFormMediator.as


package org.view
{
    import org.view.component.LoginForm;
    import org.ApplicationFacade;
    import org.puremvc.as3.interfaces.IMediator;
    import org.puremvc.as3.interfaces.INotification;
    import org.puremvc.as3.patterns.mediator.Mediator;
    import flash.events.Event;
    import mx.controls.Alert;
    //須繼承 Mediator 並實作  IMediator 介面
    public class LoginFormMediator extends Mediator implements IMediator 
    {
        public static const NAME:String = "LoginFormMediator";
       
        public function LoginFormMediator(viewComponent:Object=null)
        {
            super(NAME, viewComponent);
            //註冊 LoginForm 的登入事件  "login", 當處發時呼叫  onLogin() 方法