- PR -

HttpServletRequestが無い時にHttpSessionを取得する方法

1
投稿者投稿内容
田中
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 54
投稿日時: 2005-11-27 22:01
Strutsで開発しています。

初歩的な質問で申し訳ありませんが、HttpServletRequestが無い時にHttpSessionを
取得する方法を教えて下さい。


ActionクラスではrequestパラメタからHttpSessionを取得することができますが、
ロジック用のクラスなど、HttpServletRequestをパラメタに持っていない所で
セッション情報を取得する方法が判りません。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-11-27 23:02
ロジック用のクラスとは、独自で作られたPOJOでしょうか。
ならば、HttpServletRequest/HttpSessionを渡さない限り、
HttpSessionを取得する事はできません。

何か渡せない理由があるのでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-11-28 02:06
「ロジック用のクラス」であればそれは Web レイヤに依存しないビジネスロジックだけを記載するクラスになりそうです。
なので Web 層でしか生成し得ないインスタンスを前提にするのは妙ですね。
引数やコンストラクタにはもっと一般的な型を渡してやるようにして、サーブレットからでもアプレットからでもスタンドアロンのアプリケーション内でも呼び出せるような形にしてあげるのが良いかと思います。
サーブレット内で呼び出されるのが前提となるのであればやはり HttpServletRequest なりHttpSession なり直接渡してあげることになります。
基本的に渡されない情報は参照出来ません。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-11-28 03:00
インギさんの仰るとおり、ロジッククラスを特定APIに依存させない為には、
パラメータ等を抽象化する必要がありますね。
コード:
//処理のパラメータを返すインターフェイス
interface Data{
    String getFoo();
    String getBar();
}

//業務ロジッククラス
class Logic{
    void anyTask(Data data){
        //業務ロジック
        String foo = data.getFoo(); 
        String bar = data.getBar(); 
        ....
    }
}


上記のようにパラメータを抽象的に表現し、
業務ロジックに渡すようにします。

パラメータクラスを以下のように、
各アーキテクチャ向けに実装します。
コード:
//サーブレットで利用する為のクラス
class ServletData implements Data{
    HttpSession session;
    ServletData(HttpSession session){
        this.session = session;
    }
    String getFoo(){
        return session.getAttribute("foo");
    }
    String getBar(){
        return session.getAttribute("bar");
    }
}

//mainメソッドで利用する為のクラス
class BatchData implements Data{
    String[] args;
    BatchData(String[] args){
        this.args = args;
    }
    String getFoo(){
        return args[0];
    }
    String getBar(){
        return args[1];
    }
}


サーブレットでは
コード:
Data data = new ServletData(session);
Logic logic = new Logic();
logic.anyTask(data);


のように実行し、
バッチ処理などのmainメソッドからの実行は
コード:
Data data = new BatchData(args);
Logic logic = new Logic();
logic.anyTask(data);


というように実行します。

LogicクラスではDataインターフェイスだけを意識すればよく、
HttpSessionには依存しません。
田中
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 54
投稿日時: 2005-11-28 10:24
おはようございます。
早速のご回答ありがとうございます。

私もパラメタを渡すのが簡単だと思ったのですが、既にいろんなところで
使用しているロジックのため影響範囲が大きく、なるべくパラメタの変更は
避けたかったからです。

やりたいのは、request.getServerName()で得たサーバー名からドメイン名を
抽出することです。
ドメイン名を必要とするのがメール送信用の汎用クラスの中のため、この汎用
クラスを使用する部分を全て変更する必要があります。

今回の修正を加える前はプロファイルでメール送信クラスの中で使用する
ドメイン名を与えていましたが、wwwサーバーとアプリケーションサーバーを
分離して複数の入り口を持つようにしてしまったため、入り口に合わせて
ドメイン名を変更する必要が生じました。

アクションクラスの中だけなら修正は割と簡単だったのですが、アクションクラス
から直接呼び出すことの無いメール送信クラスを変更すると途中の関係ないクラスまで
修正を加えなければならず、何とか回避する方法は無いものかと思案しています。
田中
ベテラン
会議室デビュー日: 2002/05/08
投稿数: 54
投稿日時: 2005-11-28 11:16
ドメイン名はセッション情報に書き込んでおき、使いまわせるようにしたいと思っていました。
ドメイン名の他にもセッション情報から取り出したい情報があったので最初の質問となりました。
1

スキルアップ/キャリアアップ(JOB@IT)