首页 > Java开发 > Webservice-基于JWS初级实例(二)

Webservice-基于JWS初级实例(二)

JWS是Java语言对WebService服务的一种实现,用来开发和发布服务。而从服务本身的角度来看JWS服务是没有语言界限的,是Java语言为Java开发者提供便捷发布和调用WebService服务的一种途径。

去年这个时候在亿阳工作,经理让我做数据同步功能,用到WS,于是草草研究之后,就投入使用了。前两天同事给我讲解分配给我的项目时,讲到其中一块是数据同步功能,我不禁一笑,同事问笑什么,我说世界真是奇妙,去年这时候在做数据同步,今年换公司换项目换领导,还让我做数据同步。其实,从这也看出,随着信息化在中国的大力推进,像移动、广电这样的单位用的企业系统已经不止是一个两个,而是几十个,甚至上百,也就必然出现了系统间的通信和数据传输的问题,WS、SOA这些技术应该就是在此背景下出来的。

翻了翻之前关于WS的博客,就写了一篇《Webservice-初涉(一)》,我看有必要继去年的博客写个系列了。上篇大概提了几个关于WS的点,我们先做一个快速实例,暂且抛开CXF、Axis等框架,从简单的例子入手,再一步步来究其原理。创建两个Java Project,一个为服务器01_service,另一个为客户端01_service_client。首先编写服务器端:

  1. 实体类User

 

[java][/java] view plaincopy

  1. package cn.net.easyway.service;
  2. public class User {
  3.     private int id;
  4.     private String username;
  5.     private String password;
  6.     public int getId() {
  7.         return id;
  8.     }
  9.     public void setId(int id) {
  10.         this.id = id;
  11.     }
  12.     public String getUsername() {
  13.         return username;
  14.     }
  15.     public void setUsername(String username) {
  16.         this.username = username;
  17.     }
  18.     public String getPassword() {
  19.         return password;
  20.     }
  21.     public void setPassword(String password) {
  22.         this.password = password;
  23.     }
  24. }

 

 

 

 

 

 

 

  1. 提供服务的接口类

 

[java][/java] view plaincopy

  1. package cn.net.easyway.service;
  2. import javax.jws.WebParam;
  3. import javax.jws.WebResult;
  4. import javax.jws.WebService;
  5. @WebService() //将此接口发布成WS
  6. public interface IMyService {
  7.     @WebResult(name="loginUser") //在生成wsdl文件时,返回值显示成为loginUser
  8.     //在生成wsdl文件时,参数不是arg,而显示为username,password
  9.     public User login(@WebParam(name="username")String username,@WebParam(name="password")String password);
  10. }

 

 

 

 

 

 

 

此接口称为服务提供接口,SEI(Service Endpoint Interface),以上代码中,@WebResult和@WebParam是可选注

解,读者在去掉前后观察wsdl文档,看看究竟发生了哪些变化。

  1. 实现类

 

[java][/java] view plaincopy

  1. package cn.net.easyway.service;
  2. import javax.jws.WebService;
  3. @WebService(endpointInterface="cn.net.easyway.service.IMyService") //endpointInterface:接入点接口
  4. public class MyServiceImpl implements IMyService {
  5.     @Override
  6.     public User login(String username, String password) {
  7.         System.out.println(username + "is logining");
  8.         User user = new User();
  9.         user.setId(1);
  10.         user.setUsername(username);
  11.         user.setPassword(password);
  12.         return user;
  13.     }
  14. }

 

 

 

 

 

 

 

此类称为服务实现Bean,SIB(Serviceimplemention Bean),

endpointInterface属性指向接口。

  1. 服务发布类

 

[java][/java] view plaincopy

  1. package cn.net.easyway.service;
  2. import javax.xml.ws.Endpoint;
  3. public class Server {
  4.     public static void main(String[] args) {
  5.         String address = "http://localhost:8888/ws";
  6.         //两个参数,一个是发布服务地址,一个是发布的服务实现
  7.         Endpoint.publish(address, new MyServiceImpl());
  8.     }
  9. }

 

 

 

 

 

 

 

编写完服务发布类后,读者可运行起来,在浏览器中敲入:http://localhost:8888/ws?wsdl,即可看到相应的wsdl文档。到此时服务已经发布成功,接下来我们编写客户端,在项目01_service_client中创建类TestClient,代码如下:

 

[java][/java] view plaincopy

  1. package cn.net.easyway.service;
  2. import java.net.MalformedURLException;
  3. import java.net.URL;
  4. import javax.xml.namespace.QName;
  5. public class TestClient {
  6.     public static void main(String[] args) throws MalformedURLException {
  7.         //创建访问wsdl服务地址的url
  8.         URL url = new URL("http://localhost:8888/ws?wsdl");
  9.         //通过Qname指明服务的具体信息
  10.         QName sname = new QName("http://service.easyway.net.cn/","MyServiceImplService");
  11.         //-------------------------方式一-------------------------
  12.         MyServiceImplService msis = new MyServiceImplService(url, sname);
  13.         IMyService ms1 = msis.getMyServiceImplPort();
  14.         System.out.println(ms1.login("张三", "123"));
  15.         //------------------------方式二----------------------------------------
  16.         //创建服务
  17.         //Service service = Service.create(url,sname);
  18.         //实现接口
  19.         //IMyService ms = service.getPort(IMyService.class);
  20.         //System.out.println(ms.login("李四", "123"));
  21.     }
  22. }

 

 

 

 

 

 

 

此时,你会看到自己编辑器报错,那是因为客户端这个项目中还没有创建和服务端一致的接口,把服务端源代码直接拷贝明显是行不通,因为在实际项目开发中,别人给你提供接口,是没有必要把源代码给你的,因此这里我们需要一个命令wsimport,这是一个JDK自带的命令,如果您安装了jdk,那么就可以在命令窗口使用该命令了,该命令是将wsdl文档生成相应的类文件,我们可以把生成的这个类文件拷贝到客户端目录下,如同在本地调用一样,调用服务端了,生成的源文件大家可以看一下,是和服务端完全不同的代码,此时,我的客户端项目目录如下图:

 

wsimport命令参数解释如下:

wsimport -dd   :/wsimport -keep -verbosehttp://localhost:8888/ws?wsdl

-d d:/temp    :指定生成的目录;

-keep         :指定是否生成Java源文件;

-verbose      :显示生成的详细过程;

http://localhost:8888/ws?wsdl:网络中的wsdl文件;

下一篇讲解WSDL和工具。


本文固定链接: http://www.devba.com/index.php/archives/3080.html | 开发吧

报歉!评论已关闭.