跳到主要內容

發表文章

NSIS 啟動 Log功能

NSIS 啟動 Log功能 標準版本的NSIS安裝好之後,編譯時並無法使用以下指令 LogSet yes 編譯時會產生錯誤訊息,指出Log功能並沒有打開。 如閱讀文件會告訴你要將Log功能開啟後,重新build NSIS,對不熟悉的人是很麻煩。 此時其實可以去下載NSIS special builds,就有一個是已經啟動Log的,下載解壓後覆蓋掉原本NSIS的安裝目錄即可。

ZK - open source Ajax Framework介紹

ZK介紹 數年前因 IThome的報導 就有注意到ZK,以framework作為產品的台灣公司,真的是非常少見,而ZK的表現也是令人激賞。 除了ZK 這個主軸的framework以外,其相關的產品也很全面,介紹部份如下: ZK studio 一個eclipse plugin,用來加速ZK開發的工具。內含一些簡化開發過程的工具如: ZUL Visual Editor, 可以預覽zul所設計的UI在瀏覽器上顯示的樣子,方便設計UI。 Properties, 點選某個zul中的UI元件,即會顯示該元件的所有可設定的properties。 ZUL Palette, 元件調色盤,可以將UI元件用拖拉的方式放至zul文件中。 ZK JSP tag 將zk的元件整合至jsp中,若不想完全改寫既有jsp頁面,可以採用此一選擇,可以立即獲得Ajax的特性。 ZK Spreadsheet 類似Google docs中試算表的元件 ZK calendar 類似Google calendar的元件 ZK線上展示 ,直接以畫面示範所有元件的用法與外觀,你可以手動修改原始碼並立即觀看修改後的結果,很棒的一個作法。 優點 快速擁有Ajax效果 對JavaEE工程師來說,在不換平台的情況下(Flex, Silverlight)要做出RIA,擁有的選擇不多,直接透過Javascript使用AJAX或採用Ajax相關的library(Jquery,DWR)需要一段時間學習, RichFaces 也可能是個選擇,但JSF似乎不是很多人採用,對於JavaEE工程師來說,可以透過學習成本不高的ZK來快速打造RIA。 支援MVC架構 zul配合ZK composer(Controller),可以使zul頁面純粹擔任View的角色,完全不需寫程式碼在頁面上,作到清楚的MVC切分。 composer更可對頁面UI進行動態新增、刪減或修改屬性之變化,皆透過zK ajax engine來完成。 可純粹以Java開發 雖然ZK 5已讓懂javascript的人作前後端整合開發,甚至支援其他的script語言,但是幾乎所有既有元件功能都仍然可以透過Java控制。 Component-based, Event-Driven UI畫面以UI元件為基礎配置,也可以某個程度的客製化元件...

Java 執行檔(exe)路徑問題

要讀取應用程式下相對目錄的檔案,要瞭解java File解析相對路徑的方式。 JavaDoc java.io.File中提到 A pathname, whether abstract or in string form, may be either absolute or relative . ...resolve relative pathnames against the current user directory. This directory is named by the system property user.dir , and is typically the directory in which the Java virtual machine was invoked. 路徑可以是「相對」或「絕對」,相對路徑依照目前使用者的所在目錄,也就是JM被啟動的目錄。 在eclipse中,啟動的目錄是project根目錄,例如: myProject下執行"run as Java Application" current user directory就是 [workspace目錄]\myProject 如果用JSmooth之類的custom launcher工具封裝成exe後,current user directory就是exe所存在的目錄。 建立成捷徑後,則current user directory會以捷徑內容中「開始位置」為準,所以如果「開始位置」與exe存放位置相同的時候,則與直接雙擊exe執行的current user directory相同。 但若以bat執行,則current use directory會以bat所在目錄為準。 例如一個bat檔如下 d:\filePath.exe pause 若filePath會建一個新檔在current user directory,若bat放在桌面,則該新檔會建立在桌面,而不是exe檔所在位置。 但透過JSmooth設定可以改變此情形。 勾選"Set the executable folder as current directory of application"之後,無論bat檔在什麼位置,都以exe檔的所在位...

準姊姊的樣子

亮亮活潑又愛管東管西,連他爸爸都敢管,我們都相信以後一定會把弟弟妹妹管得死死的,只是沒想到老二還沒出生我們就已經隱約看到她做姊姊的樣子了。 昨天晚上亮亮媽躺在床上休息時,感覺到胎動,說了一句:「圈圈在踢我」。 亮亮立刻在旁邊大聲說:「不准踢媽媽!」,讓我跟亮亮媽都嚇了一大跳,沒想到老二還沒出生就已經開始被「管」囉。 真是管得太早了吧!

ZK整合Hibernate, Spring的lazy loading問題簡單解法

ZK是個好學易用的component-based, event-driven AJAX framework,可以只用Java語法開發,而擁有AJAX的技術達成的更新部份網頁效果。 Hibernate用在web-based application時,在view layer會有眾所周知的lazy loading problem,如果使用JSP等會發出HTTP request的前端技術,可以透過OpenSessionInViewFilter來解決這個問題。 不過,如果使用AJAX技術時,網頁畫面的更新通常不會發出HTTP request,因此上述解法將無法用在ZK這樣的AJAX framework中。 典型的master-detail情況是,在ZK的元件中,點選listbox中一筆紀錄(master),要顯示該筆資料的詳細資料欄位(detail),例如點了一筆員工姓名,要顯示員工詳細資料。但是這些詳細資料中,有些欄位或集合是在hibernate中設定為lazy initialization的,也就是在抓出listbox中的簡要資料時,沒有被hibernate載入的。 這時hibernate會透過model物件中附帶的Session物件去做再次查詢,如果該Session已經關閉則會拋出lazy initialization exception。 有一種作法稱為Long Session,也就是開啟一個session直到應用程式結束才關閉。 我的解法比較適用在DAO層採用 繼承Spring的 HibernateDAOSupport的架構,他的特性是CRUD的method多半用 HibernateTemplate來實做各類查詢。這樣的架構Session會在HibernateTemplate 中開啟、關閉,也就是查詢結束後Session就關閉了。如果採用這樣的架構,Long Session的解法跟此架構格格不入,ZK所提供的OpenSessionInViewListener也跟這樣的架構無法共同運作,因為DAO層與OpenSessionInViewListener不是使用同一個Session。 所以我的解法是在頁面點選一筆資料的同時,先initialize該筆的lazy-loaded collection,樣本程式碼如下: public void initializeProxy(E...

SAP自我學習資源

SAP Training : Guide to Free SAP Study Material http://www.youtube.com/watch?v=6GQeHnbT1k4

Unidirectional one-to-many foreign key自動插入

在使用單向一對多mapping,一種簡單的作法是在「many」的一方中的table中的某一個欄位用來儲存「one」一方的主鍵,如果以下方範例來說, Address表中有一欄叫personId是Person表中的主鍵。 create table Person ( personId bigint not null primary key ) create table Address ( addressId bigint not null primary key, personId bigint not null ) 取自Hibernate reference Documentation 3.3.2.GA, 7.2.3 set 要加上 cascade="all" or cascade="save-update" 當我們在儲存Person物件(含有Address)的時候,hibernate可以自動幫我們將Person的主鍵填入Address表的personId欄位中而不需要手動寫程式。 關鍵在Person的mapping document上 key column中 not-null="true" 的這個設定。 public class OneToMany { public static void main(String[] args){ Address add1 = new Address(); Address add2 = new Address(); Person p1 = new Person(); p1.sets(new HashSet()); p1.getAddresses().add(add1); p1.getAddresses().add(add2); Session session = HibernateUtil.getSessionFactory().openSession(); Transaction tx = session.beginTransaction(); session.save(p1); // cascade tx.commit(); ...