少し複雑な定義済みバリデータを使う

日付書式の妥当性検証
日付書式の妥当性検証に使うdateバリデータはさほど難しいというものではないのですが、 書き方のテンプレートということでここに一緒にメモっておきます。

<form name="MyForm">
  <field property="startDate" depends="required,date">
    <arg0 key="startDate.displayName"/>
    <var><var-name>datePattern</var-name><var-value>yyyyMMdd</var-value></var>
  </field>
</form>

maskバリデータ
よく使われるバリデータとしては必須入力チェックをするrequired、 データ型チェックをするintegerなどがありますが、 もう少し複雑なバリデータとしてmaskが便利に使えます。 これは入力値が指定した正規表現に適合すればOK、そうでなければNGとするバリデータです。 以下の例に示すように、maskバリデータにはmaskという変数を必ず定義し、 その中に照合する正規表現を記述します。 「\」を二重に書いたりする必要はありません。

<form name="FormBeanKikanExample">
  <field property="startDate" depends="mask">
    <msg name="mask" key="error.mask.generic.date"/>
    <arg0 key="kikan.startDate.displayName"/>
    <var>
      <var-name>mask</var-name>
      <var-value>^[0-9][0-9][0-9][0-9][\-\/]?[0-9][0-9][\-\/]?[0-9][0-9]$</var-value>
    </var>
  </field>
...
</form>

今までの例には載せませんでしたが、msgタグを使うと、 エラーメッセージのキー値(メッセージ・リソースのキー)を指定できます。

validwhenバリデータ
もうひとつ、頻繁に必要になる検証方法が、 複数の入力項目の関連です。例えば、ある項目が入力されていたら別の入力項目も必須だったり、 といったものです。 validwhenバリデータは、ある入力項目と他の入力項目の関連を、 Java言語の条件式風の書式で指定することができます。 下の例は、startDateとendDateという2つの入力項目があるとして、 startDateに何か値が入力されていたら、endDateにも必ず値を入力しなければいけない、 という規則を書いたものです。 *this*は、ここで注目している入力項目、つまりendDateのことを指します。 すると条件式の意味は簡単に理解できると思います。

<form name="FormBeanKikanExample">
  <field property="endDate" depends="validwhen">
    <msg name="mask" key="error.mask.generic.period"/>
    <arg0 key="kikan.endDate.displayName"/>
    <var>
      <var-name>test</var-name>
      <var-value>((startDate == null) or (*this* != null))</var-value>
    </var>
  </field>
...
</form>

定数の定義
maskバリデータで、同じ正規表現をたくさんのフォームアクションBeanのたくさんの入力項目に適用したい場合、 定数を1か所で定義して集中管理すると保守性が上がります。 それにはconstantタグを下のように使います。 定義した定数はJSTLのように、 ${定数名}で参照できます。

<formset>
  <constant>
    <constant-name>dateformat</constant-name>
    <constant-value>^[0-9][0-9][0-9][0-9][\-\/]?[0-9][0-9][\-\/]?[0-9][0-9]$</constant-value>
  </constant>
....
  <form name="FormBeanKikanExample">
    <field property="startDate" depends="mask">
      <msg name="mask" key="error.mask.generic.date"/>
      <arg0 key="kikan.startDate.displayName"/>
      <var>
        <var-name>mask</var-name>
        <var-value>${dateformat}</var-value>
      </var>
    </field>
  </form>
</formset>

その他のリソース
最後に、上の例で出てきたメッセージリソースと、サンプル用の入力フォームです。

error.mask.generic.date=日付の書式が不適正です:{0}
error.mask.generid.period=期間指定が不適正です:{0}
kikan.startDate.displayName=開始日
kikan.endDate.displayName=終了日

<%@ page contentType="text/html;charset=Windows-31J" language="java" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>

<html:html locale="true">
<head><title>validatorのテスト(期間)</title><html:base/></head>
<body bgcolor="white">
<html:errors/>
<html:form action="/ActionKikanExample" focus="startDate">
データ抽出期間:
  <html:text property="startDate" size="16" maxlength="10"/>〜
  <html:text property="endDate" size="16" maxlength="10"/><br>
  <html:submit value="検索"/>
</table>
</html:form>
<html:img page="/struts-power.gif" alt="Powered by Struts"/>
</body>
</html:html>

Server Side Java Index Top

(first uploaded 2004/03/21 last updated 2005/04/28, URANO398)

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル