- - PR -
JSF 画面遷移(URL)が変?
投稿者 | 投稿内容 | ||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-19 01:26
ご回答ありがとうございます。
ちゃんとURLが切り替わるようになりました。 かなり、気持ちよいです。 でも、戻るボタンの動きは相変わらず変です。
調べてみます。
そうなのですか。ShaleはJSF実装されると聞いていましたが、 MyFacesが含まれているのですか。 いろいろ勉強になります。ありうがとうございます。 | ||||||||||||||||||||||||||||
|
投稿日時: 2005-11-19 01:33
このあたり、MyFaces1.0.9はかなりアヤシイ挙動をしますね。 SunのRIのほうがまともに動いてくれます。 最新盤のMyFaces1.1.1についてはまだ戻るボタンについて検証していませんが・・・ ※SunのRIはJSFについての検証用途であって、業務アプリ開発・商用利用には利用できない ライセンスとなっているので注意してください。 | ||||||||||||||||||||||||||||
|
投稿日時: 2005-11-19 01:38
いろいろ教えてくださってありがとうございます。
MyFaces1.1.1を試してみます。 この度は、ありがとうございました。 | ||||||||||||||||||||||||||||
|
投稿日時: 2005-11-21 10:16
ちょっと違うと思います. ・ブラウザのURL表示とサーバ側の実行JSPがずれるのは,T2さんが説明されている通り, サーバ側でフォワードを行うどんなWebアプリでも起こる現象です. そもそもブラウザのユーザにとって,何か問題があるでしょうか? ・「戻る」や「再読込」で必ずまずいことが起きるわけではないですよね.そして,まず いことが起きるページではそれを回避するのはアプリケーションの責務です.テクニッ クとしてはJ2EEパターンの同期トークンを使ったり,あるいはJavaScriptでボタンを押 せないようにしたり,が典型的な対処かと思います. ・<redirect/>を指定するとサーバ側で実行されるページとブラウザの表示が一致します が,別のリクエストになるので,request scopeのマネージドビーンが事実上使えなくな ります. | ||||||||||||||||||||||||||||
|
投稿日時: 2005-11-21 15:22
どんなWebアプリでも起こりうる現象ということは、理解できました。 問題は大アリです。再読込すると1つ前のページに戻りますから。
私には「必ず起こるわけではないからOK」とは言えません。 1度でも起こるのであれば、問題です。 それを回避するのはアプリケーションの責務であるということも、 100歩譲って受け入れますが、フレームワークが責任を負わない以上、
ということになるのではないですか?
なるほどです。気を付けなければなりませんね。 ご教授いただき、ありがとうございました。 [ メッセージ編集済み 編集者: トリックスター 編集日時 2005-11-21 15:24 ] | ||||||||||||||||||||||||||||
|
投稿日時: 2005-11-21 15:48
戻らないのでは?ブラウザ側で送信したフォームデータを覚えていて 例えばIEなら「情報を再送信しないとページを更新できません」というポップアップが でて「再試行」をクリックする,という手順になると思いますが.
よく見かけるインターネットサイトでは,たいていのページは特に対策を取ってないので 任意に「戻る」や「再読込」ができて,それで問題なく使っていませんか? そして,決済などの時だけ「絶対に戻るボタンなどを押さないで下さい」とか念押しされ たりしますよね(もっとも稚拙な対策の例ですが). どういうページがそういう危険を含んでいるのかは,アプリケーションが判断する必要が あります.ただし,判断したときにそれを簡単に実装する方法をフレームワークが提供 してくれるのは良いことで,JSFにはとりわけそいういう機能が無いことも事実です. | ||||||||||||||||||||||||||||
|
投稿日時: 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のビューステートとおんなじ感じですかね)。 ----- 以下、オフトピです。 よしだひろゆきさんが仰っている
一方、トリックスターさんが仰っている
どちらも正しいことを仰っていると思うのですが、双方で論点が合っていないような気がします。 | ||||||||||||||||||||||||||||
|
投稿日時: 2005-11-21 19:47
この件に関して他のバージョンも調べてみました。 MyFaces1.1.1は上記と同じロジックになっているようです。 ただ、svnで現時点(Rev:345889)のソースを見ると「viewId」+「シーケンス番号」で一定数保持するような形に修正されているようです。 NightlyBuildではSun RIよりちょっと賢い実装のようですね。 ※ただ、それでも無制限に「戻る」を使えるようにするには「STATE_SAVING_METHOD=client」の必要がありますが。 |