[Seasar-user:16492] Re: Intercepter内で発生元Pageクラスのメンバ変数を参照したい

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2008年 12月 11日 (木) 19:00:20 JST


小林 (koichik) です.

Date:    Thu, 11 Dec 2008 18:11:38 +0900
From:    "浅野護" <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:16491] Intercepter内で発生元Pageクラスのメンバ変数を参照したい

> PageクラスのdoXXXメソッドが呼ばれたときに、doXXXメソッドの前後でアクセスログを出力するIntercepterクラスを作成しています。
> Pageクラスのinitialize()メソッドで、自クラスのメンバ変数に値をセットしておき、アクセスログ出力Intercepterでその値を出力しようとしたのですが、initialize()でセットした値が空のままになってしまいます。
> サンプルコードの抜粋を以下に記述しますが、元々このようなことは出来ないのでしょうか?

initialize() が呼ばれる時と do〜() が呼ばれた時では
ページクラスのインスタンスは異なります.

http://teeda.seasar.org/ja/extension/concept/lifecycle.html#リクエストパターンとライフサイクルメソッド

初期表示の際は

AaaPage aaaPage = new AaaPage();
aaaPage.initialize();

ポストバックの際は

AaaPage aaaPage = new AaaPage();
aaaPage.doXxx();

のように動いていると理解してください.

このため,initialize() で設定した値は HTML の
フォームからサブミットされるか,@Page スコープ
などで保持しない限り失われます.

http://teeda.seasar.org/ja/extension/concept/scope.html

> また上記のソースをHOT Deployで動かすと、Intercepterの「if(obj instanceof
> AaaPage){」の行が、初めて通るときは「false」で判断されました。(2回目以降はtrue)
> ただしCOOL Deployで動かすと、一回目もtrueになります。

Interceptor を dicon に定義しているのでは
ないでしょうか?

dicon に定義するとその Interceptor は HOT の
対象ではなくなるため,上記の現象となります.
詳しくは以下を参照してください.

http://ml.seasar.org/archives/seasar-user/2008-October/015960.html
http://ml.seasar.org/archives/seasar-user/2008-March/013148.html

Interceptor も SMART deploy にできるので,
通常は dicon に定義する必要はありません.
インターセプタのパッケージは <ROOT>.interceptor に
なっている必要があります.
この例だと <ROOT>.interceptor.AccessLogIntercepter
であれば,このインターセプタ自身を dicon に定義
しなくても,customizer.dicon で

<component name="pageCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain">
  <initMethod name="addAspectCustomizer">
    <arg>"accessLogIntercepter"</arg>
    <arg>"do.*"</arg>
  </initMethod>
</component>

とするだけでページクラスに AccessLogIntercepter が
適用され,インターセプタ自身も HOT になります.


P.S.
質問の際は利用しているプロダクトの名前や
バージョンを明記してください.


-- 
<component name="koichik">
    <property name="fullName">"Koichi Kobayashi"</property>
    <property name="email">"[E-MAIL ADDRESS DELETED]"</property>
    <property name="blog">"http://d.hatena.ne.jp/koichik"</property>
</component>



Seasar-user メーリングリストの案内