我们将讨论数据验证逻辑应该出现在 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 } } |
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 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器