- PR -

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

投稿者投稿内容
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-05-24 12:47
セッションの引継が引き継がれているかみてませんね

確認していれば「結果」がかえってくるはずですし。

[ メッセージ編集済み 編集者: 杏 編集日時 2007-05-24 13:00 ]
小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2007-05-25 09:36
返信ありがとうございます。
頂いたコメントに対して返答させて頂きます。

> 「action 文言に従い、faces-config.xls にて親画面に遷移させる」ということでしたので、
なるほど。私の書き方が悪かったですね。
別セッションにする意図は全く無く、同一セッションにて管理したいと思っています。

> 「親画面のほうで戻り値を判断してリフレッシュをする」
現在、こちらの方法で行っているのですが、中々上手く行きません。
もう少し詳細な仕様を書きますので、良いアイデアがありましたらアドバイスお願いいたします。

【仕様】
ユーザ情報があります。 ( 名前とか所属会社とか )
そのユーザが定期購読している雑誌の名前を知りたいと思います。
雑誌は別 DB に入っているリストの中身を表示し、
チェックボックスを押下して登録したいと思います。
雑誌はリスト形式で表示するため、別画面 ( 子画面 ) にて表示させたいと思います。
子画面は、親画面の「雑誌リスト表示」ボタンを押下した際に表示されます。
子画面イメージはこんな感じです。
−−−−−−−−−−
|日経○○  |□|
|日経××  |□|
|日経△△  |■|
|日経★★  |□|
−−−−−−−−−−

【ソース概要】
親画面にて「雑誌リスト表示」ボタンを押下する箇所のロジックです。
コード:
<h:commandButton id="button8" onclick="window.showModalDialog('./zassi.jsp','','');" value="雑誌リスト" action="" />



子画面の JSP ソースです ( もの凄くはしょってますが。。。 )。
コード:
<h:dataTable id="tbl1" var="zasshi" value="#{Bean.zasshiList}" >
表示ロジック
</h:dataTable>

<h:commandButton id="button4" value="もどる" onclick="self.window.close()" action="#{Bean.name}" /><BR><BR><BR>



意図としては、親画面にて「雑誌リスト」ボタンで「showModalDialog」を使って子画面表示。
子画面はリストが表示されて、チェックボックスを押下されると Bean で保持しているzasshiフィールドに
boolean でチェックが入る。
( zasshi フィールドは親画面表示の際に取得済み )
子画面「もどる」ボタン押下で、Bean.name をコールし、チェックされた行の雑誌名を取得し
別フィールド ( String の雑誌名がスペース区切りで入るフィールド ) に設定する。
onclick で画面 Close される。

一応、これで動いたのですが、子画面でチェックした内容が親画面に反映される時と
反映されていない時があります。
反映されない時は「Bean.name」も呼ばれていないようです。

サーバ再起動直後でも反映されないので、ごみプロセスなどは考えられないと思っています。
明示的に反映させる方法や、他の値連携などの方法がありましたらアドバイス頂きたいと思います。

長文になりましたが、宜しくお願いいたします。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2007-05-25 09:44
引用:

小僧さんの書き込み (2007-05-25 09:36) より:
一応、これで動いたのですが、子画面でチェックした内容が親画面に反映される時と
反映されていない時があります。
反映されない時は「Bean.name」も呼ばれていないようです。


反映されていないときは、「Bean.name」が呼ばれる前に、子windowが閉じられてしまう場合があるからです。
状況によって挙動が変わるのでお勧めできません。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2007-05-25 14:17
引用:
> 「親画面のほうで戻り値を判断してリフレッシュをする」
現在、こちらの方法で行っているのですが、中々上手く行きません。


ますます、意図が分からなくなりました…

引用:
<h:commandButton id="button4" value="もどる" onclick="self.window.close()" action="#{Bean.name}" /><BR><BR><BR>
子画面「もどる」ボタン押下で、Bean.name をコールし、チェックされた行の雑誌名を取得し
別フィールド ( String の雑誌名がスペース区切りで入るフィールド ) に設定する。
onclick で画面 Close される。



念のため書きますが、JSFはサーバ側で処理を実行するってことを理解されていますよね。
上記の#{Bean.name}はサーバ側にあるBeanという名前のマネージドビーンに対して、getName()というメソッドを呼ぶことです。

そしてこれが一番肝心な点ですが、#{...}というEL式が評価されるのは、そのページが表示される前、このJSPを実行する時ですよ。表示されて、ボタンをクリックした時ではありません。

例外は<h:inputText value="#{bean.attr}"/>の時で、この場合は、ボタンをクリックしてサーバにリクエストが戻ってから、beanという名前のビーンのsetAttr()というメソッドが呼ばれます。
小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2007-05-25 18:01
返信ありがとうございます。

> 反映されていないときは、「Bean.name」が呼ばれる前に、
> 子windowが閉じられてしまう場合があるからです。
なるほど。そういう理由でしたか。
Sleep などを使って Close 処理を遅らせようと思ったのですが、
それも出来ないようですね。
何か良い手がないか、もう少し探して見ます。

> ますます、意図が分からなくなりました…
うーむ。。。書き方が悪いですね。

> 念のため書きますが、JSFはサーバ側で処理を実行するってことを理解されていますよね。
一応、理解しているつもりです。

> 上記の#{Bean.name}はサーバ側にあるBeanという名前のマネージドビーンに対して、
> getName()というメソッドを呼ぶことです。
私は、action のトコに書いてあるので、素直に
「ボタンが押されたら Bean の name メソッドをコールする」と
理解していましたが、それが違いますでしょうか?
確かに、 value のトコに書いてあったら set & get が動くものだと思っていますが。。。

長々とお付き合い頂き、ありがとうございます。
朝日奈ありす
大ベテラン
会議室デビュー日: 2007/05/02
投稿数: 189
お住まい・勤務地: 最北の地
投稿日時: 2007-05-26 16:54
refrect が帰ってきた時点で画面を閉じればすむ話では??
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2007-05-28 09:17
引用:
私は、action のトコに書いてあるので、素直に
「ボタンが押されたら Bean の name メソッドをコールする」と
理解していましたが、それが違いますでしょうか?


そうでした! これは私の勘違い、すみません。

同じようなプログラムを作って動かしてログを見てみると、親画面と子画面の二つが異なるスレッドで同時に処理されることがあるようでした。なので実行のタイミングによって、ビーンへの値の反映の順序が異なるようになるように思えます。
小僧
大ベテラン
会議室デビュー日: 2005/06/24
投稿数: 122
投稿日時: 2007-05-28 16:49
返信ありがとうございます。

やはり子画面を「showModalDialog」にて表示した場合の
値の連携が不安定です。
出来るときもあるのですが、とてもシステム機能として
提供出来そうにもありません。。。

なので、画面遷移方法を工夫して提供しようと思います。
( 子画面という発想をやめる )

> 杏サマ
「refrect」とはなんでしょうか?
Google 先生にも回答頂けませんでした。。。

> よしだひろゆきサマ
誤解が解けて良かったです。
今度からは読んですぐわかるような表現方法にしたいと思います。

> 親画面と子画面の二つが異なるスレッドで同時に処理されることがあるようでした。
うーむ。やはり不安定なのですね。

他にも「selectManyCheckbox」なども使ってみたりしているのですが、
値の連携方法や、表示制限などで中々想定通りの機能 ( と画面 ) を
作るのが難しいと感じております。

最初の方にも書いていますが、子画面構想を諦めようと思います。
長々とお付き合い頂き、ありがとうございました。
また何かありましたら宜しくお願いいたします。

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