イベント処理とアラート表示
では、ZULコンポーネントの基本的な使い方が分かったところで、次に簡単なイベント処理を行ってみましょう。プッシュボタンを用意し、クリックしたら簡単なメッセージを表示させてみます。
<?page title="Index Page"?> <window title="Welcome to ZK!" border="normal" width="300px"> <label>これは、ZKで作成したページです。</label> <separator/> <button label="click" onClick="alert("こんにちは!")" /> </window>
先ほどのindex.zulをこのように修正してください。アクセスすると、「click」というボタンが表示されます。これをクリックすると、ブラウザ内に「こんにちは!」と表示されたアラートウインドウが現れます。
ここでは、<button>というタグでプッシュボタンのコンポーネントを配置しています。このタグでは、labelでボタンに表示するテキストを指定し、「onClick」でクリック時に実行する処理を設定しています。
今回は、"alert("こんにちは!")"というテキストを実行しています。これは、「alert("こんにちは!")」という処理になります。このalertを実行するだけで、メッセージをアラートウインドウで表示できます。
このalertは、JavaScriptで多用されているalert関数ではありません。「グローバル関数」と呼ばれるもので、ZKに独自に用意されているものです(グローバル関数については後述します)。
最後に、<separator/>についても触れておきましょう。これは、改行するためのタグです。ZKでは、コンポーネント類を<window>内に組み込むと、そのまま横に並べられていきます。改行する場合は、明示的に<separator/>を記述します。
ユーザーからの入力を処理する
今度は、ユーザーからの入力を利用して処理を行ってみましょう。テキストの入力フィールドを用意し、そこに入力した値を使って計算を行ってみます。
<?page title="Index Page"?> <window title="Welcome to ZK!" border="normal" width="300px"> <label>正の整数を入力:</label> <separator/> <textbox id="text1" /> <separator/> <button label="click" onClick="doAction()" /> <zscript> void doAction(){ String s = text1.value; int n = Integer.parseInt(s); int re = 0; for(int i = 0;i @lteq n;i++){ re += i; } alert("合計:" + re); } </zscript> </window>
ここでは、ゼロから入力した数字までの合計を計算して表示させています。スクリプトを見ると、<textbox>というタグが用意されています。これが、入力フィールドのコンポーネントです。また<button>では、onClick="doAction()"というように修正されています。これにより、クリックするとdoActionという、Javaのメソッドに相当するものが呼び出されるようになります。(このdoActionが何かは、この後で)
このdoActionは、その後にある<zscript>というタグの中で定義されています。この<zscript>は、スクリプト言語を使った処理を記述するためのものです。これにより、GUIを記述しているzulファイル内に処理を埋め込むことができるわけです。
使用言語は「Java」!?
では、ここで使われているのはどういう言語なのでしょうか。よく見ると、どこかで見覚えのある感じがしませんか? Integer.parseIntなんて、なかなか他の言語ではお目にかからないものじゃないでしょうか。そう、これは「Java」なのです!
といっても、完全なJavaというわけではありません。よく見ると、繰り返し部分がfor(int i = 0;i @lteq n;i++)と書かれています。これは、Javaならばfor(int i = 0;i <= n;i++)となるべきものです。
この1文を見てピンときた人は、かなりなJava通でしょう。正解は「BeanShell」です。BeanShellは、Javaのインタープリタです。Javaのソースコードをその場で実行することが可能です。それだけでなく、クラスやメソッドとして定義しなくとも、ただ行わせたい処理をそのまま記述するだけで実行できます。ここでのdoActionなどは「グローバル関数」といって、クラスなどを用意せず、いきなり関数を定義して利用することができるBeanShellの機能を使っています。
このように、Javaという言語をそのままスクリプト言語として利用できるようにしたものがBeanShellである、といってもよいでしょう。ただ単に文を書いて実行するだけでなく、面倒な定義などを極力省略して使えるように再構築されたJava、それがBeanShellです。
ZKでは、Java(BeanShell)だけでなくさまざまな言語を使って処理を記述することが可能です。<zscript>タグに「language」という属性を用意することで、Java以外の言語を使うことができます。標準で利用可能なものとしては、JavaScript、Jython、JRuby、Groovyといったものがあります。これらはZKライブラリの「ext」フォルダ内に用意されているJarファイルを使うことで利用可能となります。先に、「bsh.jar」をWEB-INF/lib内に移動しましたが、これがBeanShellのライブラリファイルだったのです。
先程、alertというものを利用しましたが、これもJavaにはない機能で、BeanShellで用意されたグローバル関数です。BeanShellを利用していればこそ、こうした安直な機能の拡張が可能なのです。