Java EE MVC:处理表单验证

在本文中,我们将介绍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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值