- - PR -
Actionの戻り値を取得したい
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-11-19 16:38
こんにちは。
フレームワークが絡んで分からなくなっているのですが、ServletActionのようにresponseをそのまま取得したいのですが、どのようにすればよいのでしょうか? フレームワークはwebwork2です。 ・XML <action name="go" class="action.GoAction"> ...ここが分かりません。 </action> ・Action public abstract class GoAction extends ActionSupport { ... public String execute() throws Exception { return "返したい文字列"; } } ・JavascriptでのAction呼び出し部(可能であれば) document.forms[0].action="go.action"; var ss = document.edit.submit(); alert(ss); ←ここに返したい文字列が表示されてくれればOKですが。 よろしくお願いします。 | ||||
|
投稿日時: 2008-11-24 01:01
スクリプトとサーブレットのデータ通信はJSONフォーマットが便利です。
当方は指摘されているフレームワークを知らないのですが、 一般的には、Response のストリームをGetして、そいつに 文字列で書き込んであげて、Response を閉じてあげること で完了します。閉じないと余計な情報が送信されてしまう 可能性(フレームワークの機能として)があるからです。 まずは、 ・ActionSupport クラスの内部で execute() を呼び出している メソッドを突き止める。 ・ActionSupport クラスが継承している Action クラスの public execute() をオーバーライドする。2つあるけど、Http の方です ね。 で、問題はここから、 execute() 引数無しのやつは、ActionSupport で定義されていて その中の何かのメソッドが呼び出しています。 たぶん、ActionSupport も Action#execute() をオーバーライド しているのでしょうから、問題にはならないかも・・・?? 使い方とXMLの書き方: http://liffey2.ld.infoseek.co.jp/java/WebWork/index3.html ActionSupportのベースクラスのDocument: http://www.docjar.com/docs/api/org/apache/struts/action/Action.html ActionSupportクラスのDocument: http://www.docjar.com/docs/api/org/springframework/web/struts/ActionSupport.html たぶん、大丈夫でしょ。 execute しか public じゃないし。Delegateのデフォルト呼び出し規約として execute の4つの引数の奴が使われるんでしょうね。 だから、
ってやってあげると、execute() の引数の無い奴が結果的に呼び出される はずです。たぶん。 | ||||
|
投稿日時: 2008-11-24 01:08
あぁ、何が言いたかったのかわかった。
MyAction クラスの execute() の戻り値で呼び出すサーブレットや JSPに振り分ける定義をXMLでやっているけど、これを呼び出す必要 が無いから、どー書けばいいの?って話でしょ? だったら、CurrentContext に 結果をセットして、 JSP の方で出力 してあげればOKだす。 JSPの中身は、 <% Context conte = Action.getContext(); response.write(conte.getAttribute("AJAXMODOKI").toString()); %> みたいになる、たぶん。 追記: で、JavaScriptの方は、IFRAMEのonload か、onreadystatechange で 受け取った文字列を alert(eval(responseText).message); ってやってあげるのね。 さらに追記: AJAXMODOKI 変数は、execute() 内でセットします。 getContext().setAttribute("AJAXMODOKI", "{ message:'Hello world' }"); { message:'Hello world' } こうすると良い利点は、複数のパラメータを名前付きで渡せること。 { message:"OK", value:10000, kingaku:205000, zeikin:1030 } とかしてあげて、 JavaScript で var r = eval(responseText) ってやると、 alert(r.message) とか、 document.forms[0].KINGAKU.value = r.kingaku; とか構造体みたいに記述できるようになります。 さらさらに追記: IFRAMEは親画面とは非同期で通信しますから、あなたが提示したスクリプト例 のようには動きません。 onload でも、onreadystatechange でも、当方が書いている responseText なる 変数の値は取れません。例として書いただけなので。 IFRAME の場合は、実体は、contentWindow.document.body.innerHTML が実体に なります。 ですので、返す値を出力するJSPも、正しいHTMLの書き方に則って書いた方が いいでしょうね。 <html> <head><title>AJAXMODOKI RESPONSE</title></head> <body> <% //ここに処理を記述 %> </body> </html> てな感じになります。 <body> に { message:"OK" } って書いたら、innerHTML では、{ message:"OK" } って 取れます。 逆に、AJAXで通信する場合は、HTMLタグを書くと必要な部分を抽出するの が面倒になるので注意が必要でしょうね。 これで最後: >IFRAMEは親画面とは非同期で通信しますから、あなたが提示したスクリプト例 >のようには動きません。 これですが、IFRAMEロード中は、ASP.NETのModalPopupExtenderのような 親画面を触れなくする仕掛けが必要になります。簡単に触れなく出来るのでチャ レンジしてみて下さい。必要ならば。但し、ESC押されると元に戻せなくなります し、F5押されるとリロードしてしまうので幾つかの対策は必要になります。 [ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-11-24 01:11 ] [ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-11-24 01:18 ] [ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-11-24 01:31 ] [ メッセージ編集済み 編集者: ぴあちゃん 編集日時 2008-11-24 01:45 ] |
1