- PR -

JSF 画面遷移(URL)が変?

投稿者投稿内容
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-11-19 01:26
ご回答ありがとうございます。

引用:

T2さんの書き込み (2005-11-19 00:40) より:
引用:

「普通にボタンを押してSubmitしたり、リンクをクリック」して
リクエストを送信する際、リダイレクトすればちゃんとURLも
切り替わるということですか?

それは、どのようにコーディング/設定すればよいのですか?


<navigation-case>要素の内側に<redirect />を記述します。


ちゃんとURLが切り替わるようになりました。
かなり、気持ちよいです。

でも、戻るボタンの動きは相変わらず変です。
引用:

トリックスターさんの書き込み (2005-11-17 15:01) より:
このあたり、「戻るボタン」制御などとも関係して
くるかなと思っているのですがどうでしょうか?
一般的な「戻るボタン」制御って、
・ページのキャッシュを残さない
ですか?
これだと、戻った後に「ページの有効期限切れ」に
なってしまいませんか?



引用:

T2さんの書き込み (2005-11-19 00:40) より:
引用:

JSFの実装って、MyFacesの他にどんなものがありますか?


SunやIBMなどからリリースされています。


調べてみます。

引用:

T2さんの書き込み (2005-11-19 00:40) より:
引用:

Shaleは正式リリースされてましたっけ?


Shaleはまだです。そもそもShaleはJSF実装を提供するプロジェクトではありません。
今のShaleにはMyFacesが含まれています。


そうなのですか。ShaleはJSF実装されると聞いていましたが、
MyFacesが含まれているのですか。

いろいろ勉強になります。ありうがとうございます。
T2
常連さん
会議室デビュー日: 2002/02/20
投稿数: 37
投稿日時: 2005-11-19 01:33
引用:

でも、戻るボタンの動きは相変わらず変です。


このあたり、MyFaces1.0.9はかなりアヤシイ挙動をしますね。
SunのRIのほうがまともに動いてくれます。
最新盤のMyFaces1.1.1についてはまだ戻るボタンについて検証していませんが・・・

※SunのRIはJSFについての検証用途であって、業務アプリ開発・商用利用には利用できない
 ライセンスとなっているので注意してください。
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-11-19 01:38
いろいろ教えてくださってありがとうございます。

MyFaces1.1.1を試してみます。

この度は、ありがとうございました。
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-11-21 10:16
引用:

つまり、私の使用しているMyFaces-1.0.9では、そもそもブラウザの「戻る」ボタンや
「再読込」ボタンを使用しないことが前提なのですね。


ちょっと違うと思います.
・ブラウザのURL表示とサーバ側の実行JSPがずれるのは,T2さんが説明されている通り,
 サーバ側でフォワードを行うどんなWebアプリでも起こる現象です.
 そもそもブラウザのユーザにとって,何か問題があるでしょうか?
・「戻る」や「再読込」で必ずまずいことが起きるわけではないですよね.そして,まず
 いことが起きるページではそれを回避するのはアプリケーションの責務です.テクニッ
 クとしてはJ2EEパターンの同期トークンを使ったり,あるいはJavaScriptでボタンを押
 せないようにしたり,が典型的な対処かと思います.
・<redirect/>を指定するとサーバ側で実行されるページとブラウザの表示が一致します
 が,別のリクエストになるので,request scopeのマネージドビーンが事実上使えなくな
 ります.
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-11-21 15:22
引用:

よしだひろゆきさんの書き込み (2005-11-21 10:16) より:
・ブラウザのURL表示とサーバ側の実行JSPがずれるのは,T2さんが説明されている通り,
 サーバ側でフォワードを行うどんなWebアプリでも起こる現象です.
 そもそもブラウザのユーザにとって,何か問題があるでしょうか?


どんなWebアプリでも起こりうる現象ということは、理解できました。
問題は大アリです。再読込すると1つ前のページに戻りますから。

引用:

よしだひろゆきさんの書き込み (2005-11-21 10:16) より:
・「戻る」や「再読込」で必ずまずいことが起きるわけではないですよね.そして,まず
 いことが起きるページではそれを回避するのはアプリケーションの責務です.テクニッ
 クとしてはJ2EEパターンの同期トークンを使ったり,あるいはJavaScriptでボタンを押
 せないようにしたり,が典型的な対処かと思います.


私には「必ず起こるわけではないからOK」とは言えません。
1度でも起こるのであれば、問題です。
それを回避するのはアプリケーションの責務であるということも、
100歩譲って受け入れますが、フレームワークが責任を負わない以上、
引用:

つまり、私の使用しているMyFaces-1.0.9では、そもそもブラウザの「戻る」ボタンや
「再読込」ボタンを使用しないことが前提なのですね。


ということになるのではないですか?

引用:

よしだひろゆきさんの書き込み (2005-11-21 10:16) より:
・<redirect/>を指定するとサーバ側で実行されるページとブラウザの表示が一致します
 が,別のリクエストになるので,request scopeのマネージドビーンが事実上使えなくな
 ります.


なるほどです。気を付けなければなりませんね。
ご教授いただき、ありがとうございました。


[ メッセージ編集済み 編集者: トリックスター 編集日時 2005-11-21 15:24 ]
よしだひろゆき
大ベテラン
会議室デビュー日: 2004/11/22
投稿数: 141
投稿日時: 2005-11-21 15:48
引用:

問題は大アリです。再読込すると1つ前のページに戻りますから。


戻らないのでは?ブラウザ側で送信したフォームデータを覚えていて
例えばIEなら「情報を再送信しないとページを更新できません」というポップアップが
でて「再試行」をクリックする,という手順になると思いますが.

引用:

私には「必ず起こるわけではないからOK」とは言えません。
1度でも起こるのであれば、問題です。


よく見かけるインターネットサイトでは,たいていのページは特に対策を取ってないので
任意に「戻る」や「再読込」ができて,それで問題なく使っていませんか?
そして,決済などの時だけ「絶対に戻るボタンなどを押さないで下さい」とか念押しされ
たりしますよね(もっとも稚拙な対策の例ですが).

どういうページがそういう危険を含んでいるのかは,アプリケーションが判断する必要が
あります.ただし,判断したときにそれを簡単に実装する方法をフレームワークが提供
してくれるのは良いことで,JSFにはとりわけそいういう機能が無いことも事実です.
henachoco
常連さん
会議室デビュー日: 2005/11/21
投稿数: 29
お住まい・勤務地: 新ハンドル:t_yamo
投稿日時: 2005-11-21 16:58
戻りボタンや複数ウィンドウ/複数フレームを使いたいのであれば、web.xmlの「javax.faces.STATE_SAVING_METHOD」に「client」を設定すると良いのではないでしょうか。

以下、怪しげな説明です。
正確なところは実装や仕様を確認してください。

JSFではページ単位でコンポーネントツリーを保持しています。
特定のページに遷移する際、そのページのコンポーネントツリーが存在していない場合は「当該ページに初めて遷移した」と見做し、アクションの実行をスキップして直ぐにページの描画処理に移ります。

で、MyFaces1.0.9の「STATE_SAVING_METHOD=server」ではコンポーネントツリーを1ページ分しか保持してくれないので、「戻る」で遷移した後に何かのアクションを実行しようとしても、「当該ページに初めて遷移した」と見做し、見事にアクションの実行をスキップしてしまいます。

一見、SunのRI(1.1_01)の「STATE_SAVING_METHOD=server」ではそれを回避しているように振舞いますが、実はデフォルトでは15個前のページまで保持しておく設定になっているため、それ以上戻ろうとするとやっぱりMyFacesと同じ挙動になります。
また、この実装ではページの名前をキーにしてMapの中にコンポーネントツリーを保持しているため、ひとつのページに何回かアクセスした場合でも直近のデータしか保持していません。

「STATE_SAVING_METHOD=server」を使っている限り「戻る」を無制限に許可する現実的な解はありません(理論上、メモリを無制限に持たなきゃいけなくなる)ので、「戻る」を無制限に使いたい場合は「STATE_SAVING_METHOD=client」を検討してください。

ただし、これを使う場合はクライアントのhiddenタグにコンポーネントツリーをシリアライズした結果がずらずらーっと出力されますので、サイズとセキュリティに注意してください(ASP.NETのビューステートとおんなじ感じですかね)。

-----
以下、オフトピです。

よしだひろゆきさんが仰っている
引用:
「戻る」や「再読込」で必ずまずいことが起きるわけではないですよね

は『要件として必ずしも「戻る」や「再読込」が必要となる訳ではない』という意味に読み取れました。

一方、トリックスターさんが仰っている
引用:
私には「必ず起こるわけではないからOK」とは言えません

は『不具合が発生するのであれば、それが数回に一回であっても問題だ』という意味に読み取れました。

どちらも正しいことを仰っていると思うのですが、双方で論点が合っていないような気がします。
henachoco
常連さん
会議室デビュー日: 2005/11/21
投稿数: 29
お住まい・勤務地: 新ハンドル:t_yamo
投稿日時: 2005-11-21 19:47
引用:
で、MyFaces1.0.9の「STATE_SAVING_METHOD=server」ではコンポーネントツリーを1ページ分しか保持してくれないので、「戻る」で遷移した後に何かのアクションを実行しようとしても、「当該ページに初めて遷移した」と見做し、見事にアクションの実行をスキップしてしまいます。


この件に関して他のバージョンも調べてみました。
MyFaces1.1.1は上記と同じロジックになっているようです。
ただ、svnで現時点(Rev:345889)のソースを見ると「viewId」+「シーケンス番号」で一定数保持するような形に修正されているようです。
NightlyBuildではSun RIよりちょっと賢い実装のようですね。

※ただ、それでも無制限に「戻る」を使えるようにするには「STATE_SAVING_METHOD=client」の必要がありますが。

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