图二表达了这个设计达到的松散耦合效果。第一处在表单和处理类之间,它们间的数据传递充分利用了哈西字典类。达到的直接好处是我们可以开发出定制表单的工具让客户自己定制应用的输入界面,客户可以增加各种输入元素到表单上却不会影响后台的处理类。第二处在处理类和数据库表格之间,它们间的数据传递充分利用了数据库中的元数据信息,达到的直接好处是我们可以开发出定制数据表的工具让客户自己定制数据表的多数字段,客户可以增加减少或修改字段却不会影响处理类。
· 4.2 设计二、xml技术、哈西技术和元数据技术
设计图(图三)于图二不同的是我们在控制层内部加上了JMS技术,用XML作为数据的交换格式。 XMLpersonHTMLAction的类来处理用户的提交请求,PersonMDB把数据插入到数据库中去。下面是这两个关键类的设计说明:
XMLpersonHTMLAction类
函数或方法:
String getReqXML() 调用getParameters()获得客户的提交数据,产生xml文档;
Void sendXML() 生成一个临时队列作为消息的反馈队列,利用JMS API把getReqXML()返回的xml文档作为JMS的消息体发送出去。
PersonMDB类
字段:
Connect conn 保存了从容器连接池中获取的数据库连接;
Hashtable XMLHashNameValue 保存了从处理类的发送来的消息中提取的名字-值对;
Hashtable targetHashNameType 保存了从数据库中获得的关于数据表persion_table的元数据--字段名-类型对;
Hashtable finalHashNameValue保存了最后插入到数据库中的名字-值对;
函数或方法:
Connect getConnect() 从容器的连接池中获取数据库连结;
Hashtable getXMLHashNameValue() 从处理类的发送来的消息中提取名字-值对;
Hashtable getTargetHashNameType() 从数据库中获得关于数据表persion_table的元数据--字段名-类型对;
Hashtable getFinalHashNameValue() 根据targetHashNameType中的字段过滤掉XMLHashNameValue中过多的字段,得到最后插入到数据库中的名字-值对;
Void insert()根据targetHashNameType中的类型和finalHashNameValue中的名字-值对构造sql语句,操作数据库;
Void sendReply() 发送反馈消息给处理类。
这些函数统一由EBJ 2.0 中的消息驱动BEAN的onMessage函数统一调用。
图四表达了这个设计达到的松散耦合效果。与图二相比,这个设计增加了一个松散耦合,从而增强了设计的分布特性。
· 总结
不能确定数据库表的字段是一个普遍的需求不确定性问题,本文通过对J2EE技术的分析总结出两个假设:固定字段假设和不定字段假设。有好多关键技术是基于固定字段假设的如CMP的实体BEAN技术,众多框架的视图-模型数据交换技术。这个假设和基于这个假设的技术往往造成项目的需求不确定风险,而且往往使项目组生成枝叶繁盛的源代码版本数。不定字段假设把这种不确定性作为一个需求来处理,利用了XML技术、集合技术、元数据技术甚至动态编译技术解决这个问题,达到数据库字段和应用松散耦合的最终目的。本文还给出了两个设计方案供参考。
· 关于作者