- PR -

Strutsの入力データ検証について

投稿者投稿内容
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-03-15 13:56
私自身、Strutsの入力データ検証の方法は下記の2通りがあると認識しております。

 1.validateメソッドの実装
 2.ValidatorFormの継承

都合によりメッセージリソースファイルではなく、DBからエラーメッセージを取得し出力しなければなりません。

この場合、やはり1の方法で実装するしかないでしょうか?
またその際、該当の ActionForm からDB接続をしなければならないのでしょうか?

DAOで取得したエラーメッセージを、うまくActionFormに渡せたらよいのですが・・・。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-03-15 15:09
DAOを作成するパターンではなく、
カスタムのメッセージリソースで対応するのはいかがでしょうか。

struts-config.xmlにメッセージリソースの設定が行えますが、
データベース接続を行うメッセージリソースを作成して、
parameter属性とfactory属性とbundle属性で定義します。

カスタムのメッセージリソースは
org.apache.struts.util.MessageResources
org.apache.struts.util.MessageResourcesFactory
のクラスを継承して作成できます。

エラー出力の際はタグライブラリのbundle属性を
定義したものと一致する名前を指定すればOKです。
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-03-15 15:38
早速のアドバイスありがとうございます。
新しい概念の対応策なので戸惑ってます。

 「DBに接続できるカスタムリソースクラスを作成して、struts-config.xmlに定義する」

ということでしょうか?

既に他の値で既存のメッセージリソースを使用していますが問題ないでしょうか?

 <message-resources parameter="MessageResources" />

ちょっと手元の書籍には無い内容なので調べてみます。
 ・MessageResourceクラスとMessageResourceFactoryクラスの実装方法
 ・struts-config.xmlの書式
 ・上記の場合のValidatorの使用方法


何か参考になりそうなサイト等がございましたらご教授よろしくお願いします。

[ メッセージ編集済み 編集者: NV 編集日時 2006-03-15 16:00 ]
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-03-15 18:08
下記Strutsソースを解析してますが、

 org.apache.struts.util.PropertyMessageResources

このクラスを継承して、下記メソッドをオーバーライドするのかな?と当たりをつけてます。

 getMessage(Locale locale, String key)

ただ、そもそもそれ程Javaに熟知していないレベルでこのような手段を採るものか悩んでいます。よくある拡張であるのか、思いっきりメスを入れているのか分かりませんが心細いです。

方向性としてあっているのかだけでも、ご指摘願えればと思います。
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-03-15 21:00
一応途中経過です。

■拡張クラス作成
 class TestMessage extends MessageResources{}
 class TestFactory extends MessageResourcesFactory{}

■struts-config.xmlに追加
 <message-resources parameter="DBResources" factory="TestFactory" key="db"/>

■JSPにメッセージタグ追加
<bean:message bundle="db" key="test" />

このような処理で取り合えず想定している値は出力されました。

ただ、私の認識ではリソースファイルはアプリ起動時に一度に読み込まれると思ってましたが、ソースを見たところ、その都度下記のメソッドが呼ばれて値を返しているような気がします。

 TestMessage.getMessage(Locale locale, String key){}

このメソッドが呼ばれる都度、DBにアクセスする必要があるのでしょうか?

ご存知でしたら、ご教授よろしくお願いします。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-03-15 21:54
ごめんなさい、遅くなりました。

で、大体説明どおりの内容になりましたね。

引用:

ただ、私の認識ではリソースファイルはアプリ起動時に一度に読み込まれると思ってましたが、ソースを見たところ、その都度下記のメソッドが呼ばれて値を返しているような気がします。

 TestMessage.getMessage(Locale locale, String key){}

このメソッドが呼ばれる都度、DBにアクセスする必要があるのでしょうか?


仕様と実装次第です。常に最新が欲しければ都度DBアクセスが必要でしょうし、
最新に拘らなければキャッシュした方がいいでしょう。
どちらがいいのかは、NVさんのプロジェクトの要求がわからないので、
私は何とも言えないです。。。

1.ファクトリでDBから読み込む
2.マップなどに格納
3.リソースクラスにマップを渡す
4.リソースクラスのgetMessageでマップを参照
って感じで処理を行えば、キャッシュも可能ですね。
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-03-16 09:20
ご親切にご回答ありがとうございます。

>>1.ファクトリでDBから読み込む
>>2.マップなどに格納
>>3.リソースクラスにマップを渡す
>>4.リソースクラスのgetMessageでマップを参照
>>って感じで処理を行えば、キャッシュも可能ですね。

かつのりさんのおっしゃる通り、最初に一度読み込めれば良いと思ってます。
ただ、Strutsのコード(PropertyMessageResources)で、どこでメッセージリソースから読み込んだ値をHashMapに設定しているのか解析できなかったで質問させていただきました。

方向性的には合っているのようですね。
1のファクトリ周りを調べてみます。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2006-03-16 11:15
別にPropertyMessageResourcesの値の設定方法にこだわる必要はないですよ。

MessageResourcesを継承して、
1.HashMapとMessageResourcesFactoryとString引数とするコンストラクタを追加
2.HashMap型のフィールド追加
3.getMessageをオーバーライドしてHashMapから値を返す
でいいと思います。

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