该应用程序是在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>
答案 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