国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

EJB中數(shù)據(jù)驗(yàn)證出現(xiàn)在什么地方最合適

2019-11-18 12:35:55
字體:
供稿:網(wǎng)友

  我們將討論數(shù)據(jù)驗(yàn)證邏輯應(yīng)該出現(xiàn)在 EJB 應(yīng)用程序代碼的什么位置,而不是專注于驗(yàn)證過程(java 技術(shù)專區(qū)的其它地方對(duì)此進(jìn)行了很好的討論)。在本系列先前的技巧文章中,我們了解了很多組成基于 EJB 技術(shù)的應(yīng)用程序的組件:底層會(huì)話 bean 及其業(yè)務(wù)接口;在實(shí)體 bean 及其客戶機(jī)之間傳送數(shù)據(jù)的值對(duì)象以及擔(dān)任 Web 層和業(yè)務(wù)層之間的保護(hù)層的各種委派類。驗(yàn)證邏輯十分適合這些組件中的任何一個(gè)。實(shí)際上,您可以在多個(gè)組件中放置驗(yàn)證邏輯,在整個(gè)應(yīng)用程序中分層次地放置它(盡管這樣做是不可取的)。因此,我們?cè)诖颂幪岢龅膯栴}是:在 EJB 應(yīng)用程序的什么位置放置驗(yàn)證代碼最有利?
  
  數(shù)據(jù)驗(yàn)證的類型
  要確定將驗(yàn)證代碼放置在什么位置,第一步是了解您正在處理什么類型的驗(yàn)證。數(shù)據(jù)格式驗(yàn)證確保所有數(shù)據(jù)類型(整數(shù)、浮點(diǎn)數(shù)、字符串等)都是正確的。它還要確認(rèn)變量都在答應(yīng)值的范圍之內(nèi)以及實(shí)際的模式按預(yù)期的匹配。本質(zhì)上,數(shù)據(jù)格式驗(yàn)證處理驗(yàn)證的任何方面,這些驗(yàn)證不需要應(yīng)用特定業(yè)務(wù)規(guī)則
  
  特定于業(yè)務(wù)的驗(yàn)證基于一組業(yè)務(wù)規(guī)則(例如,確保所提供的 ISBN 號(hào)與您數(shù)據(jù)庫中的實(shí)際書籍相匹配)。它幾乎總是需要對(duì) EJB 層以及應(yīng)用程序中的其它業(yè)務(wù)邏輯組件具有訪問權(quán)。
  
  數(shù)據(jù)格式驗(yàn)證
  確定了正在處理的驗(yàn)證類型之后,下一步是確定放置代碼的位置。在您的 EJB 應(yīng)用程序中,數(shù)據(jù)格式驗(yàn)證邏輯可以如下進(jìn)行放置:
  
  將賦值(setter)方法放置在業(yè)務(wù)委派上。
  將賦值(setter)方法放置在 bean 的遠(yuǎn)程接口上。
  將賦值(setter)方法放置在 bean 的消息對(duì)象或值對(duì)象上。
  對(duì)于本示例,我們將假定您正在處理一個(gè)包括業(yè)務(wù)委派的 EJB 應(yīng)用程序。假如是這樣,那么您應(yīng)該采取某些步驟,確保所有的應(yīng)用程序客戶機(jī)(處于 Web 層)都在使用委派進(jìn)行 bean 訪問,而不是直接訪問 bean。假如確實(shí)是這樣,那么您可以將所有數(shù)據(jù)驗(yàn)證代碼都安全地放置在業(yè)務(wù)委派方法中,如清單 1 所示。
  
  清單 1. 業(yè)務(wù)委派中的數(shù)據(jù)格式驗(yàn)證 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
     }
  }
  
  對(duì)于數(shù)據(jù)格式驗(yàn)證,您希望使驗(yàn)證邏輯盡可能靠近客戶機(jī)。數(shù)據(jù)格式驗(yàn)證經(jīng)常觸發(fā)錯(cuò)誤頁面或要求客戶機(jī)重新輸入格式錯(cuò)誤的數(shù)據(jù)。在這些情況下,您希望花費(fèi)最少的處理開銷迅速向客戶機(jī)提供反饋。通過將驗(yàn)證邏輯放置在業(yè)務(wù)委派中,您已經(jīng)創(chuàng)建了最自然的錯(cuò)誤處理方案。當(dāng)客戶機(jī)嘗試向委派查詢帶有格式錯(cuò)誤的數(shù)據(jù)時(shí),就會(huì)觸發(fā)錯(cuò)誤,請(qǐng)求被直接送回客戶機(jī),并就該問題警告用戶。
  
  將驗(yàn)證邏輯放置在 bean 實(shí)現(xiàn)中會(huì)導(dǎo)致低效率的驗(yàn)證過程。錯(cuò)誤消息將從 bean 實(shí)現(xiàn)傳送到委派,而不是直接從委派傳送到客戶機(jī),這很象 RemoteException,而不象應(yīng)用程序異常。除了遠(yuǎn)程異常的代價(jià)之外,委派還將付出 JNDI 查找、RMI 流量以及(可能有)額外的業(yè)務(wù)邏輯的代價(jià) — 花費(fèi)在單個(gè)驗(yàn)證錯(cuò)誤上的力氣太多了!
  
  特定于業(yè)務(wù)的驗(yàn)證
  特定于業(yè)務(wù)的驗(yàn)證完全是一種不同的情形。業(yè)務(wù)驗(yàn)證錯(cuò)誤通常比數(shù)據(jù)驗(yàn)證錯(cuò)誤更復(fù)雜,并很少通過客戶機(jī)交互獲得解決。解決特定于業(yè)務(wù)的錯(cuò)誤要求使用額外的實(shí)體和會(huì)話 bean 以及數(shù)據(jù)庫訪問,這些都必須通過 JNDI 和 RMI 事務(wù)進(jìn)行處理。把這種驗(yàn)證放在業(yè)務(wù)委派上花費(fèi)的開銷會(huì)很大。更好的主意是將這種驗(yàn)證移回 EJB 層,尤其是放置到 bean 的實(shí)現(xiàn)類中。
  
  在將該驗(yàn)證放置在應(yīng)用程序的這一層時(shí),所有 RMI 流量都應(yīng)該是本地的;大多數(shù)應(yīng)用程序服務(wù)器都將使用 VM 內(nèi)的優(yōu)化,以使 bean-到-bean 交互速度極快。您也可以避免 JNDI 訪問,因?yàn)樵S多 bean 已經(jīng)查找了相關(guān) bean 的主(home)接口。此外,您的業(yè)務(wù)委派已經(jīng)處理了所有必要的數(shù)據(jù)格式驗(yàn)證。
  
  結(jié)束語
  在決定將驗(yàn)證代碼放置在哪里時(shí),很重要的是能夠分辨兩種驗(yàn)證類型。數(shù)據(jù)驗(yàn)證是比業(yè)務(wù)驗(yàn)證簡(jiǎn)單得多的驗(yàn)證類型,一般的經(jīng)驗(yàn)是使它盡可能靠近客戶機(jī)。特定于業(yè)務(wù)的驗(yàn)證更復(fù)雜,并通常需要幾種不同的事務(wù)來完成。這類驗(yàn)證應(yīng)該放在 EJB 層,在那里,它可以盡可能地利用現(xiàn)有的進(jìn)程。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 深圳市| 山东省| 静海县| 句容市| 兰坪| 天柱县| 潼南县| 乾安县| 崇阳县| 涿州市| 竹北市| 古浪县| 故城县| 巴中市| 巴彦县| 田阳县| 平舆县| 图们市| 灌云县| 屏东县| 玉林市| 常州市| 株洲市| 富顺县| 来宾市| 崇仁县| 东至县| 苍山县| 桦南县| 青冈县| 军事| 肇庆市| 敖汉旗| 灯塔市| 翁源县| 瑞丽市| 南郑县| 黑河市| 寿光市| 昌吉市| 平舆县|