ZK (フレームワーク)

**ZK**は、Javaで書かれたオープンソースのAjaxWebアプリケーションフレームワークであり、プログラミング知識がほとんどなくともJavaScriptを使うことなくウェブアプリケーションのリッチなGUIを作成できる。

ZKの中核はAjaxベースのイベント駆動機構であり、123以上のXULと83のXHTMLベースのコンポーネントから成り、ユーザインタフェースを設計するためのマークアップ言語を備えている。高機能なXUL/XHTMLコンポーネントを使ってWebページを設計でき、エンドユーザーの活動を契機とするイベントによってそれらを操作できる。デスクトップのGUIアプリケーションのプログラミングモデルとよく似ている。

ZKの方式はサーバ中心型の手法と呼ばれ、コンポーネント間の同期やクライアント/サーバ間のイベントパイプラインはエンジン部が自動的に行い、Ajaxの組み立て用コードはアプリケーション開発者に対して完全に透過的である。したがって、エンドユーザーから見ればデスクトップアプリケーションのような操作性を提供し、一方で開発者にはデスクトップアプリケーションと同様の単純さを保持している。

Swingのようなコンポーネントベースのプログラミング作法に加え、ZKはリッチなユーザインタフェース定義のためのマークアップ言語ZUMLをサポートしている。

## 特徴
* （単なるHTMLに比べて）リッチなユーザインタフェースを高い抽象レベルで宣言的に記述できる。例えばXULウィジェットセットには、ツリー、コンボボックス、バンドボックス、スライダーなどがある。
* Javaへのスクリプト埋め込みをサポート。これにより、ユーザインタフェースとバックエンドのプログラミングを統一的に同じ言語で開発できる。オプションでその他のサーバサイドJavaスクリプトとしてJavaScript (Rhino)、Ruby (JRuby)、Python (Jython)、Groovyも使える。
* 高度なAjaxサポート。ユーザーのブラウザへの入力はAjax経由でサーバ側のデスクトップモデルに渡される。
* イベント駆動コンポーネントベースモデル（デスクトッププログラミングモデルと類似）
* いくつかのパターンでユーザインタフェースを生成できる。MVCプログラミングを採用した場合は、全てのイベントは中心となるコントローラクラスにフォワードされる。それとは別に zscript を使ってページ内にイベントハンドラを定義できる。前者はSwingに近く、後者はDHTMLに近い。
* JSPカスタムタグライブラリ、JSFサポート、サーブレットフィルタにより、既存のWebプレームワークとの連携が可能。SpringやHibernateをサポート。
* 新たにUIコンポーネントを作成して拡張することができる。コントロールのグループをマクロコンポーネントとして再利用できる。
* ページ内アノテーションによるデータバインディング機能。画面上のコントロールとサーバ上のPOJOのフィールドを透過的にバインドできる。

## XULとの違い
* ZKはサーバサイドでHTMLを生成するフレームワークであり、クライアント側にGeckoが存在する必要がないため、任意のブラウザで機能する。ZKはZUMLで書かれたサーバサイドのページを入力とし、ブラウザにはDHTMLを出力する。
* ZKはユーザインタフェースのロジックをサーバ上のJava環境で実行する。このため、ロジック生成に様々なスクリプティングエンジンやアプリケーションライブラリを使える。プレゼンテーションはDHTMLによりクライアント側で実行され、サーバ側負荷を軽減している。アプリケーションを単一のアプリケーションコンテナで実行することで、DOMを多用してブラウザで実行させるよりもブラウザ間の互換性確認の手間が少なくて済む。
* ZKとXULはコンポーネントが一部オーバーラップしているが、ZKには固有のコンポーネントもある。コンポーネントライブラリは拡張可能である。コンポーネントを組み合わせたマクロコンポーネントを定義できる。
* UIコンポーネントとサーバサイドのデータを宣言的にバインドすることで、サーバサイドのデータバインドを提供する。
* ルック・アンド・フィールが異なる。

## システムの要求仕様
* JRE version 5 かそれ以降
* Servlet 2.3 かそれ以降をサポートするWebサーバ

## 必要なプログラミングスキル
### 必須
* JavaまたはJavaスクリプティングエンジン言語（Groovy、Rhino、JRuby、Jython）に関する基本的知識が必要。
* HTMLとXULに関する基本的知識が必要。

### 任意
* サーバ上で動作するグルーロジックを書くには、スクリプト言語（現在サポートしているのはBeanShell、JavaScript、Groovy、Ruby、Python）の知識を要する。
* オブジェクト指向プログラミングの知識があれば、AWT/Swingスタイルのプログラミング、JavaでカスタムUIコントローラクラスを書くことなどができる。もちろん、そういった知識がなくとも zscript を使ってDHTML風のUIロジックが書ける。
* Servletプログラミング。ZKは Servlet API 上に構築されている。ZUMLをページ言語として使って、正統的なServletプログラミングを選択することもできる。
* Ajax。ZKはAjaxも基盤としているが、それによってユーザーの入力はブラウザ上でJavaのイベントに自動的に変換されるので、基本的にはブラウザで何をしているかを知らなくてもサーバ上のプログラムは書ける。
* クライアント側のJavaScript。コンポーネントのクライアント側アクションをDHTMLロジックで実行することもできるが、ほとんどの場合不要である。
* 宣言的データバインディング。ZKにはオプションでUIコントロールをPOJO Java Beansにバインドできる機能がある。その場合ZKはプログラマが作ったPOJOのsetter/getterメソッドを自動的に呼び出すので、ブラウザでのユーザー入力に対応したプログラミングが不要になる。
* EL言語。ZKはJSTLスタイルのELをサポートしている。

## ZUML
**ZUML** (ZK User Interface Markup Language) は、リッチなUI定義のためのマークアップ言語である。
* ZUMLはプログラマでない開発者が直観的にユーザインタフェースを設計できるように意図されている。
* ZUMLと他のマークアップ言語（Mozilla XUL、XHTMLなど）を同じページ内にシームレスに混合して記述できる。
* ZUMLでは、Java言語にスクリプトを埋め込むことができ（BeanShellが解釈実行する）、EL式を使ってコンポーネントやアクセスデータを操作できる。

## バージョン 5.0 での仕様強化
JavaScriptを使うことなく Ajaxな WebアプリケーションのリッチなGUIを作成できることを売りにしていたが、5.0 から Jquery(JavaScriptライブラリ)を開発者が積極的に利用し、 サーバ中心型の手法だけでなく、サーバ　クライアント融合型の手法もとれるようになった。

## バージョン 6.0 での仕様強化
; ZK Databinding2 
: 次に述べるMVVMデザインパターンを実現するための、新しいタイプのデータバインディングシステム。
; ZK MVVM Model-View-ViewModel(MVVM)
: モデル-ビュー-ビューモデル(MVVM)デザインパターンはモデル/ビュー/コントローラ(MVC)デザインパターンの進化形で、プレゼンテーションから、容易にデータとロジックを分離することができるようになる。
; Generic enhancements
: ZKは従来のJava1.4 からJava1.5 への変更で、ジェネリックスを使用して、よりタイプセーフなコードをかけるようになった。
; Servlet 3 Enhancements
: サーブレット3でCometの非同期通信をサポート。
; Advanced templates
: ZULページの中にテンプレートを作成し、これをmodelとして追加のJavaコード無しに、デザインをレンダーできる。 

## バージョン 6.5.0 での仕様強化
デスクトップとタブレットのUIとタッチエクスペリエンスの領域を、1つのコードベースおよびコンポーネントのセットで解決して融合し、実デバイスの透過性を最も簡単で最も効率的な方法で実現する。

## 脚注・出典

## 外部リンク

* ZK 公式サイト
* ZK 公式サイト（日本語版）
* REM: NetBeans 上で ZK 利用の WEBアプリを開発できるプラグイン
* An Interview with ZK Creator Tom Yeh
* Tutorial: ZK Rich Client Framework and Agile Development
* Tutorial I from IBM developerWorks II III IV V VI
* AJAXを活用したWebインタフェースの作成ツール ZK ITmedia、Programming Bible、2008年8月31日