Java 操作错误消息未显示在UI中

Java 操作错误消息未显示在UI中,java,jsp,validation,struts,struts-1,Java,Jsp,Validation,Struts,Struts 1,该应用程序是在Struts 1.2上实现的。我有一个登录表单,所有与登录相关的验证都正确显示。对于验证,我使用验证程序框架 当验证成功但用户身份验证失败时,我无法正确显示登录失败消息 我正在操作中设置ActionError消息,如下所示: Login loginDetails = validateUser(loginForm); if(loginDetails == null){ errors.add(ActionErrors.GLOBAL_ERROR, new ActionError(

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

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

我正在操作中设置
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
为空时,错误被正确添加(我通过调试代码验证了这一点)。但是这些消息不会显示在UI中

这是我在UI中添加的内容:

<td align="right">
    <div style="color:red">
        <html:errors />
    </div>
</td>
Struts Config.xml

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");      
<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>

未显示错误消息,因为您未从验证程序表单中获取它们。Struts使用
ValidatorForm
,表单应该扩展并覆盖
validate
方法。在
validate
方法中,您可以手动或使用Apache commons validator检查表单字段
genericvalidater.isBlankOrNull
例如,需要检查字段。填写
ActionErrors
并调用
super.validate
以从框架中获取可合并的其他错误。调用
super.validate
后,请求中已经输入了
ERROR\u键。此外,在本文中,我还描述了如何在验证期间处理异常,以将
EXCEPTION\u键
放入
error
属性。由于重写
RequestProcessor
添加验证方法键(验证方法键是用于映射
getKeyMethodMap()
使用的方法的键),可能会跳过操作中的验证和验证分派方法,并处理
processValidation

ActionErrors ActionErrors=super.validate(映射、请求);
添加(actionErrors.GLOBAL_消息,新的ActionMessage(“error.invalidCredentials”);
编辑:

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");      
<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>
如果要忽略验证框架并在操作中手动验证

ActionErrors=newactionErrors();
添加(ActionErrors.GLOBAL_消息,新的ActionMessage(“error.invalidCredentials”);
request.setAttribute(Globals.ERROR_KEY,errors);
返回映射。findForward(“失败”);

之后,可以通过
在JSP中显示它。首先,添加一个空白的validate()方法,即使您没有按照@romac的建议在其中编写代码

然后,尝试添加

saveErrors(request, errors);
之后


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

您在命令行中有任何错误吗?如果是,则放入堆栈跟踪。否,我没有得到任何错误…任何指针?引用属性文件意味着什么?除了
ActionError
参数之外,我没有在任何地方引用propertiesfile之类的操作。也许这是错误的…你能不能发布除了我上面发布的内容之外,我还应该做些什么?顺便说一句,我已经添加了第一个完整的代码…如果你想要任何其他信息,请告诉我。发布整个struts配置文件,请点击并让我知道…除此之外,我只添加了表单bean感谢回复。但我没有在表单中添加任何验证方法。原因:我正在从数据库中获取用户名和密码的值,检查用户是否经过身份验证。所有这些抓取和身份验证检查都在我的操作中。因此,我没有在表单中添加任何验证方法。请让我知道如何使上述代码在该操作执行验证的场景中工作。在上面的代码中,
validateUser
方法包含用于命中数据库并获取值的代码。请rpely@user182944然后,您必须使用
ValidatorForm.validate的实现代码从使用commons validator的框架中手动进行验证。是否有相同的示例代码?我不知道你的建议:(再说一次,我是不是走了一条复杂的路?有没有简单的方法可以做到这一点?请让我知道这一点:(我想你是的,因为你忽略了验证框架,这意味着你应该重写表单验证方法。@user182944已编辑并完成。您好,这一个成功了。请告诉我我所做的有什么不正确,以及为什么我需要在表单中添加虚拟验证方法?还请告诉我实现验证的最佳方法是什么。)eve this(我也不知道是什么标准方式:()..这个线程已经运行了很长时间,我很想关闭它:)再次感谢您的帮助。Struts 1需要一个验证方法,该方法在设置validate=true时为dependency。另外,验证应该在validate()中方法而不是操作。这个问题在Struts 2中得到了解决,在Struts 2中,验证程序和操作代码完全分离。现在最好切换到Struts 2。感谢您的回复。在这种情况下,如何在validate方法中进行验证,而不是在action中进行验证???这就是我关心的地方。原因:我正在通过在操作中执行DB hit only来检查用户身份验证。只有在操作中失败时,我才希望在UI中显示它。在这种情况下,请让我知道,如何从操作调用表单的validate方法,或者如何将验证失败从操作传递到表单,并在UI或您的操作中显示它希望我在表单验证方法本身中执行DB hit:(您所说的是身份验证,而不是验证。validate()方法不应该执行身份验证,它应该执行以正确格式输入的所有数据的验证。身份验证可以在actionBingo中完成