EDT资源绑定(Resource Binding)简介

EDT资源绑定(ResourceBinding)简介

资源绑定(ResourceBinding)是EGL语言的优秀特性之一,资源绑定简单来说就是对如何连接数据库或者如何调用服务的一种描述。你可以在EGL的部署描述文件(deploymentdescriptor)中维护这些绑定,这些绑定可以看做你的程序逻辑的延伸。当你在进行应用的开发和部署的时候部署描述文件就可以提供具体的连接和调用细节了。

1 典型流程

对于服务的绑定和数据库的绑定来说他们的绑定机制其实是相同的。典型的流程就是在EGL资源描述文件中定义一个资源绑定,这个资源绑定通过以下两种方式之一去建立一个变量和一个已有的资源绑定之间的联系:

  • 调用SysLib.getResource函数

  • 编写一个Resource注释(annotation

下面是调用函数的代码示例,这段代码只能在EGL函数中被调用:

myServiceMyInterfaceType?;

myService= SysLib.getResource("binding:myBinding");

下面是对应的采用注释(annotation)的代码示例,这种方式可以被应用在EGL程序的任何位置,只要这个位置是可以声明变量的:

myServiceMyInterfaceType?{@Resource{uri="binding:myBinding"}}; //.8 syntax
//another declaration
myService02MyOtherInterfaceType?{@Resource};

rui 注释项是一个可选项,它缺省的指向和它同名的资源绑定。例如:对于之前提到的注释,缺省的 uri 字段值就是“ binding:myService02”

关于如何决定是采用“函数”还是“注释”来绑定资源,可以参考一下两点:

  • 如果你要在运行时(runtime)调用已存在的绑定,当生成的输出调用代码同SysLib.getResouce函数相同的时候,可以采用“函数”法绑定

  • 如果你想显性的定义一个EGL部署描述的时候,可以采用“注释”法绑定

    myServiceMyInterfaceType?;
    
    myService= SysLib.getResource("binding:myDDFile#myBinding");
    
    
    //equivalent annotation
    
    myServiceMyInterfaceType?
    (@Resource{uri= "binding:myDDFile#myBinding"}};

如果你没有定义EGL部署描述文件的话,被引用字段就是你现在正在使用的那个。在开发时(developmenttime)这个被引用字段被定义在项目的这个属性内:DevelopmentDeployment Descriptor。在部署时,被引用的部署描述就是你正在部署的那个。


2 在代码中如何实现绑定

一个资源绑定囊括了一系列的对于绑定特征描述的字段。例如,一个REST服务绑定的字段和一个SQL数据库绑定的字段是不同的。通过绑定类型的定义你可以更好的定义资源绑定,这将比利用传统的定义过程具有优势。

  • 你可以将一个适当的绑定类型定义成一个变量。然后你就可以把参数字段的值赋给刚才定义的变脸,并且有这个变量来调用你的资源了。在这种情况下,你的这个资源绑定在你的代码中应该是唯一的。

  • 对于服务绑定来讲,你可以在代码中对那些在EGL部署描述文件中定义的变量值进行初始化并且可以在代码中对他们进行更新。


3 服务绑定(ServerBinding)

如果一个资源绑定目的是为了调用一个服务,那么这个绑定就是一个服务绑定(ServerBinding)。服务绑定主要包含如下三种情况:

  • 如果要绑定的服务被部署在了一个应用服务器上,你可以为这个服务声明一个通用资源标识(URI)。这个URI需要以http:开头如果http:前缀隐藏的话,那么这个URI需要是如下形式的一个字符串。

//myserver:8080/myproject/restservices/myService

虽然在你进行EGL调试的时候可以调用这样的已经部署好的服务,但是EGL调试器是不能调试进入这个服务的内部的。

  • 如果你要绑定的服务就在你的工作空间(workspace)之内并且这个服务是用EGL编写的。你可以利用工作空间URI来绑定它。这个工作空间URI是一个指向工作空间位置的标识。如下面例子所示:

workspace://mySourceProject/servicepackage.myService

在这种情况下,URI尽在开发的时候起作用,EGL内置的服务器允许你对你的代码进行调试(包括调试你的服务)。但是这种绑定方式的缺点是不能在部署状态下应用。所以你必须对你的服务进行部署,同时调整你的绑定方式。这样你才能在部署状态下调用服务。这在后面的文章中会做介绍。

  • 如果一个你开发的RUI应用包含服务的话,这个服务将被部署成为一个专属服务(DedicatedService)。EGL内置的服务器允许你对这个服务的代码进行调试。在这种调试的情况下,你的EGL项目并不会使用项目的部署描述文件。这种绑定的重点就是一个DedicatedServiceannotation,这个annotation是服务调用变量定义的一部分。

例如,一个名叫MyServiceType的服务是一个dedicatedservice,它的定义将是这样的:

myServiceMyServiceType {@DedicatedService};

4 在EGL部署描述文件中定义服务绑定

在这部分,你将学会绑定一个REST服务或者一个EGLREST-RPC服务。这两种服务的区别可以参考:http://www.eclipse.org/edt/papers/topics/egl_soa_overview.html

EGL部署描述文件中定义一个服务绑定,需要如下步骤:

  • 在你的EGL工程中,展开EGLSource文件夹,双击部署描述文件,他的名字以egldd结尾。

  • 点击ResourceBindings标签,资源绑定配置(ResourceBindings Configuration)页面将显示出来

  • 点击Add按钮,在添加资源绑定页面,选择RESTService Bingding。这是添加RESTService Bingding的页面将出现。如下图所示:


  • 在最上面的位置,填写绑定名。你可以参考你代码中的服务名,无论他是一个Resourceannotation还是一个在SysLib.getResource函数中被调用的声明。

  • BaseURI位置,填写一个URI,他可以是一个工作空间(workspace)URI

    • 如果你要调用一个EGLREST-RPC服务,你需要声明一个完整的URI

    • 如果你要调用一个第三方REST服务,你可以只把上层服务的信息填写进来。然后在接口类型中对他们的具体的服务变量进行补充。关于这种定义方式。可以参考后面的章节“创建调用REST服务的接口”

  • sessionCookieID可以不填

如果你要为你的工作空间里的服务类型定义一个服务绑定的话,你必须确定这个服务会被部署。

  • 首先切换到服务部署标签。如果这个服务没有列出来的话,请点击Add按钮,这样一个添加网页服务的页面就会出现。

  • 选中你打算添加的服务,然后分别点击AddFinish按钮。这样这个服务就被添加成功,并且网页服务部署页面会重新显示在你面前。如下图所示:


  • 保存这个更改过的部署描述文件。


5 在源代码中检索服务绑定

你可以通过如下源代码对一个访问服务的变量进行重新绑定:

myServiceMyInterfaceType?;
/*that declaration could have included
aResource annotation, as shown here:
myServiceMyInterfaceType?
{@Resource {uri="binding:MyGermanBinding"}}; // .8 syntaz
if( ... )
myService= SysLib.getResource("binding:MyEnglishBinding"); // .8syntax
else
myService= SysLib.getResource("binding:MyFrenchBinding"); // .8syntax
end

/*here, you can access the service operations of
oneor the other service, assuming that the two
havesimilar interfaces. */


6 在源代码中检索和修改服务绑定

下面的代码片段演示了如何访问一个第三方的REST服务:

myServiceMyServiceType?;
httpHttpRest{@Resource{uri="binding:myService"}}; /.8 syntax
http.request.encoding= encoding.json;
callmyService.myFunction() using http /.8syntax
returningto myCallBackFunction
onExceptionmyExceptionHandler;

这些源代码是这样工作的:

  1. 声明一个访问变量

这个声明会引用一个接口,这种接口的通常会包含一个或者多个的uriTemplate注释域(annotationfield),每个接口是一个可以在运行时被解析的底层URI标示符。这个接口模板通常如下所示:

/GetWeatherByZipCode?zipCode=27709 
  1. 访问一个HTTPRest对象的实例

这个对象通常一个如下所示的上层的URI

http://www.example.com/myproject/restservices/weather_service

在这种情况下,这个HTTPRest对象包含了从EGL部署描述中定义的服务绑定中抽取出来的详细内容。如果你没有制定一个注释域的话,那么这个服务绑定就会被自动定义成和你定义的服务绑定变量同名。在上面的例子中,注释域的名字将被缺省的定义为”bingding:myService”

关于HTTPRest对象的详细解释,请在EGL帮助文档中搜索关键字”eglx.httppackage”

  1. HTTPRest对象添加详细内容,例如,要确保传入服务的数据和从服务返回的数据是符合JSON格式的。

  2. 调用函数ServiceLib.completeBind使得服务绑定变量指向一个HTTPRest对象。


7 在源代码中创建服务绑定

如果EGL部署描述文件没有包含你需要的服务的话,你也可以在代码中直接创建一个服务绑定。如下面的代码所示:

myServiceIMyService?;
httpHttpRest = new HttpRest{
restType= eglx.rest.ServiceType.TrueRest,
uri= "www.example.com/myproject/restservices/weather_service"};
myBinding.request.encoding= Encoding.json;
callmyService.myFunction() using http // .8syntax
returningto myCallBackFunction
onExceptionmyExceptionHandler;


8 在EGL部署描述文件中定义一个SQL数据库绑定

如果定义一个资源绑定的目的是连接数据库,那么这个资源绑定就被称作SQL数据库绑定。

当你在EGL部署描述文件中定义SQL数据库绑定的时候,你需要将应用程序在运行时要用到的一系列的参数都描述清楚,同时还需要向EGL部署引擎提供详细的数据库配置信息。

下面是定义数据库绑定的步骤:

  1. 打开一个EGL项目,展开EGLSource文件夹,双击该项目的部署描述文件(DeploymentDescriptor),这是一个以.egldd结尾的文件

  2. 点击资源绑定(ResourceBindings)标签。这是资源绑定配置页面就会显示出来。

  3. 点击Add按钮,添加资源绑定页面就会出现,这时请选择SQLDatabase Binding。这样添加SQL数据库绑定页面就会出现,如下图所示:


为了指明绑定的详细内容,你可以有三个选择:

  • 使用在Eclipse的数据库连接选项中已经保存的数据库连接,这时你可以选择第一个选项,然后指向一个已有的数据库连接即可。或者也可以通过点击New按钮添加一个新的Eclipse数据库连接项。

  • 直接在绑定定义中描述数据库连接的详细信息,采用这种方式可以选择第二个选项。

  • 使用在应用服务器中已经定义好或者将要定义的一个JNDI数据源,采用这种方式的时候,你的连接信息就是在这个页面上选择的JNDI数据源。

如果你的代码运行在一个通过Java企业版编译而成的应用服务器上,JNDI可以让你的数据库连接在面向多用户访问的时候拥有更快的速度。


如果你打算将你的代码部署到一个ApacheTomcat服务器上,你可以这样配置你的JNDI

  • 将绑定信息通过你一种或者第二种方式配置完毕。

  • 同时选择第四个选项,这样JNDI名和其他的数据库信息将从你已经配置好的信息中自动获得。这些信息会在EGL进行部署的时候被包装起来,JNDI的内容也会被保存起来,这样你访问数据库要用的用户名和密码等信息就都被存储在了服务器上。

如果你选择使用第一种方式,你对数据库连接的改动只能在开发时起作用,因为之前的信息已经被部署到服务器上了,你想要让你的改动在运行时生效的话,必须重新部署你的应用。


9 在源代码中使用SQL数据库绑定

你可以声明一个数据库连接变量,当你第一次用这个数据库变量去访问数据库的时候,它会根据绑定的信息去发起连接。

如下所示是通过调用一个EGL部署描述文件中定义的SQL数据库绑定来访问数据库,下面是声明连接变量的例子:

myDataSourceSQLDataSource?
{@Resource {uri="binding:"MyDatabaseBinding"} };

这个声明对于绑定的数据库是否通过JNDI连接都是有效的。同时你也可以声明一个连接JNDI数据源的数据库连接变量,但是这种类型的数据库连接变量如果指向一个非JNDI类型的数据库绑定的话,在运行时就会出现错误。

myJNDIDataSourceSQLJNDIDataSource? {
{@Resource {uri="binding:MyDatabaseJNDIBinding"} };

你的代码可以使用上面提到的各种数据库连接变量,使用SQLDataSource这个类型来调用它们是非常简单有效地。你可以利用下面的代码来访问一个SQL数据库绑定:

myDataSourceSQLDataSource? =
SysLib.getResource("binding:MyBinding"); // .8 syntax

myJNDIDataSourceSQLDataSource? =
SysLib.getResource("binding:MyJNDIBinding"); // .8 syntax

myOtherJNDIDataSourceSQLJNDIDataSource? =
SysLib.getResource("binding:MyOtherJNDIBinding"); // .8 syntax

10 在源代码中创建一个SQL数据库绑定

你也可以直接在源代码中创建一个SQL数据库绑定,但是在这种情况下,你的EGL部署描述文件对于这个数据库绑定就不起作用了。例如下面的例子演示了如何连接一个非JNDI类型的数据源:

connectURLstring = "jdbc:derby:SomeDB;create=true;";
propertiesDictionary{user = "MyID", password = "MyPassword"};
myDataSourceSQLDataSource? = new SQLDataSource(connectURL, properties);
下面的例子和上面的例子功能相同,不同的是它连接的是一个 JNDI 数据源:

connectURLstring = "jdbc/myDataSource";
propertiesDictionary{user = "MyID", password = "MyPassword"};
myJNDIDataSourceSQLJNDIDataSource? =
newSQLJNDIDataSource(connectURL, properties);
前面已经提到过,任何数据库连接变量都是基于 SQLDataSource 类型的。

下面的代码演示了如何应用一个JNDI类型的连接:

connectURLstring = "jdbc/myDataSource";
myJNDIDataSourceSQLJNDIDataSource? = new SQLJNDIDataSource(connectURL);

11 为了其他的用途使用连接变量

连接变量还可以应用于下列其他的用途:

  • 获得/设置isolationlevel,这是用于声明两个用户的数据库事件这间的独立性级别的一个变量

  • 设置/获得autoCommit的值,这个值用来指明数据库的更改是否被自动接受

  • 指明你在代码中定义的SQL语句将被用于哪个database schema

  • 测试数据库连接是否有效

  • 获得运行时的警告

你可以查阅帮助文档中的"SQLDataSourceexternal type"内容获得更加详细的说明。


上一篇:使用EGL Rich UI访问数据库(9-12课)下一篇:EGL单元测试框架EUnit介绍


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值