Jsp SpringMVC返回要在视图中显示的服务层错误代码
我目前正在开发一个登录更改密码部分,其中验证由为用户注册的身份验证策略驱动 我有以下控制器,它调用身份验证服务,该服务将检查密码是否与用户的身份验证策略设置的所有规则匹配:Jsp SpringMVC返回要在视图中显示的服务层错误代码,jsp,validation,spring-mvc,error-handling,Jsp,Validation,Spring Mvc,Error Handling,我目前正在开发一个登录更改密码部分,其中验证由为用户注册的身份验证策略驱动 我有以下控制器,它调用身份验证服务,该服务将检查密码是否与用户的身份验证策略设置的所有规则匹配: @RequestMapping(value = "/changepw", method = RequestMethod.POST) public String changePw(@RequestParam(value = "username") final String username, @Vali
@RequestMapping(value = "/changepw", method = RequestMethod.POST)
public String changePw(@RequestParam(value = "username") final String username,
@Valid @ModelAttribute("changePw") final ChangePasswordForm changePasswordForm, final BindingResult errors) {
this.log.debug("Entering password change");
try {
final LoginResult result = this.authService.changePassword(changePasswordForm.getUsername(),
changePasswordForm.getOldPassword(), changePasswordForm.getNewPassword1(), changePasswordForm.getNewPassword2());
this.log.debug("login result: {}", result);
if (result.getResultCode() == CODE.ERROR) {
this.log.error(result.getErrorMessage());
errors.reject(result.getErrorMessage());
return "redirect:/login/changepw/";
}
if (result.getResultCode() == CODE.SUCCESS) {
return "redirect:/login/login";
}
errors.reject("error.login.unknown.error");
return "redirect:/login/changepw/";
} catch (final Exception e) {
errors.reject("error.login.catch.error");
return "redirect:/login/changepw";
}
}
我的登录结果基本上只是一个豆子
public class LoginResult implements Serializable {
private static final long serialVersionUID = 6058401105878015102L;
public enum CODE {
SUCCESS,
ERROR,
CHANGE_PASSWORD
}
private CODE resultCode;
private String errorMessage;
//constructors getters setters.
changePassword方法基本上返回code.SUCCESS,null
或code.ERROR,ERROR.whatever.code
现在我想做的是让error.code显示在jsp中第一个输入上方的div中
这是我的jsp:
<form:form commandName="changePw" method="POST">
<form:errors cssClass="errorBlock" element="div"/>
<div class="form_block">
<form:label path="username"><spring:message code="prompt.label.username"/></form:label>
<form:input path="username"/>
</div>
<div class="form_block">
<form:label path="oldPassword"><spring:message code="prompt.label.oldpassword"/></form:label>
<form:password path="oldPassword"/>
<div class="capsLockImage control" id="capsLockImage1" title="<spring:message code="prompt.caps_lock"/>"></div>
</div>
<div class="form_block">
<form:label path="newPassword1"><spring:message code="prompt.label.newpassword1"/></form:label>
<form:password path="newPassword1"/>
<div class="capsLockImage control" id="capsLockImage2" title="<spring:message code="prompt.caps_lock"/>"></div>
</div>
<div class="form_block">
<form:label path="newPassword2"><spring:message code="prompt.label.newpassword2"/></form:label>
<form:password path="newPassword2"/>
<div class="capsLockImage control" id="capsLockImage3" title="<spring:message code="prompt.caps_lock"/>"></div>
</div>
<input type="submit" value="<spring:message code="prompt.label.changepw"/>"/>
到目前为止,该错误已在BindingResult中注册,但不会返回到视图。使其工作的最佳实践是什么?发生这种情况是因为您正在重定向到视图,并且存储在
BindingResult
中的错误因此丢失
如果出现错误,您最好直接返回到changepw
视图,例如:
if (result.getResultCode() == CODE.ERROR) {
this.log.error(result.getErrorMessage());
errors.reject(result.getErrorMessage());
return "changepw"; // Or whatever the jsp view is called
}
如果您不能做到这一点,那么您必须将错误存储在会话中,以便在重定向请求返回时可以使用这些错误
要做到这一点,您可以在Spring的更高版本中显式地使用
HttpSession
,或者使用RedirectAttributes
——正如这篇文章所解释的:非常有效。谢谢你的帮助。很抱歉,没有足够的声誉来支持此操作。(尽管出于某些原因,BindingResult将模型作为后缀添加到错误代码中。