我正在使用Spring MVC创建一个简单的CRUD。我正在使用相同的表格进行插入和编辑。我已经创建了一个用于名称字段的验证,以检查该值是否已经存在。如何在编辑验证时避免这种情况,以及如何进行更新?
这是代码
ItemController.java
@RequestMapping(method = RequestMethod.POST)
public String processForm( @Validated ItemForm itemForm, BindingResult result,
Map model) {
if (result.hasErrors()) {
model.put("typeList", dao.getItemTypes());
return "itemmaster";
}
dao.insertItems(itemForm);
return "redirect:dashboard";
}
这是jsp页面
<form:form action="itemmaster.html" commandName="itemForm">
<table width="100%" border="0">
<tr>
<td width="7%">Name:</td>
<c:choose>
<c:when test="${not empty name}">
<td width="11%"><form:input path="nameUpdate" /></td><td width="82%"><form:errors cssStyle="color:red" path="nameUpdate"/></td>
</c:when>
<c:otherwise>
<td width="11%"><form:input path="name" /></td><td width="82%"><form:errors cssStyle="color:red" path="name"/></td>
</c:otherwise>
</c:choose>
</tr>
<td>Description:</td><td><form:textarea path="description" /></td><td width="13%"><form:errors path="description" cssStyle="color:red"/></td>
</tr>
<tr>
<td></td><td><input type="submit" value="Submit" /></td>
</tr>
</table>
</form:form>
提前致谢。
恕我直言,您不应在验证器中进行重复测试。您应该将形式验证(带有空字段和可接受格式的交易)与逻辑验证分开。第一部分仅取决于输入值,后者可能取决于外部上下文(例如数据库)。在自动验证中,只应完成第一部分。
我的建议是:
在插入方法中添加重复测试
public String processForm( @Validated ItemForm itemForm, BindingResult result,
Map model) {
if (hasDuplicatedName(itemForm) {
result.reject(DUPLICATE, "Name is already in use");
}
if (result.hasErrors()) {
model.put("typeList", dao.getItemTypes());
return "itemmaster";
}
...
您还可以通常使用事务划分:如果需要将数据库读取以进行测试,则不应在控制器中完成,而应在服务级别进行。我经常将绑定结果传递给服务层(作为Error
)在此级别上进行逻辑测试,但仍然能够稍后在视图中显示错误
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句