在本文中,我们将介绍Java EE MVC中的表单验证。
Java EE MVC与Java Bean验证API( JSR 303 )集成在一起,这使得添加验证约束变得非常容易。
使用JAX-RS方式进行验证
假设我们有一个小的html表单,可用于发送联系人消息。 为了表示表单数据,我们创建一个小的ContactMessage bean,其中包含表单字段和验证约束:
public class ContactMessage {
@FormParam("message")
@NotBlank
@Size(max = 1000)
private String message;
// getters / setters
}
在我们的MVC控制器中,我们使用@BeanParam批注将表单数据转换为ContactMessage对象:
@Controller
@Path("/")
public class ContactController {
@POST
public String formSubmit(@Valid @BeanParam ContactMessage message) {
...
}
}
(有关@BeanParam批注的更多详细信息,请参阅博客文章“使用bean参数” )。
通过将@Valid批注添加到ContactMessage参数,可以启用验证。 如果提交表单并且ContactMessage对象的验证失败,则将引发ConstraintViolationException。 在这种情况下,不会调用controller方法。 相反,可以使用通用的JAX-RS ExceptionMapper处理异常,如另一篇文章中所示: Java EE MVC中的全局异常处理 。
这种方法通常适用于标准JAX-RS REST端点。 如果无效数据已传递到服务器,我们通常希望在这里返回通用的HTTP 400(错误请求)状态代码。
在MVC环境中,只要传递了无效数据,我们就可以使用此行为向用户呈现标准错误页面。 但是,这通常不够灵活。 通常,我们想返回一个更具体的页面,向用户显示错误消息。
使用@MvcBinding和BindingResult进行验证
Java EE MVC提供了@MvcBinding批注,该批注启用了替代的异常处理机制。 可以将@MvcBinding与JAX-RS绑定批注(例如@FormParam)一起放在字段和方法参数上:
public class ContactMessage {
@MvcBinding
@FormParam("message")
@NotBlank
@Size(max = 1000)
private String message;
// getters / setters
}
如果注释字段的绑定失败,这将告诉Java EE MVC调用控制器方法而不是通用异常处理程序。 要访问绑定信息,我们可以将BindingResult对象注入到我们的控制器类中:
@Controller
@Path("/")
public class ContactController {
@Inject
private Models models;
@Inject
private BindingResult bindingResult;
@POST
public String formSubmit(@Valid @BeanParam ContactMessage message) {
if (bindingResult.isFailed()) {
models.put("bindingResult", bindingResult);
return "/WEB-INF/jsp/contact.jsp";
}
return "/WEB-INF/jsp/success.jsp";
}
}
顾名思义,我们可以使用注入的BindingResult对象访问控制器方法中的绑定信息。 在此示例中,我们仅通过调用isFailed()来检查是否存在绑定问题。 通过将bindingResult添加到模型中,我们可以稍后在视图中访问它以向用户显示错误消息。
在提交按钮下方显示所有验证错误的简单JSP视图如下所示:
<form action="${mvc.contextPath}/contact" method="post">
<label>Message:</label>
<textarea name="message"></textarea>
<br/>
<input type="submit"/>
<c:if test="${bindingResult.isFailed()}">
<p>Form validation failed. Reasons:</p>
<ul>
<c:forEach items="${bindingResult.allValidationErrors}" var="validationError">
<li>
<c:out value="${validationError.paramName}: ${validationError.message}"/>
</li>
</c:forEach>
</ul>
</c:if>
</form>
结论
使用Java EE MVC进行表单验证非常容易。 可以使用JSR 303 Bean验证批注将验证约束添加到Bean。 @MvcBinding允许我们处理控制器方法内的验证错误,而不是使用通用的ExceptionMappers。 BindingResult使我们可以访问验证信息。
与往常一样,您可以在GitHub上找到示例代码。
翻译自: https://www.javacodegeeks.com/2018/05/java-ee-mvc-handling-validation.html