- PR -

Actionの戻り値を取得したい

1
投稿者投稿内容
未記入
大ベテラン
会議室デビュー日: 2008/07/11
投稿数: 182
投稿日時: 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/02/07
投稿数: 287
投稿日時: 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つの引数の奴が使われるんでしょうね。

だから、

コード:
public class MyWebClass extends ActionSupport {

   HttpServletResponse myResponse;

   public String execute() throws Exception {
      System.err.println(myResponse);
   }

   public /*overrides*/ ActionForward execute(
       ActionMapping map,
       ActionForm form, 
       HttpServletRequest request,
       HttpServletResponse response ) throws Exception {
       myResponse = response;
       return super.execute(map, form, request, response);
   }
}




ってやってあげると、execute() の引数の無い奴が結果的に呼び出される
はずです。たぶん。

ぴあちゃん
ぬし
会議室デビュー日: 2008/02/07
投稿数: 287
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)