• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    EJB 最佳實踐:數據驗證出現在什么地方最合適

    發布: 2007-6-08 17:10 | 作者: 網絡轉載 | 來源: 網絡 | 查看: 26次 | 進入軟件測試論壇討論

    領測軟件測試網
    EJB 最佳實踐:數據驗證出現在什么地方最合適
    何從您的驗證代碼獲得最佳性能

    級別:中級

    Brett McLaughlinbrett@oreilly.com
    作家兼編輯,O'Reilly and Associates
    2003 年 3 月

    盡管數據驗證是所有企業應用程序的必需組件,但人們對數據驗證過程的理解通常很膚淺,并且不能很好地執行。在這篇 EJB 最佳實踐專欄文章中,Brett McLaughlin 解釋了對基于 EJB 技術的系統進行數據驗證的一些幕后概念,并向您展示了如何避免意外的或不可理解的錯誤消息。

    每當您處理應用程序的業務邏輯時,都需要執行驗證。應用程序必須有辦法確保傳入的數據格式正確,并且必須能夠執行特定于業務的驗證(如針對庫存復核采購訂單)。

    我們將討論數據驗證邏輯應該出現在 EJB 應用程序代碼的什么位置,而不是專注于驗證過程(Java 技術專區的其它地方對此進行了很好的討論)。在本系列先前的技巧文章中,我們了解了很多組成基于 EJB 技術的應用程序的組件:底層會話 bean 及其業務接口;在實體 bean 及其客戶機之間傳送數據的值對象以及擔任 Web 層和業務層之間的保護層的各種委派類。驗證邏輯十分適合這些組件中的任何一個。實際上,您可以在多個組件中放置驗證邏輯,在整個應用程序中分層次地放置它(盡管這樣做是不可取的)。因此,我們在此處提出的問題是:在 EJB 應用程序的什么位置放置驗證代碼最有利?

    數據驗證的類型
    要確定將驗證代碼放置在什么位置,第一步是了解您正在處理什么類型的驗證。數據格式驗證確保所有數據類型(整數、浮點數、字符串等)都是正確的。它還要確認變量都在允許值的范圍之內以及實際的模式按預期的匹配。本質上,數據格式驗證處理驗證的任何方面,這些驗證不需要應用特定業務規則。

    您知道差異所在么?
    對于良好的應用程序設計而言,清晰地分辨這兩種類型的數據驗證的能力是很重要的。有意或無意的混淆這兩種驗證類型都會導致體系結構糟糕的類和效率低下的應用程序性能。

    特定于業務的驗證基于一組業務規則(例如,確保所提供的 ISBN 號與您數據庫中的實際書籍相匹配)。它幾乎總是需要對 EJB 層以及應用程序中的其它業務邏輯組件具有訪問權。

    數據格式驗證
    確定了正在處理的驗證類型之后,下一步是確定放置代碼的位置。在您的 EJB 應用程序中,數據格式驗證邏輯可以如下進行放置:

    • 將賦值(setter)方法放置在業務委派上。
    • 將賦值(setter)方法放置在 bean 的遠程接口上。
    • 將賦值(setter)方法放置在 bean 的消息對象或值對象上。

    對于本示例,我們將假定您正在處理一個包括業務委派的 EJB 應用程序。如果是這樣,那么您應該采取某些步驟,確保所有的應用程序客戶機(處于 Web 層)都在使用委派進行 bean 訪問,而不是直接訪問 bean。如果確實是這樣,那么您可以將所有數據驗證代碼都安全地放置在業務委派方法中,如清單 1 所示。

    清單 1. 業務委派中的數據格式驗證
    package com.ibm.library;
    
    import java.rmi.RemoteException;
    import java.util.Iterator;
    import java.util.List;
    import javax.ejb.CreateException;
    import javax.naming.NamingException;
    
    public class LibraryDelegate implements ILibrary {
    
          private ILibrary library;
    
          public LibraryDelegate() {
              init();
          }
    
          public void init() {
              // Look up and obtain our session bean
              try {
                  LibraryHome libraryHome =
                      (LibraryHome)EJBHomeFactory.getInstance().lookup(
                          "java:comp/env/ejb/LibraryHome", LibraryHome.class);
                  library = libraryHome.create();
              } catch (NamingException e) {
                  throw new RuntimeException(e);
              } catch (CreateException e) {
                  throw new RuntimeException(e);
              } catch (RemoteException e) {
                  throw new RuntimeException(e);
              }
          }
    
          // No validation required for accessor (getter) methods
    
          public boolean checkout(Book book) throws ApplicationException {
            // No validation required here; the object type
            //   takes care of it
    
              try {
                  return library.checkout(book);
              } catch (RemoteException e) {
                  throw new ApplicationException(e);
              }
          }
    
          public boolean checkout(List books) throws ApplicationException {
            // Validate list
            for (Iterator i = books.iterator(); i.hasNext(); ) {
              Object obj = i.next();
                if !(obj instanceof Book) {
                throw new ApplicationException(
                  ApplicationException.VALIDATION_ERROR,
                  "Only Books are allowed in the input list");
                }
            }
    
              try {
                  return library.checkout(books);
              } catch (RemoteException e) {
                  throw new ApplicationException(e);
              }
          }
    
          // And so on...
    
            public void destroy() {
              // In this case, do nothing
          }
    }
    
    

    對于數據格式驗證,您希望使驗證邏輯盡可能靠近客戶機。數據格式驗證經常觸發錯誤頁面或要求客戶機重新輸入格式錯誤的數據。在這些情況下,您希望花費最少的處理開銷迅速向客戶機提供反饋。通過將驗證邏輯放置在業務委派中,您已經創建了最自然的錯誤處理方案。當客戶機嘗試向委派查詢帶有格式錯誤的數據時,就會觸發錯誤,請求被直接送回客戶機,并就該問題警告用戶。

    將驗證邏輯放置在 bean 實現中會導致低效率的驗證過程。錯誤消息將從 bean 實現傳送到委派,而不是直接從委派傳送到客戶機,這很象 RemoteException,而不象應用程序異常。除了遠程異常的代價之外,委派還將付出 JNDI 查找、RMI 流量以及(可能有)額外的業務邏輯的代價 — 花費在單個驗證錯誤上的力氣太多了!

    特定于業務的驗證
    特定于業務的驗證完全是一種不同的情形。業務驗證錯誤通常比數據驗證錯誤更復雜,并很少通過客戶機交互獲得解決。解決特定于業務的錯誤要求使用額外的實體和會話 bean 以及數據庫訪問,這些都必須通過 JNDI 和 RMI 事務進行處理。把這種驗證放在業務委派上花費的開銷會很大。更好的主意是將這種驗證移回 EJB 層,尤其是放置到 bean 的實現類中。

    在將該驗證放置在應用程序的這一層時,所有 RMI 流量都應該是本地的;大多數應用程序服務器都將使用 VM 內的優化,以使 bean-到-bean 交互速度極快。您也可以避免 JNDI 訪問,因為許多 bean 已經查找了相關 bean 的主(home)接口。此外,您的業務委派已經處理了所有必要的數據格式驗證。

    結束語
    在決定將驗證代碼放置在哪里時,很重要的是能夠分辨兩種驗證類型。數據驗證是比業務驗證簡單得多的驗證類型,一般的經驗是使它盡可能靠近客戶機。特定于業務的驗證更復雜,并通常需要幾種不同的事務來完成。這類驗證應該放在 EJB 層,在那里,它可以盡可能地利用現有的進程。

    在下一篇技巧文章中,我們將討論增強應用程序的驗證過程的其它方法,并將驗證徹底與業務委派隔離開來。在此之前,查看參考資料一節,獲取更多閱讀資料,我們網上再見!

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    TAG: ejb 出現 地方 實踐 驗證 最佳 在什么 最合適


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>