- PR -

JSF 画面遷移(URL)が変?

投稿者投稿内容
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-11-17 15:01
こんにちは。

Tomcat、MyFaces、Spring、Hibernate、MySQLで
Webアプリケーションを作成しています。
だいたい動いているのですが、どうも画面遷移が
変なのです。

例えば、
login.jsf → toppage.jsf へ遷移するのですが、
toppage.jsfが表示されている状態で、ブラウザの
アドレスは、login.jsfを指しています。
その後、
toppage.jsf → page1.jsf へ遷移すると、やはり
page1.jsfが表示されている状態で、ブラウザの
アドレスは、toppage.jsfを指しています。

その為、再読込すると前のページをロードします。
再読込さえ(あと戻るボタンとか)しなければ、
正常に動きます。これは、JSFの仕様でしょうか?
それともMyFacesの仕様?
皆様におかれましては、どんな状態で動作されて
いるのでしょうか?

ちょっと、気持ち悪いので、正しいURLが表示でき
るようにしたいので、ご教授お願いします。

このあたり、「戻るボタン」制御などとも関係して
くるかなと思っているのですがどうでしょうか?
一般的な「戻るボタン」制御って、
・ページのキャッシュを残さない
ですか?
これだと、戻った後に「ページの有効期限切れ」に
なってしまいませんか?
そのあたりも踏まえて、コメントをいただけると
非常に助かります。

よろしくお願いいたします。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2005-11-17 19:14
引用:

トリックスターさんの書き込み (2005-11-17 15:01) より:
こんにちは。
login.jsf → toppage.jsf へ遷移するのですが、
toppage.jsfが表示されている状態で、ブラウザの
アドレスは、login.jsfを指しています。


この「遷移」というのがフォワードを指しているのであれば、これは正しい動きです。
フォワードというのはサーバ内での処理ですので、ブラウザから見ればlogin.jsfへの
リクエストに対してレスポンスが返っているわけで、toppage.jsfというURLは知りようが
ありません。もし、toppage.jsfに明示的にブラウザ側で遷移するのであれば、フォワード
ではなくリダイレクトによって遷移すべきです。
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-11-17 19:18
引用:

ukさんの書き込み (2005-11-17 19:14) より:
引用:

トリックスターさんの書き込み (2005-11-17 15:01) より:
こんにちは。
login.jsf → toppage.jsf へ遷移するのですが、
toppage.jsfが表示されている状態で、ブラウザの
アドレスは、login.jsfを指しています。


この「遷移」というのがフォワードを指しているのであれば、これは正しい動きです。


いえ、普通にボタンを押してSubmitしたり、
リンクをクリックして遷移した場合です。

よろしくお願いいたします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2005-11-17 19:38
仕様書に明記されているかは知りませんが、仕様みたいなものです。
ちなみにMyFacesもSun RIもどちらも同じような挙動をします。

JSFではStrutsみたいにアクションに対してURLを割り当てません。
UICommandはビューの中で定義されることになるからでしょう。

URLは具体的にどう使われるかと言うと、最初のフェーズである、
RestoreViewで現在のリクエストを引き起こしたビューを特定する
ために使われることになります。

もしも復元することができないなら、指定されたURLに相当する
ビューをそのままレンダリングするフェーズに移行します。
これは最初のリクエストの場合(FacesServletへGET)などです。

もしビューを復元できたのならば、パラメータから発生もとの
UICommandを割り出してそこで定義されたアクションを発動させます。

このようにURLがアクションを発生させたビューのURLとなるため、
常にひとつ前のビューのURLを示すように見えるわけです。
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-11-17 20:33
マジですか...

つまり、JSFではそもそもブラウザの「戻る」ボタンや
「再読込」ボタンを使用しないことが前提なのですね。
それが受け入れられないなら、JSFは使うべからずですか?

この操作は、一般的なユーザーは必ずやると思います。
ユーザーを教育しなければいけないわけですね。
ということは不特定多数のユーザーを対象としたインター
ネット上のサービスにはJSFは使えないですね。

あと、別ウインドウを開いたりすると変な挙動をします、
開いた元のページが。おそらく原因は同じですね。

非常に勉強になりました。一度、仕様書を読み返します。
ありがとうございました。
T2
常連さん
会議室デビュー日: 2002/02/20
投稿数: 37
投稿日時: 2005-11-17 20:58
> つまり、JSFではそもそもブラウザの「戻る」ボタンや
> 「再読込」ボタンを使用しないことが前提なのですね。
それとこれとは問題が異なります。混同しないように注意してください。
「この「遷移」というのがフォワードを指しているのであれば」というuk氏の問いに対して
「いえ、普通にボタンを押してSubmitしたり、リンクをクリックして遷移した場合です。 」
という回答からも、forwardの動作を正しく理解されていないように見受けられます。
「普通にボタンを押してSubmitしたり、リンクをクリック」してリクエストを送信した
場合でも、forwardによる画面遷移が行われた場合はURLとレスポンスのコンテンツは
異なるものが返されます。これはJSFに限った話しではありません。

ブラウザの戻るボタンを押下したり再読込ボタンを押下したりした場合の問題は
JSFに限らず、どんなWebアプリケーションでも考えなければならない問題です。

問題のJSFですが、ブラウザの戻るボタンを押下したり再読込ボタンを押下したりした場合の
挙動は、実装やバージョンによって異なります。仕様で明確化されていないので、仕方ないところですね。
トリックスター
大ベテラン
会議室デビュー日: 2003/04/16
投稿数: 104
投稿日時: 2005-11-17 21:31
ご教授、ありがとうございます。

引用:

T2さんの書き込み (2005-11-17 20:58) より:
「この「遷移」というのがフォワードを指しているのであれば」というuk氏の問いに対して
「いえ、普通にボタンを押してSubmitしたり、リンクをクリックして遷移した場合です。 」
という回答からも、forwardの動作を正しく理解されていないように見受けられます。


そのようです。
「普通にボタンを押してSubmitしたり、リンクをクリック」して
リクエストを送信する際、リダイレクトすればちゃんとURLも
切り替わるということですか?
それは、どのようにコーディング/設定すればよいのですか?

引用:

ブラウザの戻るボタンを押下したり再読込ボタンを押下したりした場合の問題は
JSFに限らず、どんなWebアプリケーションでも考えなければならない問題です。


ごもっともでございます。

引用:

問題のJSFですが、ブラウザの戻るボタンを押下したり再読込ボタンを押下したりした場合の
挙動は、実装やバージョンによって異なります。仕様で明確化されていないので、仕方ないところですね。


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

JSFの実装って、MyFacesの他にどんなものがありますか?
Shaleは正式リリースされてましたっけ?
T2
常連さん
会議室デビュー日: 2002/02/20
投稿数: 37
投稿日時: 2005-11-19 00:40
引用:

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


そういうことです。

引用:

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


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

引用:

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


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

引用:

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


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

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