- PR -

Struts1.1とDataSourceの取得について

投稿者投稿内容
POTETO
常連さん
会議室デビュー日: 2003/10/06
投稿数: 41
投稿日時: 2003-10-22 07:14
みなさん、こんにちは。
Struts1.1の勉強をしています。
JNDIを用いたDB接続を行う時に、lookup()メソッドを使ってDataSourceを
取得すると思いますが、これをどのタイミングで行うのが良いでしょうか?
@Actionサーブレットのフィルタークラスを作成しそこで行う。
A各イベント時にコールされるActionクラスで行う。
B各Actionクラスから呼び出されるヘルパークラスで行う。
「B」はトランザクションの保持を考えると違うような気がします。
または、他に何か良いタイミングがあるのでしょうか。

どなたか御知恵をお貸しください。

因みに、DB接続にはO/RマッピングのTorqueを使っているので、
Torque.init("Torque.properties")でDataSourceの取得を行います。
(違ってたらすいません。)
とまと
ベテラン
会議室デビュー日: 2003/10/18
投稿数: 51
投稿日時: 2003-10-22 07:42
おはようございます。

1.ServletContextListenerを実装する。
2.ActionServletのinitメソッドの中で行う。
3.Struts PlugInで実現する。
があるでしょうか。
1はServlet API2.3をサポートしたサーブレットコンテナ
が必要です。
2の方法はActionServletを拡張する必要があるので、
採用したくないでしょう。
今回はStruts1.1を利用されるとのことですので、
3が一番簡単なのではないでしょうか。
サービス中に何度も呼ばれるActionクラスで
データベース接続の初期化がされているかどうか
判定し、されていなければ初期化するといった
方法でももちろん実現することはできますが、
・効率性
・終了処理をどこに記述するのか。
・初期化処理の記述が分散される可能性がある
といった点を考えるとあまりスマートでは
ないように感じます。

[編集]
Filterに関する記述を削除。

[ メッセージ編集済み 編集者: とまと 編集日時 2003-10-22 07:46 ]

[ メッセージ編集済み 編集者: とまと 編集日時 2003-10-22 07:53 ]
Dandan
常連さん
会議室デビュー日: 2002/01/17
投稿数: 25
投稿日時: 2003-10-22 13:05
こんにちは、

引用:

とまとさんの書き込み (2003-10-22 07:42) より:
2.ActionServletのinitメソッドの中で行う。



Struts1.1なら、ActionServletより、RequestProcessorを継承したほうが良いです。

私は、RequestProcessor.init()をオーバライドしてデータソースを取得しています。(super.init()も忘れないように)

RequestProcessorはstruts-config.xmlの <controller processorClass="[フルパッケージクラス名]" />で入れることができますので、お手軽です。

考慮する点としては
1. TilesFrameworkを使う場合は、TilesRequestProcessorを継承する
2. 複数モジュール(struts-config.xmlを複数使うとき)の時の対処
になると思います。
とまと
ベテラン
会議室デビュー日: 2003/10/18
投稿数: 51
投稿日時: 2003-10-22 13:56
こんにちは。

引用:

Dandanさんの書き込み (2003-10-22 13:05) より:

Struts1.1なら、ActionServletより、RequestProcessorを継承したほうが良いです。



今回の場合、どういった点でRequestProcessorのinitメソッドを
オーバーライドした方がベターなのでしょうか。
※Struts1.1ではActionServletを拡張するよりもRequestProcessorを
 拡張した方がよいケースは多いとは思います。
(例.processPreprocessフックなど)
また、Struts Pluginを利用しないでRequestProcessorを
拡張する方法を選んだ理由も聞かせていただけるとうれしいです。

実は最初RequestProcessorのオーバーライドについても
考えたのですが、
まさにDandanさんのご指摘の通りのことを考慮し、
引用:

1. TilesFrameworkを使う場合は、TilesRequestProcessorを継承する
2. 複数モジュール(struts-config.xmlを複数使うとき)の時の対処
になると思います。


ActionServletのinitメソッドをオーバーライド方が
考慮すべき点が少ないのでベターかなと思いました。

ただ、これは状況によってどちらとも言えないのでしょうね。
RequestProcessorを拡張せざるを得ない場合は、
ActionServletとRequestProcessorの両方を拡張するのは
goodだとは思わないし、
ReqeustProcessorを拡張する予定のないシステムでは、
ActionServletのinitのオーバーライドを選択すれば
Dandanさんのご指摘したことを考慮する必要がないので
簡単だということになるのでしょうか。

ただ、私がもし設計するならStruts PlugInを
採用していますね。

以上です。
ボア
ベテラン
会議室デビュー日: 2002/05/22
投稿数: 78
投稿日時: 2003-10-22 17:17
私も Servlet で言う init() が Action に無いものかどうかを
調べたことがありました。

試したことはないですが、Action を継承した中間クラスを作成し、
ここで、setServlet() をオーバライドするのって何か問題が
あるのでしょうか?
Dandan
常連さん
会議室デビュー日: 2002/01/17
投稿数: 25
投稿日時: 2003-10-22 18:15
うーん、別にそんなに否定の意図でレス書いたわけじゃないんだけどなぁ。

引用:

今回の場合、どういった点でRequestProcessorのinitメソッドを
オーバーライドした方がベターなのでしょうか。


ですが、大元の
引用:

2.ActionServletのinitメソッドの中で行う。
2の方法はActionServletを拡張する必要があるので、
採用したくないでしょう。


を受けて
引用:

(ActionServletを拡張する必要があるので、採用したくないなら)Struts1.1なら、ActionServletより、RequestProcessorを継承したほうが良いです。


と思っただけです。
別に「RequestProcessorへの実装はベストの選択だ!」とは言ってないし、
引用:

ただ、これは状況によってどちらとも言えないのでしょうね。
RequestProcessorを拡張せざるを得ない場合は、
ActionServletとRequestProcessorの両方を拡張するのは
goodだとは思わないし、
ReqeustProcessorを拡張する予定のないシステムでは、
ActionServletのinitのオーバーライドを選択すれば
Dandanさんのご指摘したことを考慮する必要がないので
簡単だということになるのでしょうか。


のとおりだと思います。
---------------------
ちなみに、
引用:

また、Struts Pluginを利用しないでRequestProcessorを
拡張する方法を選んだ理由も聞かせていただけるとうれしいです。


ですが、この前関わったプロジェクトでは、Struts上に載せるRequestProcessorをベースにしたコンポーネント(DBアクセスもあるもの)を作成しました。
コンポーネントを使用したいモジュールなら、<controller>にセットし、使用したくないモジュールは指定しないような作りにしたのです(逆に考慮点を利用した)。

そのときは、どうせRequestProcessorに書けばいいや、と思ったし実装する人がstruts-config.xmlに<plug-in>の記述を書かなくてすむ、と思っただけですけどね。
---------------------
[追記]

先の私の
引用:

私は、RequestProcessor.init()をオーバライドしてデータソースを取得しています。(super.init()も忘れないように)


は*いつも*その様に実装してるような書き方ですね、失礼しました。前回その様に実装しただけで、その前は1.0ベースだったので、普通にAction#getDatasource()だったんですけどね。

[ メッセージ編集済み 編集者: Dandan 編集日時 2003-10-22 18:23 ]
とまと
ベテラン
会議室デビュー日: 2003/10/18
投稿数: 51
投稿日時: 2003-10-22 19:02
こんばんは。

引用:

うーん、別にそんなに否定の意図でレス書いたわけじゃないんだけどなぁ。


なんか私の返信が威圧的(?)だったみたいで、
申し訳ありませんでした。
私はこういった設計に関する話題が好きで、
設計者が様々な状況でどんな判断で実装方法を選択したのかといった
ことに非常に興味があり、
それで質問させていただきました。

私などは、RequestProcessorにはできれば手を付けたくない、
RequestProcessorに密接に関連したコンポーネントは作りたくないと
考えてしまうのですが、
逆にそのような拡張方法をとることでアプリケーションを
記述するプログラマにとっては便利な仕組みを
提供しようという考えなのですね。
※実は、私も、セッションチェック、権限チェック、サービスチェック、
 などの業務共通処理をRequestProcessorで
 実行するような仕掛けを作っていたりします(笑)。

引用:

(ActionServletを拡張する必要があるので、採用したくないなら)Struts1.1なら、ActionServletより、RequestProcessorを継承したほうが良いです。
と思っただけです。
別に「RequestProcessorへの実装はベストの選択だ!」とは言ってないし、


これに関しては了解しました。
プロジェクトでRequestProcessor#initを採用されたとのことだったので、
どんな判断で決定したのか興味があったのです。

Dandanさんの気分を害してしまったようで
申し訳ありませんでした。
以上です。
POTETO
常連さん
会議室デビュー日: 2003/10/06
投稿数: 41
投稿日時: 2003-10-23 07:23
とまとさん、Dandanさん、
返信どうもありがとうございます。
DataSourceの取得だけでいろいろな実装方式があるんですね。
恥ずかしながら、Strutsは勉強し始めたばかりなので、
Struts PlugIn(Actionパッケージのインターフェース?)の
存在じたい知りませんでした。
いろいろ試してみたいと思います。

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