セッションの利用
常に接続を維持し、値などを保持し続けるのに、セッションは不可欠です。ZKでも、もちろんセッションを利用できます。簡単なサンプルを挙げておきましょう。
<?page title="Index Page"?> <window title="Welcome to ZK!" border="normal" width="300px"> <zscript> var gmsg = session.getAttribute("msg"); void doAction(){ String s = text1.value; session.setAttribute("msg",s); alert("「" + s + "」をセッションに保存しました。"); } </zscript> <label>セッション:${gmsg}</label> <separator/> <textbox id="text1" /> <separator/> <button label="click" onClick="doAction()" /> </window>
入力フィールドにテキストを書き、[save]ボタンを押すと、そのテキストがセッションに保管されます。以後、ページをリロードすると保存した値が表示されるようになります。ここでは、sessionオブジェクトの「setAttribute」「getAttribute」というメソッドを利用してセッションへの値のやり取りを行っています。このsessionは、JSPの暗黙オブジェクトと同様、HttpSessionのインスタンスです。しかし、JSPの暗黙オブジェクトがそのまま使えるわけではありません。例えば、sessionやapplicationなどは使えますが、requestやresponse、outといったもっとも重要なものは使えません。
applicationやsessionについては、ZKのシステムに何ら影響を与えるものではありませんが、requestやresponseなどは「クライアント側とサーバ側を分離しない」というZKのシステムからすれば、使えることができてはまずいものです。outによる出力も、プレゼンテーション層を管理するためのZKというフレームワークからすれば利用できない方がいいものなので、用意されていないのでしょう。
従って、これらは「JSPの暗黙オブジェクトが使える」というより、「ZKが独自に、必要最低限の暗黙オブジェクトを用意してある」と考えた方が良いでしょう。実際、ZKには、JSPにはなかった暗黙オブジェクトが多数揃えられています。現在のイベントを示すeventや、forEachによる繰り返しで用いられるeach、コンポーネント自身を示すselfなども暗黙オブジェクトです。
内部ウインドウの作成
ZKでは、ウインドウを擬似的にWebページ内に配置できました。さらに機能を用意して、パソコンのデスクトップのような表現も可能です。ZKでは、メニューバー、ダイナミックなコンポーネント(ウインドウ)の生成、ウインドウ操作時のイベント処理など、基本的な機能は揃っているので、ちょっとコードを書けば、擬似デスクトップを作りマルチウインドウなGUIを構築することもできます。
実際に簡単なサンプルを作ってみましょう。まず、ページ内に内部ウインドウとして表示させるzulファイルを作成します。ここでは「other.zul」という名前で、Webアプリケーションのルート(index.zulと同じ階層)に配置しておくことにします。ソースコードはざっと次のようにしておきましょう。
<window title="ウインドウ" border="normal" height="100px" width="300px" minheight="100" minwidth="100"> <zscript> void doAction(){ alert("ok"); } </zscript> <label>※ウインドウ</label> <separator/> <button label="click" onClick="doAction()" /> </window>
ここでは、<window>タグ内にラベルとボタンを用意してあります。ボタンをクリックすると、簡単なメッセージが表示されるようにしてあります。これは「内部ウインドウ内できちんとスクリプトが機能するか」を確認するためのものなので、内容は適当に変えて構いません。
それよりも重要なのは、<window>タグに用意されている属性です。ここではheight/widthの他に「minheight」「minwidth」というものが用意されています。これらは、最低の高さと幅を示すものです。これにより、指定したサイズより小さくウインドウをリサイズできないようにします。