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

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

1. 实体类User

package cn.net.easyway.service;

public class User {

	private int id;

	private String username;

	private String password;

	public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}

2. 提供服务的接口类

package cn.net.easyway.service;

import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService; @WebService() //将此接口发布成WS
public interface IMyService { @WebResult(name="loginUser") //在生成wsdl文件时,返回值显示成为loginUser
//在生成wsdl文件时,参数不是arg,而显示为username,password
public User login(@WebParam(name="username")String username,@WebParam(name="password")String password);
}

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

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

3. 实现类

package cn.net.easyway.service;

import javax.jws.WebService;

@WebService(endpointInterface="cn.net.easyway.service.IMyService") //endpointInterface:接入点接口
public class MyServiceImpl implements IMyService { @Override
public User login(String username, String password) { System.out.println(username + "is logining"); User user = new User(); user.setId(1);
user.setUsername(username);
user.setPassword(password); return user;
}
}

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

endpointInterface属性指向接口。

4. 服务发布类

package cn.net.easyway.service;

import javax.xml.ws.Endpoint;

public class Server {

	public static void main(String[] args) {

		String address = "http://localhost:8888/ws";

		//两个参数,一个是发布服务地址,一个是发布的服务实现
Endpoint.publish(address, new MyServiceImpl());
}
}

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

package cn.net.easyway.service;

import java.net.MalformedURLException;
import java.net.URL; import javax.xml.namespace.QName; public class TestClient { public static void main(String[] args) throws MalformedURLException {
//创建访问wsdl服务地址的url
URL url = new URL("http://localhost:8888/ws?wsdl");
//通过Qname指明服务的具体信息
QName sname = new QName("http://service.easyway.net.cn/","MyServiceImplService"); //-------------------------方式一-------------------------
MyServiceImplService msis = new MyServiceImplService(url, sname); IMyService ms1 = msis.getMyServiceImplPort();
System.out.println(ms1.login("张三", "123")); //------------------------方式二----------------------------------------
//创建服务
//Service service = Service.create(url,sname);
//实现接口
//IMyService ms = service.getPort(IMyService.class);
//System.out.println(ms.login("李四", "123"));
}
}

此时,你会看到自己编辑器报错,那是因为客户端这个项目中还没有创建和服务端一致的接口,把服务端源代码直接拷贝明显是行不通,因为在实际项目开发中,别人给你提供接口,是没有必要把源代码给你的,因此这里我们需要一个命令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文件;

下一篇讲解几个规范和工具。

Webservice-初级实例(二)的更多相关文章

  1. 主题:Java WebService 简单实例

    链接地址:主题:Java WebService 简单实例    http://www.iteye.com/topic/1135747 前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要 ...

  2. Java WebService入门实例

    Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务. Web Service的关键技术和规则: 1.XML:描述 ...

  3. WebService入门实例教程

    什么是WebService 通过使用WebService,您的应用程序可以向全世界发布信息,或提供某项功能,它是基于Web的服务,通过Web进行发布.查找和使用. WebService脚本平台需支持X ...

  4. webservice测试实例

    webservice测试实例(LR8.1) 接口声明:这个接口是sina的短信服务接口,我只是用来做脚本学习使用,不会对其产生压力:希望读者也只是用来进行录制学习,而不是产生压力. 接口文档:http ...

  5. C语言库函数大全及应用实例二

    原文:C语言库函数大全及应用实例二                                              [编程资料]C语言库函数大全及应用实例二 函数名: bioskey 功 能 ...

  6. VS2008中C#开发webservice简单实例

    1.创建工程 文件-> 新建->网站 如下图. 工程建好后,会自动添加如下代码: using System; using System.Linq; using System.Web; us ...

  7. Hibernate实例二

    Hibernate实例二 一.测试openSession方法和getCurrentSession方法 hebernate中可以通过上述两种方法获取session对象以对数据库进行操作,下面的代码以及注 ...

  8. Ajax实例二:取得新内容

    Ajax实例二:取得新内容 通过点击pre和next按钮,从服务器取得最新内容. HTML代码 <div id="slide">图片显示区</div> &l ...

  9. WPF中的多进程(Threading)处理实例(二)

    原文:WPF中的多进程(Threading)处理实例(二) //错误的处理 private void cmdBreakRules_Click(object sender, RoutedEventArg ...

  10. Java WebService 简单实例

    前言:朋友们开始以下教程前,请先看第五大点的注意事项,以避免不必要的重复操作. 一.准备工作(以下为本实例使用工具) 1.MyEclipse10.7.1 2.JDK 1.6.0_22 二.创建服务端 ...

随机推荐

  1. 屏幕编程 F4的帮组用法

    PROCESS ON VALUE-REQUEST. * 设置帮助(工作中心)  FIELD wa_zppt026-arbpl MODULE mdl_arbpl_f4. *&---------- ...

  2. 在界面线程不能使用Sleep和WaitForSingleObject之类的函数, 使用 MsgWaitForMultipleObjects

    http://blog.csdn.net/wishfly/article/details/3726985 你在主线程用了WaitForSingleObject,导致了消息循环的阻塞,界面假死. 然后在 ...

  3. NIO框架之MINA源码解析(转)

    http://blog.csdn.net/column/details/nio-mina-source.html http://blog.csdn.net/chaofanwei/article/det ...

  4. Android开发之下载Tomcat服务器的文件到模拟器的SD卡

    Tomcat服务器可以到Apache的官网去下载http://tomcat.apache.org/,如何配置和使用百度下也有很多介绍,只要把Java的SDK配下java_home环境变量就行了,因为T ...

  5. Linux目录结构和常用命令

    源地址:http://www.cnblogs.com/JCSU/articles/2770249.html 一.Linux目录结构 你想知道为什么某些程序位于/bin下,或者/sbin,或者/usr/ ...

  6. 空间参考系统与WKT解析

    空间参考系统与WKT解析 1.为什么要空间参考系统? 空间参考系统,也称为坐标系统.在GIS中为地理数据定位的基准,假设给你一个坐标(442281.875,4422651.589).如果不给你空间参考 ...

  7. form表单标签的enctype属性的作用

    Enctype是指定将数据回发到server时浏览器使用的编码类型.其编码类型有下面三种 一. application/x-www-form-urlencoded         这是通过表单发送数据 ...

  8. 在安装mysql出现的错误以及解决方法

    因为手贱更新了一下驱动,结果导致无线网卡出了问题.然而就算是从官网上下载了驱动各种折腾也没有弄好,心里特别堵.无奈只有重装系统这一条路了.这里表示特别难过,因为电脑上东西实在太多了,而且各种环境变量. ...

  9. CSS 文本框里添加按钮的实现

    有很多人做界面会经常发现设计师设计出这样的界面: 咋一看是一个文本框里加了一个按钮,经过谷歌之后,未发现在文本框里可以添加按钮. 但可以通过div来实现它. 我的做法是先做一个大小的div,然后用带里 ...

  10. SICP 习题 (2.6) 解题总结:丘奇计数

    SICP 习题 2.6 讲的是丘奇计数,是习题2.4 和 2.5的延续. 这里大师们想提醒我们思考的是"数"究竟是什么,在计算机系统里能够怎样实现"数".准备好 ...