ログイン・ログアウトを繰り返していると、ログインページのユーザーID欄がいつも前回値のままになっている事に気付くと思います。
Paraselene は過去に表示したページインスタンスを保持しており(履歴と呼びます)、再度同じ画面が要求されると履歴からそのインスタンスを取り出してくるため、入力値も保存されたままとなっています。
ページA → ページB → ページC
例えばこのような画面遷移にてページCが表示されたとすると、履歴にはA~Cが順番にスタックされて保存されており、履歴に該当ページが存在すれば、それを使用します。
そして、ページCからページAへ画面遷移してくると、ページAを残してBとCの2つは履歴から削除されます(ページAより最近アクセスされたページ全てが削除されます)。
会員登録画面を例に挙げれば、
会員情報入力ページ → 入力内容確認ページ → 登録ありがとうございました
この時、先頭へ戻るという事は入力のやり直しか、登録が正常終了した(会員登録トランザクションが終了した)という事です。
そのため、ページBとCはもう不要なインスタンスであると判断します。
履歴は RequestParameter インスタンスから取得できます。いつでも最古のアクセスページから直近アクセスのページインスタンスまで全て参照可能です。
このチュートリアルの場合は、ログイン画面へ戻る度に Hello 画面インスタンスが削除され、ログイン画面は初めて表示した時に使用したインスタンスが常に使用され続けている事になります。
また、ユーザーID欄がいつも埋まっているのに対しパスワードはいつも空欄です。
セキュリティ上の観点から、type="password" の <INPUT> を出力しようとしても値をブラウザに返さない仕様としているため、このような動作になります。
履歴格納方法の振る舞いは、以下の制御が可能です。各ページでオーバーライドする事で変更可能です。
| falseを返すと履歴へ追加されません。 SuperPageクラスで実装されており、常にtrueを返しています。 |
|
| 上記のページB、ページCのようなクリア動作を制御し、falseを返すと履歴から削除しません。 SuperPageクラスで実装されており、常にtrueを返しています。 falseを返すと、履歴中に同じページが繰り返し格納される場合があります。 この場合、履歴中の最新インスタンスが使用されます。 |
ログイン画面は、ユーザーIDもクリアされていた方が良いので、LoginHtml のソースを次のように変更します。
1: 2: 3: 4: 5: 6:
public Page outputMain( Page from, RequestParameter req ) throws PageException { // 出力内容を設定します。 // 初期化したい場合は、init()をコールして下さい。 init(); return this; }