使用CMP2和XML处理动态数值对象

在EJB 2.0局部引用和容器管理关系出现之前,通常把实体EJB用于模型粗粒度域对象。这主要是由于与远程通信有关系统开销并阻止了细粒度访问企业层的客户层对象。粗粒度设计的性能通过实现数值对象而促进改善,压缩所有的数据也就是说在客户层和企业层之间传递数据。使用有大量域对象的复杂系统,即使这么样能提供一个第一流的和高度执行设计,这个设计导致在系统内出现过多的数值对象。这同样也创建在企业层和客户层之间的紧密连接。同样,在EJB出现之间,bean提供者不得不明确地提供用于维护域对象之间联接的程序。在一个有在域对象之间的复杂关系的情况中,数值对象的设计变得很复杂。在使用EJB开发企业应用程序的过程中,容器管理关系和局部引用的出现开启了令人兴奋的新途径。在本文中,我将带你使用EJB 2.0的强大方法连同bean组件和JAXP创建动态的基于数据结构的XML,可以在你的企业层和表现层之间传递信息。

从企业层到客户层传递数据的过程中使用XML,可以帮助你实现在的应用程序中的多种宽松连接;然而,当你把新的域对象添加到实体型中时,你可能需要添加用于创建新DOM构架的类来添加该实体。在文中,我们将开发一个框架来动态地遍历容器管理和给定的局部EJB有关的域,并且创建一个可以在应用程序的多个层之间传递的XML件。这个方法将有以下优点∶

在企业层和客户层之间促进宽松连接。

便于管理域对象之间关系。

从系统中除去复杂数值对象因为XML是由动态地遍历CMP和CMR域产生的,当它们添加新对象到域模型中时,bean提供者不必创建新的用来创建新的DOM构架的对象类。

EJB 2.0局部引用促进访问bean组件;bean组件与局部引用结合可以含于与其他的被容器管理的bean的关系。举例来说,在一个帮助系统中,UserEJB可以有与ServiceRequestEJB的一到多双向关系和与ProductEJB的一到一的单向联系以及与ServiceRequestHistoryEJB的一到的双向关系。UserEJB同时可以有与PhoneEJB一到多的双向关系。这样,使用EJB 2.0局部引用和容器管理关系,你可以设计一套复杂的有关体。容器管理持久性和关系域是在bean类中使用抽象存取程序方法定的。用于关系域的存取程序方法要么返回一个集合要么返回定义这个系的bean的本机接口,这还取决于这个关系集的容量。这些存取程序法可以通过bean组件的本机接口展示。EJB 2.0的深入研究超出了本文范围,请参阅EJB 2.0的规范。

一个效率高的设计模式应该通过外观组件展示你的应用程序的使用案例并且不准从客户层中直接访问实体组件。回到我们的帮助系统的例子中来,其中的一个使用案例是取得给定用户的详细资料。外部组件可以查找需要的用户实体组件,并且通过容器管理持久性与关系域取得所需数据并把它返回表现层。

用于数据传送对象的一个显而易见的选择就是简单的Java bean。UserBean可能有表示持久性与关系域的属性。这种关系域要么是java.util.Collection要么是其他的取决于这种关系的bean组件。UserBean可能有ServiceRequestBean和PhoneBean集。ServiceRequestBean可能有一个ProductBean和许多ServiceRequestHistory bean组件。此外,这些bean组件还可能还有简单的String或者表现容器管理持久性域的基本属性。这个选择的主要的不利之处就是使你的实体模型更加复杂,使你的数据传送对象bean层次更加复杂,还将在你的服务(企业)层和消费(表现)层之间创建紧密连接。研究一下这个关系的复杂的层次,一个更好的选择是使用XML DOM对象作为数据传送对象。你的组件将产生oeg.w3c.dom.Document对象类型并且你的表现组件使用XML的JSP自定义标记和XSLT文件来“消费”它们。

现在,下一个问题是∶怎么从CMP局部bean引用中创建XML文件?我们可以使用一个基于用于创建不同的类型的DOM组件的方法的工厂;然而,这将创建过多的“工场”组件,并且你可能需要添加新的"工场"组件作为你的实体模型扩展。我们需要的是一个可以使用实体局部对象,引导容器管理关系和创建动态DOM构架的公用程序。这个公用程序将负责在双向关系中循环引用,以避免无限的循环和深入导航关系元素。

时间: 2024-09-13 04:13:49

使用CMP2和XML处理动态数值对象的相关文章

从XML中动态加载菜单的示例

本文配套源码 这个案例是一个基于VS2005的WinForm菜单控件的例子,功能是从XML中动态加载菜单数据到MenuTrip控件上.这个案例中用到了XML,反射之类的技术.当然实用价值有限,仅供学习参考之用. 首先创建一个WinForm项目,在Form1上放置一个MenuTrip控件,将其命名为MainMenu. 在项目中添加一个XML文件,命名为Menu.xml,代码如下: MenuXml 1<?xml version="1.0" encoding="utf-8&q

Python中动态获取对象的属性和方法的教程_python

首先通过一个例子来看一下本文中可能用到的对象和相关概念. #coding: UTF-8 import sys # 模块,sys指向这个模块对象 import inspect def foo(): pass # 函数,foo指向这个函数对象 class Cat(object): # 类,Cat指向这个类对象 def __init__(self, name='kitty'): self.name = name def sayHi(self): # 实例方法,sayHi指向这个方法对象,使用类或实例.

Android非XML形式动态生成、调用页面的方法

本文实例讲述了Android非XML形式动态生成.调用页面的方法.分享给大家供大家参考.具体分析如下: 这个问题是这样的:我们不使用XML构建页面,而是使用程序构建新的页面,并在页面中添加各种控件. 一.构建新页面: ① 在src目录中添加一个class,命名为SignPage ② 在AndroidMainfest.xml中添加一个Activity: <activity android:name="com.example.stest.SignPage"/> 注意,这句添加后

Groovy高效编程:动态改变对象的能力

从Groovy1.1beta-2开始,实现动态改变对象的能力变的十分简单: 一开始,我们有这样一个类: class Person { String name } 该类的实例都是哑巴,不能说话,作为造物主的我们该完善它们,使它们能自我介绍(添加实例方法):class Person { String name } // 添加自我介绍的行为 Person.metaClass.introduce << {println "I'm $name"} 现在让我们看看,它们到底是否真的能够

JS使用ajax从xml文件动态获取数据显示的方法

 这篇文章主要介绍了JS使用ajax从xml文件动态获取数据显示的方法,实例分析了javascript使用Ajax技术操作XML文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JS使用ajax从xml文件动态获取数据显示的方法.分享给大家供大家参考.具体分析如下: 下面的JS代码通过ajax检索xml文件的内容动态展示到网页,真个页面无刷新 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 2

C++内存泄露,只是动态申请对象,然后delete就发生了内存泄露,真奇怪。

问题描述 C++内存泄露,只是动态申请对象,然后delete就发生了内存泄露,真奇怪. 今天写了个样例程序,程序主要是动态创建一个类的对象,存入list链表中,然后再把链表中的对象delete掉回收内存,理论上并不应该会产生内存泄露,但是从现象上来看确实是发生了内存泄露.程序启动后我分别在"创建对象前"."创建对象后"."释放对象内存后"三个阶段使用命令ps -aux|grep a.out查看了程序使用内存情况,发现在"释放对象内存后&

关于修改xml 文件中数值的问题

问题描述 关于修改xml 文件中数值的问题 10C 请问大神:如何修改xml文件中的数值为其一半,即 25,30,35.方法不限,最好有具体可执行的代码. #别的代码< void property=""exp""> < int>50 < /void> #别的代码< void property=""exp""> < int>60 < /void> #别的代码

如何使用动态共享对象的模式来安装PHP_php基础

PHP 通常被安装在 Linux/Unix 操作系统上,并且搭配 Apache 服务器一起使用.在将 PHP 与 Apache 服务器一起安装的时候,你有三种不同的安装方式可以选择:静态模块,动态共享对象(Dynamic Shared Object, DSO)以及 CGI 程序执行文件.  在这里我建议大家使用动态共享对象的模式来安装 PHP,这是因为这种安装方式为日后的维护与升级提供了极大的便利.假设你一开始安装 PHP 的时候,只加入了PHP 的数据库相关模块.几天以后你决定再加装 PHP 

javascript-求前端大神解释js动态访问对象属性的问题

问题描述 求前端大神解释js动态访问对象属性的问题 在js我有一个这样的需求:对象temp里面有name1name2,name3 属性这样访问属性:temp.(""name""+1)temp.(""name""+2)temp.(""name""+3)为什么不行?但是在groovy里是可以的 解决方案 这个市解释器不一样吧你要是使用 temp['name'+1]肯定是好使的.所以编写的js