抱歉我的愚蠢问题和糟糕的英语。 我尝试使用Spring MVC在我的新开发Web中对用户更改密码菜单进行一些验证。
我遵循How to perform Spring validation in MultiActionController?
的指示我写这段代码:
public ModelAndView hanldeBindException(HttpServletRequest request, HttpServletResponse response, ServletRequestBindingException bindingException) {
BindException bindException = (BindException) bindingException.getRootCause();
ModelMap modelmap = new ModelMap();
ChangePasswordForm cpForm = new ChangePasswordForm();
cpForm.setUsername(SessionHelper.getUsername());
modelmap.addAttribute("ChangePasswordForm", cpForm);
return new ModelAndView("changepassword").addAllObjects(bindException.getModel()).addObject("ChangePasswordForm", cpForm);
}
和我的jsp:
<form:form action="update.htm" commandName="ChangePasswordForm" >
<form:errors path="*" cssClass="errorblock" element="div" />
<table class="form">
<tr>
<td class="col1"><label>User Name :</label></td>
<td class="col2"><form:label path="username" >${ChangePasswordForm.username}</form:label></td>
</tr>
<tr>
<td><label>Old Password :</label></td>
<td><form:password path="oldPassword" id="oldPassword"></form:password>
<form:errors path="oldPassword" cssClass="error" /></td>
</tr>
<tr>
<td><label>New Password :</label></td>
<td><form:password path="newPassword"></form:password>
<form:errors path="newPassword" cssClass="error" /></td>
</tr>
<tr>
<td><label>Confirm New Password :</label></td>
<td><form:password path="confirmNewPassword"></form:password>
<form:errors path="confirmNewPassword" cssClass="error" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="submit" ></td>
</tr>
</table>
</form:form>
但是当我尝试像空字段这样的负面测试时,我的屏幕上没有出现任何错误。 当我尝试打印出来时
System.out.println("UserController::hanldeBindException::1" + bindException.getObjectName());
它显示对象名称是“command”而不是jsp中的命令名,即“ChangePasswordForm”。当我尝试将该commandName更改为“command”时,它可以工作。但我只是好奇是有一些方法在BindException类中setObjectName或你有另一种方法来使用自定义名称而不是默认的“命令”对象名称??
更新
我的验证工作,因为我将commandName更改为“command”,如下所示:
<form:form action="update.htm" commandName="command">
<!-- Form Field and Error define here -->
</form:form>
当然也在我的控制器中进行一些调整。如果我把它换成另一个名字它就不再工作了。
我使用Spring Framework 3.0.2 RELEASE。
答案 0 :(得分:0)
简单的答案是,你很可能以某种形式扩展BaseCommandController(AbstractCommandController或其他),在这种情况下你应该覆盖“getCommandName()”和“getCommand()”方法。但我无法从你提供的代码中看出来。
你正在使用什么版本的弹簧?从基类开始,“命令”的概念现在相对过时了3.0+。而是使用基于注释的控制器和模型属性:@Controller
@SessionAttributes({"changePasswordForm"})
public class MyController {
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setValidator(new ChangePasswordFormValidator());
}
@ModelAttribute("changePasswordForm")
public ChangePasswordForm createChangePasswordForm() {
...
}
@RequestMapping(...)
public ModelAndView controllerMethod(
@Valid @ModelAttribute changePasswordForm ChangePasswordForm) {
...
}
}
这应该在调用控制器方法之前自动验证您的表单,然后退回到调用页面。
在验证器中,您将在validate方法中提供错误消息代码:
public void validate(Object target, Errors errors) {
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", "username.required");
}
然后,您将确保“username.required”是您提供给spring的任何MessageSource中的密钥。
表单标记应该与您拥有的完全一样。
以下是控制器的弹簧参考手册: