精彩的人生
好好工作,好好生活
BlogJava
首页
新随笔
联系
聚合
管理
147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(43)
给我留言
查看公开留言
查看私人留言
随笔分类
BIRT(1)
Eclipse(13)
EMF&GEF(6)
Google Code Jam(3)
Gossip(28)
Java(45)
Job(6)
Social Network(5)
Web(1)
Web Service(41)
我爱吃(2)
随笔档案
2008年9月 (1)
2008年8月 (1)
2008年3月 (1)
2008年2月 (1)
2008年1月 (1)
2007年12月 (1)
2007年11月 (2)
2007年10月 (1)
2007年7月 (1)
2007年3月 (1)
2006年10月 (9)
2006年9月 (18)
2006年8月 (4)
2006年7月 (6)
2006年6月 (3)
2006年5月 (11)
2006年4月 (27)
2006年3月 (25)
2006年2月 (6)
2006年1月 (1)
2005年12月 (20)
2005年11月 (6)
相册
my
收藏夹
GEF/EMF/Eclipse(1)
semantic web(4)
uddi(2)
配色方案(5)
Friends
Reload_cn
uiiang
八进制
老冒的SNS专栏
Web Site
Eclipse Org
Eclipse World
网谈
关注虹的新作,关注SNS
搜索
积分与排名
积分 - 442953
排名 - 123
最新评论
1. re: 当cmd里输入路径包含空格的时候
谢谢分享
--网盘搜索-kaopu.so
2. re: 当cmd里输入路径包含空格的时候[未登录]
我的路径是中文带空格怎么办?
%cd%/bin/bin/java -jar ../../export.jar执行不了啊
--liu
3. re: Rare Order[未登录]
@Guest
Wrong at all!!!!
--123
4. re: 当cmd里输入路径包含空格的时候[未登录]
很有用哟
--temp
5. re: 插件制作过程记录(使用TreeViewer贡献视图)
代码下载不了了,
--jiaojiaf
阅读排行榜
1. 正宗泡椒凤爪做法(zz)(146670)
2. 当cmd里输入路径包含空格的时候(30526)
3. 将String转换成InputStream(28072)
4. 转:Eclipse插件FatJar安装与使用(19227)
5. 简单的将String类型的xml转换为对象的代码(13958)
6. 如何写好PPT(8818)
7. 读Axis2用户帮助文档(7832)
8. 2005.6.12 使用jsp上传文件(7560)
9. 从插件/RCP中取得文件路径的方法(6219)
10. Eclipse的BPEL(5551)
评论排行榜
1. 正宗泡椒凤爪做法(zz)(97)
2. 2005.6.12 图片处理(17)
3. 如何写好PPT(10)
4. 读Axis2用户帮助文档(9)
5. gef布局的一点感想(8)
6. 从扩展点中load class(8)
7. 从插件/RCP中取得文件路径的方法(7)
8. emf&gef之一example.my.gefpractice(7)
9. 转:Eclipse插件FatJar安装与使用(6)
10. 将String转换成InputStream(6)
转:一个soap的例子
CSDN - 专家门诊 - Java J2SE / 基础类问题
回复人: panq(漫随天外) ( ) 信誉:100 2001-10-25 13:40:12Z 得分:300
简单对象访问协议(SOAP):
用于Internet上的分布式计算,可以实现跨平台跨编程语言的对象访问和方法调用.
它通过HTTP协议实现参数的传输,同时以特定的XML格式表示参数.这样,只需要一个支持H
TTP协议的WEB服务器和一个XML解析器就可以实现简单的SOAP功能.由于成为了标准,所以
会有越来越多的软件支持它.大家若有兴趣的话可以去看SOAP1.1标准.
同时,还有许多SOAP的开发工具,以简化SOAP的开发.随着这些开发工具的完善,我们
甚至可以不用管具体的SOAP格式就可以开发SOAP应用.
下面以APACHE的SOAP包为例,举个例子:
服务器端的Class:
package samples.soap;
public class SOAPCal {
double rate;
public SOAPCal() {
rate = 8.7;
}
public void setRate(double rate) {
this.rate = rate;
}
public Double calculate(int direction, double value) {
Double retVal;
switch(direction) {
case 0:
retVal = new Double(value * rate);
break;
case 1:
retVal = new Double(value / rate);
break;
default:
retVal = null;
}
return retVal;
}
}
客户端Class:
package samples.soap;
import java.io.*;
import java.util.*;
import java.net.*;
import org.w3c.dom.*;
import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.encoding.*;
import org.apache.soap.encoding.soapenc.*;
import org.apache.soap.rpc.*;
public class SOAPCalUser {
public static void main(String[] args) throws Exception {
if (args.length != 3
&& (args.length != 4 || !args[0].startsWith("-"))) {
System.err.println("Usage:");
System.err.println(" java " + SOAPCalUser.class.getName() +
" [-encodingStyleURI] SOAP-router-URL name " +
"(0: dollor to yuan | 1: yuan to dollor) value");
System.exit (1);
}
int offset = 4 - args.length;
String encodingStyleURI = args.length == 11
? args[0].substring(1)
: Constants.NS_URI_SOAP_ENC;
URL url = new URL(args[1 - offset]);
int direction = Integer.parseInt(args[2 - offset]);
double value = Double.parseDouble(args[3 - offset]);
Call call = new Call();
call.setTargetObjectURI("urn:SOAPCal");
call.setMethodName("calculate");
call.setEncodingStyleURI(encodingStyleURI);
Vector params = new Vector();
params.add(new Parameter("direction", int.class, new
Integer(direction), null));
params.add(new Parameter("value", double.class, new Double(value),
null));
call.setParams(params);
Response resp;
try {
resp = call.invoke(url, "");
} catch (SOAPException e) {
System.err.println("Caught SOAPException (" +
e.getFaultCode() + "): " +
e.getMessage());
return;
}
// Check the response.
if (!resp.generatedFault()) {
Parameter ret = resp.getReturnValue();
Object retVal = ret.getValue();
System.out.println(retVal != null ? "\n" + retVal : "I don't
know.");
} else {
Fault fault = resp.getFault();
System.err.println("Generated fault: ");
System.out.println (" Fault Code = " +
fault.getFaultCode());
System.out.println (" Fault String = " +
fault.getFaultString());
}
}
}
和
package samples.soap;
import java.io.*;
import java.util.*;
import java.net.*;
import org.w3c.dom.*;
import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.encoding.*;
import org.apache.soap.encoding.soapenc.*;
import org.apache.soap.rpc.*;
public class SOAPCalAdmin {
public static void main(String[] args) throws Exception {
if (args.length != 2
&& (args.length != 3 || !args[0].startsWith("-"))) {
System.err.println("Usage:");
System.err.println(" java " + SOAPCalAdmin.class.getName()
+ " [-encodingStyleURI] SOAP-router-URL name " +
"rate ");
System.exit (1);
}
int offset = 3 - args.length;
String encodingStyleURI = args.length == 11
? args[0].substring(1)
: Constants.NS_URI_SOAP_ENC;
URL url = new URL(args[1 - offset]);
double rate = Double.parseDouble(args[2 - offset]);
Call call = new Call();
call.setTargetObjectURI("urn:SOAPCal");
call.setMethodName("setRate");
call.setEncodingStyleURI(encodingStyleURI);
Vector params = new Vector();
params.add(new Parameter("rate", double.class, new Double(rate),
null));
call.setParams(params);
Response resp;
try {
resp = call.invoke(url, "");
} catch (SOAPException e) {
System.err.println("Caught SOAPException (" +
e.getFaultCode() + "): " +
e.getMessage());
return;
}
// Check the response.
if (!resp.generatedFault()) {
System.out.println("The rate has been changed.");
} else {
Fault fault = resp.getFault();
System.err.println("Generated fault: ");
System.out.println (" Fault Code = " +
fault.getFaultCode());
System.out.println (" Fault String = " +
fault.getFaultString());
}
}
}
发布用的XML文件dd.xml:
<isd:service xmlns:isd="http://xml.apache.org/xml-soap/deployment"
id="urn:SOAPCal">
<isd:provider type="java"
scope="Application"
methods="setRate calculate">
<isd:java class="samples.soap.SOAPCal"/>
</isd:provider>
</isd:service>
这个程序的功能是设置和计算美元/人民币的兑换价格,用
java org.apache.soap.server.ServiceManagerClient
http://sb3server:8080/soap/servlet/rpcrouter
deploy dd.xml
把服务器端程序发布到TOMCAT上,然后在客户端用:
java samples.soap.SOAPCalAdmin
http://sb3server:8080/soap/servlet/rpcrouter
XX.XX
来设置汇率(1美元兑换多少人民币), 用
java samples.soap.SOAPCalUser
http://sb3server:8080/soap/servlet/rpcrouter
(1|0) XX.XX
来换算,其中1和0代表从人民币到美元和从美元到人民币,下一个参数是要换算的钱数.
另外,在http://www.xmethods.com/gettingstarted/apache.html
有一个简单的教程介绍怎样用APACHE的SOAP包写SOAP客户端程序.讲解比较详细.
注意点:
*如果SOAP传回来的参数是一个CLASS,这个CALSS会被序列化(Serializer)为一段XML
代码,在客户端接这个CLASS时,仍然需要一个同名CLASS,而且那些被传递过来的数据的SE
T和GET方法名和参数名要相同.如果是自定义的CLASS,就要做maping声明.声明方法见APA
CHE SOAP包的samples\addressbook\DeploymentDescriptor.xml文件中isd:mappings的
写法.
在客户端调用时要加上
SOAPMappingRegistry smr = new SOAPMappingRegistry();
BeanSerializer beanSer = new BeanSerializer();
smr.mapTypes(/*encodingStyle*/Constants.NS_URI_SOAP_ENC,
new QName(/*Namespace URI*/"urn:xml-soap-address-demo", /*Local
Part*/"address"),
/*Class type*/Address.class, /*java2XMLClassName*/beanSer,
/*xml2JavaClassName*/beanSer);
call.setSOAPMappingRegistry(smr);
*目前不是所有的CLASS都能被序列化,如Hashtable就不行,所以最好用简单的数据类
型,如String,String,Integer,Double及其数组来传递变量,对复杂的参数,可以直接做成
XML Document传递(使用Constants.NS_URI_LITERAL_XML作为EncodingStyleURI),这样就
省得客户端专门做个CLASS来接参数,也方便跨语言的调用.在使用APACHE的SOAP包时,XML
Document在客户端会被转换为XML DOM的Element class.
现在唯一的方法是自己写进行序列化的程序,不过以后也许会有标准的序列化方法.
*CLASS被序列化时CLASS中的静态的变量是不会被加入的来的,这一点要注意.
posted on 2006-03-09 11:23
hopeshared
阅读(3911)
评论(1)
编辑
收藏
所属分类:
Java
Feedback
#
re: 转:一个soap的例子
2009-06-22 14:52
1123
也不排个版..
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
一段关于callback的代码
当cmd里输入路径包含空格的时候
java类加载的表现形式(zz)
初探Java类加载机制的奥秘(zz)
Java类加载内幕(zz)
使用Jakarta Commons Pool处理对象池化(zz)
对象池(对象缓冲池)-高手进阶(zz)
简单的将String类型的xml转换为对象的代码
一段很好用的判断数据库中某张表是否存在的代码
转:Java Annotation 高级应用
Powered by:
BlogJava
Copyright © hopeshared