子画面から遷移すると新規画面が開く

[統計] HTMLからXHTMLへの移行を進めていますか?



0   名前: あづさ : 2007/08/17(金) 18:06  ID:wza.zcYK sub-tS
【現在の状況】
 <開発環境>
 struts1.3.8
 jdk1.4
 Tomcat5.0

度々お世話になります。
showModalDialogで子画面を開いています。
その子画面でactionを発生させて元の画面を再表示したいのですが、
新規画面がオープンされてしまい、そこに結果が表示されてしまいます。
原因も対処法も想像できない状態です。(targetを指定?でもどこに。。。)

 子画面A
  ↓
 action発生
  ↓
 javaで処理
  ↓
 新規画面を表示(新しいwindowがオープンされる)

【どうしたいのか】
 子画面からactionを発生させ、遷移元(同じ画面)を再表示させたい。
 
 子画面A
  ↓
 action発生
  ↓
 javaで処理
  ↓
 子画面Aを表示


【サンプルの提示】
 
--struts-config.xml--

<action path="/action1" type="src.TestAction" name="ListForm" validate = "false">
<forward name="success" path="/pages/子画面A.jsp"/>
</action>

--子画面A.jsp--
<script type="text/javascript">
<!--
function windowClose() {
parent.window.close();
}


function submitForm(actionName){
with(document.forms[0]){
action = "/Prj/"+actionName;
document.forms[0].submit();
}
return false;
}

// -->

<html:button property="select" onclick="submitForm('action1.do')">表 示</html:button>



【検索用語】
JavaScript、struts、showModalDialog、新規画面、開く

1   名前: 元帥 : 2007/08/17(金) 18:06  [URL]  ID:FOlVpZIE sub-bK
移動元:
http://www.tagindex.com/cgi-lib/q1bbs/patio.cgi?mode=view&no=3416
よく見ると質問内容に差異が見受けられますが、日付の新しい方を今抱えている問題と判断します。

Java(JSP等)にしろCGIにしろ、結局はサーバーが処理してHTMLを出力します。
サーバーサイドとクライアントサイドを同じ目線で見るからいかんのです。
strutsは便利な機能を備えているのかもしれませんが、一端切り離して考えて下さい。
新規ウインドウを開く、親ウインドウを操作するといった事はあくまでもクライアントサイドの仕事なので、出力されたHTMLとJavaScriptのソースコードを載せた方がレスはつきやすいと思います。

取り敢えず回答ですが、子ウインドウのformの内容を、openerを使ってGET形式で親ウインドウに受け渡すのはどうでしょうか?


> 表 示
文字のバランスやレイアウトの為に空白を用いるのは避けて頂きたいです。
音声読上げブラウザ等を使用する場合「ひょうじ」ではなく「ひょう、じ」として発音するかもしれないですし、或いは別の読みを使うかもしれません。
字間を開けたいのでしたらスタイルシートが使えます。

> showModalDialog
IE専用であり、他のブラウザでは当然動きませんので、注意して下さい。
IE限定と題して利用者を減らすのは構わないですし、社内イントラネット等でIE使用率は100%だと高を括って、showModalDialogの使用を前提としてノウハウをためていくと後々苦労するかもしれません。

2   名前: あづさ : 2007/08/17(金) 18:06  ID:wza.zcYK sub-tS
ご解答、アドバイスありがとうございました。
こちらの問題は、自己解決いたしました。(子画面から遷移すると新規画面が開く)
showModalDialogで子画面を開き、そこからactionを発生させ同画面を再表示させた場合必ず子画面が開くことを確認いたしました。
確認方法としましては、showModalDialogをopenに変更して試してみました。その結果、新規画面が表示されなくなったのでおそらくそうであろうという
結論に至りました。
なので、open時に親画面にモーダル化のfunctionを組み込んで対応しようと思います。
アドバイスありがとうございました。
参考URL:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22195&forum=28&2

>取り敢えず回答ですが、子ウインドウのformの内容を、openerを使ってGET形式で親ウインドウに受け渡すのはどうでしょうか?
こちらにつきましては、うまく伝わっていないようなので、もう一度ご説明申し上げます。

問題と致しましては、子画面を開く時点でサーバー側の処理を必要とします。(親画面で、子画面を開くボタンを押された時のForm情報を使用してサーバー側でDBアクセスが発生します)
サーバー側で取得してきたデータを子画面で表示させたいと考えています。
ここで問題となってくるのが、子画面を開くときに、strutsのactionを呼べるらしいのですが、そのときにどのFormをsubmitすればよいかを指定できないことです。(window.open(strutsのaction指定,args, display);)
これにより、サーバーに処理が移ったときに希望するFormを取得することができず、希望の処理を実行することができない状態でおります。

>サーバーサイドとクライアントサイドを同じ目線で見るからいかんのです。
このアドバイスをもとにして表現するとすれば

[クライアントサイド]新規windowをオープンさせる
[サーバーサイド]actionが発生した時点の最新のForm(親画面)を取得し処理を行う。処理後データを子画面に表示するFormに詰めrequestにセットする。

となるような気がします。その切り分けを踏まえて、今できないことは、サーバーサイドで最新のForm(親画面)を取得できていないということです。
受けて側のサーバーサイドを改修すればよいのか、クライアントサイドを改修するのか、もしくは無理なのかが、解らない状態です。
長々と文章で説明して申し訳ありませんが、どなたかご存知の方がいらっしゃいましたらご教授願いたく思っています。
よろしくお願い致します。


3   名前: 元帥 : 2007/08/17(金) 18:06  [URL]  ID:ssUjTYvm sub-bK
>>2
なるほど、了解しました。

ポートにもよるのですが、サーバーは要求されたファイルを返す事しかしません。
a.htmlと打てば、a.htmlが得られます。
特定のファイルを要求した時、サーバーはそのファイルをプログラムから処理し、出力されたデータを返します。
これがサーバーサイドで、ファイルを要求する時にはデータを送信する事も可能です(普通のファイルに対してデータを付けても構いませんが)。
また、得たファイルの内容が後から変わる事はありません。
変更するには、もう一度要求するしかありませんが、サーバーの仕事はファイルを返して終わりなので、クライアントから再び要求がくるまでサーバーは何もしません。
actionを呼び出す、というのはファイルを要求する、に相当します。

私はstrutsにはあまり詳しくないので、低レベルな方法を紹介します。
因みにここで言う高低は優劣を示すものではありません。
struts等はフレームワークによって高レベルなコーディングを可能とする、つまり低レベル部分を覆い隠しているだけであり、strutsだろうと何だろうと、実際行われている動作はあまり変わらない筈です。

方法1.後から取得する:
新規(子)ウインドウをオープンし、新しいウインドウに該当のファイルが表示されました(サーバーはファイルを返しましたので仕事終了です。)。
ここで、action発生元である親ウインドウのformの内容を取得するにはクライアントサイドを使います。
発生場所を特定する為に、予めJavaScriptでフラグを用意しておくのが妥当かと思われます。
取得したデータを子ウインドウのformに入れます。

方法2.先に取得する:
新規(子)ウインドウをオープンする時、親ウインドウのformを付加してファイルを要求します。
親ウインドウの構成がどうなっているのか分かりかねますが、JavaScriptを用いて送信したいformの内容を取得し、GETで送ります。
要求先のファイルから、GETで送られたデータを取得し、それを元に子ウインドウとして表示すべきファイルを出力します。

# 私の頭が固いだけで、他に良い方法があるかもしれませんが。

4   名前: あづさ : 2007/08/17(金) 18:06  ID:wza.zcYK sub-tS
>>元帥様

親切にご教授いただいてありがとうございます。
自己解決(無理やり代案を考えました)

僭越ながら代案をご報告申し上げます。(おそらく方法1に近いのではないでしょうか)

0.session上の新規画面に関するデータを初期化する。
1.データを取得する前の新規画面を開く
2.1.画面に、初めて開かれた場合にのみONLOADで以下の処理を実行する。(初めて開かれたかどうかのデータを持つ)
 ・新規画面から親画面のデータを取得する。
 ・取得したデータをもとにサーバに処理を返し、必要データを取得する。
3.画面を閉じる時に、JavaScriptで親画面に取得した子画面で取得したデータを追記する。
(実データは、子画面でサーバ処理が実行される度に更新します。JavaScriptで親画面のデータに追記するのは、実データとの見た目上の同期をとるためです。)

ちょっとしっくりいかない方法(実データと画面上のデータが別処理を行っている点)ですが、このような感じで実現することができました。
元帥様、本当にありがとうございました。
これをもちまして、このスレッドは終了させてください。

一覧へ戻る