バリデータのアイデア
以前、
http://d.hatena.ne.jp/cero-t/20070622/1182530354
で書いてたバリデータを実現するためのアイデア。
こんな感じで記述します。
<input type="text" id="year" m:label="年" m:value="#{xxxDto.year}" /> <input type="text" id="month" m:label="月" m:value="#{xxxDto.month}" /> <input type="text" id="day" m:label="日" m:value="#{xxxDto.day}" /> <span m:inject="s:validator2" m:binding="#{dateValidator}" m:targetId="year,month,day" m:eventId="doXxx" m:label="生年月日" />
機能はこんな感じ。
- s:validator2のコンポーネントは、UIInputを継承していて、getSubmittedValue、getValue、getLocalValueで常に非nullの値を返します(=常にバリデーションが走ります)
- m:bindingで、バリデーションの種類を選択します(s:validatorと同じ)
- m:targetIdで、バリデーション対象を選択します。単数でも複数でも可能です(S2AnywhereValidatorと同じ)
- m:eventIdで、このバリデーションを実施するボタンやコマンドリンクのidを指定します。未指定なら常にバリデーションします。
- m:labelで、エラーメッセージに使うラベルを指定します(inputと同じ)
- バリデーションエラー時には、エラーメッセージをレンダリングします(h:messageも取り込みます)
売りは、
- ボタンごとに、適用するバリデーションを切り替えられます。
- 「複数フィールドのいずれかが入力された場合のみOK」という、どうしても出来なかったバリデーションも実現できます。
- h:messageを別途書く必要はありません。
S2JSF標準でサポートするには、(特にJSF的には)何だかなー、
という実装になりそうなので、S2JSF Extensionみたいな名前で
別JARとして提供する方が良いかも知れません。
その場合、カスタムタグのprefixはsじゃなくて、seかsxでしょうか。
もしくは両方あわせて、
ダメダメ。