Project Logo
 
LoadOnDemand  

これは、プログラムhttp://docs.zkoss.org/wiki/Use_Load-On-Demand_to_Handle_Huge_Dataで書かれたアーティクルのZKGrailsへのポートです。
.このチュートリアルZKGrails 0.7.1およびそれ以降を使用します。オリジナル

Grailsプロジェクトを作成します

このタイプのチュートリアル用のGrailsプロジェクトを準備します:

$ grails create-app ondemand

ZKGrailsインストール

次に、 ZKGrailsをインストールする必要があります。
最新のバージョンを自動的にインストールするには、次のように入力します:

$ grails install-plugin zk

ドメインクラスの作成

シンプルなドメインクラスのEmployeeを使用してデモプログラムを作成します。
Grailsのドメインクラスを作成するには、ドメインを作成するには、 クラス名を使用して以下の様にcreate-domain-classコマンドを使用します:

$ grails create-domain-class employee

Employeeのプロパティを追加します

次に、ドメインクラスのEmployeeに2つのプロパティを追加します。すなわちfullname 、usernameで両方ともStringです。

class Employee {

   
String fullname
   
String username

   
static constraints = {
   
}
}

zulページを作成します

$ grails create-zul employee

このコマンドでgrails-apps/composers/EmployeeComposer.groovyも作成されます。

employee.zul編集

<window apply="${employeeComposer}">

   
<vbox>
       
<image src="images/grails_logo.jpg"/>
   
</vbox>

   
<listbox id="lstEmployee" width="100%" checkmark="true">
       
<listhead sizable="true">
           
<listheader label="ID" sort="auto" />
           
<listheader label="Full Name" sort="auto" />
           
<listheader label="User Name" sort="auto" />
       
</listhead>
 
</listbox>
 
<paging id="pagEmployee" pageSize="30" />

</window>

EmployeeComposer編集

このコードでは、 2のプロパティlstEmployee 、 pagEmployeeを見ることができます 。
どちらもGenericForwardComposerのサブクラスで、GrailsComposer により注入されています 。
それらは、明らかに、 zulファイルにおけるリストボックスとページングコンポーネントを表しています。

そこにはafterCompose クロージャも見えます 。
このクロージャはdoAfterComposeによって起動され、そこでコンポーネントを初期化するGroovyが動作します。

アクティブなページを更新する為にpagEmployeeをクリックする度に自動イベントハンドラonPaging_pagEmployeeがコールされます。
ハンドラが動作するにはハンドラの唯一の引数はForwardEventもしくはEventでなければならない事に注意。

redrawメソッドにおいて宣言される、Groovyのデフォルト引数の使用例をお見せしましょう。
それは、 afterCompose 内でredraw()をコールすることですが、redraw(0)を意味します 。

また、 redraw メソッドにはZKGrails によって追加される動的メソッドを使用するところが2ヶ所あります。
最初の1つは listbox#clear ですべての ListItem を削除します。
2つ目は append で、 ZK Builderを介してのコンポーネントを構築を受け付けています。

import org.zkoss.zkgrails.*
import org.zkoss.zk.ui.event.*

class EmployeeComposer extends GrailsComposer {

   
def lstEmployee
   
def pagEmployee

   
def afterCompose = { c ->
        pagEmployee
.totalSize = Employee.count()
        redraw
()
   
}

   
def onPaging_pagEmployee(ForwardEvent fe) {
       
def e = fe.origin
        redraw
(e.activePage)
   
}

   
def redraw(page=0) {
       
def list = Employee.list(offset: page * pagEmployee.pageSize,
                                 max
: pagEmployee.pageSize)

        lstEmployee
.clear()
        lstEmployee
.append {
            list
.each { e ->
                listitem
(value: e) {
                    listcell
(label: e.id)
                    listcell
(label: e.fullname)
                    listcell
(label: e.username)
               
}
           
}
       
}
   
}

}

テストデータ

アプリケーションを実行する前に、いくつかの試験データを表示する必要があります。
grails-app/conf/BootStrap.groovy オープンし、 initのクロージャに、次のスニペットを追加します。

     def init = { servletContext ->
       
1000.times { i ->
           
new Employee(fullname: "Name $i", username: "user$i").save()
       
}
     
}

上記のコードでは、1000個のドメインオブジェクトクラス Employee を作成するために、1000回ループします 。

アプリケーションを実行します

$ grails run-app

そこで、お使いのブラウザポイントを http://localhost:8080/ondemand/employee.zul で確認します。