Ajax

チュートリアルのダウンロードのソース見てたら「あれ?これパクれば Ajax できるんじゃね?」と思ってさっそくやってみた。クラス名とか気にしないで・・・。

public class WorkAction {
  public HttpServletResponse response;
  @Required
  public String type;
  @Execute(validator = false)
  public String callAjax() {
    PrintWriter out = null;
    try {
      response.setContentType("text/xml;charset=UTF-8");
      out = new PrintWriter(new OutputStreamWriter(response.getOutputStream() , "UTF-8"));
      out.print("こんにちは");
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      if(out != null) {
        out.close();
      }
    }
    return null;
  }
}
<script src="../scripts/prototype.js"></script>
<script>
function ajaxTest() {
  var url = 'http://localhost:8080/tutorial/work/callAjax';
  var pars = 'type=Ajaxだだだだ'
  var myAjax = new Ajax.Request(
        url, 
        {
           method: 'post', 
           parameters: pars, 
           onComplete: showResponse
  });
}
function showResponse(originalRequest)
{
  alert(originalRequest.responseText);
}
</script>
・・・いろいろ省略・・・
<input type="button" value="ajax" onclick="ajaxTest()">

ボタンを押したら、「type=Ajaxだだだだ」をパラメータにして、WorkAction#callAjax を Ajax を使って呼び出す。レスポンスはちゃんと文字化けせずに表示されたし、 WorkAction のメンバの type にもちゃんと「Ajaxだだだだ」が入っていたのだ。HotDeploy の効果てきめんであっさり出来ちゃったよ。
Action には強制される Super クラスがないのでどこかに Ajax のレスポンス処理を自前で定義する必要があるのが気になったので Ajax 対応で

@Execute(validator = false)
public AjaxResponse callAjax() {
  String text = "ごにょごにょ";
  return AjaxResponse(text , "UTF-8");
}

とかアノテーションの書き方全然知らないんですけど・・・・

@ExecuteAjax(validator = false , encode = "utf-8")
public String callAjax() {
  String text = "ごにょごにょ";
  return text;
}

とか、どうでしょう?(^^;

ここまで簡単にできるんだったら rails よりいい気がしてきたけど「Java は重い」っていうイメージはなかなかぬぐえないよねぇ〜、一般的に。WEBRick とか mongrel とか thin みたいなさくっと動かせるコンテナとか出てきたらイメージ変わるのかなぁ。