ActionError消息未在UI中显示

时间:2013-01-23 13:15:51

标签: java jsp validation struts struts-1

该应用程序是在Struts 1.2上完成的。我有一个登录表单,所有与登录相关的验证都会正确显示。对于验证,我使用的是Validator框架。

验证成功但用户身份验证失败后,我无法正确显示登录失败消息。

我在Action中设置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中。

这是我在用户界面中添加的内容:

<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>

2 个答案:

答案 0 :(得分:3)

首先,即使您没有按照@RomanC的建议在其中编写代码,也要添加一个空白的validate()方法。

然后,尝试添加

saveErrors(request, errors);

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

如果这不起作用,请回复。让我们先让它工作,然后你最好使用@RomanC建议的标准方式。

答案 1 :(得分:2)

错误消息未显示,因为您没有从验证程序表单中获取它们。 Struts使用ValidatorForm表单应该扩展并覆盖validate方法。在validate方法中,您可以手动或使用Apache commons验证器检查表单字段。例如,GenericValidator.isBlankOrNull需要检查字段。填写ActionErrors并调用super.validate以从您可以合并的框架中获取其他错误。致电super.validate后,ERROR_KEY已经提出请求。此外,在帖子problem in error handling using struts validator framework中,我还介绍了如何在验证过程中处理异常,以便将EXCEPTION_KEY添加到error属性中。由于覆盖RequestProcessor添加验证方法密钥(验证方法密钥是用于映射getKeyMethodMap()使用的方法的密钥),因此可能在操作和验证分派方法中跳过验证等其他事项,并处理{ {1}}。

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