Validator と ActionForm.validate メソッドを同時に使う

失敗

あるフォームクラスに、Validator と ActionForm.validate メソッドによる検証を併用したところ、Validator の検証結果が反映されませんでした。

環境

このレポートは、以下の環境について記述したものです。

JDK JDK 5 Update 9
Struts Struts 1.3

原因

フォーム・クラスの validate メソッドにおいて、親クラスの validate メソッドを呼び出していなかったことが原因でした。

解決策

Validator の検証結果は、親クラスの validate メソッドを呼び出すことにより、取得することができます。

以下に簡単なサンプルを示します。このサンプルでは Validate や validate メソッドに関連する箇所以外は省略していますので、ご注意ください。

(1) struts-config.xml

Validator を有効するための設定を <plug-in> タグに記述します。
Validator および ActionForm.validate メソッドを使用するアクションでは、<action> タグの validate 要素を true にします。

[struts-config.xml - Validator と validate メソッドの使用を定義]
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE struts-config PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
    "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>

  <!-- ================ Form Bean Definitions ================ -->
  <form-beans>
    <form-bean name="sample_SampleForm"
      type="com.failuresoft.sample.SampleForm">
    </form-bean>
  </form-beans>

  <!-- =============== Action Mapping Definitions ============== -->
  <action-mappings>
    <action path="/sample"
        type="com.failuresoft.sample.SampleAction"
        name="sample_SampleForm"
        scope="request"
        validate="true"
        input="/sample.jsp">
      <forward name="sample_result" path="/result.jsp" />
    </action>
  </action-mappings>

  <!-- ============= Message Resources Definitions ============= -->
  <message-resources parameter="resources.application" />

  <!-- ================ Plug Ins Configuration =============== -->
  <plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames" 
      value="/org/apache/struts/validator/validator-rules.xml, 
          /WEB-INF/conf/validation.xml"/>
    <set-property property="stopOnFirstError" value="true" />
  </plug-in>

</struts-config>

(2) validation.xml

Validator の入力チェックを定義します。

[validation.xml - prop に必須チェックを行う]
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE form-validation PUBLIC
    "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"
    "http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd">

<form-validation>

  <!-- ================ Validator Definitions ================ -->
  <formset>
    <form name="sample_SampleForm">
      <field property="prop" depends="required">
        <arg position="0" key="err.req" />
      </field>
    </form>
  </formset>

</form-validation>

(3) フォーム・クラス

Validator を使用するため、ValidatorForm を継承します。 validate メソッドを併用するため、validator メソッドをオーバーライドする必要があります。 validator メソッドでは、親クラス (ValidatorForm) の validator メソッドを呼び出し、Validator の検証結果を取得します。

[Java - validate メソッド内で、Validator の検証結果を受け取る (validate メソッド以外は省略)]
package com.failuresoft.sample;

// Validator を使用するため、ValidatorForm を継承
public class SampleForm extends ValidatorForm {
  @Override
  public ActionErrors validate(ActionMapping mapping, HttpServletRequest req) {
    // Validator の検証結果を取得
    ActionErrors errors = super.validate(mapping, req);
    // validator メソッド独自の検証
    if (this.prop == "入力エラー") {
      errors.add("prop", new ActionMesage("err.val"));
    }
    // Validator と validate メソッドの検証結果を返す
    return errors;
  }
}

(4) JSP

エラーメッセージは <html:messages> タグ、または <html:errors> タグを使用して、表示します。

[JSP - エラーメッセージの表示]
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ page pageEncoding="UTF-8" %>
<%@ taglib prefix="html" uri="http://struts.apache.org/tags-html" %>
<%@ taglib prefix="bean" uri="http://struts.apache.org/tags-bean" %>

<html>
  <body>
    <!-- エラーメッセージの表示 -->
    <html:messages id="err" message="false">
      <ul>
        <li><bean:write name="err" /></li>
      </ul>
    </html:messages>
    <!-- 入力フォーム -->
    <html:form action="/sample" method="POST">
      <html:text property="prop" />
      <html:submit property="submit" value="OK" />
    </html:form>
  </body>
</html>

コメント

コメント投稿
(非公開)
     « アイコン一覧 »
(必須)

作成日:2006/12/27
更新日:2006/12/27