几种常用的webService开发
发布时间:2020-12-16 23:53:00 所属栏目:安全 来源:网络整理
导读:? ???? 一、利用jdk web服务api实现,这里使用基于 ?SOAP message? 的 ?Web? 服务 ???? 1.首先建立一个 Web services EndPoint: package ?Hello;??? import ?javax.jws.WebService;??? ?javax.jws.WebMethod;??? ?javax.xml.ws.Endpoint;??? ?? @WebService
?
???? 一、利用jdk web服务api实现,这里使用基于 ?SOAP message?的?Web?服务 ???? 1.首先建立一个Web services EndPoint:
package
?Hello;???
?????? ? 2.
使用?apt?编译?Hello.java(例:apt -d?[存放编译后的文件目录] Hello.java?)?,会生成 jaws目录import ?javax.jws.WebService;??? ?javax.jws.WebMethod;??? ?javax.xml.ws.Endpoint;??? ?? @WebService?? public ? class ?Hello? {?? ? @WebMethod?? public?String?hello(String?name)?{??? return?"Hello,?+?name?n;??? }??? ???? ?staticvoid?main(String[]?args)?{??? ???//?create?and?publish?an?endpoint??? ???????Hello?hello?=new?Hello();??? ???????Endpoint?endpoint??Endpoint.publish(http://localhost:8080/hello,?hello);???? ????????}??? } ? ????3.使用java Hello.Hello运行,然后将浏览器指向http://localhost:8080/hello?wsdl就会出现下列显示 ? ?? 4.使用wsimport 生成客户端?? ???? ???? 使用如下:wsimport?-p?.?-keep?http://localhost:8080/hello?wsdl ??? 这时,会在当前目录中生成如下文件: ????????? ? ?????? 5.客户端程序: ??????
1
?HelloClient
{???
??
2?main(String?args[])?3??HelloService?service??HelloService();??? 4??Hello?helloProxy??service.getHelloPort();??? 5??String?hello??helloProxy.hello("你好);?????????? 6??System.out.println(hello);??? 7??}??? 8} 9 ???? 以上方法还稍显繁琐,还有更加简单的方法 二、使用xfire,我这里使用的是myeclipse集成的xfire进行测试的 ??? 利用xfire开发WebService,可以有三种方法: ????? 1一种是从javabean 中生成; ????? 2 一种是从wsdl文件中生成; ??????3 还有一种是自己建立webservice ??? 步骤如下: ????用myeclipse建立webservice工程,目录结构如下: ? ??? 首先建立webservice接口, ?????代码如下: ????? 1
?com.myeclipse.wsExample;
????? 接着实现这个借口:
2 // Generated?by?MyEclipse 3 4 interface ?IHelloWorldService? { ???? ?????String?example(String?message); } ?1
?2
?3
?4
?HelloWorldServiceImpl?
implements
?IHelloWorldService?
?5?6?????String?example(String?message)??7?????????message; ?8????} ?910???修改service.xml?文件,加入以下代码: ? <
service
>
????????
name
HelloWorldService
</
serviceClass
????????????com.myeclipse.wsExample.IHelloWorldService
?把整个项目部署到tomcat服务器中?,打开浏览器,输入
http://localhost:8989/HelloWorld/services/HelloWorldService?wsdl
,可以看到如下:?
?5 ?6 implementationClass ?7 ????????????com.myeclipse.wsExample.HelloWorldServiceImpl ?8 ?9 style wrapped 10 use literal 11 scope application 12 ???? > ???? ?然后再展开HelloWorldService后面的wsdl可以看到: 客户端实现如下: ?com.myeclipse.wsExample.client; ?java.net.MalformedURLException; ?java.net.URL; ?org.codehaus.xfire.XFireFactory; ?org.codehaus.xfire.client.Client; ?org.codehaus.xfire.client.XFireProxyFactory; ?org.codehaus.xfire.service.Service; ?org.codehaus.xfire.service.binding.ObjectServiceFactory; ?com.myeclipse.wsExample.IHelloWorldService; 13 14 ?HelloWorldClient? 15?main(String[]?args)?throws?MalformedURLException,?Exception?16?TODO?Auto-generated?method?stub17Service?s?ObjectServiceFactory().create(IHelloWorldService.class); 18XFireProxyFactory?xf?XFireProxyFactory(XFireFactory.newInstance().getXFire()); 19String?urlhttp://localhost:8989/HelloWorld/services/HelloWorldService; 20 21try22????????{???????????? 23???????????? 24????????????IHelloWorldService?hs(IHelloWorldService)?xf.create(s,url); 25????????????String?sths.example(zhangjin26????????????System.out.print(st); 27????????}28catch(Exception?e) 29????????30????????????e.printStackTrace(); 3132333435 ?????? 这里再说点题外话,有时候我们知道一个wsdl地址,比如想用java客户端引用.net?做得webservice,使用myeclipse引用,但是却出现无法通过验证的错误,这时我们可以直接在类中引用,步骤如下: ???????? ?1
static
void
?main(String[]?args)?
throws
?2?3????????Service?s?4????????XFireProxyFactory?xf???????? //远程调用.net开发的webserviceClient?c?Client(?URL(http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl)); ????????Object[]?oc.invoke(qqCheckOnline?String[]{531086641591284436}11调用.net本机开发的webservice12Client?c1http://localhost/zj/Service.asmx?wsdl13Object[]?o1c1.invoke(HelloWorld?String[]{}14三、使用axis1.4调用webservice方法 ???前提条件:下载axis1.4包和tomcat服务器???,并将axis文件夹复制到tomcat服务器的webapp文件夹中 ?? 这里我就说一下最简单的方法: ???????? 首先建立一个任意的java类(例如:HelloWorld.java),复制到axis文件夹下,将其扩展名改为jws,然后重新启动tomcat,在浏览器中输入 http://localhost:8989/axis/HelloWorld.jws?wsdl ,就会得到一个wsdl文件,其客户端调用方法如下: ?? ?javax.xml.rpc.Service; ?javax.xml.rpc.ServiceException; ?javax.xml.rpc.ServiceFactory; ?java.rmi.RemoteException; ?javax.xml.namespace.QName; ?TestHelloWorld? ???????????? ????????String?wsdlUrl?http://localhost:8989/axis/HelloWorld.jws?wsdl????????String?nameSpaceUri?http://localhost:8989/axis/HelloWorld.jws????????String?serviceName?HelloWorldService????????String?portName?????????ServiceFactory?serviceFactory??ServiceFactory.newInstance(); ????????Service?afService?serviceFactory.createService(?URL(wsdlUrl),0)">?QName(nameSpaceUri,?serviceName)); ????????HelloWorldInterface?proxy??(HelloWorldInterface)afService.getPort(????????System.out.println(return?value?is?proxy.getName(john)?)?; 30 四、使用axis2开发webservice(这里首先感谢李宁老师)???? ? 使用axis2 需要先下载? ?? axis2-1.4.1-bin.zip ?? axis2-1.4.1-war.zip ?? http://ws.apache.org/axis2/ ???? 同理,也需要将axis2复制到webapp目录中 在axis2中部署webservice有两种方法, ??? 第一种是pojo方式,这种方式比较简单,但是有一些限制,例如部署的类不能加上包名 ??? 第二种方式是利用xml发布webservice,这种方法比较灵活,不需要限制类的声明 ??? 下面分别说明使用方法: ??? 1.pojo方式: 在 Axis2 中不需要进行任何的配置,就可以直接将一个简单的 POJO 发布成 WebService 。其中 中所有的 public 方法将被发布成 方法。先实现一个pojo类: ? ?1
?HelloWorld
?String?getName(String?name) ???由于这两个方法都是public类型,所以都会发布成webservice。
编译
HelloWorld
类后,将
HelloWorld.class
文件放到%tomcat%
webappsaxis2WEB-INFpojo
目录中(如果没有
pojo
目录,则建立该目录),然后打开浏览器进行测试:????你好??name; ???? int?add(?a,0)">?b) ?????ab; 输入一下url:? http://localhost:8080/axis2/services/listServices ? ? 这是其中的两个webservice列表,接着,在客户端进行测试: 首先可以写一个封装类,减少编码,代码如下: ?? ?? ?MZ.GetWebService;
???? 2.使用service.xml发布webservice,
这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在META-INF目录中,该文件的内容如下:
?org.apache.axis2.AxisFault; ?org.apache.axis2.addressing.EndpointReference; ?org.apache.axis2.client.Options; ?org.apache.axis2.rpc.client.RPCServiceClient; ?GetWSByAxis2? ??????private?String?EndPointUrl; ?String?QUrlhttp://ws.apache.org/axis2?QName?opAddEntry;? ?String?WSUrl; ?RPCServiceClient?setOption()??AxisFault ????????????????RPCServiceClient?serviceClient??RPCServiceClient(); ??????????Options?options??serviceClient.getOptions(); ??????????EndpointReference?targetEPR??EndpointReference(WSUrl); ??????????options.setTo(targetEPR); ???????????serviceClient; ??????}?????? ???????QName?getQname(String?Option)?????????? ?QName?(QUrl,Option); ?返回String???????String?getStr(String?Option)???????this.setOption();? ????? ??????????opAddEntry?.getQname(Option); 35?????????String?str??(String)?serviceClient.invokeBlocking(opAddEntry,? 36???????????????????????????Object[]?Class[]{String.?})[0]; 37??????????str; 38?????}39?返回一维String数组40?String[]?getArray(String?Option)?41??????4243444546?????????String[]?strArray??(String[])?serviceClient.invokeBlocking(opAddEntry,128)">47???????????????????????????Object[]?Class[]{String[].48?strArray; 4950从WebService中返回一个对象的实例51??????Object?getObject(String?Option,Object?o)?52?????{? 53????????RPCServiceClient?serviceClient?54?????????QName?qname55?????????Object?object??serviceClient.invokeBlocking(qname,0)">?Object[]?Class[]{o.getClass()}56?object; 575859/////////////////////////////////////////???????读者可以自己封装数据类型,如int,byte,float等数据类型60} 61 客户端调用方法: MZ.GetWebService.GetWSByAxis2?ws = new ?MZ.GetWebService.GetWSByAxis2(); ws.WSUrl " http://localhost:8989/axis2/services/HelloWorld ; HelloWorld?hello ?(HelloWorld)ws.getObject( getName ); ???????????? ??????????? ?System.out.println(hello.getName( zhangjin )); service?name
HelloWorld
???? description ????????HelloWorld?webservice ???? parameter?name ServiceClass ????????service.HelloWorld?? ???? parameter messageReceivers ???????? messageReceiver?mep http://www.w3.org/2004/08/wsdl/in-out ???????????? org.apache.axis2.rpc.receivers.RPCMessageReceiver /> http://www.w3.org/2004/08/wsdl/in-only org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver 其中<service>元素用于发布Web Service,一个<service>元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebService的WSDL内容: http://localhost:8080/axis2/services/myService?wsdl ? 除此之外,还有直接可以在其中制定webservice操作方法:可以这样些service.xml文件 ???????HelloWorld?service
????????service.HelloWorld?? operation?name messageReceiver? operation add messageReceiver ???????????? 15 16 如果要发布多个webservice,可以在文件两段加上 < serviceGroup><service></service>...<service></service></serviceGroup>发布 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |