文字化けに振り回され,まる一日…

先日ブックマークしておいたStruts APIドキュメントのバージョンが1.0系だったことに今日気づいた.
ここ数日使ってて気づかなかったとは….今日,DynaValidatorFormの記載が見つからなくて発狂しそうになって気づいた….
ほんと,今日はボケまくりの日.

native2ascii

メッセージプロパティファイルを作成するときにお馴染みのnative2asciiコマンド.
2bytes文字をUnicodeエスケープしてくれる.
(大雑把な説明は→ http://java.sun.com/j2se/1.4/ja/docs/ja/tooldocs/win32/native2ascii.html

さて,元のファイルがShift_JISとかEUCなら問題ないのだけど,うっかりUTF-8エンコーディングされてるファイルを,このコマンドで変換すると,変換後のプロパティファイルを使っても文字化けが発生してしまうので注意ってハナシ.

例えばこんな感じに化ける.

繧貞?・蜉帙@縺ヲ縺上□縺輔>

(↑「〜を入力してください」)


ちなみにこれに気づくのにほぼ一日かかりました(泣


メッセージプロパティファイルの変換元ファイルはShift_JISで作っておきましょう,という教訓でした.

validation.xmlの range

Struts の Validatorプラグインを使って,フォーム入力値の上限値・下限値のチェックをしようというオハナシ.
デフォルトで提供されているルールを使うわけだけど,以前はルール名がrangeだったのが,
手元の,Struts 1.2.9に付属していたvalidator-rules.xmlでは
intRange・floatRange・doubleRangeと,数値の型に応じて3つに分かれている.(よーするに進化してる)

例として,BMI計算アプリとかの身長・体重を入力するフォームを仮定し,身長の入力を100cmから200cmに制限するとする場合,プロパティファイルでは,

errors.range = {0}は{1}から{2}までの値を入力してください.

とかやりたくなる.
そうすると,フォームの属性名表記(この場合は「身長」)だけでなく,下限値と上限値も必要になってくるのだけど,validation設定ではちゃんとこれらを渡す仕組みが提供されている.


<field property="height" depends="required,integer,intRange">
<arg0 key="bmiInputForm.height"/>
<arg1 name="intRange" key="${var:min}" resource="false"/>
<arg2 name="intRange" key="${var:max}" resource="false"/>
<var>
<var-name>min</var-name>
<var-value>100</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>200</var-value>
</var>
</field>

arg0でフォームの属性名の表記(プロパティファイルで定義)を指定し,arg1,arg2で下限値・上限値を指定する.
ここでは,varで指定した値を取得するので,keyとして${var:min}などと指定する.(EL(式言語)っぽい表記だけどびみょーに違うところがまたイヤラシイ.)
さらに,resource="false"として,メッセージリソースからkeyに該当するメッセージを探すのではなく,keyの値そのものを出力するように指示する.
このresouce属性の設定を忘れると(デフォルトはtrueなので),指定したkeyの値(この場合だと${var:min})を持つメッセージリソースを探しに行って,見つからなくて,nullが表示される.
(例:「身長はnullからnullまでの値を入力してください」と表示されてしまう)

どうせなら指定したリソースが見つからなかったときはエラーになってくれればまだ何が起こってるかがわかりやすいんだけど….(これで30分ハマった人の愚痴)