2

アプリケーションはStruts1.2で作成されています。ログインフォームがありますが、ログインに関連するすべての検証が正しく表示されています。検証には、Validatorフレームワークを使用しています。

検証は成功したがユーザー認証が失敗した場合、ログイン失敗メッセージを正しく表示できません。

私はActionError次のようにアクションでメッセージを設定しています:

Login loginDetails = validateUser(loginForm);
if(loginDetails == null){
    errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.invalidCredentials"));
    return mapping.findForward("failure");
}

以下は、ApplicationResources.propertiesファイルに作成されたエントリです。

error.invalidCredentials=User Name and Password does not match.

loginDetailsがnullの場合、エラーは適切に追加されています(コードをデバッグしてこれを確認しました)。ただし、メッセージはUIに表示されません。

これは私がUIに追加したものです:

<td align="right">
    <div style="color:red">
        <html:errors />
    </div>
</td>

以下は、struts-configファイルで作成されたエントリです。

<action input="/mediaLogin.jsp" path="/welcome" type="com.media.action.LoginAction"
    name="loginForm" scope="session" validate="true">
    <forward name="success" path="/rentLibrary.jsp"></forward>
    <forward name="failure" path="/mediaLogin.jsp" redirect="false"></forward>
</action>

認証に失敗した場合は、ログイン画面と同じページとしてパスを指定し、にを作成しredirectましたfalse

私が欠けているものを教えてください:)

編集

完全なコード:

LoginForm loginForm = (LoginForm)form;
HttpSession session = request.getSession();
ActionErrors errors=new ActionErrors();     
if(loginForm.getAction().equalsIgnoreCase("Login")){
    // Provide the NUll Check
    Login loginDetails = validateUser(loginForm);
    if(loginDetails == null){
        errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.invalidCredentials"));
        return mapping.findForward("failure");
    }
    populateLoginDetails(loginDetails, loginForm);
}
System.out.println("**************************************" + mapping.getAttribute() + "**************************************");
session.setAttribute("userDetails", loginForm);
return mapping.findForward("success");      

Struts-Config.xml

<form-beans>    
    <form-bean name="loginForm" type="com.media.form.LoginForm" ></form-bean>   
</form-beans>
<action-mappings>
    <action input="/mediaLogin.jsp" path="/welcome" type="com.media.action.LoginAction"
        name="loginForm" scope="session" validate="true">
        <forward name="success" path="/rentLibrary.jsp"></forward>
        <forward name="failure" path="/mediaLogin.jsp" redirect="false"></forward>
    </action>               
</action-mappings>

<message-resources parameter="resources.ApplicationResources" />

<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
    <set-property property="pathnames"
        value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />
</plug-in>
4

2 に答える 2

3

まず、@ RomanCによって提案されているようにコードを記述しなくても、空白のvalidate()メソッドを追加します。

次に、追加してみてください

saveErrors(request, errors);

errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.invalidCredentials"));

これが機能しない場合は、返信してください。最初にそれを機能させてから、@RomanCが提案する標準的な方法を使用する方がよいでしょう。

于 2013-01-24T16:39:29.770 に答える
2

バリデーターフォームからエラーメッセージを取得していないため、エラーメッセージが表示されません。Strutsは、フォームを拡張してメソッドValidatorFormをオーバーライドする必要があることを使用します。validateこのvalidateメソッドでは、フォームフィールドを手動で確認するか、Apachecommonsバリデーターを使用して確認できます。GenericValidator.isBlankOrNullたとえば、フィールドのチェックが必要です。を入力してActionErrorsを呼び出し、super.validateマージできるフレームワークから追加のエラーを取得します。電話をかけるとsuper.validateERROR_KEYはすでにリクエストに入れられています。さらに、strutsバリデーターフレームワークを使用したエラー処理の問題後、 検証中に例外を処理EXCEPTION_KEYしてerror属性。アクションでの検証のスキップや、RequestProcessor検証メソッドキーの追加をオーバーライドすることで可能な検証ディスパッチメソッド(検証メソッドキーは、によって使用されるメソッドをマップするために使用されるキー)のような他のものgetKeyMethodMap()、およびを処理しprocessValidationます。

ActionErrors actionErrors = super.validate(mapping, request);    
actionErrors.add(ActionErrors.GLOBAL_MESSAGE, new ActionMessage("error.invalidCredentials"));

編集:

検証フレームワークを無視し、アクションで手動で検証する場合

ActionErrors errors = new ActionErrors();
errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionMessage("error.invalidCredentials"));
request.setAttribute(Globals.ERROR_KEY, errors);
return mapping.findForward("failure");

その後、を介してJSPで表示できるようになります<html:messages

<logic:messagesPresent>
  <html:messages id="error">
    <span><bean:write name="error"/></span><br/>
  </html:messages>
</logic:messagesPresent>
于 2013-01-23T15:06:21.997 に答える