乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      developerWorks:Java 技術(shù):EJB 最佳實踐:數(shù)據(jù)驗證出現(xiàn)在什么地方最合...

       思奇劍 2006-11-16
      如何從您的驗證代碼獲得最佳性能

       

      Brett McLaughlinbrett@oreilly.com
      作家兼編輯,O‘Reilly and Associates

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

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

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

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

      您知道差異所在么?
      對于良好的應(yīng)用程序設(shè)計而言,清晰地分辨這兩種類型的數(shù)據(jù)驗證的能力是很重要的。有意或無意的混淆這兩種驗證類型都會導(dǎo)致體系結(jié)構(gòu)糟糕的類和效率低下的應(yīng)用程序性能。

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

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

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

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

      清單 1. 業(yè)務(wù)委派中的數(shù)據(jù)格式驗證
      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
                              }
                              }
                              
                              

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

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

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

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

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

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

      參考資料



      關(guān)于作者
      Brett McLaughlin 的照片Brett McLaughlin 從 Logo 時代(還記得那個小三角嗎?)就開始從事計算機工作了。他現(xiàn)在專門研究用 Java 和 Java 相關(guān)技術(shù)構(gòu)建應(yīng)用程序基礎(chǔ)結(jié)構(gòu)。過去幾年他一直在 Nextel Communications 和 Allegiance Telecom, Inc. 致力于實現(xiàn)這些基礎(chǔ)結(jié)構(gòu)。Brett 是 Java Apache 項目 Turbine 的共同創(chuàng)始人之一,該項目用 Java servlet 為 Web 應(yīng)用程序開發(fā)構(gòu)建可重用的組件體系結(jié)構(gòu)。他還是 EJBoss 項目(一個開放源碼的 EJB 應(yīng)用程序服務(wù)器)和 Cocoon(一個開放源碼的 XML Web 發(fā)布引擎)的志愿開發(fā)人員之一??赏ㄟ^
      brett@oreilly.com 與 Brett 聯(lián)系。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多