跳到主要內容

發表文章

目前顯示的是 三月, 2016的文章

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 如下:<tableid="zFLQ5"class="z-hbox"cellpadding="0"cellspacing="0"border="0"><tbody><trvalign="top"><tdid="zFLQ5-frame"style="width:100%;height:100%"align="left"><tableid="zFLQ5-real"height="100%"cellpadding="0"cellspacing="0"border="0"style="text-align:left"><tbody><trvalign="top"><tdid="zFLQ6-chdex"style="height:100%"><divid="zFLQ6"class=&quo…

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 物件的時候。