跳到主要內容

發表文章

目前顯示的是有「zk」標籤的文章

ZK 教學 - 常見錯誤用法 06 - 慎選 data binding 語法

慎選 data binding 語法 最常用的語法有以下 4 種: @init: 只從 ViewModel 載入一次 @load:載入並追蹤 ViewModel 變化 @save:寫入 ViewModel1 @bind:(雙向)等於 @load + @save 後面 3 種因為需要持續維持(追蹤)元件與 ViewModel 的綁定關係,伺服器需要建立 tracking node,因此成本較高。 依對系統的負擔排名如下: 因此如果沒有動態變化的需要,請使用 @init 。 例如在 Listbox , Grid , Tree 內的 <template> 若只是顯示資料,只需用 @init ,可以免去大量 tracking node 所需的記憶體。 例如: < grid width = " 400px " model = " @init(vm.itemList) " > < columns > < column label = " index " /> < column label = " name " /> </ columns > < template name = " model " > < row > < label value = " @init(forEachStatus.index) " /> < label value = " @init(each.name) " /> </ row > </ template > </ grid >

用 ZK shadow component 實現更彈性的頁面控制 - JCConf 2016 演講

很開心有機會能在 JCConf 2016 上演講,講題是「用 ZK shadow component 實現更彈性的頁面控制」。Shadow Component 我認為是 ZK 8 最重要的功能,讓你模組化一個頁面片段(含有一群 UI 元件),允許你傳參數至該頁面,因此可以輕易地在不同頁面內重用該頁面片段。 例如你用幾個元件組合出如下的個人資料圖: 你可以將該群元件放在一個獨立的 zul 中,在任一個頁面中將其插入,也可以設定一個易讀的元件名稱,所以在 zul 中就可以類似這樣使用: <zk> <personbox person = "@init(vm.person)" > </zk> 配合 ListModelList 跟 <forEach> (shadow component) 就可以做到動態增減的效果: 完整介紹請看當天演講影片:

Visual Editor 的替代方案 Run-jetty-run

ZK Studio 是幫助你開發 ZK 程式的一個 eclipse plugin,原本附帶一個 zul 頁面預覽功能叫 Visual Editor,目前已經被拆開需要額外 下載安裝 。不過因為已經沒有繼續維護,你若使用較新版的 eclipse Visual Editor 可能無法正常執行。 因此推薦各位安裝另一個 eclipse plugin: run-jetty-run 。它有幾個優點: 快速啟動 它可以直接在 eclipse 中將你的專案用 jetty 這個輕量的 application server 跑起來,過程只需要幾秒鐘,也不需要打包你的專案成 WAR。 熱抽換 Java class 開發過程中更改 Java class 也不需要重新啟動,它會自動載入最新編譯的 bytecode 自動關閉前一台 如果再啟動一次 jetty (不管是相同或不同專案),它會自動先幫你把前次啟動的 jetty 停掉,再啟動一個新的,避免因為同一個 port (通常是 8080)已經被佔用而造成啟動失敗。 可用 eclipse 熱鍵啟動 用快速鍵 (command+F11) 啟動、重啟更便利,加速開發。

ZK 教學 - 使用 MVC 或 MVVM?

不管是現在剛開始接觸 ZK 或是用過一陣子的人都可能會遇到的問題是到底要用 MVC 或 MVVM 的方式開發。從 ZK 8 之後又把 MVVM 的能力更佳的擴展,所以 MVVM 會是一個功能更強的開發方式。但 MVC 在使用上比較直覺,仍有其優勢,所以我想決定性的因素會比較是 開發者的偏好 及 專案的特性 。你可參考下面的比較來決定哪種方式比較適合你。 優勢比較 MVVM ViewModel 較不易受畫面變動影響。 因為 ViewModel 沒有變數直接指向 ZK 元件,因此若是畫面上有元件更改,ViewModel 一般不需要修改 ViewModel 較易於在不同頁面中重用。 因為 ViewModel 只包含資料跟業務邏輯,若是不同頁面需要的資料跟業務邏輯相同,就可以重用同一個 ViewModel 例如 A 頁面按按鈕執行搜尋,B 頁面點選單執行同樣的搜尋,則可以重用同一個 ViewModel 中的 command,只是兩個頁面 data binding 寫在不同的元件上。 畫面較易於重用(易於模組化)。 透過 shadow component 跟 template 機制,可以將一段頁面的片段做成可以接受傳入參數 套用 Responsive Design 的成本較低。 通常需要針對不同裝置設計不同版面,但是顯示的資料內容大同小異,因此 ViewModel 多半可以重用 易於套用美工所設計的畫面,或是網路上現成的元件。 易於整合第三方 javascript library 或 widget。 因為 ZK 8 提供了一個可以讓你透過 javascript 去呼叫 ViewModel 中的 command (client side binding) 的方式來跟後端溝通 ViewModel 的可測試性較好。 因為 ViewModel 不需要繼承特定類別跟實作特定介面,可以輕易地執行單元測試 MVC 操控元件方式直覺好學、易懂。 MVVM 控制元件較不直接,需要了解 zk framework data binding 的行為 可以完全使用元件所提供的所有 API。 仍有極少部分 ZK 元件行為沒辦法用 MVVM 控制。例如產生 Messagebox , Listbox.renderAll() , Popup.o...

ZK 教學中文書 - ZK 教練

2016年開始做了不少場教育訓練,覺得台灣工程師應該會蠻希望有一本中文的教材,因為目前網路上多是零散的文章,英文的文件雖然完整,但是太龐大,大部分的人應該無從下手。因此最近開始撰寫一本教學書:「 ZK 教練 」(書名是老婆提供的點子),也為自己在這份工作推出一個代表作。 本書會包含以下幾個特點,幫助讀者更有效地學習: 範例專案 本書附帶一個範例專案,裡面包含所有書中提到的範例程式。你可以輕易地將整個專案執行在 jetty 上,透過瀏覽器看到執行結果,有助於了解程式碼。 練習專案 執行 maven 指令可以產生一個練習專案,它以範例專案為基礎,但是刻意移除部分程式碼,好讓讀者練習之用。因此你可以產生範例專案來練習,若真的遇到困難再參考完整程式。 圖片解說 儘量以各式圖片解說概念。我認同 Head First Design Pattern 一書中提及的理念,學習不是只能靠文字,其他的媒介可以讓大腦得到更多資訊,更增強學習效果。 情境 FAQ ZK 目前已經是個頗為成熟的框架,功能很多,因此不熟悉的人常常不知道實務上某個情境要用什麼功能來解決,這裡會列出各個常用的情境並提供連結指向建議使用的 ZK 特性 當然目前本書尚未完成,歡迎給予回饋。 去看看 ZK 教練

ZK 教學 - 瀏覽器頁籤 (tab) 被關掉後進行處理

如果你想要在 browser tab 關掉時去執行一些應用程式邏輯,例如清理資料等等。我們可以傾聽 browser tab 關掉的事件,這件事等同於 ZK 的 desktop 被移除。 ZK 提供一個 DesktopCleanup listener讓你可以傾聽任何一個 desktop 被移除的事件,所以只要發現你所關注的那一頁的 desktop 被移除了,那就是該 tab 被關掉了,你可以在該 listener 中實作你的應用程式邏輯。範例如下: import org . zkoss . zk . ui . Component ; import org . zkoss . zk . ui . Desktop ; import org . zkoss . zk . ui . select . SelectorComposer ; import org . zkoss . zk . ui . select . annotation . Listen ; import org . zkoss . zk . ui . select . annotation . Wire ; import org . zkoss . zk . ui . util . DesktopCleanup ; import org . zkoss . zul . Div ; public class CloseComposer extends SelectorComposer < Component > { @Wire Div root ; @Override public void doAfterCompose ( Component comp ) throws Exception { super . doAfterCompose ( comp ); //or register in zk.xml getPage (). getDesktop (). addListener ( new MyDesktopCleanupListener ()); } @Listen ( "onClick = #exi...

ZK 教學 - 常見錯誤用法 05 - 用 @NotifyChange 通知 ListModel 改變

以 MVVM 方法開發時,我們通常必須要用 @NotifyChange 來通知 ZK ViewModel 中的某個特定 property 更改了,這時 ZK 會重新載入該 property 去更新畫面。但是若是使用 ZK 提供的 ListModel 的實作物件則有例外 (e.g. ListModelList ),因為 ZK 元件都會傾聽 ListModel 的變動,因此如果你改變其內容,元件都會知道並只 render 差異的部分,並不需要被通知。 這時若是加上 @NotifyChange 有什麼壞處呢?它反而會使 ZK 重新載入整個 ListModel 並 re-render 其中所含有的資料,如此一來,比起元件內建的機制只 render 差異部分還來得更沒效率。

ZK 教學 - 常見錯誤用法 04 - 使用不正確的分享範圍

ZK 中除了提供 Java EE 標準的共享範圍: application , session , request 之外,還提供 desktop 跟 component 範圍。你可透過相對應的範圍物件並呼叫 setAttribute(key, value) 把資料存進去,並在同一個範圍內透過 getAttribute(key, value) 把資料取出來,是很常見的資料傳遞、分享方法。存資料在恰當的範圍,才能共享資料給適當的對象,也不會影響別人的狀態,或產生不必要的垃圾資料。簡介一下 ZK 才有的範圍 (scope): desktop : 大部份情形你可以把這個範圍看作是一個瀏覽器的 tab,同一個 tab 下的元件都屬於同一個 desktop。每次重新載入 (reload) 頁面會重新產生一個新的 desktop。 component : 要取得該元件的 reference 才能取得其上的資料,通常是用來存該元件才會使用的暫存資料。 execution : 這是 ZK 的名詞,指得其實就是 request。只是因為 ZK 要求 zul 的 HTTP request 跟透過 AJAX 發的 HTTP request (通常是 event)有不同的處理方式,但是要通用化兩者,畢竟都是 HTTP request, 就用 Execution 物件封裝兩種不同的 request。 建議用法如下: 只使用足夠的、最小的範圍共享。如果可以透過 desktop 共享,就不要透過 session。 使用 ZK 開發時,一般會將多個相關的功能實作在同一頁 (這也是使用 AJAX 開發應用程式的常態),所以大部時候,跟頁面相關的資料只需要存在 desktop 範圍就夠了。如果存在 session ,要注意其會影響所有同一個瀏覽器下的 tab。 要注意使用 application 及 session scope 的 event queue 會自動啟動 server push。

ZK 教學 - 常見錯誤用法 03 - 過度使用複雜元件

每個 ZK 元件都會在瀏覽器產生對應的 HTML element ,有些很複雜、有些較簡單,當然越複雜的 HTML 對瀏覽器記憶體、效能的負擔就越大。所以沒有必要時,不要選擇成本較高的元件。 例如只是要把某一群元件包在一個區域,也許要插入新元件或是整群處理時,可以用 <div> 就好,而不要用 <window> 。 如果只是要將多個元件水平排列,而並不需要控制其對齊位置的時候,則應該使用 <hlayout> 即可,而不需要用 <hbox> 。同樣的道理,簡單的垂直排列需求可以用 <vlayout> 完成而不需用 <vbox> 。 以一個內含兩個元件的 <hbox> 為例: <hbox> <div> hbox </div> <div> hbox </div> </hbox> 其所產生的 HTML 如下: <table id = "zFLQ5" class = "z-hbox" cellpadding = "0" cellspacing = "0" border = "0" > <tbody> <tr valign = "top" > <td id = "zFLQ5-frame" style = " width : 100 %; height : 100 % " align = "left" > <table id = "zFLQ5-real" height = "100%" cellpadding = "0" cellspacing = "0...

ZK 教學 - 常見錯誤用法 02 - 存取別的 Desktop 中的元件

ZK 中 Desktop 的概念約略等同一個 browser tab,每個元件都會歸屬某個特定的 Desktop,而 ZK 的一個元件在實作上其實是由前端的 widget 加上後端的 Java 物件兩兩一組構成。我們是透過操作後端 Java 元件來操作前端 widget。這個從屬關係不能被打亂,否則 操作 Java 物件若找不到對應的前端 widget 就會產生錯誤。 所以,如果你存取到另一個 Desktop 的元件,例如呼叫該元件的 setter ,這時候理當元件要透過 HTTP response 去控制前端的 widget,但 如果 ZK 發現現在的 Destkop 跟元件的原所屬的 Desktop 不相同,就會拋出以下例外 java.lang.IllegalStateException: Access denied: component, <Listcell z_27_b53>, belongs to another desktop: [Desktop g272] 這種情形可能發生在: 你將指向某個元件的變數透過 event queue 傳到 Desktop scope 以外,例如 session or application scope,並且在另一個 Desktop 存取該元件 解決方法 : 傳遞資料本身,而不要傳元件。例如我要把 page1.zul 中的 Textbox 輸入值,傳到另一個 page2.zul 中做處理,這時就不應該把 Textbox 直接當參數傳出去,而是把 Textbox.getValue() 傳出去。 Composer 中有一個指向元件的變數是 static 解決方法 : 不要將指向元件的變數宣告成 static

ZK 教學 - 常見錯誤用法 01 - 操作元件而不是其 model

好幾個 ZK 元件都支援 以一個 model 物件為基礎來繪製其內容 ,例如 Listbox, Grid, Tree, Tabbox, Combobox。這種情況下, 必須要以控制該 model 來控制元件的 rendering、選擇模式 (single or multiple choice)、被選定的項目 (selected items) ,而不是直接透過元件的 API 。 以下是常見的例子: 要將 Listbox 設定成多選,應該要用 ListModel.setMultiple(true) 而不是 Listbox.setMultiple(true) 。 要刪掉某一個 Listitem ,應該是刪掉 ListModel 中對應的資料物件,而不是直接呼叫 Listitem.detach() 。 點選 Tabbox \ Tab 上的關閉按鈕時,不會關掉 Tab ,因為其移除是要由 Model 控制。 使用 TreeModel 時,要展開 Tree 上某個節點,要透過 TreeOpenableModel.addOpenPath() (or DefaultTreeModel.() ) 而不是 Treeitem.setOpen() 什麼時候可以直接呼叫元件 API 來控制呢?就是你沒有給 Model 物件的時候。

2015 ZK framework 10年台灣研討會

ZK 很難得的在 2015.12.30 舉辦了 台灣研討會 ,約有50位以上來參加。除了公司的人自己演講外,也有請 TonyQ 來聊一下開發 zkfiddle 的過程,以及 ZK 使用者來分享心得。 我也擔任 [ ZK 除錯技巧 ] 的講者,這個講題過去沒人講過,也沒有相關文件,但我覺得應該有很多使用者有興趣知道,因為大部份使用者未必會想要瞭解 ZK 背後運作原理,但是首先會遇到就是使用過程發生問題要怎麼自行排除。 ZK 除錯技巧 演講投影片 除錯案例探討範例程式

Criticism about ZK

Comparison ZK http://blog.pdark.de/2011/10/27/zk/ Performance Report of Server Side RIA Frameworks http://java.dzone.com/articles/performance-report-server-side Thoughts about the ZK Web Framework: Overall experience http://jawsy.fi/blog/2011/09/08/thoughts-about-the-zk-web-framework-overall-experience/ Thoughts about the ZK Web Framework: Technical stuff http://jawsy.fi/blog/2011/09/27/thoughts-about-the-zk-web-framework-technical-stuff/ http://blue-walrus.com/?p=187 ZK vs Vaadin http://jtechnoprojects.blogspot.com/2011/05/zk-vs-vaadin.html http://jtechnoprojects.blogspot.in/2012/12/vaadin-touchkit-vs-zk-mobile-vs.html http://forum.zkoss.org/question/89429/vaadin-vs-zk/ User Experience ZK Rich Client Framework and Agile Development http://www.theserverside.com/news/1363872/ZK-Rich-Client-Framework-and-Agile-Development

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元件為基礎配置,也可以某個程度的客製化元件...