当前位置: 代码迷 >> Web前端 >> 传智播客-web service(六)-即时发布与定制发布、wsdl文档与java对象
  详细解决方案

传智播客-web service(六)-即时发布与定制发布、wsdl文档与java对象

热度:112   发布时间:2012-11-09 10:18:47.0
传智播客-web service(6)-即时发布与定制发布、wsdl文档与java对象

即时发布与定制发布

?

Axis开发WS应用有两种发布方案:即时发布与定制发布。

?1、即时发布:开发这类服务时,只用编写源码,不用编译。源码一般放在项目的根目录下,扩展名改为jws即可。访问时通过完整路径(包括jws扩展名)直接访问该文件。访问时容器会对该服务类源码进行实时编译,编译后的文件放在生成的/WEB-INF/jwsClass目录下。 需要注意的是,即时发布的服务类不能有包名。为什么呢?因为jws文件也可以放在/项目名/aaa/目录下,因此可以通过http://localhost:8080/ 项目名/aaa/xxx.jws访问该服务,而此时实时编译的class文件放在jwsClass/aaa下,如果jws服务类带有包名,那么实时编译时容器会混淆“目录”和“包”。

?

2、定制发布:java类允许有包名。第一次发布时需要借助客户端的WSDD(Web Service Deploy Description)文件,该文件可以放在客户端项目的任意目录下,然后用Adming Client命令将WSDD文件上传给服务器(如果是myeclispe这样的IDE,可以利用工具调用AdminClient类的main方法)第一次发布后便会在服务端的/WEB-INF目录下自动生成一个server-config.wsdd文件,以后即使客户端的wsdd文件被删除了也可以(不知道是不是个bug,毕竟只有第一次需要,还是作为服务端的初始化??)。 需要明白的是,即时WS项目部署到了tomcat这样的web容器上,也不意味着就对外发布了WS服务。此外,通过地址访问服务时,需要在公开的服务名称之前加services/,当然也可以在配置文件中更改,不过一般没这个必要。 类似一般web应用,WS应用也有“范围”的概念,不过只有session和application两种;WS应用中的Handler则类似web应用的filter机制。 默认情况下axis服务器只能接受本机的管理请求。如需远程访问的话,需要修改Server-config.wsdd文件: <parameter name="enableRemoteAdmin" value="true"></parameter>

?

wsdl文档与java对象

Axis用三种方式支持WSDL:url+?wsdl方式获得自动生成的wsdl文档;

wsdlL2java工具能够通过wsdl文档生成java客户端存根和服务器端骨架;

java2wsdl工具可以通过java构建wsdl文档。

重点说说后面两种: 1、wsdlL2java:根据wsdl文档生成java对象。(1)客户端:run config-->project-->main(org.apache.axis.wsdl.WSDL2Java)-->arguments(http://localhost:8888/webservice/services/CustomerService?wsdl)-->run!-->刷新project-->project根目录下自动生成了基于pojo类、url信息和map数据的三个包,包最下层是WSDL2Java自动生成的java对象源码。当然也可以用命令指定生成的源码安放的路径和包名:http://localhost:8888/webservice/services/CustomerService?wsdl -v -p cn.itcast.axis.client.wsdl2java.customer -o src。同时还会自动生成deploy.wsdd和undeploy.wsdd文件。 生成的源码中,stub对象是wsdl2java生成的静态代理;静态代理类其实就是对动态代理的封装,用的类是完全一样的(Service/Call等),但是不用写地址和操作名了,通过静态代理(因为地址和操作名已经封装在本地了),就可以像访问本地类一样访问远程方法。XXXSOAPBindingSkeleton、XXXSOAPBindingImple是用命令“--server-side --skeletonDeploy true”生成的服务器端的骨架类,这时,wsdd文档中发布的服务是XXXSOAPBindingSkeleton;不过一般情况下,在客户端调用时不需要服务端的骨架,所以“--skeletonDeploy true”参数可以不用,这时就不会生成AddressBookSOAPBindingSkeleton,而wsdd文档中部署的是AddressBookSOAPBindingImpl,可以在这个服务类里实现业务逻辑。

?(2)服务端:将客户端自动生成的包copy到服务端src目录下,因为XXXSOAPBindingStub、XXXServiceLocator和Service是服务于客户端的,在服务端可以删除这三个文件,deploy.wsdd和undeploy.wsdd也是客户端才用的,也都不需要。将客户端的服务发布到WS以后,XXXSOAPBindingImple也可以删除,因为XXXSOAPBindingImple服务已经上传到服务端了。 2、java2wsdl:通过java构建wsdl文档。通常情况下,双方合作,一般先写接口构建业务体系,然后就可以进行其他工作,因为接口已经包含了业务签名,而具体的业务逻辑实现可以后期再写;此时可以通过接口生成wsdl文档,再通过文档生成实现类和骨架存根(关于骨架存根,请参见前文《ejb3(2)》),再在Impl里写具体实现。一般应用过程如下:编写业务接口-->java2wsdl-->wsdl2java-->编写接口实现(业务逻辑)-->用wsdl2java生成的deploy.wsdd部署(对外发布)-->将编写完的wsdl2java生成的实现copy到服务端,删除不需要的部分。

  相关解决方案