选择显示字体大小

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 层,在那里,它可以尽可能地利用现有的进程。


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons