[Seasar-user:16725] Re: SAStrutsでのSESSION使用方法について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2009年 1月 22日 (木) 19:00:20 JST


小林 (koichik) です.

Date:    Thu, 22 Jan 2009 18:29:12 +0900
From:    aaa aaa <[E-MAIL ADDRESS DELETED]>
To:      <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:16724]  RE:   RE:  Re: SAStrutsでのSESSION使用方法について

> 解決済みだと思ってたのですが、動作確認していたところ
> SESSIONスコープに格納されていなかったようです。
>  
> Dtoという名称でないとだめとかですかね?

そうですね.
Seasar2 にコンポーネントとして管理されるには,

・dicon に登録する
・SMART deploy で自動登録される

のいずれかが必要です.
dicon に登録するならアノテーションは不要なので,
ここでは SMART deploy で自動登録するとします.

SMART deploy で自動登録されるには,SMART deploy の
規約に従う必要があります.

http://s2container.seasar.org/2.4/ja/DIContainer.html#SMARTdeploy

クラス名は用途ごとに決められており,ログイン情報なら
Dto となります.FQN だと

<root>.dto.XxxDto

です.よって,

@Component(instance = InstanceType.SESSION)
public class LoginDto implements Serializable {

としてください.

また,Service では

  public Map sessionScope;

として HttpSession をラップした Map を
受け取るようにしてください.

そして作成した LoginDto のインスタンスを 
loginDto という名前で Map に追加してください.

    sessionMap.put("loginDto", loginDto);

これで LoginDto がセッションに含まれます.

> 本設定で、Actionでは以下のような取り出し方法をしております。
> -------------------------------------------------------
>  @Resource
>  private LoginData loginData;
> -------------------------------------------------------

Service が LoginDto をセッションに追加した
リクエストよりも後のリクエストであれば,これで
LoginDto が DI されるようになります
(クラス名は LoginDto に,フィールド名は 
loginDto にしてください).

ただし,Service を呼び出す前にこのフィールドが
null だった Action では,Service の呼び出しから
戻ってきた後もこのフィールドは null のままです.

Service を呼び出した Action で LoginDto を
取得するには,Service と同じように

  public Map sessionScope;

を用意して,loginDto という名前で get()
してください.

    loginDto = (LoginDto) sessionScope.get("loginDto");



-- 
<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 メーリングリストの案内