- PR -

JSF にて親画面←子画面のデータ受渡し方法

投稿者投稿内容
小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2007-05-22 17:53
また皆様のお知恵を拝借したく。

【環境】
OS:Windows 2000
Web サーバ:Tomcat 5.0
JDK:1.4
JSF:1.1

【状況】
現在、JSF フレームワークを使用して Web システムを作成しています。
その中で、親画面 → 子画面に遷移し、子画面で選択したものを
親画面に表示する、という動きをしたいと思います。
動きのイメージ としてはこんな感じです。
( リンク先は Seasar ですが。。。 )

昔の投稿を参考にし、
showModalDialog にて表示する所までは上手くいったのですが、
子画面にて入力 ( とか選択 ) したデータを親画面に引継ぐ方法がわかりません。

昔の投稿では「onClick」の戻り値を取得する、と書いてありますが JSF を使用しているため、
子画面にて Bean のフィールドに設定
子画面 Close した際、親画面をリフレッシュ
親画面、子画面にて入力したデータが表示される
という動きになるのかな、と思っていますが、想定通りの動きをしません。

【サンプルプログラム】
プログラムとしては以下のようになります。
親画面
コード:
        <h:commandButton onclick="window.showModalDialog('../user/userName.jsp','window','')" value="子画面" action="" /><BR><BR><BR>



子画面
コード:
        <h:commandButton value="もどる" onclick="self.window.close()" action="back" /><BR><BR><BR>



<解説>
親画面で「showModalDialog」にて子画面表示。
子画面は ( サンプルコードはありませんが ) 画面テキストエリアを表示する。
テキストエリアのフィールドは親画面と同一のフィールド。
子画面にてデータを入力し、「もどる」ボタンを押下すると onclick にて画面消滅。
action 文言に従い、faces-config.xls にて親画面に遷移させることにより、
子画面のデータを用いてリフレッシュ表示。

【知りたいこと】
サンプルプログラムの解説で書いたストーリで上手く行けばよかったのですが、
上手くいきません。
値の受渡し方法についてお知恵を拝借したいです。

宜しくお願いいたします。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2007-05-23 19:49
「昔の投稿」ではあくまでもブラウザ側で親子のデータをやりとりする話をしていたのではないでしょうか?

別画面を開いて、そこからサーバにアクセスしたら、同じセッションとは見てくれないために連動できないのではないですか?
小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2007-05-23 19:53
返答ありがとうございます。

> 別画面を開いて、そこからサーバにアクセスしたら
???
そのような解釈に見えてしまいましたでしょうか?
一応、意図としては
> ブラウザ側で親子のデータをやりとりする話
のつもりで書いたのですが。

Bean を通す、と書いたからそのような認識になったのでしょうか?

朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-05-23 21:45
引用:

小僧さんの書き込み (2007-05-23 19:53) より:
返答ありがとうございます。

> 別画面を開いて、そこからサーバにアクセスしたら
???
そのような解釈に見えてしまいましたでしょうか?
一応、意図としては
> ブラウザ側で親子のデータをやりとりする話
のつもりで書いたのですが。

Bean を通す、と書いたからそのような認識になったのでしょうか?





子画面てユーザーからしてみたらの話であって、サーバーからみれば別画面なのですよ。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-05-23 22:17
あれ?

showModalDialog()って(ブラウザの)セッション引き継がないんですか?
IE限定機能は使った事ないのでわからないです。

けど、セッションを引き継ぐなら可能なように思えます。
STATE_SAVING_METHOD=clientも必須になっちゃいますけど。

引用:

小僧さんの書き込み (2007-05-22 17:53) より:
子画面にて Bean のフィールドに設定
子画面 Close した際、親画面をリフレッシュ
親画面、子画面にて入力したデータが表示される


両画面で同じBackingBeanを共有するのを前提に
サーバ経由でBackingBeanを使ってやりとりするなら、
子画面のclose()直前にform.submit()が要るのでは?

この場合は親画面側のリフレッシュ時にはsubmit()すると
BackingBeanも上書きしちゃうので、それさえ何とかすれば
実現できそうな気もしなくはないです。

他の方法では、JavaScriptで何とかする、でしょうね。
#っていうか、「昔の投稿」はこっちの方向では?

こちらの場合はJSFがid属性を動的に作ってしまうのが面倒です。
コンポーネント作るか、TomahawkでforceId="true"するか。

JSFってJavaScriptとの親和性が悲惨な事になってますよね。
小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2007-05-24 08:59
返信ありがとうございます。

杏サマ
個人的には
あしゅサマの
「showModalDialog()って(ブラウザの)セッション引き継がないんですか? 」の一言につきます。
セッション情報は引継いでくれている、という前提でお話しておりました。

あしゅサマ
> 子画面のclose()直前にform.submit()が要るのでは?
なるほど。そうですか。
ちょっとそのキーワードで探してみます。

> 他の方法では、JavaScriptで何とかする、でしょうね。
> #っていうか、「昔の投稿」はこっちの方向では?
そうなんです。昔の投稿はこちらの方なのですが、
これまた指摘があるとおり
> JSFってJavaScriptとの親和性が悲惨な事になってますよね。
と感じております。

その為、Bean を使えばいけるかな、と思い質問させて頂いた次第です。
何はともあれ、ご回答ありがとうございます。
もう少し調べてみます。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2007-05-24 09:38
「showModalDialog」はセッションの引継ぎはされるはずです。
というかIEは基本的に別画面でもセッションは引き継がれますね。
#IEの起動方法を変えれば別セッションにもできるはず。

で「showModalDialog」は親画面へのデータの受け渡しは「戻り値」以外では、
できなかったと思います。
ですので、親画面のほうで戻り値を判断してリフレッシュをする必要があります。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2007-05-24 11:26
引用:

> 別画面を開いて、そこからサーバにアクセスしたら
???
そのような解釈に見えてしまいましたでしょうか?
一応、意図としては
> ブラウザ側で親子のデータをやりとりする話
のつもりで書いたのですが。


「action 文言に従い、faces-config.xls にて親画面に遷移させる」ということでしたので、子画面で指定したbackをnavigation-ruleで指定して親画面を再表示させる意図かと思いました。faces-configに従って動作するのはサーバ側ですから、当然サーバにアクセスするのだと思いましたが、違うのでしょうか?
ブラウザ側だけの話であればKOXさんがおっしゃっているように「親画面のほうで戻り値を判断してリフレッシュをする」でいいのでは?

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