ZKという、コンポーネント型のWebフレームワークがあって、ちょっと面白そうなので試してみた。
https://www.zkoss.org/
コンポーネント型なのでJSFが近い。
とりあえず始め方がここにいろいろある。
https://www.zkoss.org/wiki/ZK_Installation_Guide
プロジェクト作成
まあ、結局Spring Bootと一緒に使うことになるだろうから、Spring Bootで始めるやつを見る。
https://www.zkoss.org/wiki/ZK_Installation_Guide/Quick_Start/Create_and_Run_Your_First_ZK_Application_with_Spring_Boot
まずSprig Bootのプロジェクトを作る。
https://start.spring.io/
Dependencyは何もいらないということなので、そのまま。
Spring MVCなどはZKの依存ライブラリとして入ることになる。
で、pom.xmlにrepositoryの追加。
<repositories>
<repository>
<id>ZK CE</id>
<name>ZK CE Repository</name>
<url>https://mavensync.zkoss.org/maven2</url>
</repository>
</repositories>
あと、dependencyを追加。
<dependency>
<groupId>org.zkoss.zkspringboot</groupId>
<artifactId>zkspringboot-starter</artifactId>
<type>pom</type>
<version>3.2.3</version>
</dependency>
ドキュメントには、${zkspringboot.version}
の部分はmavenレポジトリを確認してくれと書いてあったので、ここにある最新っぽい3.2.3を指定。
http://mavensync.zkoss.org/maven2/org/zkoss/zkspringboot/zkspringboot-starter/
最初の画面を作る
ではZKのコードを書いてみる。zulという拡張子でXMLを書くらしい。
ドキュメントをそのままコピペ。してsrc/main/resources/web/hello.zulに保存
<zk>
<window title="Hello ZK - Spring Boot!" border="normal">
You are using ZK version <label value="${session.webApp.version}"/>
</window>
</zk>
あと、src/main/resources/application.properties ファイルに設定を一行追加
zk.homepage=hello
で実行やーと思ったらorg.zkoss.zk.ui.http.HttpSessionListenerがないというClassNotFoundが・・・。
zkspringboot-starter.3.2.3のPOMを見るとzkbindがprovidedになってるのでプロジェクトに含まれない。provideされてないし。
ということで、自分のpom.xmlにzkbindも追加。zkspringboot-starterにあるものからscopeを取り除いただけ。
<dependency>
<groupId>org.zkoss.zk</groupId>
<artifactId>zkbind</artifactId>
<version>10.0.0-jakarta</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
</exclusion>
</exclusions>
</dependency>
改めて起動したらlocalhost:8080にアクセスしたら動いた!
独自のファイルを追加する
では独自のファイルをsrc/main/resources/web/world.zul に置いてみる。
<zk>
<window title="My Page" border="normal">
It works!!
</window>
</zk>
で、localhost:8080/worldとかにアクセスしてもNot Found。
どうやってアクセスすればいいのか全然わからなかったのだけど、サンプルコードとか見てたらコントローラーかかないといけないっぽい。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HelloController {
@GetMapping("/helloworld")
public String hello() {
return "world";
}
}
なんかダサいな。パスをそのまま返すコントローラを作ることになりそう。
ドキュメントさがしたら、ここにあった。
https://github.com/zkoss/zkspringboot/blob/master/README.md
改めてコントローラのパスにアクセスしたら見れた。
Javaコードと結び付ける
じゃあ、ボタン押したらなにかJavaのコードを呼び出すっていうのをやろう。
それっぽいタグを書いてコンポーネントを置いてみる。idをちゃんと指定しておけばどうにかなる。
<zk>
<window title="My Page" border="normal"
apply="com.example.demo.HelloComposer">
It works!!
<vlayout>
<hlayout>
<textbox id="input"/>
<button id="exec" label="Go"/>
</hlayout>
<label id="output" value="hello"/>
</vlayout>
</window>
</zk>
コンポーネントはこのリファレンスに。
https://www.zkoss.org/wiki/ZK_Component_Reference
そしたら対応するJavaコードを書く。クラス名をwindowタグのapplyに指定している。このクラスはSelectorComposer<Component>
を継承する必要がある。
package com.example.demo;
import org.zkoss.zk.ui.Component;
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.zul.Label;
import org.zkoss.zul.Textbox;
public class HelloComposer extends SelectorComposer<Component>{
@Wire
private Label output;
@Wire
private Textbox input;
@Listen("onClick = #exec")
public void go() {
output.setValue(input.getValue());
}
}
あとは、コンポーネントに対応するフィールドを定義して@Wire
アノテーションを貼る。フィールド名はたぶんIDと同じ名前にする必要がある。違う場合はアノテーションに指定すればいいのかもしれないけど試してない。
イベントハンドラには@Listen
をつけてonClick
にボタンのIDを指定する。
実行したら動いた!
Spring Bootとの組み合わせはJSFよりもやりやすい。
結構よさそうなんだけど、コンポーネントベースのフレームワークを使いたいのは企業の社内システムで、そうするとJEEアプリケーションサーバーをたててそうだし、いろいろ考えるとJSFがいいかなぁ。