jsr 303 验证日期
在本文中,我将向您展示如何使用新的Bean验证框架(又名JSR-303)。
遗产
在获得JSR 303(又名Bean验证框架)的结果之前,有两次有趣的尝试尝试验证框架。 每一个都来自层的末端,并专注于其范围。
前端验证
Struts是2001-2002年在表示层上学习和使用的框架。 Struts使用MVC模型并专注于Controller,在带有Action
Struts中表示。 视图是普通的JSP,Struts使用ActionForm
以便将数据从Controller传递到View,反之亦然。 简而言之,这些是框架用于与View交互的POJO。
作为表示层框架,Struts关注的是验证用户输入。 动作表单有一个漂亮的方法,称为validate()
。 此方法的签名如下:
publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest)
开发人员必须检查表单是否有效,然后填写(如果不是) ActionErrors
对象(基本上是List
)。 然后,如果ActionErrors
对象不为空,Struts会将流重定向到错误页面(输入)。 由于手动检查很无聊且容易出错,因此使这种验证自动化可能是一个好主意。 即使在那时,声明式验证也被认为是关键。
这是Apache Commons Validator的目标。 其配置通过XML进行。 您指定:
- 您有权访问的验证器。 有一些内置的,但您可以添加自己的
- bean和验证器之间的关联:将通过哪些规则验证哪些bean
尽管Struts紧密集成了Commons Validator,但是您可以完全单独使用后者。 但是,最新的稳定版本(1.3.1)已于2006年末发布。当前开发的版本是1.4,但是Maven网站自2008年初以来就没有进行过更新。我的做法有些遗漏,因此我将其排除在外当我被迫使用Struts时,可以节省我的验证需求。
在这种情况下,我必须使用它,因为Struts插件知道如何使用两个XML配置文件来生成JavaScript客户端验证。
后端验证
以前,我们看到第一个验证框架来自用户输入。 另一方面,由于在数据库中强制执行了约束,因此插入/更新数据不需要进行此类验证。 例如,尝试将50个字符长的字符串插入VARCHAR(20)
列将失败。
但是,让数据库处理验证有两个主要缺点:
- 由于您需要连接到数据库,发送请求并处理错误,因此会降低性能
- 这种错误不能轻易地映射到Java异常,如果可能的话,也可以映射到错误的特定属性
最后,在将数据发送到数据库之前,最好在Java世界中验证域模型。 这就是Hibernate Validator的范围。 Commons Validator配置基于XML,而Hibernate Validator配置基于Java 5注释。
即使Hibernate Validator旨在验证域模型,您也可以使用它来验证任何bean。