用wsdd(Web Services Deployment Descriptor)方式发布WebService

来源:互联网 发布:中国种植网域名交易 编辑:程序博客网 时间:2024/06/05 00:14

二、用wsdd(Web Services Deployment Descriptor)方式发布WebService

wsdd方法比jws方法要稍微复杂些,但一定程度上比jws发布的方法要灵活。

1、首先在AxisWebService工程创建一个java类,里面写简单的2个方法getName、getAge,代码如下:

 

复制代码
package com.hoo.service;/** * <b>function:</b>wsdd发布模式的axis WebService * @author hoojo * @createDate Dec 15, 2010 17:24:35 PM * @file HelloWorldWSDD.java * @package com.hoo.service * @project AxisWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */public class HelloWorldWSDD { public String getName(String name) { return "your name : " + name; } public int getAge(int age) { return age + 10; }}
复制代码

 

 

 

2、如果用wsdd方法首先需要定制我们的wsdd xml文件,这里命名为deploy.wsdd,创建在当前web工程的WEB-INF目录下,代码如下:

 

复制代码
<?xml version="1.0" encoding="UTF-8"?><deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="HelloWorldWSDD" provider="java:RPC"> <parameter name="className" value="com.hoo.service.HelloWorldWSDD" /> <!-- * 代表所有的方法都暴露 --> <parameter name="allowedMethods" value="*" /> <parameter name="scope" value="request" /> </service></deployment>
复制代码

 

 

 

service标签代表一个WebService服务,HelloWorldWSDD就是当前WebService的名称;provider是java的WebService类型,分别有: RPC、Document、Wrapped、Message、EJB、RMI;有兴趣的可以看看org.apache.axis.providers.java包下面的WebService的实现类或是文档;

parameter的参数className代表当前WebService的class类路径;

allowedMethods代表暴露的方法,那些方法在客户端可以调用;

<parameter name="scope" value="request" />

这个是当前WebService的作用域,它有3个值,分别是:request、session、application。

request代表为每个WebService SOAP的请求都产生一个服务对象,和Spring的scope很像,在服务请求频繁的话会消耗很多资源。

session 是给每个调用当前WebService的客户端创建一个服务对象

application 是个当前所有的请求创建一个服务对象

 

 

3、写完配置后,就需要用axis提供的AdminClient工具类帮我们发布WebService,直到生成server-config.wsdd,步骤如下:运行cmd命令,然后进入当前工程发布的目录,即%tomcat_home%/webapps/project/WEB-INF>

我的是:C:\SoftWare\tomcat-5.0.28\tomcat-5.0.28\webapps\AxisWebService\WEB-INF>

然后输入命令:java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient deploy.wsdd

这里的deploy.wsdd是我们刚才定制的wsdd文件,java当然是jvm的命令,-Djava.ext.dirs=lib设置当前命令的依赖包,AdminClient是axis提供的工具类,这个类本来是可以在官方的工程中admin可以直接运行的(这里不可以,下载下来的少了AdminServlet,有兴趣的可以研究下,就是前面说的官方的示例);

如果运行命令后,看到:

Processing file deploy.wsdd

<Admin>Done processing</Admin>

就代表快成功了,why?快!看看deploy.wsdd同级目录有没有生成server-config.wsdd如果有这个文件就成功了,没有就失败了。如果失败了还有解决办法,首先你得启动tomcat,将我们的工程发布出去。然后在重复上面的命令,不行就换命令行代码如下:

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -lhttp://localhost:8080/AxisWebService/services/AdminService deploy.wsdd

-lhttp://localhost:8080/AxisWebService/services/AdminService是因为你的端口可能被axis占用了,我们将指定AdminService来完成转换,运行上面命令就没有问题了。

 

 

4、在WebBrowser的地址栏输入:

http://localhost:8080/AxisWebService/servlet/AxisServlet

你就可以看到如下效果:

And now... Some Services

  • HelloWorldWSDD (wsdl)
    • getName
    • getAge
  • AdminService (wsdl)
    • AdminService
  • Version (wsdl)
    • getVersion

刚才在deploy.wsdd中指定的WebService就在上面出现了,还有暴露出来的方法。点击wsdl就可以看到刚才一样熟悉的wsdl的xml文档。

 

5、下面我们编写客户端代码调用上面的WebService,代码块和上面的jws几乎一样,只是参数,方法名称不同。

 

复制代码
package com.hoo.client;import java.rmi.RemoteException;import javax.xml.namespace.QName;import javax.xml.rpc.ServiceException;import org.apache.axis.client.Call;import org.apache.axis.client.Service;/** * <b>function:</b>wsdd 模式的axis WebService客户端 * @author hoojo * @createDate Dec 15, 2010 17:30:48 PM * @file HelloWorldWSDDClient.java * @package com.hoo.client * @project AxisWebService * @blog http://blog.csdn.net/IBM_hoojo * @email hoojo_@126.com * @version 1.0 */public class HelloWorldWSDDClient { public static void main(String[] args) throws ServiceException, RemoteException { //webService访问地址 String url = "http://localhost:8080/AxisWebService/services/HelloWorldWSDD"; //创建服务 Service service = new Service(); //创建调用句柄 Call call = (Call) service.createCall(); //设置请求地址 call.setTargetEndpointAddress(url); /** * 设置调用的方法和方法的命名空间; * 当然null也可以,因为本身它就没有设置命名空间,一般方法的命名空间是 * 包名倒写组成,如com.hoo.service,ns=http://service.hoo.com */ call.setOperationName(new QName("http://service.hoo.com", "getName")); /** * 用call调用getName方法,设置请求的参数,返回的就是返回值了 */ String result = (String) call.invoke(new Object[] { "jack" }); System.out.println(result); call.setOperationName(new QName("http://service.hoo.com", "getAge")); /** * 用call调用getAge方法,设置请求的参数,返回的就是返回值了 */ int resultAge = Integer.parseInt(call.invoke(new Object[] { 89 }).toString()); //服务器端+10 System.out.println(resultAge); }}
复制代码

 

 

 

运行后结果如下:

your name : jack

99

 

call.setOperationName(new QName("http://service.hoo.com", "getName"));

这里设置命名空间,也可以用null代替,但是不能随意设置,有时候会出现异常。


版权所有,转载请注明出处 本文出自: 
分享道版权所有,欢迎转载,转载请注明出处,谢谢
Top↑
收藏
关注
评论
分类: WebService
标签: 用wsdd(Web Services Deployment Descriptor)方式发布WebSe
好文要顶 关注我 收藏该文  
hoojo
关注 - 1
粉丝 - 1194
+加关注
3
0
(请您对文章做出评价)
« 上一篇:一、搭建简单的axis web服务
» 下一篇:三、取消发布的WebService(删除一个发布成功的Web服务)
posted on 2010-12-20 14:22 hoojo 阅读(19071) 评论(7) 编辑 收藏

评论:
#1楼 2010-12-20 16:07 | airbai  
fasdfas[img]fads[/img]sf
1
alert('a');
支持(0)反对(0)
  
#2楼[楼主2010-12-20 16:15 | hoojo  
@airbai
?
支持(0)反对(0)
  
#3楼 2013-02-18 17:27 | 同帅  
第3步中,“然后进入当前工程发布的目录,即%tomcat_home%/webapps/project/WEB-INF> ” 这句话是不是博主将eclipse的workspace设置为%tomcat_home%/webapps/了
支持(0)反对(0)
  
#4楼[楼主2013-02-22 09:44 | hoojo  
@同帅
就是你发布的web工程在具体的tomcat的目录了
支持(0)反对(0)
  
#5楼 2013-02-22 14:30 | 同帅  
请问,怎么将工程发布的目录设定为tomcat的\webapps这个目录下
支持(0)反对(0)
  
#6楼[楼主2013-02-22 17:09 | hoojo  
@同帅
手动放置到你的tomcat目录即可,实际开发中不会用这篇博文描述的方式发布服务的。
支持(0)反对(0)
  
#7楼 2013-02-22 22:27 | 同帅  

0 0
原创粉丝点击