失敗
あるフォームクラスに、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 にします。
<?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 の入力チェックを定義します。
<?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 の検証結果を取得します。
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> タグを使用して、表示します。
<%@ 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>
