previousViewIdを何とかして保持

previousViewIdは直前にリクエストしたページの、/viewからのHTMLパスが入っている。
以下に引用するとおり、「あるPageが以前にどこのPageから遷移してきたかを判別する」用途に使える。

previousViewId(プレビアスビューアイディ)とは、あるPageが以前にどこのPageから遷移してきたかを判別する機能です.
Pageクラスに[previousViewId]というString型のプロパティを定義しておくと、Teedaが自動的に設定してくれます.
previousViewIdには、/view/hoge/foo.htmlのような形式のHTMLまでのパスが設定されます.

http://teeda.seasar.org/ja/extension_features.html#previousViewId

が、しかし。
当然ながら、F5リロードしたら前回の値が消え、F5を押したときの画面のHTMLパスが入る。
これでは「どこから来たか」という判定には一回しか使えない。

自分の画面にいる間(ポストバック or F5更新)は、どうしても「どこから来たか」という情報を保持しておきたかったので、ちょっと考えてみた。というかだいぶ考えてしまった。
スコープアノテーションでもっと簡単にできる想定だったんだけど、よく理解していなかったので思惑通りにはいかず、結局力任せにプログラム書くことに。
ちなみに何故「どこから来たか」という情報を保持しておきたかったかというと、いや、単純に「どこから来たか」という情報を保持しておきたかった…。
previousViewIdだとF5したら内容が変わってしまうし。いまいち使いどころが思い浮かばない。。

package local.web.previous;

import org.seasar.framework.container.S2Container;
import org.seasar.framework.convention.NamingConvention;
import org.seasar.framework.util.StringUtil;
import org.seasar.teeda.extension.annotation.scope.SubapplicationScope;

public abstract class BasePage {

	// 遷移元ページのHTMLパス(Teedaが自動セット)
	public String previousViewId;

	// 遷移元ページのHTMLパスをサブアプリケーションスコープ化するための変数
	@SubapplicationScope
	public String previous;

	public S2Container container;
	public NamingConvention namingConvention;

	public Class initialize() {

		// previousViewIdがある(=どこかのページにアクセスした)場合のみ処理
		if (!StringUtil.isEmpty(previousViewId)) {

			// previousViewIdからページクラスオブジェクトを取得
			String pageName = namingConvention.fromPathToPageName(previousViewId);
			Class pageClass = container.getComponent(pageName).getClass();

			// previousViewIdから取得したページクラスオブジェクトのシンプルな名前(クラス名だけの文字列)を取得
			String previousClassName = this.getSimpleClassName(pageClass.getSimpleName());

			// 現在アクセスしているページクラスのシンプルな名前を取得
			String thisClassName = this.getSimpleClassName(this.getClass().getSimpleName());

			// サブアプリケーションスコープ化した遷移元ページのHTMLパスがある場合のみ処理
			if (!StringUtil.isEmpty(previous)) {

				// 自画面遷移(ポストバック or F5更新)は何もしない
				if (previousClassName.equals(thisClassName)) {
					// 何もしない
				} else {
					// 自分とは違うクラスから遷移してきた場合はpreviousViewIdを保持
					previous = previousViewId;
				}

			} else {
				// 直前にアクセスしたと思われる遷移元ページのHTMLパスで、初期化
				previous = previousViewId;
			}
		}

		return this.init();
	}

	/**
	 * SimpleClassNameのStringから、単純なクラス名だけの文字列を取り出す
	 *
	 * @param className
	 *            SimpleClassNameのString
	 * @return String 単純なクラス名
	 */
	private String getSimpleClassName(String className) {
		return className.substring(0, className.indexOf("$"));
	}

	/**
	 * 子ページクラスのinitialize的メソッド
	 *
	 * @param void
	 * @return Class 遷移先ページクラス
	 */
	abstract public Class init();

}