独自幸福快乐史上最全面诊眼诊鼻诊耳诊唇诊舌诊依依不舍孤独
药膳食疗 2020年06月19日 浏览:7 次
现在要做的是为远程服务调用设置参数。为此,我们要用到invoke()方法的第三个参数:传入动态代理上被调用方法的一个参数数组。数组中索引为0的参数是方法调用中最左边的参数,索引为1的参数是方法的第二个参数,依此类推。举例来说,如果客户程序调用了sayHelloTo(String name)方法soso贴吧这样的就是你注册的贴号集中起来。最重要的一点就是你每天都要去关注他。在我们 装修第一 这个关键词排名时,那么参数数组就是包含一个字符串的数组。invoke()方法处理该数组的每一个元素,创建一个由Parameter对象构成的向量(Vector)(正如第二篇文章中客户程序所做的那样):ctor params = new ctor();
for( int i=0; ngth; i++ )
{
if( isSimple(args[i]) || isSimpleArray(args[i]) )
{
d(new Parameter(_paramName+(i+1),
args[i].getClass(),args[i],null));
}
else if( isVector(args[i]) )
{
addMapping((ctor)args[i]);
d(new
Parameter(_paramName+(i+1),args[i].getClass(),args[i],null));
}
// 如果这个数组的元素不属于Java基本数据类型
// 则假定这是一个JavaBean的数组
else if( isArray(args[i]) )
{
if( smr == null )
smr = new SOAPMappingRegistry();
if( beanSer == null )
beanSer = new BeanSerializer();
ArraySerializer arraySer = new ArraySerializer();
pTypes(_URI_SOAP_ENC,
null, null, beanSer, beanSer);
pTypes(_URI_SOAP_ENC,
null,args[i].getClass(), arraySer, arraySer);
d(new Parameter(_paramName+(i+1),
args[i].getClass(),args[i],null));
}
// 假定这是一个Bean
else
{
if( smr == null )
smr = new SOAPMappingRegistry();
if( beanSer == null )
beanSer = new BeanSerializer();
String qnamePart = args[i].getClass().getName();
pTypes(_URI_SOAP_ENC,
new QName(urn, qnamePart),args[i].getClass(), beanSer,
beanSer);
d(new Parameter(_paramName+(i+1),args[i].getClass(),args[i],null));
}
}
invoke()方法用到了许多私有的辅助方法,比如用isSimple()来确定参数的类型。如果参数是一个JavaBean或者一个数组,那么,程序必须设置一个定制的SOAP映射注册项,并通过setSOAPMappingRegistry()方法对Call对象作相应的设置(参见第二篇文章)。SOAP代理假定,当出现JavaBean时,SOAP服务用到的所有JavaBean按照如下方式映射:NameSpace URI设置成对象ID,Local Part设置成JavaBean完整的类名。我们部署HelloWorld服务时正是按照这个要求进行,所以一切都不存在问题。
invoke()方法的剩余部分相当简单:设置Call对象参数,设置定制SOAP映射注册项(如果有必要的话),发出调用,接收方法调用的返回值。如下所示:
if( ze() != 0 )
tParams(params);
if( smr != null )
tSOAPMappingRegistry(smr);
// 发出调用
Response resp = voke(serverURL, "");
if( !neratedFault() )
{
Parameter ret = tReturnValue();
return(tValue());
}
else
{
Fault fault = tFault();
throw new
SOAPException(tFaultCode(),tFaultString());
}
二、HelloWorld服务
下面是HelloWorld服务的完整代码。有似曾相识的感觉吗?
package hello;
public class HelloServer
{
public String sayHelloTo(String name)
{
intln("sayHelloTo(String name)");
return "Hello " + name + ", How are you doing?";
}
public String sayHelloTo(Name theName)
{
intln("sayHelloTo(Name theName)");
return "Hello " + tName() + ", How are you doing?";
}
}
回忆一下,Name是一个简单的JavaBean,代码如下:
package hello;
public class Name
{
private String name;
public String getName()
{
return name;
}
public void setName(String name)
{
= name;
}
}
事实上,这里服务的代码与第二篇文章中的服务程序代码完全一样。对于服务开发者来说,唯一增加的工作是创建Java接口。部署服务的方法也和第二篇文章中讨论的完全一样,所以这里我不再介绍。相同的地方还不止如此,编译和运行客户程序的方法也和第二篇文章介绍的一样。为什么有这么多相同之处呢?因为我们创建的代理是一个非插入式的框架,它不会修改和干涉任何Apache SOAP部件的内部工作——无论是客户端还是服务端亦可降低自身投资风险。( 李勇 张兵 实习生 程雅璐 刘坤)。
三、其他说明
本文讨论的SOAP代理(可以从文章后面下载)支持以下参数类型:
⑴ 下面的Java基本数据类型及其对应的对象形式。
boolean, Boolean,
double, Double,
float, Float,
long, Long,
int, Integer,
short, Short,
byte, Byte
脉络舒通丸功效动脉硬化日常保健方法云香祛风止痛酊怎么用
- 上一篇: 索尼需求将推动图像传感器热销
- 下一篇 软体家具棕纤维弹性床垫的标准是怎样的
-
加图索伊瓜因没说过要离队踢尤文他将首发
2020-08-06
-
幸福快乐太烂了字母哥仅得分板助还能拿MVP吗依依不舍
2020-06-19
-
滇丹参的功效与作用
2019-07-15
-
第二届全国伊尹中医药文化研讨会举行
2019-07-15
-
三种山楂害虫的防治方法
2019-07-07
-
山西的晴节与三月三风俗
2019-07-07