`
Motte2010
  • 浏览: 22331 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

WebService学习之路一

阅读更多

 

 闲来无事,根据教学视频学下WS,做下简单的记录

 

现行的 WS主要有 SOAP XML axis2xfireCXF

 

不管是哪种接口,哪种平台基于哪种语言开发的WS 都严格按照wsdl标准和soap协议。

 

以下的学习 主要都是基于注解的形式开发,jdk1.6,开发工具eclipse

 

一、第一个简单的示例

首先创建一个WS项目。


代码:

//定义接口

@WebService(targetNamespace="com.trylin.ws.service")
public interface ITest {
	public int add(int a,int b);
	public int minus(int a,int b);
}

//定义实现类
@WebService(endpointInterface="com.trylin.ws.service.ITest")
public class TestImpl implements ITest{
	public int add(int a, int b) {
		return a+b;
	}
	public int minus(int a, int b) {
		return a-b;
	}
}

//开启服务

publicstaticvoid main(String[] args) {

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

       Endpoint.publish(address, new TestImpl());

}

 
   验证服务

打开浏览器,输入http://localhost:8888/WS?wsdl  显示发布服务的wsdl



 

代码解释

上述代码中实现了一个简单的WS的发布。

首先定义一个接口和实现类 ITest,TestImpl

然后加入@WebService  注解。

targetNamespace 属性表示发布后生成WSDL文件的命名空间(默认值:当前类的包路径),对应namespace

<import namespace="http://com.trylin.ws.service/" location="http://localhost:8888/WS?wsdl=1"/>

这里有个小细节,注意到这个namespace是不是觉得有点别扭呢,先想想包命名原则,下面生成客户端调用的时候,简单再说明一下。

 

endpointInterface 属性表示实现的接口

 

Endpoint.publish(address, new TestImpl());

根据地址  实现类,将接口发布。

发布后的WS地址就是 address ,可以直接访问,在address后加入 ?wsdl 可以查看接口发布后的wsdl

 

 

客户端调用

上面就算是发布了一个简单的WS,简单吧,然后客户端怎么调用呢?

这里就用到了jdk 1.6自带的 wsimport命令

打开cmd命令窗口 ,输入 wsimport, 如图:(ps:请保证在你运行电脑的jdk环境变量设置正确,没有jdk配置环境变量,百度下)



 
简单的介绍几个主要的命令

-d 指明生成WS客户端文件本地存放目录

-verbose 查看生成的详细信息(生成日志)

-p 指定ws客户端生成文件的包名(默认按照 @webService定义的命名空间)

-keep 是否生成源文件( 表示生成的文件中 包含java class ,不加只有class)

 

创建本地客户端存放目录

D:/webservice/test

(记得开服务哦运行上面的main)

cmd 输入 wsimport -d D:\webservice\test -keep -verbose http://localhost:8888/WS?wsdl



 

generating code...   表示创建的java文件 

compiling code...    表示编译java文件

 

上面不是说过 wsdl上的命名空间有点问题,这下看日志有看出来吗?哈哈,应该有发现吧,生成的java源文件的目录是不是和我们在服务端的源文件目录刚好颠倒了呢。我也是看到这里才发现这个问题的。简单的说下我个人对这个问题的想法吧。

Java关于包,有个简单的命名原则,就是按照域名反向命名,比如 baidu.com 包名就叫com.baidu。我们生成的客户端文件是根据wsdl生成的,包名是根据wsdl中的namespace定义,只不过会将namespace视为一个域名,然后反向生成客户端类的包名。我在第一个示例中的接口中定义了@WebService(targetNamespace="com.trylin.ws.service") 按照反向,生成的包名就是 service.ws.trylin.com   然后就出现了我们刚才的客户端文件和服务端文件包名相反的现象了。 

这个只是我个人的一个凭空猜想,没什么依据可言,呵呵。

 

OK,按照我上面的理解,我把命名空间 反向定义  service.ws.trylin.com

重新生成客户端。

然后再创建一个新的clinet项目,把生成的客户端复制到项目中,创建客户端测试类。

 


/**
 * @ClassName: ITestCase
 * @Description: 
 * @author Try_Lin
 * @date 2013-7-15 下午11:45:06
 *
 */
public class ITestCase {
	
	/**
	 * 根据java提供的ws调用
	 * @throws Exception
	 */
	@Test
	public void testClient1() throws Exception{
		URL url = new URL("http://localhost:8888/WS?wsdl");   //wsdl路径
		
		//可以从  产生的wsdl中definitions 节点属性中 找到   targetNamespace  和 serviceName 
		String targetNamespace = "http://impl.service.ws.trylin.com/";//WS指向命名空间
		String serviceName = "TestImplService";//WS发布服务名称
		QName qname = new QName(targetNamespace, serviceName);
		Service service = Service.create(url,qname);
		ITest test = service.getPort(ITest.class);
		System.out.println(test.add(1, 2));
	}
	/**
	 * 根据wsdl生成的客户端调用的
	 */
	@Test
	public void testClient2(){
		TestImplService service = new TestImplService();
		ITest test = service.getTestImplPort();
		System.out.println(test.add(3, 2));
	}

}

 
 
两种调用方式都可以,只是第二种方式看上去更加简洁。

  可以看下 第二种方式的 TestImplService代码 ,其实只是对第一种方式的部分封装。

 public TestImplService() {
        super(TESTIMPLSERVICE_WSDL_LOCATION, new QName("http://impl.service.ws.trylin.com/", "TestImplService"));
    }

    /**
     * 
     * @return
     *     returns ITest
     */
    @WebEndpoint(name = "TestImplPort")
    public ITest getTestImplPort() {
        return super.getPort(new QName("http://impl.service.ws.trylin.com/", "TestImplPort"), ITest.class);
    }

   这样一个简单的WS就实现了

 

测试代码在附件中。。。

 

WSDLSOAP相关,待续

我也是看教学视频,边看边琢磨然后写下,方便以后自己忘记的时候,可以参考下。

如果有大神看到这里,还希望指点下错误的地方,或者提供下学习建议。 

 

 WebService学习之路二:   http://trylin.iteye.com/blog/1907883

 

 

 

  • 大小: 48.9 KB
  • 大小: 47.3 KB
  • 大小: 14.6 KB
  • 大小: 21 KB
  • 大小: 92.8 KB
6
4
分享到:
评论
13 楼 susiya 2013-08-14  
java_xiaoxu 写道
你好,我现在也在做WebService,但是我的要部署在Weblogic上,并且通过Servlet启动WebService服务,你知道如何做吗?或者给点建议,谢谢了


你是要部署到linux吧?
12 楼 susiya 2013-08-14  
不错,虽然做这个有一段时间了,但总体还是没什么概念,看了我要研究一下这个视频才行
11 楼 Motte2010 2013-07-21  
lvwenwen 写道
楼主应该可以上传可以跑的工程吧

嗯,我现在也是边看边学,等所有的视频我看完了,我会简单的做一个用户登录认证接口,然后用tomcat部署,然后共享,现在直接把学习的代码上传没什么意义。
10 楼 lvwenwen 2013-07-21  
楼主应该可以上传可以跑的工程吧
9 楼 Motte2010 2013-07-17  
java_xiaoxu 写道
你好,我现在也在做WebService,但是我的要部署在Weblogic上,并且通过Servlet启动WebService服务,你知道如何做吗?或者给点建议,谢谢了

现在的myeclipse中可以创建webService的项目,然后spring现在也对webservice有支持,这个你可以参考下网上的大牛们的示例,我也会试着部署,然后写成博客。。。呵呵。。可能短时间不会哦。。。
8 楼 java_xiaoxu 2013-07-17  
你好,我现在也在做WebService,但是我的要部署在Weblogic上,并且通过Servlet启动WebService服务,你知道如何做吗?或者给点建议,谢谢了
7 楼 Motte2010 2013-07-16  
sakajiaofu 写道
你发布的这个webservice 让axis2的客户端调用可以成功吗

可以,你用axis2 jar包中的WSDL2Java 根据wsdl生产客户端,只不过axis2生成的客户端文件和我这里用 wsimport生成的有点差异,但基本都一样。
在生成的客户端中  有个 *ServiceLocator.java  通过它的get*Port()方法可以获取到你发布的接口对象,然后调用方法就ok。我在下面的学习中,说明下 axis2 xfire等客户端的实现。
6 楼 sakajiaofu 2013-07-16  
你发布的这个webservice 让axis2的客户端调用可以成功吗
5 楼 liu_shui8 2013-07-16  
8错,值得学习
4 楼 Motte2010 2013-07-16  
cloudzb 写道
这个视频下载点资源不错!

嗯,共同学习。。。
3 楼 cloudzb 2013-07-16  
这个视频下载点资源不错!
2 楼 Motte2010 2013-07-16  
yao00jun 写道
什么视频啊???可以介绍下吗?

当然可以,有好资源肯定是需要分享,我有必要把这个地址弄个博客贴出来,让大家都知道下
http://www.verycd.com/topics/2917293/    
1 楼 yao00jun 2013-07-16  
什么视频啊???可以介绍下吗?

相关推荐

    Eclipse下WebService学习.doc

    【Eclipse下WebService学习】 在IT领域,WebService是一种基于开放标准的、允许不同系统之间进行交互的技术。在Eclipse这个流行的Java集成开发环境中,开发者可以方便地创建、部署和测试WebService。本文档主要介绍...

    WebService学习之路三

    【WebService学习之路三】 在IT领域,WebService是一种用于构建分布式应用程序的技术,它允许不同系统间的交互,不受平台或编程语言的限制。本篇主要聚焦于WebService的学习,通过深入理解其原理和实践,来提升我们...

    webservice学习

    在“WebService CXF学习:整合Spring框架”的主题下,我们可能将深入学习如何配置和管理CXF服务,包括创建服务端点、定义服务接口、编写服务实现、设置客户端代理,以及如何利用Spring的配置和依赖注入来简化这些...

    WebService 学习

    【WebService学习】 WebService是一种基于互联网的、松散耦合的分布式计算模型,它允许不同的系统之间进行数据交换和业务交互。这项技术的核心是利用XML(可扩展标记语言)作为数据交换的标准格式,SOAP(简单对象...

    WebService学习资料(很全)

    WebService学习资料(很全)WebService学习资料(很全)WebService学习资料(很全)WebService学习资料(很全)WebService学习资料(很全)WebService学习资料(很全)

    springboot2.0webService学习

    springboot2.0webService学习 

    WebService学习之路四

    【WebService学习之路四】 在IT领域,WebService是一种基于标准协议(如SOAP、WSDL和UDDI)的开放式网络服务,允许不同系统间的应用程序通过互联网进行通信。本篇将深入探讨WebService的学习路径,重点关注其核心...

    webservice学习资料和样例(xfire)

    webservice学习资料和样例webservice学习资料和样例webservice学习资料和样例webservice学习资料和样例webservice学习资料和样例webservice学习资料和样例

    WebService学习和了解

    WebService学习和了解 WebService的优点 SOAP是什么?WSDL是什么?

    webservice 学习的c#版本实例

    本教程以"webservice 学习的c#版本实例"为主题,将引导你深入理解Webservice的原理以及C#中实现Webservice的方法。 首先,让我们了解ASMX Web Service。ASMX是.NET Framework早期用于构建Web服务的技术,它基于SOAP...

    WebService学习总结

    WebService学习过程中,知识点的总结,和例子。

    WebService学习笔记

    **WebService学习笔记** WebService是一种基于互联网的、平台和语言无关的接口规范,它允许不同系统间的应用程序进行交互和数据共享。这项技术的核心是利用XML(可扩展标记语言)作为数据交换格式,SOAP(简单对象...

    Eclipse下WebService学习

    【Eclipse下WebService学习】 在Eclipse环境下学习和开发WebService是一项重要的技能,尤其对于Java开发者而言。WebService是一种基于标准的、平台无关的通信机制,它允许不同系统间的应用程序通过网络进行互操作。...

    java注解webservice学习第一篇

    Java注解是Java编程语言中的一个重要特性,它允许在代码中添加元数据,为编译器、解释器或任何其他工具提供额外的信息。在Java Web服务...通过学习和掌握这些知识,开发者可以更高效地构建和维护Web服务应用。

    webservice学习报告

    webservice学习报告,理论与实践

    WebService学习笔记0001

    【WebService学习笔记0001】 在IT领域,WebService是一种基于开放标准(如XML、SOAP、WSDL和UDDI)的互操作性技术,它允许不同系统间的应用程序通过网络进行通信。本学习笔记将围绕WebService的核心概念、工作原理...

    webService学习资料

    【标题】:“webService学习资料” 【描述】:“webService学习资料,内含有思维导图两张,webservice资料整理,欢饮下载。” 【标签】:“webService” 在信息技术领域,Web服务(Web Service)是一种基于互联网...

Global site tag (gtag.js) - Google Analytics