previousViewIdからページクラスを取得
これはMLに流れていたのを発見。先人に感謝。
// DI public S2Container container; public NamingConvention namingConvention; // previousViewIdからページクラスオブジェクトを取得 String pageName = namingConvention.fromPathToPageName(previousViewId); Class pageClass = container.getComponent(pageName).getClass();
previousViewIdを何とかして保持
previousViewIdは直前にリクエストしたページの、/viewからのHTMLパスが入っている。
以下に引用するとおり、「あるPageが以前にどこのPageから遷移してきたかを判別する」用途に使える。
previousViewId(プレビアスビューアイディ)とは、あるPageが以前にどこのPageから遷移してきたかを判別する機能です.
http://teeda.seasar.org/ja/extension_features.html#previousViewId
Pageクラスに[previousViewId]というString型のプロパティを定義しておくと、Teedaが自動的に設定してくれます.
previousViewIdには、/view/hoge/foo.htmlのような形式のHTMLまでのパスが設定されます.
が、しかし。
当然ながら、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(); }
伊達政宗の遺訓が悟りすぎ
一、仁に過ぐれば弱くなる。義に過ぐれば固くなる。礼に過ぐれば諂(へつらい)となる。智に過ぐれば嘘を吐く。信に過ぐれば損をする。
http://ja.wikipedia.org/wiki/%E4%BC%8A%E9%81%94%E6%94%BF%E5%AE%97#.E9.81.BA.E8.A8.93
一、気長く心穏やかにして、よろずに倹約を用い金銀を備ふべし。倹約の仕方は不自由なるを忍ぶにあり、この世に客に来たと思へば何の苦しみもなし。
一、朝夕の食事はうまからずとも褒めて食ふべし。元来客の身に成れば好き嫌ひは申されまじ。
一、今日行くをおくり、子孫兄弟によく挨拶して、娑婆の御暇申すがよし。
ひとつ目は、バランスが大事ということか。
偏りは良くないよね。