如何实现一个与数据库表字段松耦合的j2ee应用 |
作者:佚名 发布时间:2005-04-02 来源:不详
|
本文基于java环境,分 体bean的不足,接着讲述了
|
析和实现了解决这个问题的方案 用java实现这个需求的技巧,最
|
。首先指出j2ee容器管理持久性实 后是具体地实现。
|
在软件项目的分析设计 ER图。再详细设计UI界面上 类型。这些过程紧密地依赖 个表的字段有多少,它们的 目前我只能为我的表大概确 段的变化就是我的一个需求 字段可能不会是一样的。由 烦地构造源代码的版本数。 j2ee容器管理持久性实体be 实现。
|
过程中,我们首先分析数据实体 有哪些输入框,文本框等,紧接 于数据实体的稳定性,比如在数 类型是什么等。但是当这个稳定 定这些字段。项目组是否该等到 ,项目该如何开发?即使所有客 于不同的客户对字段的需求不是 本文基于java环境,分析和实现 an的不足,接着讲述了用java实
|
,例如确定类,类成员变量或者画 着我们还会确定方法的参数个数和 据库设计中,我们需要多少表,每 性失去了怎么办?用户很有可能说 用户确定之后再做?如果用户说字 户能确定字段,不同的客户确定的 一样的,项目组有时不得不不厌其 了解决这个问题的方案。首先指出 现这个需求的技巧,最后是具体地
|
CMP实体BEAN机制也就 bean类具有持久性字段(或 的get/set方法一样。下面
|
是容器管理持久性实体bean机制 属性)的抽象get/set方法。这 是一个Personbean实体bean类的
|
。CMP实体bean的提供者提供的 两个方法与普通java bean的属性 name持久性字段的申明。
|
Class Personbean extends EntityBean { |
Abstract String getName(); |
Abstract String setName(String vname); |
String ebjCreate(String name) {
|
setName(name);};
|
部署时,一般部署工具会产生这个类的子类,子类的申明大概如下: |
Class PersonbeanSubClass extends
|
Personbean{
|
String getName(){ return name;} |
String setName(Strin
|
g vname){name=vname;}
|
至于具体的字类实现机制可参见《Ma 。容器创建的是子类的实例。通过父子类 性get/set方法实现了一个实体bean的持 成这个子类的。这样bean提供者只需规定 有工具辅助完成。但我们必须注意到,为 方法。同样我们注意到为了创建一个实体 String的参数。这样的代码无疑建立在这 设下的语句还有访问数据库时的Statemen
|
stering Enterprise JavaBeans Second Edition》 的比较可知,子类通过一个私有字段和继承的两个属 久性属性。部署工具是根据java bean的内省机制生 持久性字段的抽象访问器函数,其他的持久性实现都 了指定一个持久性字段,提供者必须硬编码两个访问 Bean,我们为ejbCreate方法提供了一个类型为 个实体bean只有一个持久性字段的前提之下。类似假 t语句:
|
Statement st = conn.createStatement(); |
St.execuate("insert
|
into person (name) value('Jo
|
hn')");
|
广泛使用类似假设的例 定制标签处理类的数据交互 制为CMP实体BEAN类机制,
|
子还有Struts的视图-模型数据 。我暂且称这种假设为固定字段 目的在于重视j2ee中的这个特征
|
交换机制中ActionForm和HTMLTag 假设,基于这个假设的代码实现机 。
|
固定字段假设和CMP实 文称为持久性字段的三属性 响源代码,这就产生了一系 久性字段的三属性和源代码 有XML,动态编译技术,元 久性字段,有一个持久性字 性字段,最后执行数据库操 源代码,接着及时编译生成
|
体BEAN类机制硬编码持久性字段 )三个中至少一个固定下来了, 列令人讨厌的代码树。不定字段 分开,最终达到客户可以订制持 数据技术,字典集合技术等。这 段的数据容器和一部分分析代码 作。动态编译技术是一个过渡技 字节代码,部署到应用中。
|
,把字段的名字,个数和类型(本 使得更改持久性字段的工作必然影 假设和脚本语言类技术就是要把持 久性字段的目的。典型的实现技术 些技术有一个共同点就是不固定持 。分析代码解释数据容器中的持久 术,它可根据客户配置,动态生成
|
XML是一个非常好的数据交换格式, 据,定义了文档中数据的格式和组成。XM 数据值(元素文本或属性值)。另外JAVA 等。JAXP集合了基于事件分析的简单XML XML进行消息发送接收和消息处理的编程 档如HTML,JAVA源代码等。
|
它具有很好的模式定义(DTD),DTD是XML文档的元数 L文档中同时包含了数据名称(元素名或属性名)和 中有很强的XML文档分析和使用API,包括JAXP,JAXM 编程接口SAX和节点数的DOM分析技术。JAXM则是利用 接口。XSLT能很容易地把XML文档转为其他格式的文
|
利用XML表达用户配置信息,XSLT把 java.lang.Compiler类及时编译产生字接 。详细描述请参照http://www.javaworld
|
这些信息转换成相应的JAVA源代码,接着是用 代码。当然你也可以生成其他的辅助类,sql语句等 .com/javaworld/jw-02-2002/jw-0201-xslt.html
|
元数据技术把关于数据 信息。数据字典可以放在xm ,开发者访问数据字典可以
|
的描述放在数据字典中,使用者 l文档中,也可以在数据库服务 得到客户的当前持久性字段,并
|
访问数据字典可以得到关于数据的 器上。在客户配置了持久性字段后 生成正确的代码。
|
java中的哈西表等字典 我们的方法调用是表中有多 字段硬编码入了源代码中, 数的接口是固定的。
|
类集合数据结构可以在方法调用 少字段,填充数据库的函数一般 持久性字段变化必会造成源代码
|
之间传递变化的持久性字段。平常 要接收多少参数,这样就把持久性 的变动。字典集合技术使这样的函
|
为了应用上面的分析,具体体现如何 出一个简单的任务:做一个采集人员信息
|
实现与数据库表字段松散耦合的j2ee应用,在这里提 的应用程序。
|
我们粗略分析一下便可 WAF框架来设计。关于WAF框 s/cn/java/l-j2eeArch/ind
|
得到一个人员类,暂且命名为Pe 架可参见http://www-900.ibm.c ex.shtml
|
rson,但字段我们确定不了。采用 om/developerwork
|
下面设计图(图一)表 务器部分和客户端部分,服 上显示页面的客户端部分, 客户可以点击此按钮发出提 类来处理用户的提交请求。
|
示:客户发出http请求,容器定 务器部分为在容器中运行的指令 客户端部分聚集(包含)了一个 交请求。根据WAF的框架流程, 下面是这个关键类的设计说明:
|
位到person.jsp,这个网页分成服 ,这些指令会build在客户浏览器 html表单,表单有一个提交按钮, 我们设计一个personHTMLAction的 字段:
|
Connection conn 保存了从容器连接池中获取的数据库连接; |
Hashtable reqHashNamevalue 保存
|
了从用户提交的表单中提取的名字-值对;
|
Hashtable targetHash 元数据--字段名-类型对;
|
NameType 保存了从数据库中获
|
得的关于数据表persion_table的
|
Hashtable finalHashNamevalue保存
|
了最后插入到数据库中的名字-值对;
|
Connect getConnect() 从容器的连接池中获取数据库连结; |
Hashtable getReqHash
|
Namevalue() 从用户提交的表
|
单中提取名字-值对;
|
Hashtable getTargetH 数据--字段名-类型对;
|
ashNameType() 从数据库中获
|
得关于数据表persion_table的元
|
Hashtable getFinalHashNamevalue reqHashNamevalue中过多的字段,
|
() 根据targetHashNameType中的字段过滤掉
|
Void insert()根据t 构造sql语句,操作数据库
|
argetHashNameType中的类型和f 。
|
inalHashNamevalue中的名字-值对
|
这些函数统一由WAF框架中的这个类
|
的父类HTMLAction的一个函数perform来调用。
|
图二表达了这个设计达到的松散耦合 递充分利用了哈西字典类。达到的直接好 应用的输入界面,客户可以增加各种输入 理类和数据库表格之间,它们间的数据传 处是我们可以开发出定制数据表的工具让 或修改字段却不会影响处理类。
|
效果。第一处在表单和处理类之间,它们间的数据传 处是我们可以开发出定制表单的工具让客户自己定制 元素到表单上却不会影响后台的处理类。第二处在处 递充分利用了数据库中的元数据信息,达到的直接好 客户自己定制数据表的多数字段,客户可以增加减少
|
设计图(图三)于图二 格式。 XMLpersonHTMLActi 去。下面是这两个关键类的
|
不同的是我们在控制层内部加上 on的类来处理用户的提交请求, 设计说明:
|
了JMS技术,用XML作为数据的交换 PersonMDB把数据插入到数据库中
|
String getReqXML()
|
调用getParameters()获得客户
|
的提交数据,产生xml文档;
|
Void sendXML() 生成一个临时队列 回的xml文档作为JMS的消息体发送出去。
|
作为消息的反馈队列,利用JMS API把getReqXML()返
|
Connect conn 保存了从容器连接池中获取的数据库连接; |
Hashtable XMLHashNamevalue 保存
|
了从处理类的发送来的消息中提取的名字-值对;
|
Hashtable targetHash 元数据--字段名-类型对;
|
NameType 保存了从数据库中获
|
得的关于数据表persion_table的
|
Hashtable finalHashN
|
amevalue保存了最后插入到数据
|
库中的名字-值对;
|
Connect getConnect() 从容器的连接池中获取数据库连结; |
Hashtable getXMLHash
|
Namevalue() 从处理类的发送
|
来的消息中提取名字-值对;
|
Hashtable getTargetH 数据--字段名-类型对;
|
ashNameType() 从数据库中获
|
得关于数据表persion_table的元
|
Hashtable getFinalHa XMLHashNamevalue中过多的
|
shNamevalue() 根据targetHa 字段,得到最后插入到数据库中
|
shNameType中的字段过滤掉 的名字-值对;
|
Void insert()根据targetHashNam 构造sql语句,操作数据库;
|
eType中的类型和finalHashNamevalue中的名字-值对
|
Void sendReply() 发送反馈消息给处理类。 |
这些函数统一由EBJ 2.
|
0 中的消息驱动BEAN的onMessag
|
e函数统一调用。
|
图四表达了这个设计达 从而增强了设计的分布特性
|
到的松散耦合效果。与图二相比 。
|
,这个设计增加了一个松散耦合,
|
不能确定数据库表的字段是一个普遍 结出两个假设:固定字段假设和不定字段 的实体BEAN技术,众多框架的视图-模型 造成项目的需求不确定风险,而且往往使 把这种不确定性作为一个需求来处理,利 技术解决这个问题,达到数据库字段和应 供参考。
|
的需求不确定性问题,本文通过对J2EE技术的分析总 假设。有好多关键技术是基于固定字段假设的如CMP 数据交换技术。这个假设和基于这个假设的技术往往 项目组生成枝叶繁盛的源代码版本数。不定字段假设 用了XML技术、集合技术、元数据技术甚至动态编译 用松散耦合的最终目的。本文还给出了两个设计方案
| |
|
|
|
|