日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JSR 303 – Bean Validation 介绍及最佳实践

發布時間:2025/3/21 javascript 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSR 303 – Bean Validation 介绍及最佳实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

關于 Bean Validation

在任何時候,當你要處理一個應用程序的業務邏輯,數據校驗是你必須要考慮和面對的事情。應用程序必須通過某種手段來確保輸入進來的數據從語義上來講是正確的。在通常的情況下,應用程序是分層的,不同的層由不同的開發人員來完成。很多時候同樣的數據驗證邏輯會出現在不同的層,這樣就會導致代碼冗余和一些管理的問題,比如說語義的一致性等。為了避免這樣的情況發生,最好是將驗證邏輯與相應的域模型進行綁定。

Bean Validation 為 JavaBean 驗證定義了相應的元數據模型和 API。缺省的元數據是 Java Annotations,通過使用 XML 可以對原有的元數據信息進行覆蓋和擴展。在應用程序中,通過使用 Bean Validation 或是你自己定義的 constraint,例如?@NotNull,?@Max,?@ZipCode?, 就可以確保數據模型(JavaBean)的正確性。constraint 可以附加到字段,getter 方法,類或者接口上面。對于一些特定的需求,用戶可以很容易的開發定制化的 constraint。Bean Validation 是一個運行時的數據驗證框架,在驗證之后驗證的錯誤信息會被馬上返回。

下載 JSR 303 – Bean Validation 規范?http://jcp.org/en/jsr/detail?id=303

Hibernate Validator 是 Bean Validation 的參考實現 . Hibernate Validator 提供了 JSR 303 規范中所有內置 constraint 的實現,除此之外還有一些附加的 constraint。如果想了解更多有關 Hibernate Validator 的信息,請查看?http://www.hibernate.org/subprojects/validator.html

Bean Validation 中的 constraint

表 1. Bean Validation 中內置的 constraint

Constraint詳細信息
@Null被注釋的元素必須為?null
@NotNull被注釋的元素必須不為?null
@AssertTrue被注釋的元素必須為?true
@AssertFalse被注釋的元素必須為?false
@Min(value)被注釋的元素必須是一個數字,其值必須大于等于指定的最小值
@Max(value)被注釋的元素必須是一個數字,其值必須小于等于指定的最大值
@DecimalMin(value)被注釋的元素必須是一個數字,其值必須大于等于指定的最小值
@DecimalMax(value)被注釋的元素必須是一個數字,其值必須小于等于指定的最大值
@Size(max, min)被注釋的元素的大小必須在指定的范圍內
@Digits (integer, fraction)被注釋的元素必須是一個數字,其值必須在可接受的范圍內
@Past被注釋的元素必須是一個過去的日期
@Future被注釋的元素必須是一個將來的日期
@Pattern(value)被注釋的元素必須符合指定的正則表達式

表 2. Hibernate Validator 附加的 constraint

Constraint詳細信息
@Email被注釋的元素必須是電子郵箱地址
@Length被注釋的字符串的大小必須在指定的范圍內
@NotEmpty被注釋的字符串的必須非空
@Range被注釋的元素必須在合適的范圍內

一個 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

public class Order {// 必須不為 null, 大小是 10@NotNull@Size(min = 10, max = 10)private String orderId;// 必須不為空@NotEmptyprivate String customer;// 必須是一個電子信箱地址@Emailprivate String email;// 必須不為空@NotEmptyprivate String address;// 必須不為 null, 必須是下面四個字符串'created', 'paid', 'shipped', 'closed'其中之一// @Status 是一個定制化的 contraint@NotNull@Statusprivate String status;// 必須不為 null@NotNullprivate Date createDate;// 嵌套驗證@Validprivate Product product;...getter 和 setter}

顯示更多

清單 2. Product.java

public class Product {// 必須非空@NotEmptyprivate String productName;// 必須在 8000 至 10000 的范圍內// @Price 是一個定制化的 constraint@Priceprivate float price; ...Getter 和 setter}

顯示更多

清單 3. OrderQuery.java

// 'to'所表示的日期必須在'from'所表示的日期之后// @QueryConstraint 是一個定制化的 constraint@QueryConstraintpublic class OrderQuery {private Date from;private Date to; ... omitted...Getter and setter}

顯示更多

定制化的 constraint

@Price?是一個定制化的 constraint,由兩個內置的 constraint 組合而成。

清單 4. @Price 的 annotation 部分

// @Max 和 @Min 都是內置的 constraint@Max(10000)@Min(8000)@Constraint(validatedBy = {})@Documented@Target( { ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD })@Retention(RetentionPolicy.RUNTIME)public @interface Price {String message() default "錯誤的價格";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}

顯示更多

@Status?是一個新開發的 constraint.

清單 5. @Status 的 annotation 部分

@Constraint(validatedBy = {StatusValidator.class})@Documented@Target( { ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD })@Retention(RetentionPolicy.RUNTIME)public @interface Status {String message() default "不正確的狀態 , 應該是 'created', 'paid', shipped', closed'其中之一";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}

顯示更多

清單 6. @Status 的 constraint validator 部分

public class StatusValidator implements ConstraintValidator<Status, String>{private final String[] ALL_STATUS = {"created", "paid", "shipped", "closed"};public void initialize(Status status) {}public boolean isValid(String value, ConstraintValidatorContext context) {if(Arrays.asList(ALL_STATUS).contains(value))return true;return false;}}

顯示更多

Bean Validation API 使用示例

創建訂單

用戶在創建一條訂單記錄時,需要填寫以下信息:訂單編號,客戶,電子信箱,地址,狀態,產品名稱,產品價格

圖 3. 創建訂單

?

對這些信息的校驗,使用 Bean Validation API

清單 7. 代碼片段

protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {HttpSession session = req.getSession();// 從 request 中獲取輸入信息String orderId = (String) req.getParameter("orderId");String customer = (String) req.getParameter("customer");String email = (String) req.getParameter("email");String address = (String) req.getParameter("address");String status = (String) req.getParameter("status");String productName = (String) req.getParameter("productName");String productPrice = (String) req.getParameter("productPrice");// 將 Bean 放入 session 中Order order = new Order();order.setOrderId(orderId);order.setCustomer(customer);order.setEmail(email);order.setAddress(address);order.setStatus(status);order.setCreateDate(new Date());Product product = new Product();product.setName(productName);if(productPrice != null && productPrice.length() > 0)product.setPrice(Float.valueOf(productPrice));order.setProduct(product);session.setAttribute("order", order);ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();Set<ConstraintViolation<Order>> violations = validator.validate(order);if(violations.size() == 0) {session.setAttribute("order", null);session.setAttribute("errorMsg", null);resp.sendRedirect("creatSuccessful.jsp");} else {StringBuffer buf = new StringBuffer();ResourceBundle bundle = ResourceBundle.getBundle("messages");for(ConstraintViolation<Order> violation: violations) {buf.append("-" + bundle.getString(violation.getPropertyPath().toString()));buf.append(violation.getMessage() + "<BR>\n");}session.setAttribute("errorMsg", buf.toString());resp.sendRedirect("createOrder.jsp");}}

顯示更多

如果用戶不填寫任何信息提交訂單,相應的錯誤信息將會顯示在頁面上

圖 4. 驗證后返回錯誤信息

其實在整個程序的任何地方都可以調用 JSR 303 API 去對數據進行校驗,然后將校驗后的結果返回。

清單 8. 調用 JSR 303 API 進行校驗

Order order = new Order(); ...ValidatorFactory factory = Validation.buildDefaultValidatorFactory();Validator validator = factory.getValidator();Set<ConstraintViolation<Order>> violations = validator.validate(order);

顯示更多

結束語

JSR 303 的發布使得在數據自動綁定和驗證變得簡單,使開發人員在定義數據模型時不必考慮實現框架的限制。當然 Bean Validation 還只是提供了一些最基本的 constraint,在實際的開發過程中,用戶可以根據自己的需要組合或開發出更加復雜的 constraint

總結

以上是生活随笔為你收集整理的JSR 303 – Bean Validation 介绍及最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久怡红院 | 欧美 日韩 高清 | 综合色在线观看 | 国产男人天堂 | 伊人青青操 | 91视频你懂的 | 婷婷综合久久 | 午夜啪啪网 | 成年免费在线观看 | 国产免费一区视频观看免费 | 久久视频一区二区三区 | 男女无套免费视频网站动漫 | 亚洲国产精品一区二区久久hs | 欧美日韩第一区 | 国产精视频 | 日韩视频一 | 天堂av影院| 蜜臀国产AV天堂久久无码蜜臀 | 狠狠干亚洲色图 | 日韩1区2区3区 | 欧美成人a∨高清免费观看 国产精品999视频 | 亚洲精品乱码久久久久久久 | 全肉的吸乳文 | 超碰成人在线免费观看 | 不卡一区在线 | 亚洲24p | 欧美福利视频在线观看 | 黄色av大片| 国产性生活毛片 | 一区二区欧美在线 | 国产三级视频 | 一本色道久久综合亚洲精品图片 | 激情网络 | 国产无遮挡又黄又爽免费网站 | 亚洲天堂系列 | 免费的毛片网站 | 99在线观看视频 | 国产成人久久精品麻豆二区 | 欧美激情视频在线播放 | 撕开少妇裙子猛然进入 | 欧美男同又粗又长又大 | 国产三级理论片 | 久久嫩草视频 | 在线免费观看黄色 | 人妖一级片 | 中文字幕免费在线观看 | 男女操操视频 | 怒海潜沙秦岭神树 | 日韩少妇内射免费播放18禁裸乳 | 91在线日韩 | 免费观看日韩毛片 | 超碰公开免费 | 日韩成人av电影 | 国产五区 | 国产欧美久久一区二区三区 | 亚洲爱爱网 | 91国产在线免费观看 | 老头把女人躁得呻吟 | 黄色一级片免费播放 | 日韩欧美高清在线视频 | 日韩一及片 | 在线观看日韩av | 男人操女人免费视频 | 操大逼网站 | 国产精品久久..4399 | 亚洲综合在线播放 | 天堂网视频 | 久久成人av | 欧美国产不卡 | 视色网 | 777视频在线观看 | 国产v综合v亚洲欧美久久 | 动漫美女被x | julia一区二区三区中文字幕 | 资源av| 国内偷拍一区二区 | 在线观看日韩视频 | 深夜精品| 网站黄在线观看 | 特级毛片在线观看 | 亚洲精品456 | 免费网站黄色 | 男女激情av| 成人短视频在线观看 | 97人妻精品一区二区三区软件 | 日日摸天天爽天天爽视频 | 国产精品77 | 18+视频在线观看 | 国产女合集 | 理论片在线观看视频 | 最近免费中文字幕大全免费版视频 | 日韩欧美在线播放 | 天天做天天射 | 欧美在线一级 | 国产精品国产三级国产 | 91高跟黑色丝袜呻吟在线观看 | 日日爱99| 成人污在线| 无码人妻精品一区二区三区温州 |