ひがやすを blog このページをアンテナに追加 RSSフィード

Information

2008-07-07

SAStrutsで簡単Ajax

SAStrutsで簡単にAjaxを扱えるようにしました。サンプルはこんな感じ。

package tutorial.action;

import org.seasar.struts.annotation.Execute;
import org.seasar.struts.util.ResponseUtil;

public class AjaxAction {

    @Execute(validator = false)
    public String index() {
        return "index.jsp";
}

    @Execute(validator = false)
    public String hello() {
        ResponseUtil.write("こんにちわ");
        return null;
    }
}

アクションで、ResponseUtil#write()を使ってレスポンス文字列を書き出すだけ。ResponseUtil#write()はコンテントタイプエンコーディングを指定することもできます。

JSPはこんな感じ。JavaScriptライブラリは、もちろん流れるようなインターフェースjQuery

<%@page pageEncoding="UTF-8"%>
<html>
<head>
<title>Tutorial: Ajax</title>
<link rel="stylesheet" type="text/css" href="${f:url('/css/sa.css')}" />
<script src="${f:url('/js/jquery.js')}"></script>
</head>
<body>

<h1>Tutorial: Ajax</h1>
<span id="message"></span><br />
<input type="button" value="hello"
    onclick="$('#message').load('hello');"/>
</body>
</html>

$('#message').load('hello')だけで、idmessageの要素をhelloメソッドの呼び出し結果で置き換えることができます。jQuery楽過ぎ。これだけ簡単なら、JavaScript自動的に吐き出すタグライブラリなんていらないね。


明日か明後日にSAStruts1.0.3-rc1をリリースする予定です。

モンモン 2009/08/27 16:29 突然ですいませんが、質問があります。
AjaxのActionからServiceにアクセスし、
DBからデータを取得することは可能なのでしょうか。

現在、ActionでServiceをnewしServiceのメソッドを
呼び出すことまではできたのですが、
DB接続する際にエラー(NullPointerException)が発生します。

できるということであれば、アドバイスいただければと思います。
突然ですいませんが、お力をお借りしたいと思います。
SAStruts、S2JDBCを利用しております。

higayasuohigayasuo 2009/08/27 16:37 ActionでServiceをnewするのではなく、普通にDIすればできますよ。

モンモン 2009/08/27 17:04 DIしているのを利用しようとしたのですが、
Serviceのメソッドを読み込み時にエラーが発生。
>>[ESSR0092]クラスのフォーマットが不正です。。詳細はjava.lang.NullPointerException
なので、newしました。するとメソッドは読み込んだのですが、
その中で利用しているjdbcManagerがnullということで
同じエラーが発生しています。

higayasuohigayasuo 2009/08/28 09:42 その現象は、Ajaxは関係ないのでは。
クラスのフォーマットが不正というのを解決するのが先だと思います。JDK1.6でコンパイルしたクラスをJDK1.5のアプリケーションサーバで動かしているとか。

モンモン 2009/08/28 10:52 開発環境で発生しているためJDKの違いというのは考えられないと思います。
同じServiceの同じメソッドをAjax経由でなく呼び出した場合は正しく動作しています。
もう少しいろいろ見ています。
何か思い当たることがあれば、またレスいただければと思います。

モンモン 2009/09/01 10:11 携帯とPCの両方に対応するため文字コードをShift_JISにしています。
Ajax通信ではUTF-8のため、ajax通信がうまくいかないのだと思うのですが、いかがでしょうか。
web.xmlの設定をどのようにしたらよいのか、アドバイスいただけませんでしょうか。

モンモン 2009/09/01 17:29 携帯とPCを併用しているため、文字コードをSJIS系のWindows-31Jを
利用しています。この場合、IEでcharset=Windows-31Jが解釈できずに
エラーとなるようです。
http://d.hatena.ne.jp/kusakari/20070720/1184928455
このページにある対応はためしてみましたが、うまく動作しませんでした。

seasarだと他の方法ではないとダメなのでしょうか?

higayasuohigayasuo 2009/09/01 18:02 文字コードの話なら、web.xmlのencodingfilter以外は特に関与していないので、一般的な方法で対処できるはずです。

takuyatakuya 2009/09/10 16:38 はじめまして
 質問があります
  hello()メソッドをカレンダーから時間を取得するように変更してみたのですが
  何度呼び出しても時間が変わりません。
  
  デバックをしてみると一度目はメソッドにアクセスしているのですが
  2度目以降はメソッドを実行せずに値を取得しているようなのですが
  しかたないのですかね?

higayasuohigayasuo 2009/09/13 10:05 ブラウザのキャッシュに引っかかっているんだと思いますよ。
queryStringに?new Date()などをいれて、常にURLが変わるようにしてください。

takuyatakuya 2009/09/14 15:20 ありがとうございました。
 値が変わるようになりました。

投稿したコメントは管理者が承認するまで公開されません。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/higayasuo/20080707/1215422724