Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsp SpringMVC返回要在视图中显示的服务层错误代码_Jsp_Validation_Spring Mvc_Error Handling - Fatal编程技术网

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将模型作为后缀添加到错误代码中。