我的第一个WebService项目

来源:互联网 发布:淘宝删除中差评 编辑:程序博客网 时间:2024/06/05 18:00

Web Service


  Web Service是一个平台独立的、低耦合的,自包含的、基于可编程的web应用程序,可使用开放的xml标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。


  说白了,Web Service可用于异构平台之间的交互,也就是说不受开发语言的限制。


小实例


  Eclipse创建Java Project,设置JDK的版本为1.7以上,我这里 用的是1.8版本的。


  Web Service项目分为两部分,服务端和客户端。首先编写服务端,由一个简单的接口类和实现类组成。


接口:

package com.tgb.webservice;import javax.jws.WebService;@WebServicepublic interface HelloService {String sayHello(String name);}
实现类:

package com.tgb.webservice.impl;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import com.tgb.webservice.HelloService;@WebService(endpointInterface = "com.tgb.webservice.HelloService")public class HelloServiceImpl implements HelloService {public String sayHello(String name) {return "Hello, " + name + "!";}}


  @WebService有三个属性,endpointInterface、serviceName、portName。

  endpointInterface:该实现类所对应的接口类,要接口类的全名,也就是包名加类名。

  serviceName:是给服务类起的别名,可以随意起。在wsdl的xml文件中,对应serviceName属性。如果不写的话,会默认生成类名+Service,我这里就是HelloServiceImplService。

  portName:是服务类绑定的端口名,可以随意写。在wsdl的xml文件中,对应portName属性。如果不写的话,默认生成l类名+Port,我这里就是HelloServiceImplPort。


  接下来就是要发布服务了。发布服务采用的是Endpoint类的publish方法:

package com.tgb.webservice;import javax.xml.ws.Endpoint;import com.tgb.webservice.impl.HelloServiceImpl;public class PublishServer {public static void main(String[] args) {String address = "http://localhost:9000/helloService";Endpoint.publish(address, new HelloServiceImpl());System.out.println("Server published..");}}


  首先声明一个服务的地址,我这里设置的是http://localhost:9000/helloService,发布完成后,可以使用http://localhost:9000/helloService?wsdl这个地址来查看wsdl配置文件的内容。如果正确显示,则发布成功了。上述代码可以直接右键Run As Java Application来运行发布服务,下图所示的情况时发布成功的:


接下来再建一个客户端类,来测试一下发布好的服务。

package com.tgb.webservice;import java.net.MalformedURLException;import java.net.URL;import javax.xml.namespace.QName;import javax.xml.ws.Service;public class HelloClient {public static void main(String[] args) {try {URL url = new URL("http://localhost:9000/helloService?wsdl");QName sName = new QName("http://impl.webservice.tgb.com/",        "helloService");Service service = Service.create(url, sName);HelloService helloService = service.getPort(HelloService.class);System.out.println(helloService.sayHello("Fiala"));} catch (MalformedURLException e) {e.printStackTrace();}}}


  其中的url是发布好的服务的wsdl文件地址。QName传的参数一个是namespaceURI,一个是要访问的服务类名,namespaceURI就对应了wsdl文件中的targetNamespace,访问的服务类名就是wsdl文件中的serviceName名称。


  直接右键Run As Java Application就可以得到结果,我的结果是输出:Hello,Fiala!


实例升级:客户端和服务端分离


  在上面的例子中,客户端的类和服务端的类是建在同一个项目下的,这其实是没有做到分布式的,下面就要另外建一个Java项目,实现客户端和服务端的分离。


  利用wsimport命令,将服务端的代码导出为class文件。

                                      

  

  wsimport:导出代码

  -d:要导出的位置,这个位置要提前创建好

  -keep:导出的时候同时导出源代码

  -verbose:输出导出时的详细信息

  http://localhost:9000/helloService?wsdl:发布的服务地址


  导出完成后在相应路径下会生成代码,生成时会直接把包生成进去。把生成的包拷贝到新创建好的Java Project的src下,如下图:

                                                                                                   

创建一个HelloClient类,里面的代码就变成了下面的:

package com.tgb.webservice;import com.tgb.webservice.impl.HelloService;import com.tgb.webservice.impl.HelloService_Service;public class HelloClient {public static void main(String[] args) {HelloService_Service helloServiceImplService = new HelloService_Service();HelloService helloService = helloServiceImplService        .getHelloServicePort();System.out.println(helloService.sayHello("Tom"));}}
右键直接Run As Java Application,就可以得到输出结果:Hello,Tom!


实例再升级:面向服务


  从上面的例子也可以看到,客户端对服务端的调用其实是依赖wsdl文件的,调用的内容也都是wsdl文件规定好的,所以我们可以发布好服务,然后将wsdl文件给客户端,这样客户端就不用依赖服务端的接口或者类了,也就实现了面向服务了。


总结


  对于面向服务的调用方式,暂时还不太了解wsdl是怎么配置的,接下来还需要深入学习。过路大牛,如果看到了有什么问题,请指正,谢谢!

1 0
原创粉丝点击