先理解什么是服务:
现在的应用程序变得越来越复杂,甚至只靠单一的应用程序无法完成全部的工作。更别说只使用一种语言了。
大家在写应用程序查询数据库时,并没有考虑过为什么可以将查询结果返回给上层的应用程序,甚至认为,这就是数据库应该做的,其实不然,这是数
据库通过TCP/IP协议与另一个应用程序进行交流的结果,而上层是什么样的应用程序,是用什么语言,数据库本身并不知道,它只知道接收到了一份协议,这就是sql92查询标准协议。
目前的云计算、云查杀都是一种服务,现在比较流行的说法是SOA(面向服务的框架)。
既然数据库可以依据某些标准对外部其他应用程序提供服务、而且不关心对方使用什么语言,那我们为什么就不能实现跨平台、跨语言的服务呢?
只要我们用Java写的代码,可以被任意的语言所调用,我们就实现了跨平台,跨语言的服务!
什么是webservice,它可以用来干什么?
WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求。从而实现远程调用. 学习WebSerice可以将你的服务(一段代码)发布到互联网上让别人去调用,也可以调用别人机器上发布的WebService,就像使用自己的代码一样。
webservice的特点:
1.WebService通过HTTP POST方式接受客户的请求
2.WebService与客户端之间一般使用SOAP协议传输XML数据.
3.它本身就是为了跨平台或跨语言而设计的。
基于cxf的webservice简单应用:
这里使用的是apache-cxf-2.7.10的jar包,拷贝lib下的jar包的项目中。
service的编写:
package com.cxf.test.service; import javax.jws.WebParam; import javax.jws.WebService; @WebService(name="sayHiInterface",targetNamespace = "http://com.cxf.test.service/") public interface SayHiToWebService { public String sayHi(@WebParam(name = "name") String name); }
package com.cxf.test.service; import javax.jws.WebParam; import javax.jws.WebService; @WebService(targetNamespace = "http://com.cxf.test.service/",endpointInterface = "com.cxf.test.service.SayHiToWebService",serviceName="SayHiToWebServiceImplService") public class SayHiToWebServiceImpl implements SayHiToWebService { public String sayHi(String name) { return "hi: " + name; } }server的发布方式:
import com.cxf.test.service.SayHiToWebService; import com.cxf.test.service.SayHiToWebServiceImpl; public class ServerStart { public static void main(String[] args) { //传统发布方式 // SayHiToWebServiceImpl sayHiToWebService = new SayHiToWebServiceImpl(); // String address = "http://192.168.1.109:8080/sayHiToWebService"; // Endpoint.publish(address,sayHiToWebService); SayHiToWebService helloworldimp = new SayHiToWebServiceImpl(); <span style="white-space:pre"> </span> <span style="white-space:pre"> </span>JaxWsServerfactorybean factorybean = new JaxWsServerfactorybean(); <span style="white-space:pre"> </span>factorybean.setAddress("http://192.168.1.109:8080/sayHiToWebService"); <span style="white-space:pre"> </span>factorybean.setServiceClass(SayHiToWebService.class); <span style="white-space:pre"> </span>factorybean.setServiceBean(helloworldimp); <span style="white-space:pre"> </span>factorybean.create(); } }
client调用方式:
package com.cxf.test.server; import java.net.MalformedURLException; import java.net.URL; import javax.xml.namespace.QName; import javax.xml.ws.Service; import org.apache.cxf.jaxws.JaxWsProxyfactorybean; import com.cxf.test.service.SayHiToWebService; public class ClientTest { public static void main(String[] args) { // JaxWsProxyfactorybean jwpb = new JaxWsProxyfactorybean(); // jwpb.setServiceClass(SayHiToWebService.class); // jwpb.setAddress("http://192.168.1.109:8080/sayHiToWebService"); // SayHiToWebService sayHiToWebService = (SayHiToWebService) jwpb.create(); // System.out.println(sayHiToWebService.sayHi("cainiaolei")); try { URL url = new URL("http://192.168.1.109:8080/sayHiToWebService?wsdl"); QName qName=new QName("http://com.cxf.test.service/","SayHiToWebServiceService"); Service service = Service.create(url,qName); SayHiToWebService sayHiToWebService = service.getPort(SayHiToWebService.class); System.out.println(sayHiToWebService.sayHi("cainiao")); } catch (MalformedURLException e) { e.printstacktrace(); } } }访问:
<pre name="code" class="java">http://192.168.1.109:8080/sayHiToWebService?wsdl是否可以看见这项服务的具体描述呢?这样一个简单的webservice应用就形成了!
下面讲解wsdl2java命令生成客户端代码,客户端可以直接通过代码调用服务!
控制台下进入现在的apache-cxf文件下的bin目录:
调用 wsdl2java -p com. sy.cxf.client -d e:\ -all http://localhost:8080/cxf/webservice/helloWorld?wsdl 命令,
-p 也就是package 对应java中的包
-d 输入目录,生成.java文件会在该目录,会自动添加-p参数配置的包路径
-client 生成客户端测试web service的代码.
-server 生成服务器启动web service的代码.
-impl 生成web service的实现代码.
-ant 生成build.xml文件.
-all 生成上面-client -server -impl -ant 对应的所有文件.
这样就可以在e盘下看到我们的客户端代码了,拷贝代码到客户端!
这里我是以我的应用进行描述的,
这样在客户端,你就可以通过:
new CollectHuaQiangServiceService().getCollectHuaQiangServicePort().startCaptureHuaQiangService(); 调用你的服务了!
注:以上参考过itcast机构的ppt!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。