曹
曹晓钢
Unregistered / Unconfirmed
GUEST, unregistred user!
工作环境中有RDBMS,客户端是JSP,如何才是最好的对象模型呢?
先说一下我的理解。
对于RDBMS中的Table,和Java class是可以一一对应的。假设我们有个表叫做PurchaseOrder,
还有个表叫做PerchaseOrderItem,简写为PO和POItems.那么相对应的就应该有两个Java class:
PurchaseOrder和PurchaseOrderItem.在同名的Table和Class之间,Table的Column和Class
的properties是一一对应的。
我们来考虑一些基本问题。首先是PO和POItems的关系。在数据库中他们是10,*)的关系,
也就是delphi里面的master/detail关系。在Java class中间,PurchaseOrder应该在一个
Collection里面包含若干个PurchaseDetailItems。
考虑到四种基本的操作(select/insert/modify/delete)都可以被完全的实现,这样我们
就完成了从RDBMS table row到JavaClass instance的映射。通过技术手段可以使得这种
映射是有效的,完全可以自动化。
现在我们要使用JavaClass来生成HTML.在jsp里面引用Java Class的properties,来构造这个
HTML页面。由于有4种基本操作,所以叶面比较难写。为了处理PO的properties,就需要
2个不同的叶面:只读的显示界面和可以修改的界面。
对于这个困难,我采用这样的方法解决:自己写了一套taglib,由一个Layout外框和若干个
Element组成。大概是这样的结构:
<layout mode="display"> // or 'modify' when user want to modify.
<Element property="PurchaseFrom"/>
<Element property="ShipAddress"/>
...
</layout>
这个Element可以自行处理输出,在layout mode为display的时候输出span Tag,在mode
为modify的时候输出input Tag.
在客户端提交Form上来的时候,一个方法可以parse Form的参数,实现自动化的JavaClass
属性装载。
这样,JavaClass和Form之间也可以变成映射的关系。
下面要说到正题了。
今天研读Struts,有所启发。
我原来的程序结构中,没有ActionMapping这个关键层。我的理解是这是个调度接口,就是
一个类似于软件总线的接口。尽管我原来的结构中做的没有如此明显,但是基本思想是一
致的。
利用Struts来生成Form,有一个优点是可以实现集中的Server端validate.本来这是一个很繁琐
的步骤。
但是我还有另一个思路。
如上所述,到现在为止我们实现的是从RDBMS Table到JavaClass的完全映射,假设我们的客户需要
我们输出一个PurchaseOrder的备份给他,然后要求我们的系统还提供一个接口,允许他使用
这个备份来重新生成PurchaseOrder,那么我们就不能简单的利用web接口了。
一个比较好的办法是生成XML文件来实现这个备份。作为标准文档接口,XML具有很多优势。
这时候我意识到XML和RDBMS,JavaClass是三个相互独立,而且相互可以完全映射的实体。
从JavaClass的properties中完全可以自动的dump出一个XML文件来,并且从XML中提取attibute
生成JavaClass的Instance也是可行的。
由于这三者都可以标准化,可以做到只要定义了数据库结构,就可以自动生成JavaCode和
XML DTD/schema。而且在运行时,Table Row,Java class instance, XML 可以相互等价替换。
这样的话,假设我们的JavaClass已经可以随时转换成为XML,那么为什么不利用这个XML来
直接生成HTML呢?只需要简单的XSLT就可以实现。考虑到客户端对应的结构可以用Form
来代表,我们现在就有4个实体:RDBMS table row,JavaClass,XML,HTML Form。
从HTML form提交的结果中,我们可以自动化的提取元素来赋值给JavaClass(这一点我已经
在现实的工程中使用了),那么,这是不是意味着我们可以实现这4中实体的完全转换?
这样的话,Struts扮演一个什么角色呢?
在生成HTML的时候,XML和Struts只需要其中一个。
使用Struts的好处是我们可以利用Struts来做Validate,做完Validate就可以把Form传上
来的数据装载到JavaClass。
现在我有一个设想,可不可能利用XML在Struts的基础上实现更加通用的结构模型?
(Struts初学者,若有错误切莫见笑)
如何才是最好的结构呢?
欢迎大家继续讨论!
先说一下我的理解。
对于RDBMS中的Table,和Java class是可以一一对应的。假设我们有个表叫做PurchaseOrder,
还有个表叫做PerchaseOrderItem,简写为PO和POItems.那么相对应的就应该有两个Java class:
PurchaseOrder和PurchaseOrderItem.在同名的Table和Class之间,Table的Column和Class
的properties是一一对应的。
我们来考虑一些基本问题。首先是PO和POItems的关系。在数据库中他们是10,*)的关系,
也就是delphi里面的master/detail关系。在Java class中间,PurchaseOrder应该在一个
Collection里面包含若干个PurchaseDetailItems。
考虑到四种基本的操作(select/insert/modify/delete)都可以被完全的实现,这样我们
就完成了从RDBMS table row到JavaClass instance的映射。通过技术手段可以使得这种
映射是有效的,完全可以自动化。
现在我们要使用JavaClass来生成HTML.在jsp里面引用Java Class的properties,来构造这个
HTML页面。由于有4种基本操作,所以叶面比较难写。为了处理PO的properties,就需要
2个不同的叶面:只读的显示界面和可以修改的界面。
对于这个困难,我采用这样的方法解决:自己写了一套taglib,由一个Layout外框和若干个
Element组成。大概是这样的结构:
<layout mode="display"> // or 'modify' when user want to modify.
<Element property="PurchaseFrom"/>
<Element property="ShipAddress"/>
...
</layout>
这个Element可以自行处理输出,在layout mode为display的时候输出span Tag,在mode
为modify的时候输出input Tag.
在客户端提交Form上来的时候,一个方法可以parse Form的参数,实现自动化的JavaClass
属性装载。
这样,JavaClass和Form之间也可以变成映射的关系。
下面要说到正题了。
今天研读Struts,有所启发。
我原来的程序结构中,没有ActionMapping这个关键层。我的理解是这是个调度接口,就是
一个类似于软件总线的接口。尽管我原来的结构中做的没有如此明显,但是基本思想是一
致的。
利用Struts来生成Form,有一个优点是可以实现集中的Server端validate.本来这是一个很繁琐
的步骤。
但是我还有另一个思路。
如上所述,到现在为止我们实现的是从RDBMS Table到JavaClass的完全映射,假设我们的客户需要
我们输出一个PurchaseOrder的备份给他,然后要求我们的系统还提供一个接口,允许他使用
这个备份来重新生成PurchaseOrder,那么我们就不能简单的利用web接口了。
一个比较好的办法是生成XML文件来实现这个备份。作为标准文档接口,XML具有很多优势。
这时候我意识到XML和RDBMS,JavaClass是三个相互独立,而且相互可以完全映射的实体。
从JavaClass的properties中完全可以自动的dump出一个XML文件来,并且从XML中提取attibute
生成JavaClass的Instance也是可行的。
由于这三者都可以标准化,可以做到只要定义了数据库结构,就可以自动生成JavaCode和
XML DTD/schema。而且在运行时,Table Row,Java class instance, XML 可以相互等价替换。
这样的话,假设我们的JavaClass已经可以随时转换成为XML,那么为什么不利用这个XML来
直接生成HTML呢?只需要简单的XSLT就可以实现。考虑到客户端对应的结构可以用Form
来代表,我们现在就有4个实体:RDBMS table row,JavaClass,XML,HTML Form。
从HTML form提交的结果中,我们可以自动化的提取元素来赋值给JavaClass(这一点我已经
在现实的工程中使用了),那么,这是不是意味着我们可以实现这4中实体的完全转换?
这样的话,Struts扮演一个什么角色呢?
在生成HTML的时候,XML和Struts只需要其中一个。
使用Struts的好处是我们可以利用Struts来做Validate,做完Validate就可以把Form传上
来的数据装载到JavaClass。
现在我有一个设想,可不可能利用XML在Struts的基础上实现更加通用的结构模型?
(Struts初学者,若有错误切莫见笑)
如何才是最好的结构呢?
欢迎大家继续讨论!