フォームを使わないアクション
では、フォームを使わないで何らかの操作を行う場合はどうするのでしょう。例えば、<a>タグによるリンクで何かを設定するような場合、フォームは利用しません。こうした場合も同様に扱えるのでしょうか。
フォームを利用しないで何かを実行させるような場合には、Apache Clickに用意されている「ActionButton」「ActionLink」といったコントロールを用います。これらは、それぞれプッシュボタンとハイパーリンクを作成するためのもので、Submitと同様にイベント処理を組み込むことができます。実際にやってみましょう。まず、helo.htmのボディ部分を次のように修正しておきます。
<body> <h1>Hello Click!</h1> <p>$msg</p> <p>$link</p> <p>$button</p> </body>
そして、HeloPageクラスを修正します。今回はActionLinkとActionButtonをそれぞれ用意し、個々にイベント処理のメソッドを設定してみましょう。
public class HeloPage extends Page { public String msg = "ボタンをクリック。"; private ActionLink link; private ActionButton button; @Override public void onInit(){ link = new ActionLink("link","ハイパーリンク",this,"action1"); this.addControl(link); button = new ActionButton("button","プッシュボタン",this,"action2"); this.addControl(button); } public boolean action1(){ msg = "ActionLinkをクリックしました。"; return true; } public boolean action2(){ msg = "ActionButtonをクリックしました。"; return true; } }
表示されるリンクやボタンをクリックすると、メッセージが変化します。それぞれのコントロールの利用の仕方は、Submitの例とほとんど同じです。唯一異なるのは、フォームにaddせず、直接PageにaddControlしているという点だけです。
直接addControlした場合、テンプレート側にそのコントロールを出力するように記述をしていないとページに表示されません。ここでは、$linkと$buttonがテンプレートに用意されており、ここでコントロールのタグが出力されています。
また、ここではコントロール類をaddControlで組み込んでいますね。このように直接コントロールをPageに組み込む場合、ただpublicフィールドとして用意して表示させるだけだと、アクションがうまく機能しません。このようにaddControlで明示的に組み込む必要があるようです。
ページ遷移とデータの受け渡し
続いて、ページの移動について考えてみましょう。Pageクラスには、フォワードやリダイレクトのために次のようなメソッドが用意されており、それらを呼び出すだけでページ移動することができます。
setForward( 移動先 ) setRedirect 移動先 ) setRedirect 移動先 , Map )
引数には、移動先のページを指定します。これは、"helo.htm"というように名前で指定することもできますし、HeloPage.classというようにPageクラスを指定することもできます。
非常に面白いのは、setRedirectでリダイレクトするときには、必要な値をMapとして受け渡すことができる、という点でしょう。実をいうと、このMapを渡す書き方は、ver. 2.1から新たにサポートとなったものです。このため、2.0.1では動かないのですが、非常に面白い機能ですのでここで紹介しておきましょう(2.0.1では、この後に説明するフォワードを使った方法を用いてください)。HeloPageクラスを次のように修正してください。
public class HeloPage extends Page { public String msg = "整数を入力ください。"; publicForm form; private TextField input; private Submit submit; public HeloPage(){ form = new Form("form"); input = new TextField("input","入力"); form.add(input); submit = new Submit("button","移動",this, "submit"); form.add(submit); } public boolean submit(){ msg = input.getValue(); Map map = new HashMap(); map.put("msg", msg); this.setRedirect(OtherPage.class,map); return true; } }
ここでは、送信されたらsetRedirectでOtherPage.classに移動するようにします(このクラスはこの後に作成します)。このとき、Mapインスタンスを第2引数に渡しています。このMapでは、input.getValueで送信されたテキストを取り出し、"msg"というキーで保管してあります。こうして渡したテキストを、リダイレクト先で利用しようというわけです。なお、helo.htmには、$formを出力してフォームを表示するよう修正をしておいてください。