ちょっとキャッチなタイトルだなぁ。内容を期待しすぎないように。
今日、ハンズオンセミナで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 がおかしいっぽい。