Ajax対応機能

S2ClickにはActionLink、ActionButton、Submitコントロールの代わりにAjaxで同様の呼び出しを行うためのAjaxLink、AjaxButton、AjaxSubmitというコントロールを提供していますが、本格的にClickでAjaxを使ったアプリケーションを作るにはこれだけでは機能不足な感が否めません。
Ajaxリクエストを処理する別のフレームワークを組み合わせて使うという方法も考えられますが、Clickはせっかく画面単位にページクラスを作るので、その画面で必要なAjax処理はそのページクラスで実装できたほうが便利だよね、ということでかなり今さら感はありますが、Ajaxprototype.jsAjax.Request)でページクラスのメソッドを呼び出す機能を作ってみました。
まずはページクラスにAjaxで呼び出すためのメソッドを作り、@Ajaxアノテーションを付与します。メソッドはpublicで、引数を取る場合は文字列型にしておく必要があります(いまのところ)。引数の数は任意です。

@Ajax
public void hello(String name){
  renderHTML("Hello " + name + "!");
}

上記の例ではS2ClickPageで定義されているrenderHTML()メソッドで文字列を返却していますが、レスポンスはメソッドの戻り値として返却することもできるようにしようと思っています。
んで、ページクラスに@Ajaxアノテーション付きのメソッドを定義しておくと、S2ClickはそのメソッドAjaxで呼び出すための以下のようなJavaScript関数を自動生成します。生成されたJavaScriptはHTMLテンプレートの$pageImportsを記述した箇所に出力されます。関数の第一引数にはレスポンスを処理するハンドラ関数、第二引数以降には呼び出すページクラスのメソッドに渡す引数を指定します。

function hello(resultHandler, arg0){ ... }

このJavaScript関数を以下のように呼び出すことでページクラスのメソッドAjaxで呼び出すことができます。

hello(function(transport){
  alert(transport.responseText);
}, 'Naoki Takezoe');

注意点として、この方法でページクラスのメソッドを呼び出す場合、通常のClickのイベントハンドリングなどの処理をすべてスキップして、該当のメソッドだけを呼び出します。そのため、onSecurityCheck()やonInit()などのメソッドは呼び出されません。onSecurityCheck()で認証処理などを行っている場合は要注意です(onSecuriryCheck()くらいは呼び出してもいいかなと思いますが…)。
引数に文字列以外を渡せるようにするなど、いろいろと機能強化はしていこうと思いますが、とりあえず基本的なコンセプトはこんな感じです。