点击修改的表单提交,控制器从方法中抛出的异常捕捉到异常信息进行显示:
注意:
1)jsp中的<form:errors必须是存在于ModelAttribute标记的类中的字段
2)控制器捕获异常是通过.getCode方法,然后再以switch...case的方式进行捕捉
3)在jsp页面中以<form:error形式接收
控制器:
@RequestMapping("dochangepassword")
public String doChangePassword(HttpSession session, @ModelAttribute("form") ChangePasswordForm form, BindingResult bindingResult) {
Long fiId = (Long) session.getAttribute(SessionName.FI_ID);
Long operatorId = (Long) session.getAttribute(SessionName.USER_ID);
try{
fiOperatorService.updatePassword(fiId, operatorId, form.getOldPassword(), form.getNewPassword(), operatorId);
}catch (BusinessException e) {
switch (e.getCode()) {
case ModelException.FI_OPERATOR_PASSWORD_NOT_MATCH:
bindingResult.addError(new FieldError("form", "oldPassword", "操作员口令错误!"));
return "fi/info/changepassword";
default:
throw e;
}
}
return "fi/info/changepasswordsuccess";
}
实现方法:
@Override
@Transactional
public void updatePassword(Long fiId, Long operatorId, String oldPassword, String newPassword, Long executor) {
FiOperator operator = fiOperatorDao.getByFiAndId(fiId, operatorId);
if (operator == null) {
throw new BusinessException(ModelException.FI_OPERATOR_NOT_EXIST, "操作员不存在:operatorId=" + String.valueOf(operatorId));
}
//
StandardPasswordEncoder encoder = new StandardPasswordEncoder(SystemConstant.LOGIN_PASSWORD_ENCODER_SECRET);
//判断旧口令是否正确
if (!encoder.matches(oldPassword, operator.getLoginPassword())) {
throw new BusinessException(ModelException.FI_OPERATOR_PASSWORD_NOT_MATCH, "操作员口令错误:operatorId=" + String.valueOf(operatorId));
}
//更新口令
operator.setLoginPassword(encoder.encode(newPassword));
operator.setUpdatedBy(executor);
operator.setUpdatedDateTime(DateTime.now());
fiOperatorDao.updatePassword(operator);
}
jsp页面:
<form:form name="form" id="form" action="dochangepassword.htm" modelAttribute="form" method="post">
原口令 </span> <input type="password" id="oldPassword" name="oldPassword"">
<form:errors path="oldPassword" cssClass="error"></form:errors>