ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Struts!!!!!コミュのvalidation.xml の arg0 の key に動的な値を渡したい

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして。
主に Struts & Tiles で Web システムの構築をしている者です。
新しいトピックを立ててしまいましたがよろしかったでしょうか。

さて、以下のような事はできないのでしょうか。
今日半日くらい調べた範囲では分からなかったのでお訊きします。
お分かりの方がいらっしゃいましたらご教示いただければ幸いです。

01: MyForm.java:
02:
03: class MyForm extends ValidatorForm {
04:  static class Param {
05:   private String name;
06:   private String value;
07:
08:   String getName() { return name; }
09:   String getValue() { return vaule; }
10:   void setName(String name) { this.name = name; }
11:   void setValue(String value) { this.value = value; }
12:  }
13:
14:  private Param[] params;
15:
16:  Param[] getParams() { return params; }
17:  void setParams(Param[] params) { this.params = params; }
18: }
19:
20:
21: validation.xml:
22:
23: <form name="MyForm">
24:  <field property="value" indexedListProperty="params" depends="required">
25:   <arg0 key="${params[].name}" resource="false"/>
26:  </field>
27: </form>

何をやりたいのかと言うと、入力フォーム自身をユーザの入力に基づいて作ろうとしています(そしてそれ自体はできています)。

で、入力値の検査を validator に任せようと思っているのですが、フィールド名が前述の通りユーザに入力により動的に決まるため、プロパティファイルのキーを指定する事ができません。
具体的には 25行目になりますが、このような感じで変数が使えると嬉しいのですが、なにか上手い方法はありますでしょうか。

上記の 25行目はもちろん動かず、ただ「${params[].name}」と表示されてしまいます。
ここさえクリアできれば、とても嬉しいのですが。

なお、説明を簡単にするため「depends="required"」にしていますが、実際にチェックしたいのは「maxlength」と「validwhen」です。
クラスおよびメンバに public 修飾が無いのも簡略化のためです。

よろしくお願いします。

コメント(6)

初めまして。zetta1985と申します。

ひと月前のトピックなので、自己解決されてるとは思いますが、
気になったのでコメントさせて頂きます。

EK3さんがおっしゃってる「入力フォーム自身をユーザの入力に基づいて作る」という処理がどのような実装になっているか、私では本文から読み取れませんでしたので、参考までに。


Strutsのバージョンが明記されてませんが、Struts1.2.系では、var要素のvar-nameに式を記述する事ができます。(半日調べたとの事なのでご存知かも知れませんが)

以下URLの「24.5.1 ValidWhen ルール」の欄に記述されています。

http://www.techscore.com/tech/ApacheJakarta/Struts/24.html


ここからは余談ですが、EK3さんのやりたい事は設定ファイルの実装できる限界に近いと思います。
設定ファイルだとデバッグしずらい等ブラックボックスの部分がネックになってきます。

もし、まだお困りのようでしたら、ValidatorのJavaScriptを有効にした際にHTMLに出力されるスクリプトをコピペして、JavaScriptを独自にラップして利用した方が、柔軟に対応できますし、
IDEでデバッグもできて保守性・再利用性が高まるかと思います。


以上、EK3さんの問題が解決致します事を願っております。
zetta1985 さん:
初めまして。

コメントありがとうございます。
せっかくコメントいただいたので、勇んで書き始めたらだいぶ長くなってしまいました。
面倒くさかったら無視してください。


実を言うと当該部分は放ったらかしで、なにも状況は変わっていません。(^^;
が、validator では無理だろうなというのが今のところの結論です。
だいぶ残念ですが、validator を抜けた後、ロジック内でチェックしようと考えています。


> EK3さんがおっしゃってる「入力フォーム自身をユーザの入力に基づいて作る」という処理がどのような実装になっているか、私では本文から読み取れませんでしたので、

ちょっと説明が足りなかったようです。
すみません。
ざっくり言うと、「汎用データベース機能」の簡単なものをユーザに提供したいと考えています。

ユーザは、データ自体を入力する(させる)前に、そのメタデータを定義する事ができます。
例えば「書籍」というメタデータを定義します。プロパティとして「著者」「ISBNコード」などを定義する事ができ、さらに各プロパティの入力が必須かどうかを指定する事ができます。

上記のユーザが定義したメタデータに従って、システムは末端のユーザ向けに入力画面を生成します。
上記の例ならば、末端のユーザに対しては著者とISBNコード入力欄が表示され、それぞれ必須かどうかが示されます。

・・・と、ここまではできている状態です。

最初は、入力項目が可変のフォームを作ること自体、無理なのではないかと思っていたのですが、なんと大したもので、最初のサンプルコードのようにオブジェクトの配列に対するgetter/setterを定義する事でクリアできました(Struts開発陣に脱帽)。

その際、JSPには(ちょっと今自宅で正確な記述は思い出せないのですが)「${params[].name}」のような記述が許されていました。

ここまでできているのだから、後は validator がよろしくやってくれればとてもキレイなのになぁ、と思った次第です。
つまり、可変フォームに対応する「ラベル」をオブジェクトから取得できればいいのに、ということです。

<arg1 name="maxlength" key="${var:maxlength}" resource="false"/>

のような記述が許されているのだから、後一歩だと思うのですが。


おそらくは zetta1985 さんのおっしゃる通り設定ファイルの限界と言う事なのでしょう。
#でも検証している、と言う事はデータは validator の手元にある訳です。
#私が欲しいメタデータの「見出し」も同じデータオブジェクト内に格納されています。
#後一歩じゃん、とついつい思ってしまいます。(^^;


Struts のバージョンを明記しないなど、質問の基本すら怠っていたにも関わらず、コメントいただき大変ありがとうございます。
少なくとも、世間一般ではできていて、私だけできていない、といった状態ではなさそうだということが分かり安心(がっかり?)しました。

なお、教えていただいた TECHSCORE さんのサイトには私もよくお世話になっています。(^^
>EK3さん

長文でのご回答、ありがとうございます。
EK3さんがおっしゃってる「入力フォーム自身をユーザの入力に基づいて作る」という処理が
理解できました。

私が関わってきたStrutsアプリよりも複雑な設計のアプリですね・・・
とても興味深いです。


>実を言うと当該部分は放ったらかしで、なにも状況は変わっていません。(^^;
>が、validator では無理だろうなというのが今のところの結論です。
>だいぶ残念ですが、validator を抜けた後、ロジック内でチェックしようと考えています。

そうですね、今回のケースだとActionFormで検証するのが常套手段だと思います。


と、言っておいてなんですが、「validatorの検証ルール追加」というのは、もうお試しになりましたか?

検証ロジックの中でActionForm・設定情報等が扱えるので、かなり自由に拡張できると思います。
オブジェクトから取得した文字列をエラーメッセージのキーとして扱う、というのも簡単にできますよ。


私たちがお世話になっているTECHSCORE さんのサイトに記載されていますw

まだお試しになってない場合は、検証してみてはいかがですか?
zetta1985さん、こんばんは。

> と、言っておいてなんですが、「validatorの検証ルール追加」というのは、もうお試しになりましたか?

あ、なるほど。
自分で書いてしまえばいいんですね。
ちょっと盲点でした。

> オブジェクトから取得した文字列をエラーメッセージのキーとして扱う、というのも簡単にできますよ。

おおお!なんと!
今ちょっと別件で手が離せないので、少し先になってしまうかもしれませんが、ぜひ試してみたいと思います。

> 私たちがお世話になっているTECHSCORE さんのサイトに記載されていますw

あはは。(^^;
まじめに見ていないのがバレてしまいましたね。


改めまして、この度は貴重な情報をありがとうございました。
目から鱗でした。
今後ともどうぞよろしくお願いします。
>EK3さん

どうやら問題解決のヒントにはなったようで幸いです。
結果報告、お待ちしてます。

私の方こそ、今後ともよろしくお願い致します。
> 主に zetta1985 さん:

最初の質問をしてから 2ヶ月ちょい?
だいぶ寄り道をして、ついに今日、この部分に戻って参りました。(^^;

結論から言うと、zetta1985 さんのおっしゃる通り、独自 validator でキレイにできました。
さらす程のコードではないのですが、一応の結論と言う事で:

MyForm.java(getter/setter その他いろいろ省略しています):
class MyForm extends ValidatorForm {
 private Param[] params;

 static class Param {
  private boolean isRequired;
  private String header;
  private String note;
 }
}


validation.xml:
<form name="MyForm">
 <field property="params" depends="my-validator"/>
</form>


validator:
class MyValidator implements Serializable {
 static boolean validate(Object bean, ValidatorAction action, Field field,
   ActionMessages messages, Validator validator, HttpServletRequest request) {

  boolean hasError = false;

  Object obj = PropertyUtils.getProperty(bean, field.getProperty());
  for (Param param : (Param[])obj) {
   if (param.getIsRequired() && GenericValidator.isBlankOrNull(param.getNote())) {
    ActionMessage message = new ActionMessage("errors.required", param.getHeader());
    messages.add(field.getKey(), message);
    hasError = true;
   }
  }

  return !hasError;
 }
}


いやはや、簡単なものですね。
validator を書く、というのでちょっと身構えていたのですが。

これで(上のコードでは省略されていますが)他の必須項目と全く同列に、メタデータに対する入力も検証できるようになりました。

zetta1985 さんありがとうございました。
おかげさまで、満足のいく結果が得られました。
またよろしくお願いします。m(_ _)m

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

Struts!!!!! 更新情報

Struts!!!!!のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング