继续更新学习进度

远程调用技术代码追踪之WebService 远程调用技术代码追踪之WebService DOC文档 立即下载

为了不让过去走的弯路白走,所以自己一定要记录下这一路的“风景”。在之前我们实现了Delphi调用EJB,但是我们一直用的都是Delphi自己给我们生成的WSDL Importer,在接口文件中有根据wsdl分析得出的EJB方法,接下来问题就来了,如果我们每一次发布一个EJB工程,就需要每一次都Import一下,这样一来就十分不方便,所以为了改进,我们将所有EJB的方法都放在一个方法中,这个方法有两个参数,第一个参数代表第几个方法,也可以是方法名字,第二个参数是方法要传递到参数。这样做的好处有两点:1、我们可以不用改接口文件,同样在wsdl中就只有一个方法,比起有一大堆方法,这样加载起来更加迅速2、当别人通过浏览器看wsdl时也不知道我们写了什么方法,防止有人闲的无聊对服务器进行捣乱。。。然而对于第二个参数的传递我们有了实现好的约定,用字符串来传递并且用特定的分隔符将传进去的参数分隔开,在EJB中进行判断,然后将相应的参数存到相应的变量中,所以说这样一来对于参数的顺序有都变得随意,稍微简化了客户端的操作,当然函数返回的参数值是String类型。

接下来让我们来看下Importer生成的单元中系统给的代码。我的EJB中有两个方法DBConnection和UpdateInfo

 <textarea readonly="readonly" name="code" class="Delphi"> 
unit DBConnection1;

interface

uses Soap.InvokeRegistry, Soap.SOAPHTTPClient, System.Types, Soap.XSBuiltIns;

const
  IS_OPTN = $0001;
  IS_UNQL = $0008;


type
  //系统自动生成代码。。。
  
  DBConnection = interface(IInvokable)
  ['{7846D3B7-919A-4FF5-4D9A-446678551BF4}']//GUID,128位数字通过算法结合网卡MAC地址和电脑自带的时钟把数字转化成左边的一串东东
    function  GetDataSet(const arg0: string): string; stdcall;
    procedure UpdateInfo(const arg0: string); stdcall;
  end;

function GetDBConnection(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): DBConnection;
//这是系统给我们的用于接口实例化的函数,我们可以传URL或者是WSDL

implementation
  uses System.SysUtils;

function GetDBConnection(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): DBConnection;
const
  defWSDL = 'http://localhost:8080/GetData/DBConnection?wsdl';
  defURL  = 'http://localhost:8080/GetData/DBConnection';
  defSvc  = 'DBConnectionService';
  defPrt  = 'DBConnectionPort';
var
  RIO: THTTPRIO;
begin
  Result := nil;//因为我们在用WSDLImport的时候给了wsdl所以当我们再次接口实例化的时候如果传的部分参数是空,程序就会用一开始给的wsdl
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
    RIO := THTTPRIO.Create(nil)
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as DBConnection);
    if UseWSDL then
    begin
      RIO.WSDLLocation := Addr;
      RIO.Service := defSvc;
      RIO.Port := defPrt;
    end else
      RIO.URL := Addr;
  finally
    if (Result = nil) and (HTTPRIO = nil) then
      RIO.Free;
  end;
end;

//以下是程序运行时这个单元的初始化代码
initialization
  { DBConnection }
  InvRegistry.RegisterInterface(TypeInfo(DBConnection), 'http://getdata/', 'UTF-8');//其中<span style="font-family: Arial, Helvetica, sans-serif;">http://getdata/是我们EJB工程的目录,包的名字,为了我们每个人编写的方法可以一起用,多以我们把EJB的工程和包的名字作了约定,这样我们需要调用别人的方法时,只需要在接口实例化的时候把他的IP传过去就好了(因为EJB中的方法也约定好的就一个并且名字也一样)</span>

  InvRegistry.RegisterDefaultSOAPAction(TypeInfo(DBConnection), '');
  InvRegistry.RegisterInvokeOptions(TypeInfo(DBConnection), ioDocument);//其中ioDocument是由我们EJB代码决定的,@SOAPBinding(use = SOAPBinding.Use.LITERAL,style = SOAPBinding.Style.DOCUMENT)我选择的是DOCUMENT
  { DBConnection.GetDataSet }
  InvRegistry.RegisterMethodInfo(TypeInfo(DBConnection), 'GetDataSet', '',
                                 '[ReturnName="return"]', IS_OPTN or IS_UNQL);//在类加工厂注册函数和方法、这样才能实例化接口对象
  InvRegistry.RegisterParamInfo(TypeInfo(DBConnection), 'GetDataSet', 'arg0', '',
                                '', IS_UNQL);
  InvRegistry.RegisterParamInfo(TypeInfo(DBConnection), 'GetDataSet', 'return', '',
                                '', IS_UNQL);
  { DBConnection.UpdateInfo }
  InvRegistry.RegisterParamInfo(TypeInfo(DBConnection), 'UpdateInfo', 'arg0', '',
                                '', IS_UNQL);

end.
</textarea>

Ps.在这里补充下关于GUID的相关小知识,因为GUID的使用有IID(接口标识),CLSID(class标识),而本质都是GUID,用于区分不同人编写的东西。

对于JBOSS我们也有了一些新的发现,在SessionBean开始我们写的import带入包,实际上只是在编译的时候可以不出语法错误,而真正的包引入还是依赖于JBOSS的模块。我们发现,当在开头写了import org.apache.xerces.impl.dv.util.Base64;但是在启动JBOSS时还是会报错说找不到类,而后我们在META-INF的MANIFEST中添加了依赖关系Dependencies: org.jdom,org.apache.xerces,JBOSS便不再报错。对此我们猜测在开始时部署了相应的jar包并没有真正的加载进来,也许JBOSS为了提高效率,采用动态加载模块,另外,我们这个Dependencies后跟的是module.xml的模块名字,加入我们把JBOSS的org.apache中文件夹xerces改成tom,把module.xml中模块名字也改成tom,我们还是能找到jar包,因为一个模块对应着一个jar包,而import后的关系是类关系,模块部署的名字是和它不同,只是平常我们建文件夹时的层次和名字和引入类的关系一致。

最后要总结下最近关于向数据库中存图片的过程,首先在本地加载图片,得到图的流(流相当于二进制字节数组+对数组的一些操作),而后对流按照Base64码制进行编码,之后再对生成的字符串进行压缩,压缩之后再次变成二进制,接着Base64编码,然后作为参数传过去就好了,在EJB方法中反着来一遍就好了,因为WebService只认可见字符,转换成Base64码制是必须的。另外关于BLOB类型的插入也需要先一条空的而后在Update。具体方法来自以下http://ligaosong.iteye.com/blog/1072719

FINAL---->老师说要把编程看成乐趣,自己大一并没有做到,现在是时候动手敲写代码啦!2016年3月7日差4分钟第二天

AI在个性化营养方案制定中的应用:从代谢组学到膳食规划 本文章的主要目的是全面探讨AI在个性化营养方案制定过程中的应用,从代谢组学的数据收集与分析,到基于这些数据制定合理的膳食规划。范围涵盖了AI技术在该领域的核心概念、算法原理、数学模型、实际项目应用,以及相关的工具和资源推荐等方面。旨在为科研人员、营养师、软件开发人员等提供一个系统的知识体系,帮助他们更好地理解和应用AI技术来实现个性化营养方案的制定。核心概念与联系:介绍AI、代谢组学和膳食规划的核心概念,以及它们之间的相互联系,并通过文本示意图和Mermaid流程图进行展示。 阅读详情

相关推荐

Solidworks二次开发(C# .NET API):从零构建装配体与虚拟零件

本文详细介绍了使用C#进行Solidworks二次开发,从零构建装配体与虚拟零件的完整流程。通过.NET API实现设计自动化,涵盖环境搭建、核心对象模型、虚拟零件创建与外部化保存等关键技术,帮助工程师将重复性建模工作程序化,大幅提升设计效率与标准化水平。

alice7model的博客 607

Delphi 调用 C#的Webservice 不能传入参数

Delphi7 调用 C#的Webservice 不能传入参数 解决办法: 在Delphi导入WSDL后生成的单元的最后一行,即initialization里的初始化端口的代码中加入代码 InvRegistry.RegisterInvokeOptions(TypeInfo(接口名), ioDocument); 即可 要加在 InvRegistry.Register

pmj888666的专栏 1182

深入解析:el-table合并单元格

  在企业级应用开发中,我们经常需要处理复杂的数据展示需求。在构建复杂的数据展示后台时,我们常常需要将表格中具有相同属性的行进行视觉上的合并,以提升信息的聚合度和可读性。在 Element Plus 的 el-table 组件中,span-method 属性是实现单元格合并的核心机制,允许开发者自定义单元格的合并逻辑,开发者可以通过实现自定义合并策略来满足各种负责需求。  合并行的本质是通过计算相邻行数据的相似性,确定满足合并的单元格范围,然后通过 DOM 操作将多个单元格合并为一个。这种操作在前端数据可视

独泪了无痕 229

Delphi 调用webservice接口

一、使用向导 1.导入wsdl文件:file--new----other----webservice---WSDLimporter---输入wsdl地址 http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl 完成之后,即可导入wsdl文件。 ...

weixin_33901926的博客 859

STM32F103循迹小车PID调参实战:手把手教你整定舵机PD与电机PI参数

本文详细介绍了基于STM32F103的循迹小车PID调参实战,重点讲解舵机PD控制与电机PI参数的整定技巧。通过硬件选型、基础测试、四步调参法和分段控制策略,帮助开发者解决小车蛇形走位等问题,提升循迹性能。文章还分享了高级调试技巧和典型问题排查方法,适用于智能车竞赛和机器人开发。

weixin_42524226的博客 361

【Python&RS】Rasterio库安装+基础函数使用教程

Rasterio是一个Python库,专门用于栅格数据的读写操作。它支持多种栅格数据格式,如GeoTIFF、ENVI和HDF5,为处理和分析栅格数据提供了强大的工具。RasterIO适用于各种栅格数据应用,如卫星遥感、地图制作等。这篇文章跟大家介绍一下Rasterio库的安装以及一些基本函数的使用教程,附带源码。

Remote Sensing迷途小书童 1万+

Delphi客户端访问.NET Webserivce时遇到传入参数为空的问题解决!

1)将WSDL地址通过Delphi 新建导入生成PAS文件; 2)打开该PAS文件,添加以下内容:   InvRegistry.RegisterInterface(TypeInfo(ismpSoap), 'http://tempuri.org/', 'utf-8');   InvRegistry.RegisterAllSOAPActions(TypeInfo(ismpSoap),

阿问的专栏 1904

Unity零基础到进阶 | Unity Shader 深度硬核解析

Unity Shader 是运行在GPU上的可编程渲染程序,是整个引擎渲染体系的算法核心。它通过 Unity 封装的 ShaderLab 语法 + GPU 原生 HLSL 语言编写,定义了「网格数据如何经过光照计算、纹理采样、几何变换、混合测试,最终转化为屏幕像素颜色」的完整规则。 通俗来说:Shader 决定物体「怎么画」,材质(Material)只是 Shader 的参数实例,决定「用什么画」。没有 Shader,材质就是无渲染能力的空壳;没有材质,Shader 无法落地到具体物体。

努力前行,总会成为自己心中的那道光 1万+

Delphi调用WCF异构编程

Delphi调用WCF异构编程, 几年前,就开始使用Delphi进行分布式开发,最早用的方案是Delphi7+Webservice,在简单的应用场景下,也能够满足需求了。目前有一个项目,主要的需求点如下: 1. 有N个系统 2. 其中有一个系统A为基础数据平台,要为其他系统提供数据服务 3. 这N个系统中,有用Java开发的Web,有用C#开发的Web,有用Delphi开发的桌面APP,还有用Android开发的手机APP,都要使用系统A提供的基础数据

敦格 9132

司法AI系统的架构设计:法律知识图谱如何辅助智能庭审?架构师亲测

简单来说,法律知识图谱是一种采用图数据结构(节点Node + 边Edge/关系Relation)来组织和表达法律领域知识的语义网络。它以。

AI 算法实战派 1088

数据挖掘实战-基于决策树算法构建北京市空气质量预测模型

通过分析这些数据,我们将利用决策树算法建立预测模型。决策树算法具有直观易懂、分类效果好等优点,适合用于此类预测问题。我们将采用适当的方法对模型进行训练和优化,以提高预测精度。最终,我们将评估模型的预测效果,并探讨其在实际应用中的可行性和潜在价值。希望通过本实验,能为北京市的空气质量改善工作提供一定的支持。通过基于决策树算法构建的北京市空气质量预测模型的实验研究,我们在多方面取得了显著的进展。首先,我们成功地整合了来自气象、环保、交通等多个领域的大量数据,形成了一个全面而综合的空气质量分析框架。

m0_64336780的博客 2万+

5.13 学习日记,首页进度继续更新

今天调整css,把banner和左侧的产品分类列做好了。还差右侧的公司介绍部分以及产品部分。 唉。banner做了半天,最后还是采用了美工设计的一个。 做白工一天。...

weixin_33850890的博客 86

Android蓝牙中的Rfcomm协议介绍

RFCOMM(Radio Frequency Communications)是一种基于蓝牙技术的串口仿真协议,以下是详细介绍:一、协议概述二、工作原理三、应用场景

手机-手表蓝牙开发工程师的博客 713

出差回来继续学习更新

出差大半个月,回来继续学习更新 转载于:https://www.cnblogs.com/rcltocode/p/6805406.html

weixin_30919429的博客 130

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python的等待代码是什么_代码等待10秒不直观,教你用进度条显示时间进度

你有没有试过代码里等待几秒再继续做下一件事,但是控制台日志啥都没打,一直傻傻的等?今天教大家显示实时打印等了多少秒的进度条,希望大家喜欢。1、工具今天跟大家分享的Python库就是Tqdm,它是 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息。用户只需要封装任意的迭代器,是一个快速、扩展性强的进度条工具库。效果图2、安装$ pip install tqdm3、tqdm的...

weixin_39637457的博客 671

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

python学习记录(12.6~12.10)

对了,我是跟着b站up主Python大本营学习滴,感兴趣的童鞋也可以一起学习呀。先道个歉,这几天有点事忘了跟进学习进度了,这次一并补上【求原谅呜呜呜~~~】(我会继续坚持更新滴,欢迎分享学习经验,大家一起进步!

2401_87722330的博客 212

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

2020-09-27

来CSND的第一天,持续更新自己的学习进度。

qq_51081772的博客 98

每日学习打卡

英语每日百词,快考四级了,我不要求全部记住,起码有个印象。每天晚上十二点我会准时更新每天进度完成情况和第二天的博客。继续完成 python基础(1/2)我发这个博客是为了督促我的进度。

jdkdksjsj的博客 156

中山大学软件工程23级学习复盘第一篇

学习进度。

Fish_eat_bread的博客 142

Carsim学习-面向电动汽车的AEB系统设计(3)

Day3主要是处理一下Carsim Run control的问题。上图中,点击Math model右边的倒三角形,可以看到有三种math model的datesets供我们选择,第一种是基于Generic,也就是外部来源的,第二种是Tire,基于轮胎模型的,第三种就是车辆来源。我们选择Vehicle->Vehicle Assembly.在Math Model下面那一栏选择车辆:这些车是Day2里面导入的 .接下来选择控制方法,Precedure。进入到DLC @ 120km/h,设置参数(最好是先Dupli

m0_72837196的博客 1491

第一周(5.29-6.4)学习计划

第一周学习计划及完成情况

君兮_的博客 257

进展报告 Week 2

Week 2 学习内容前言学习内容花书Python基础 前言 本周学习时间为:2021.10.25 - 2021.10.31星期天 本周截至目前学习内容包括:花书 前言部分、线性代数部分(7- 22页)、Python基础 学习内容 这一周周一到周五的课内事情比较多,分布式系统课程的大作业快要到DDL,正在进行后端上的工作。因此,本周主要学习时间都在周末;由于周六下午开组会,先行撰写一份,周六晚及周日将继续学习并更新本周进度报告 花书 本周目前花书将引言部分看完,并且将进度更新到线性代数相关的2

weixin_43968093的博客 243
上一篇: 一名小白理清关于Web的一些基本概念
setback_away
博客等级 码龄11年 0粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值