表 1. Bean Validation 中内置的 constraint
表 2. Hibernate Validator 附加的 constraint
一个 constraint 通常由 annotation 和相应的 constraint validator 组成,它们是一对多的关系。也就是说可以有多个 constraint validator 对应一个 annotation。在运行时,Bean Validation 框架本身会根据被注释元素的类型来选择合适的 constraint validator 对数据进行验证。
有些时候,在用户的应用中需要一些更复杂的 constraint。Bean Validation 提供扩展 constraint 的机制。可以通过两种方法去实现,一种是组合现有的 constraint 来生成一个更复杂的 constraint,另外一种是开发一个全新的 constraint。
创建一个包含验证逻辑的简单应用(基于 JSP)
在本文中,通过创建一个虚构的订单管理系统(基于 JSP 的 web 应用)来演示如何在 Java 开发过程中应用 Bean Validation。该简化的系统可以让用户创建和检索订单。
系统设计和运用的技术
图 1. 系统架构

图 1 是报表管理系统的结构图,是典型的 MVC(Model-View-Controller)应用。Controller 负责接收和处理请求,Servlet 扮演 Controller 的角色去处理请求、业务逻辑并转向合适的 JSP 页面。在 Servlet 中对数据进行验证。JSP 扮演 View 的角色以图型化界面的方式呈现 Model 中的数据方便用户交互。Model 就是此系统进行操作的数据模型,我们对这部分加以简化不对数据进行持久化。
数据模型
图 2. 数据模型

图 2 展示的是订单管理系统的数据模型。
声明了 contraint 的 JavaBean
清单 1. Order.java
清单 2. Product.java
清单 3. OrderQuery.java
定制化的 constraint
@Price
是一个定制化的 constraint,由两个内置的 constraint 组合而成。
清单 4. @Price 的 annotation 部分
@Status
是一个新开发的 constraint.
清单 5. @Status 的 annotation 部分
清单 6. @Status 的 constraint validator 部分
Bean Validation API 使用示例
创建订单
用户在创建一条订单记录时,需要填写以下信息:订单编号,客户,电子信箱,地址,状态,产品名称,产品价格
图 3. 创建订单

对这些信息的校验,使用 Bean Validation API
清单 7. 代码片段
如果用户不填写任何信息提交订单,相应的错误信息将会显示在页面上
图 4. 验证后返回错误信息

其实在整个程序的任何地方都可以调用 JSR 303 API 去对数据进行校验,然后将校验后的结果返回。
清单 8. 调用 JSR 303 API 进行校验
…
结束语
JSR 303 的发布使得在数据自动绑定和验证变得简单,使开发人员在定义数据模型时不必考虑实现框架的限制。当然 Bean Validation 还只是提供了一些最基本的 constraint,在实际的开发过程中,用户可以根据自己的需要组合或开发出更加复杂的 constraint
此文章由 http://www.ositren.com 收集整理 ,地址为: http://www.ositren.com/htmls/70808.html