[转载]EJB 最佳实践: 数据验证出现在什么地方最合适

本文讨论 EJB 应用程序中数据验证逻辑的合适位置。数据验证分数据格式验证和特定于业务的验证。数据格式验证应靠近客户机,可放在业务委派中;特定于业务的验证更复杂,应放在 EJB 层的 bean 实现类中。

EJB 最佳实践: 数据验证出现在什么地方最合适


尽管数据验证是所有企业应用程序的必需组件,但人们对数据验证过程的理解通常很肤浅,并且不能很好地执行。在这篇 EJB 最佳实践专栏文章中,Brett McLaughlin 解释了对基于 EJB 技术的系统进行数据验证的一些幕后概念,并向您展示了如何避免意外的或不可理解的错误消息。

每当您处理应用程序的业务逻辑时,都需要执行验证。应用程序必须有办法确保传入的数据格式正确,并且必须能够执行特定于业务的验证(如针对库存复核采购订单)。

我们将讨论数据验证逻辑应该出现在 EJB 应用程序代码的 什么位置,而不是专注于验证过程(Java 技术专区的 其它地方对 此进行了很好的讨论)。在本系列先前的技巧文章中,我们了解了很多组成基于 EJB 技术的应用程序的组件:底层会话 bean 及其业务接口;在实体 bean 及其客户机之间传送数据的值对象以及担任 Web 层和业务层之间的保护层的各种委派类。验证逻辑十分适合这些组件中的任何一个。实际上,您可以在多个组件中放置验证逻辑,在整个应用程序中分层次地放置它 (尽管这样做是不可取的)。因此,我们在此处提出的问题是:在 EJB 应用程序的什么位置放置验证代码 最有利

数据验证的类型

要确定将验证代码放置在什么位置,第一步是了解您正在处理什么类型的验证。 数据格式验证确保所有数据类型(整数、浮点数、字符串等)都是正确的。它还要确认变量都在允许值的范围之内以及实际的模式按预期的匹配。本质上,数据格式验证处理验证的任何方面,这些验证不需要应用特定业务规则。

c.gif
您知道差异所在么?

对于良好的应用程序设计而言,清晰地分辨这两种类型的数据验证的能力是很重要的。有意或无意的混淆这两种验证类型都会导致体系结构糟糕的类和效率低下的应用程序性能。

特定于业务的验证基于一组业务规则(例如,确保所提供的 ISBN 号与您数据库中的实际书籍相匹配)。它几乎总是需要对 EJB 层以及应用程序中的其它业务逻辑组件具有访问权。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


数据格式验证

确定了正在处理的验证类型之后,下一步是确定放置代码的位置。在您的 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 流量以及(可能有)额外的业务逻辑的代价 — 花费在单个验证错误上的力气太多了!


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


特定于业务的验证

特定于业务的验证完全是一种不同的情形。业务验证错误通常比数据验证错误更复杂,并很少通过客户机交互获得解决。解决特定于业务的错误要求使用额外的实体 和会话 bean 以及数据库访问,这些都必须通过 JNDI 和 RMI 事务进行处理。把这种验证放在业务委派上花费的开销会很大。更好的主意是将这种验证移回 EJB 层,尤其是放置到 bean 的实现类中。

在 将该验证放置在应用程序的这一层时,所有 RMI 流量都应该是本地的;大多数应用程序服务器都将使用 VM 内的优化,以使 bean-到-bean 交互速度极快。您也可以避免 JNDI 访问,因为许多 bean 已经查找了相关 bean 的主(home)接口。此外,您的业务委派已经处理了所有必要的数据格式验证。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


结束语

在决定将验证代码放置在哪里时,很重要的是能够分辨两种验证类型。数据验证是比业务验证简单得多的验证类型,一般的经验是使它尽可能靠近客户机。特定于业 务的验证更复杂,并通常需要几种不同的事务来完成。这类验证应该放在 EJB 层,在那里,它可以尽可能地利用现有的进程。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-130614/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/374079/viewspace-130614/

内容概要:本文围绕“基于交流潮流的电力系统多元件N-k故障模型研究”展开,深入探讨了利用Matlab代码实现电力系统在发生多个关键元件同时故障(即N-k故障)情况下的交流潮流计算与故障分析方法。该模型不仅考虑了传统潮流方程的非线性特性,还引入了故障约束条件,能够精确模拟复杂多样的故障场景,如短路、断线等,进而评估电网在极端运行条件下的稳态与动态行为。研究通过构建典型电力系统算例,验证了所提模型在故障筛选、脆弱性识别及系统恢复策略制定方面的有效性,为电力系统安全评估、风险预警和防御体系构建提供了坚实的理论依据和技术支撑。此外,模型具备良好的扩展性,可进一步应用于连锁故障传播分析、恶意攻击模拟等高级安全分析领域。; 适合人群:具备电力系统分析基础理论知识和Matlab编程能力的高校研究生、科研院所研究人员以及电力公司从事电网规划、运行与安全管理的技术人员,特别适用于开展电力系统安全稳定、可靠性评估与应急响应机制研究的专业人士。; 使用场景及目标:①开展电力系统在多重故障条件下的交流潮流仿真,评估系统电压稳定性、线路过载风险及负荷损失程度;②识别电网中的关键薄弱环节与脆弱元件,支撑电网加固改造与防御资源配置;③用于科研项目中的故障场景建模与算法验证,或作为教学案例帮助学生理解复杂故障下的系统响应机制。; 阅读建议:此资源以Matlab代码为核心实现手段,建议读者结合理论推导与代码实现进行对照学习,重点关注故障建模过程中雅可比矩阵的修正方法、故障注入方式及收敛性处理策略,建议在仿真中逐步增加故障数量与复杂度,深入理解N-k故障对系统潮流分布的影响规律,并尝试将其拓展至含新能源接入的现代电力系统场景中进行验证与优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值