欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
developerWorks:Java 技術(shù):EJB 最佳實(shí)踐:數據驗證出現在什么地方最合...
如何從您的驗證代碼獲得最佳性能

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

參考資料



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

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
EJB 最佳實(shí)踐
J2EE架構的6個(gè)最佳實(shí)踐
J2EE設計決策
bean、javabean、entity、dto、ejb、pojo都是些什么鬼
EJB
Springvs.EJB
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久