pb11+webservice开发分布式三层应用
- 格式:pdf
- 大小:4.19 MB
- 文档页数:25
webserv ice服务器端会提供ws dl接口文档,pb里面用we b service proxy wizard从wsdl 生成对象,再调用即可(注意把c:\program files\sybase\shared\powerbu ilder下面的pbso apclie nt90.pbd加入ta rget),代码样例:SoapCon nectio n lsc_con nsoapser vice lproxy_objString ls_prox y_name = "soapser vice "//生成的代理对象名称String ls_url = "http://localho st:8080/axis/service s/SoapSer vice "//web service url//lsc_con n = Create SoapCon nectio nlsc_con n.SetOpti ons( "SoapLog=~ "soaplog.txt~ " ")int li_ret,ili_ret = lsc_con n.Createi nstanc e( lproxy_obj, ls_prox y_name, ls_url)If li_ret<> 0 ThenMessage Box( "错误", "调用失败,错误号码: " + String(li_ret))ReturnEnd Iftns1__r equest conten t lst_req uestlst_req uest.arg1 = 5lst_req uest.arg2 = "test "tns1__r eturnr esult lst_res ultlst_res ult = lproxy_obj.GetResu lt(lst_req uest)Message Box(String(lst_res ult.result), "code: " + lst_res ult.reason.code + "~nmessag e: " + &lst_res ult.reason.message + "~ndesc: " + lst_res ult.reason.desc )注意pb调用w ebserv ice只能返回简单的in t string类型,复杂的结构会出错怎么样在pb9里面调用We bServi cepb9也出来了,速度够快的,大概看了一下,与pb8比较,增加的功能不多,主要是WebService,Xml和Ejb.我就感受了一下p b9的We bServi c e功能,与大家共享。
J2EE――分布式的多层应用程序――摘自J2EETutorial1.4.1J2EE平台使用多层分布式的应用模式。
应用逻辑根据其功能分成多个组件,这些应用组件组成了分布在不同机器上的J2EE应用,同时它们依赖于属于它们的各个层。
下面列出了位于不同层的组件. 运行在客户机上的客户层组件. 运行在J2EE服务器上的网络层. 运行在J2EE服务器上的逻辑层. 运行在EIS服务器上的企业信息层通常J2EE应用程序可以用下图表示,从图中可以看出,J2EE应用程序通常由三层构成,因为他们分布于三个不同的物理位置:客户端,服务器,后台数据库服务器。
通过这种方式运行的三层应用模式拓展了基于客户/服务的两层模式。
一.J2EE组件J2EE应用程序由组件构成。
一个J2EE组件是自包含的、与其相关的类和文件一起被集成到J2EE应用程序中并与其他组件通信的功能软件模块。
J2EE规范定义了下面几类组件:。
运行在客户端的应用客户程序及小程序。
运行于服务器网络的Servlet&Jsp组件。
运行于服务端的企业逻辑组件——EJB。
J2EE组件用Java语言编写,它的编译方式与其他的应用程序没什么两样。
J2EE组件与标准Java类的不同之处在于J2EE组件已经证明能很好的集成到了应用程序中,并且与J2EE 规范兼容,它们被部署到负责运行、管理的J2EE服务器上。
二.J2EE客户端J2EE客户端可以是网络浏览器也可以是桌面应用程序。
网络浏览器网络客户程序由两部分组成:动态网页包含各种标记语言(HTML,XML等),它由运行于网络层的网络组件产生,浏览器从服务器接受信息并反馈到页面上。
网络客户端又称为瘦客户。
瘦客户端通常不运行像查询数据库,执行复杂的业务规则,或连到合法的应用程序。
在使用瘦客户时,重量级的操作都被载入到运行于J2EE服务器上的企业Bean中,它能够均衡安全,速度,服务及可靠性。
●小程序网页可以包含小程序。
小程序是一个较小的用java语言编写的程序,它能通过安装在浏览器上的虚拟机运行。
PB环境下分布式应用程序的开发一、分布式应用程序概述分布式系统的出现源于传统的C/S结构的若干弊病,如效率低,安全性差等,结合到数据库方面来说,全球的DNS(域名解析系统)系统是一个很典型的例子,试想如果把全世界所有的域名都集中到一台服务器中来进行管理,那服务器肯定会因负载过重而无法正常工作,整个互联网也就瘫痪了。
在编写C/S结构的数据库应用系统时,同样也会遇到这类问题,那就是如果客户数量很多,数据量又都很大的情况下,服务器的负载就会很重,而且重复性工作很多,因为很多客户发出的查询可能完全相同而服务器却需要一一进行查询;同时查询算法存储于客户端,这可能不适合一些商业环境,因为算法本身可能是需要保密的。
如果能够在传统的服务器和客户机之间再加一个服务器用于存储查询算法和临时查询结果,则以上问题均得到了解决。
这正是分布式系统的工作原理。
二、在PB环境下如何进行分布式应用程序的开发下图是分布式系统的工作原理图:图(一)首先,分布式服务器必须建立与数据库服务器的连接,可以通过ODBC接口来实现,本文不在叙述,下面要讲述客户端如何通过分布式服务器来访问数据。
在PB环境下要实现分布式的编程,首先在DTS端,需要用到两个对象,一个TransPort对象和一个不可视的用户对象(Classà Custom,Nonvisible Object,以下简称NVO),其中TransPort对象用于响应客户端的连接请求,NVO 对象用于和客户端进行实际的数据传输。
在客户端也需要用到两个对象,分别是Connection对象和代理对象(NVO-Proxy),其中Connection对象用于建立到DTS 的连接,NVO-Proxy 实际上是与NVO一一对应的,它只是NVO的一个代理,在客户端通过此代理对象来调用NVO的函数来实现相关功能。
以下是TransPort对象和Connection对象的常用属性及方法:1、TransPort对象属性:Driver:可选的值有四个,分别是WinSock、NamedPipes、OpenClientServer 和Local,由于Winsock的通用性,一般情况下都选择Winsock。
使用PowerBuilder 6.0开发分布式三层应用程序作者:陈俊明本文档是在PowerBuilder 6.0的基础上产生。
所有内容均为实践中所得,所有代码在程序中均通过(机器配置:P200/64M/6.4G)。
在文章的最后,还有一个通用的服务器框架应用程序,您可对服务器程序只加入您的分布对象即可完成服务器程序。
由于水平所限,错误在所难免,还请大家指正,我的EMAIL是CHENJM@,发邮件时请在主题中加入POWERBUILDER字样。
概述只要有过MIS程序编程经验的程序员都知道,一般情况下,整个MIS应用系统分为两部份,即分为数据库服务器和前台程序(即平时我们所说的C/S结构)。
在这种体系统结构下,应用系统的逻辑实现几乎都是通过前台程序即客户端来体现,少量保存在数据库服务器中(以存储过程的形式),在业务和管理形式没有变化的情况下,这种结构工作得非常好。
可是当业务逻辑发生变化时,我们就需要对客户端程序进行修改和重新编译,并把新程序发布给用户,有时(大多数时候)还要对客户重新进行培训。
可以说,C/S体系结构不能很好的适应未来系统的发展。
正因为此,在软件界逐渐形成另一种应用体系结构即数据库服务器、应用服务器和前台程序。
在这种结构下,几乎所有的商业逻辑都在应用服务器中实现,前台程序只是通过应用服务器提供的接口来实现其功能。
修改商业逻辑,只需要修改应用服务器程序,只要保持对前台程序的接口不发生变化,前台程序可以不用作任何修改即可实现功能的转变,并体现新的商业逻辑,其优点是显而易见的。
PowerBuilder 6.0是当今用于与数据库有关的应用系统开发的首选工具,它支持几乎所有当前流行的数据库服务器,具有可视化的面向对象编程环境,使其非常易于使用。
从5.0版本开始,PowerBuilder支持C/S体系结构和分布式计算体系结构的应用。
本文的主要目的是通过对用PowerBuilder开发分布式计算体系结构应用的学习,使读者能够基本掌握分布式计算体系结构应用的开发。
pb11开发webservice⽤pb11开发webservice真是很简单,现在我把搭建的过程简单描述⼀下。
1、服务端打开pb11,选择菜单file->new->target->.net web service,然后⼀路next,最后⽣产的项⽬⽂件中⾄少包含三项,⼀个webservice应⽤,⼀个p_webservice部署,⼀个n_webservice⽤户对象,然后在这个n_webservice对象中写⾃⼰的公开函数,即可。
例如,函数string wf_getdw(ref string synac)SQLCA.DBMS = "" SQLCA.LogPass = "123456" SQLCA.LogId = "sa" SQLCA.AutoCommit = FalseSQLCA.DBParm = "Namespace='System.Data.SqlClient',Database='mydb',DataSource='.'"connect;datastore lds string ls_rtnlds = create datastore lds.dataobject = "dd" lds.settransobject(sqlca) lds.retrieve()synac = lds.describe("datawindow.syntax") ls_rtn = lds.describe("datawindow.data")disconnect; destroy ldsreturn ls_rtn然后部署web service,打开p_webservice,可以看到有⼏个属性页,其中有⼀个“objcet”页,可以看到你要发布的函数列表。
以下是一个使用PowerBuilder(PB)调用WebService的示例,字数超过1500字。
首先,确保你已经在PowerBuilder中创建了一个WebService方法,并将其发布为IIS 方式。
然后,按照以下步骤进行操作:创建PB的解决方案文件:在PowerBuilder中创建一个新的解决方案文件,并确保引用了一个pbwsclient11.pbd文件。
这个文件在安装路径中可以找到。
创建对象:从"工具箱"中拖动一个"WebServiceProxyWizard"图标到PowerBuilder的设计界面。
这将创建一个新的对象,用于调用WebService。
连接SOAP对象:在代码编辑器中,使用以下代码连接SOAP对象:ls_s1 = "abc"ls_s2 = "def"// 连接SOAP对象if ole_ws.ConnectToNewObject("MSSOAP.SoapClient30") < 0 thenif ole_ws.ConnectToNewObject("MSSOAP.SoapClient") < 0 thenthrow CreateRuntimeError(ls_error)end ifend if这段代码将尝试连接到两个不同的SOAP客户端对象。
如果连接失败,将抛出一个运行时错误。
初始化WebService地址:使用以下代码初始化WebService的地址:vbnetole_ws.mssoapinit(ls_address)其中,ls_address是WebService的WSDL文件路径。
调用方法:使用以下代码调用WebService方法:vbnetls_return = ole_ws.addstr(ls_s1, ls_s2)其中,addstr是WebService方法名,ls_s1和ls_s2是方法的参数。
PB调用各类WebService或c#程序慢慢的有很多接口pb都已经无法调用了,还有一些进制计算,位移等pb都无法实现,这时最简单的就是用c#做好,让pb调用。
但是pb只能调用最基础的c++开发的标准dll。
通过无数次的百度,我找到了一个好的方法,也许您已经知道了。
但是我觉得还是要写出来,只要还有一个为此发愁的朋友存在。
谢谢!方法思路是:1、用c#写一个类,方法的参数一定要用标准数据类型,返回值也要是标准数据类型(string、int或者结构等等)。
在这个方法里面调用各类webservice或其他http接口等pb无法直接调用的。
2、我正巧要做一个调用java写的webservice,下面贴出代码,供参考,因为用csc.exe编译程序无法处理引用,所以using System;using System.Collections.Generic;using System.Text;using System.Security.Cryptography;namespace ysxt{public class ws{public string sendrecv(string sUser, string sPwd){string retu = "";try{xjca.YsxtMainServiceImplService myrefe = new xjca.YsxtMainServiceImplService(); //这里就是解决csc.exe无法编译引用问题的,xjca是在另外一个ysws.cs文件里,这个cs文件不是我写的,也不能写出来,这是用另外一个命令生成出来的,具体命令看本文最后备注myrefe.Url = myUrl;retu = myrefe.sendRecv(sUser, sPwd);}catch (Exception e){return e.Message;//一定要用try....catch,否则pb调用过程中出现错误,都没有办法知道哪里错了,这句话就是关键。
pb+webservice开发分布式三层应用(演示或测试例程代码:WebserviceExample.rar)一、 WEBSERVICE服务端的开发1、新建立一个workspace工作区先择FILE菜单下的NEW,选择标签页‘Workspace’新建一个工作区。
点击后出现下图在文件名处输入工作区的名称,假设我们的工作区名为webserver,单击保存按钮。
这样工作区就建立成功了。
2、建立一个.net web service 应用点击FILE菜单下的NEW选中.net web service 点击ok按钮点击next按钮点击next按钮这里我们不修改pbl库名,当然你可以按你的意思修改库名,点击next 按钮。
一直点Next按钮直到出现这里需要注意一点,如果你当前的IIS端口,不是默认的80 ,假设是7000的话,那么在localhost后面要加上“:7000” ,。
再点击一次next直到finish按钮。
3、连接数据库(建立测试环境所用文件CreateENV.sql)我们先来建立一个数据库的连接以为后期的webservice服务提供一个连接。
打开系统生成的n_webservice对像在其constructor里面写上SQLCA.DBMS = "ODBC"SQLCA.AutoCommit = FalseSQLCA.DBParm = "ConnectString='DSN=localdbora8;UID=scott;PWD=tiger',PBCatalogOwner='scott'"我是拷贝的这里你可以修改成你的数据库连接参数。
数据库连接建立完成后,我们再建立一个uf_retrieve的方法用来提取数据库数据long ll_row,ll_returnrowstring ls_oldsql,ls_newsql,ls_err_a,ls_errorint i,LI_WHEREdatastore ds1ds1 = create datastoreconnect using sqlca;if SQLCA.SQLCode <> 0 thenp_ref_returnerr="连接数据库出错,请检查数据库连接参数。
SQLCA.sqlcode=" & + string(sqlca.sqlcode) + "~r~n"+string(sqlca.DBParm) + "~r~n"+string(sqlca.sqlerrtext) return -1////创建数据窗口出错end ifif len(p_dw_syntax) < 100 thends1.dataobject=trim(p_dw_syntax)//// 我的想法是通过可以传递datawindow名称,而不是几K的Datawindow语法//// 来减轻网络通讯量(考虑到通用性,此想法可免了)// if NOT IsV alid(d_emp) then// disconnect using sqlca;p_ref_returnerr="服务端加载数据窗口出错! '"+trim(p_dw_syntax)+"'不存在?" // return -1////创建数据窗口出错// end ifelseif ds1.create(p_dw_syntax,ls_error)<>1 thendisconnect using sqlca;p_ref_returnerr="服务端重建数据窗口出错! "+ls_errorreturn -1////创建数据窗口出错end ifend ifint li_ali_a=ds1.settransobject(sqlca)if li_a<>1 thendisconnect using sqlca;p_ref_returnerr="服务端设置数据存储事务出错!"return -1///设置对像事物出错end ifls_oldsql=ds1.getsqlselect()if trim(ls_oldsql)='' or isnull(trim(ls_oldsql)) thendisconnect using sqlca;p_ref_returnerr="传入的数据窗口对像sql语法为空!"return -1 //取新窗口语法出错end ifls_newsql=ls_oldsql //先赋值LI_WHERE = pos(UPPER(ls_oldsql),'WHERE',1)IF trim(p_where_clause) <>'' thenIF LI_WHERE = 0 THENls_newsql=ls_oldsql +' '+ p_where_clauseELSEls_newsql=mid(ls_oldsql,1,LI_WHERE - 1 ) +' '+ p_where_clause END IFEND IFif trim(ls_newsql)='' or isnull(trim(ls_newsql)) thendisconnect using sqlca;p_ref_returnerr="连结后的sql语法为空!请检查传入的数据窗口对像sql语法。
"return -1 //取新窗口语法出错end ifif Match ( ls_newsql, '"' ) thendisconnect using sqlca;p_ref_returnerr="重组后的sql语法出错,数据窗口语法不能包含双引号!"+ls_newsql return -1//设置新窗口语法出错elseif not Match ( upper(ls_newsql), "WHERE" ) thendisconnect using sqlca;p_ref_returnerr="重组后的sql语法出错,数据窗口必须包含一个where条件"p_ref_returnerr += ls_newsqlreturn -1//设置新窗口语法出错end ifif ds1.modify( 'DataWindow.Table.Select="' + ls_newsql+'"' )<>"" thendisconnect using sqlca;p_ref_returnerr="重组后的sql语法出错,请检查数据窗口对像SQL语法。
"+ls_newsql return -1//设置新窗口语法出错end ifll_row=ds1.retrieve()if ll_row<0 or isnull(ll_row) thendisconnect using sqlca;p_ref_returnerr="数据检索出错!"+ls_err_a+ls_newsqlreturn -1//服务端检索数据出错end ifif ds1.modify('DataWindow.Table.Select="' + ls_oldsql+'"' ) <>"" thendisconnect using sqlca;p_ref_returnerr="还原旧数据窗口语法出错,请检查数据窗口对像语法是否含有双引号。
"p_ref_returnerr += ls_oldsqlreturn -1 //还原旧数据窗口语法出错end ifll_returnrow=ds1.getfullstate(p_ref_dwoblob)if ll_returnrow<0 or isnull(ll_returnrow) thendisconnect using sqlca;p_ref_returnerr="服务端进行blob时,获取数据行出错!"return -1 //封装到blob变量时出错end ifdisconnect using sqlca;destroy ds1;p_ref_returnerr="数据检索成功!"return ll_returnrow4、把服务端发布到IIS服务选中我们的P_webservice,右键点击,点击Deploy 编译,pb11会自动将webservice发布到我们原来定义的IIS服务器上发布的时候要注意一点就是在objects选项卡上,必须先中我们上面的函数(或者叫方法),library list选项卡上要选上我们的pbl库文件。
关闭所有打开的窗口,然后Deploy(编译)。
1、编译完成后run一下我们的webservice看看是否发布成功,出现上图并能看到我们定义的函数,webservice就算是发布成功了。
(呵呵....)其它可能有参考意义的图片(PowerBuilder125/.NET4样例)这样我们就完成了一个服务端检索方法。
下一节我们接着继续讲解如何用客户端检索数据。
二、 客户端调用webservice1、建立一个PB应用点击确定后点击finish 完成2、给工程附加pbsoapclient110.pbd (或pbsoapclient125.pbd,宜与PB版本对应)这个文件通常在pb11的安装目录里,可以通过搜索找到它,然后将这个文件拷贝到我们新建应用的目录下,并附加到工程里面来。
3、为应用添加一个webservice proxy函数添加完成后在工程里面添加一个窗口,我们来实验一下我们前面的工作注意:应用程序要与webservice通讯都要通过webservice proxy来完成,所以我们首先要建立一个proxy。
(小提示:对已经建立了Proxy的,如果web端定义发生了‘复杂’变化,客户端简单deploy失败时,可删除客户端与本proxy相关的内容,在保留其它内容的前提下,重新建立Proxy,重新Deploy。
)Ok后,一直点击next,在WSDL File Name指定页面,填写如下:面去找,如下图然后一直Next,直到下图填写如下:打开我们刚才定义的代理,并Deploy编译。