- PR -

struts1.1b3のvalidateについて。

投稿者投稿内容
KingSize
常連さん
会議室デビュー日: 2002/11/13
投稿数: 38
投稿日時: 2003-02-17 20:58
いつもお世話になっています。

前にも似たようなことを質問していて大変申し訳ないのですが、どうしてもうまくいかないので、どなたかご教授をお願いします。

表題にもあるとおり、struts1.1b3のValidatorFormを使用した入力チェックについて質問させてください。

環境は
j2sdk1.4.1_01
tomcat4.1.18
struts1.1b3
です。
struts-config.xmlにおいて、
<form-bean name="loginform" type="XX.LOGINForm"/>
〜中略〜
<action path="/loginaction"
type="XX.LOGINAction"
name="loginform"
scope="request"
validate="true"
input="/LOGIN.jsp">
<exception type="XX.StiCriticalException"
key="error.critical"
handler="XX.UserExceptionHandler"
path="/ERROR.jsp"/>
<forward name="success"
path="/WEB-INF/JSP/MENU.jsp"/>
<forward name="false"
path="/LOGIN.jsp"/>
</action>
〜中略〜
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property property="pathname"
value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/>
</plug-in>

と記述し
validation.xmlにて

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE form-validation PUBLIC "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN" "http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
<form-validation>
<global>
</global>
<formset>
<form name="loginform">
<field property="userId" depends="required">
<arg0 resource="false" key="error.user_id" />
   </field>
<field property="password" depends="required">
<arg0 resource="false" key="error.password" />
   </field>
</form>
</formset>
</form-validation>

と記述して
LOGINFormではそれぞれの
フィールドとgetter/setterメソッドを記述しています。
クラスのはじめには
public class LOGINForm extends ValidatorForm implements Serializable{
としています。
LOGIN.jsp内で

<html:text property="userId" size="15" maxlength="16"/>
<html:password property="password" size="15" maxlength="12"/>

と配置してあるフォーム情報の入力チェックをしようとしています。
jarファイルにはstruts1.1b3の中にあるstruts-validatorサンプルのものを使用しています。
validator-rules.xmlについても入っていたものをコピーして使っています。

現象としましては空欄で送信しても入力チェックが行なわれずにそのまま先に進んでしまいます。
(値が入ってないのでforward name="false"のLOGIN.jspに戻るわけですが)

struts-config.xmlの<plug-in classNameの箇所を変えるとエラーになるのでそこは認識していると思うのですが、その先のValidation.xmlをうまく認識していないんでしょうか?
一日いろいろ調べてみたのですがどうしてもわからず、投稿することにしました。

どなたかご存知の方、ご教授よろしくお願いします。
うのきち
ベテラン
会議室デビュー日: 2003/02/17
投稿数: 55
投稿日時: 2003-02-17 21:54
jspファイルに、<html:errors/>が無いとかいうオチじゃないですよね。
特に大きな問題は、私には発見できなかったです。

ただ、<arg0 resource="false" key="error.user_id" />って変じゃないですか?
resource="false"ってことは、"error.user_id"って文字列自体を使うことになるので。
メッセージ自体が出ないそうなので、直接関係ないですけど。

あとは、html:formしてるところのactionのpathが、"/loginaction"以外のものになってるとかでしょうか。

とりあえず、validate()メソッドを、overrideして、中でprintln()してから、super.validate()呼ぶようにしてみて、呼ばれているかどうか調べるあたりから始めて見てはどうでしょう?
KingSize
常連さん
会議室デビュー日: 2002/11/13
投稿数: 38
投稿日時: 2003-02-17 23:04
お返事本当にありがとうございます。

早速試してみました。

public class LOGINForm extends ValidatorForm implements Serializable{
  public ActionErrors validate(ActionMapping mapping,
      HttpServletRequest request){ System.out.println("validate is called.");

return super.validate(mapping, request);
  }

としてみたところ、サブミット時にSystem.outの内容が吐き出されました。

ということは、validatiion.xmlの書き方がおかしくて、うまく検証できていないということなのでしょうか?

余談ですがこんなのも見つけました。
http://www.mail-archive.com/struts-user@jakarta.apache.org/msg58212.html
関係あるでしょうか?

夜も遅くなってきましたが、よろしければご教授お願いします。

[ メッセージ編集済み 編集者: クボタ 編集日時 2003-02-17 23:07 ]
うのきち
ベテラン
会議室デビュー日: 2003/02/17
投稿数: 55
投稿日時: 2003-02-17 23:53
>余談ですがこんなのも見つけました。
>http://www.mail-archive.com/struts-user@jakarta.apache.org/msg58212.html
>関係あるでしょうか?

う〜ん、この人の場合、真っ白の画面になると行っているので、validate()の中で無限ループになっているのだと思います。クボタさんの場合は戻ってくるので、この問題とは別ではないかと思います。

validate()は、通っているんですよね。super.validate()の戻りのActionErrorsには、エラーは入っていますか?
あと、わざと、ActionErrorsを作って返したら、エラーは表示されるでしょうか?
KingSize
常連さん
会議室デビュー日: 2002/11/13
投稿数: 38
投稿日時: 2003-02-18 02:22
すいません。

ぎりぎり終電で見れませんでした...

明日の朝一で試してみます!
KingSize
常連さん
会議室デビュー日: 2002/11/13
投稿数: 38
投稿日時: 2003-02-18 10:18
昨日はありがとうございました。

早速試してみました。

errors.isEmpty()ではtrueが入っていました。エラー入ってないみたいです。
また、
errors.add("userId", new ActionError("errors.required", "ユーザID"));
とエラーを追加して見ましたらさすがにエラーをキャッチしてinputのページに行ったのですが、
<html:errors/>と書いてもエラーメッセージが表示されません。

その他validation.xmlのdepends=に適当な値を入れてもエラーとかにならないのですが、そういうものなのでしょうか?

以上、よろしくお願いします。
KingSize
常連さん
会議室デビュー日: 2002/11/13
投稿数: 38
投稿日時: 2003-02-18 18:35
いつもお世話になっています。

進展としましてはvalidation.xmlのヘッダ部分を
<?xml version="1.0" encoding="ISO-8859-1" ?>
とすることで、このファイルを読み取って、Actionクラスに処理が移る前にinputで指定したページに遷移するところまでは行きました。
(以前はencodingがUTF-8になっていました。)

きちんと遷移するのはいいのですが、今度は<html:error/>の箇所にエラーメッセージが表示されません。
jsp内で
<%= request.getAttribute("org.apache.struts.action.ERROR") %>とすると
org.apache.struts.action.ActionErrors@16f2067
というようにエラーはあるはずなのですが表示してくれません。

それともstruts-validatorサンプルのように
<logic:messagesPresent>
<html:messages id="error">
<li><bean:write name="error"/></li>
</html:messages>
</ul><hr>
</logic:messagesPresent>

というようにしてやったほうが良いのでしょうか?
この方法でもうまくはいかないのですが...

どなたか同じような事象を解決した方がいらっしゃいましたらご教授いただけないでしょうか?
よろしくお願いします。
うのきち
ベテラン
会議室デビュー日: 2003/02/17
投稿数: 55
投稿日時: 2003-02-18 18:52
どうも、予想されているのと異なるvalidation.xmlが読み込まれているようですね。

depends="foo"などと、存在しないバリデータを書いたら、"Depends string "foo" was not found in validator-rules.xml."というエラーがスタックトレースと共にブラウザに表示されるはずです。(多分NullPointerException)

また、

public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request)
{
ActionErrors errors = new ActionErrors();
errors.add("userId", new ActionError("errors.required", "ユーザID"));
return errors;
}

などと意図的にエラーを返せば、エラーが表示されなければおかしいです。こちらは、JSPの先頭に、<%@ taglib uri="/tags/struts-html" prefix="html" %>を書き忘れているとかですかね...

スキルアップ/キャリアアップ(JOB@IT)