2008年9月29日 星期一

REM - ZK Plugin for NetBeans

ZK 官方雖然只推出 ZK Studio 這個 Eclipse Plugin,不過 SourceForge.net 上有一個免費的 NetBean Plugin,名叫 REM,目前最新是 1.5.0 版。

裝好了之後,REM 會在 Web Application 中新增 ZK 這個 Framework,並且可以新增 ZUL、ZS、ZHTML 等檔案類型,撰寫 ZUL 檔案的時候也可以提供 Content Assist 功能,網站上提供的畫面如下,我就不另外抓了:


不過,目前好像還沒有提供 zscript 內 Java 程式碼的 Content Assist 功能。

使用 NetBeans 開發 Web Services

上課的時候,常常需要撰寫 Web Services,我個人覺得 NetBeans 這方面做的比 Eclipse 要來的好。

前兩天有個學員問我一個問題:如果有現成的 WSDL 檔案,可不可以像以前一樣產生 Server 端的 Skeleton?因為客戶會把需求寫成 WSDL,再交給他們去開發出 Web Services。

答案當然是可以的。

在 NetBeans 的專案上按下滑鼠右鍵,選取 New,就會看到三個跟 Web Services 有關的選項:
  1. Web Service...:這個是要從 Java 類別產生出 Web Service,當然也順便產生 WSDL
  2. Web Service Client...:這個是從 WSDL 產生出 Web Service 的 Client 端
  3. Web Service from WSDL...:這個就是從 WSDL 產生出 Web Service 的 Server 端,也就是所謂的 Skeleton
所以,不管是哪一種,都不需要像以前一樣寫一堆命令列參數。其實,當 NetBeans 產生專案時,就會為每個專案產生一個相對應的 build.xml 檔案,裡面就已經定義好一個一個 Ant Task,包括 Build、Build and Clean、Run,也包括撰寫或呼叫 Web Service 的相關 Task 了!

2008年9月18日 星期四

ZK 3.5.0 image 的 setContent 問題

ZK 可以用以下的方式顯示圖片:
<image id="photo" />
如果要清除圖片內容的話,可以用以下的方式:
photo.setContent(null); 
最近改用最新版的 ZK 3.5.0,上面的 會蹦出一個對話方塊,寫著 im == null。

問了 ZK 原廠,答案是:

舊版的 setContent 方法跟新版的 setContent 方法不太一樣:新版的 setContent 方法是一個 Overloaded 方法,有兩個版本:
public void setContent(org.zkoss.image.Image image)
public void setContent(java.awt.image.RenderedImage image)
所以要改用以下的寫法:
photo.setContent((org.zkoss.image.Image) null) 
可是我試了之後,還是一樣。後來看了一下 Javadoc 說明文件:
Calling this method implies setSrc(null).
In other words, the last invocatio of setContent(org.zkoss.image.Image)
overrides the previous setSrc(java.lang.String), if any.
我就把程式碼改了一下:
photo.setSrc(null); 
居然就恢復正常了!

2008年9月9日 星期二

JBoss AS 的 EJB 3.0 的命名衝突

JBoss AS 的 EJB 3.0 Support 一直做的都還不錯,所以上課的時候我很喜歡拿它來作示範。

前幾天發生一個狀況:程式明明沒錯,部署起來也沒看到什麼明顯的錯誤訊息,但是執行就是會有問題,一直抱怨找不到一些方法,可是我明明就有寫。

後來發現,我是直接部署 JAR 檔案,所以 Session Bean 的名稱預設就是 ClassName/remote 或 ClassName/local,因為我在兩個不同的 EJB Module 裡面定義了相同名稱、不同功能的 Session Bean,所以其中一個實際上並沒有部署成功。結果程式執行的時候,一直找到另一個功能不相同的同名 Session Bean,所以才會出問題。

解決方法是,要嘛把另一個有同名 Session Bean 的 EJB Module 移除,不然就是不要直接部署 EJB Module,先定義 Enterprise Application,加入 EJB Module 之後再部署,這樣 SessionBean 的預設命名方式就會變成 EARName/ClassName/remote 或 EARName/ClassName/local,也就不會產生命名衝突了!

2008年9月8日 星期一

GlassFish 的 DataSource

上課的時候,為了兼顧輕便與佔有率的考量,我喜歡用 MySQL 作為 Database Server。MySQL 預設的管理者帳號沒有密碼,一直以來使用上也沒出過什麼大問題。

這幾天有個課程需要用到 GlassFish,就在 GlassFish 裡頭定義了一個 MySQL 的 DataSource。沒想到,問題發生了:GlassFish 抱怨我的 DataSource 沒有設定 PasswordCredential,可是我的 MySQL 管理者帳號真的沒設定密碼啊!

試了半天之後,沒有什麼進展,所以我最後還是決定,幫我的 MySQL 管理者帳號設定密碼。然後,一切就搞定了!