2004-04-16 [長年日記]

[Struts] validator は valid じゃなくても動作する

ちょっとキャッチなタイトルだなぁ。内容を期待しすぎないように。

今日、ハンズオンセミナでStrutsを説明してたんすよ。Strutsで使える機能のひとつに、struts validatorってありますよね。簡単に説明しとくと、HTMLフォームから入力された文字列の必須チェックとか長さチェックとかを、ルールとフィールドとをXMLで関連づけてやると、よしなにチェックしてくれるしかけです。

で、このXMLの書き方がヘンタイなんですよ。最小文字数を指定するには

<field property="password" depends="required,minlength" >

<arg0 key="label.password" />

<arg1 name="minlength" key="6" resource="false" />

<var><var-name>minlength<var-name>

<var-value>6<var-value></var>

</field>

最大文字数を指定するには

<field property="password" depends="required,maxlength" >

<arg0 key="label.password" />

<arg1 name="maxlength" key="8" resource="false" />

<var><var-name>maxlength<var-name>

<var-value>8<var-value></var>

</field>

ってな感じです。depends のところにはルールを複数指定できます。

で、両方一度に指定するにはどうするんだろう? と悩んだわけです。jakarta-struts-1.1.zip内のstruts.jarに含まれている validation_1_1.dtd によれば、

<!ELEMENT field   (msg?, arg0?, arg1?, arg2?, arg3?, var* )>

って書いてあるんで、arg1を複数書くことはできません。

しかしね、テキストエディタで無理やり書いちゃったら、動きやがりました。

<field property="password" depends="required,minlength,maxlength" >

<arg0 key="label.password" />

<arg1 name="maxlength" key="8" resource="false" />

<arg1 name="minlength" key="6" resource="false" />

<var><var-name>maxlength<var-name>

<var-value>8<var-value></var>

<var><var-name>minlength<var-name>

<var-value>6<var-value></var>

</field>

つまり、validation.xml は vaildでなくても動く、ってなわけで。

協力会社さんが調べてくれました

commons validator の中で、明示的に validationしないように設定されてる、と突き止めてくれました。あっという間に。さすがー。

ついでに

validation_1_1.dtdは非推奨になってて、validator_1_0.dtd に置き換わってます。こっちだと

<!ELEMENT field   (msg|arg0|arg1|arg2|arg3|var)*>

なーんだ。結局、jakarta-struts-1.1.zip がおかしいっぽい。

[]