GVKun编程网logo

webservice定义(webservice详解)

5

这篇文章主要围绕webservice定义和webservice详解展开,旨在为您提供一份详细的参考资料。我们将全面介绍webservice定义的优缺点,解答webservice详解的相关问题,同时也会

这篇文章主要围绕webservice定义webservice详解展开,旨在为您提供一份详细的参考资料。我们将全面介绍webservice定义的优缺点,解答webservice详解的相关问题,同时也会为您带来axis2实现webservice之使用services.xml文件发布WebService、java 学习笔记之 webservice(一)- 入门实例,自定义 webservice 服务、java学习笔记之webservice(四)--用Myeclipse在web项目中发布WebService、MOSS2007自定义WebService(1)-----自定义Webservice的步骤介绍的实用方法。

本文目录一览:

webservice定义(webservice详解)

webservice定义(webservice详解)

两个JVM之间的通讯可以用webservice,它有如下定义: SOAP:简单对象访问协议,一般由http+xml组成 WSDL:wen service discription language:是一种通过xml描述的语言 uddi:发现与整合服务,可直接用取得的地址代替,如:http://www.ayandy.com/Service.asmx?WSDL,或这个地址表示的xml的硬盘绝对路径

axis2实现webservice之使用services.xml文件发布WebService

axis2实现webservice之使用services.xml文件发布WebService

       还是对教程的延伸,本来是周五要写的,但是耽搁了一下,就拖到周一了。

      Axis2实现Web Service,虽然可以将POJO类放在axis2\WEB-INF\pojo目录中直接发布成Web Service,这样做不需要进行任何配置,但这些POJO类不能在任何包中。这似乎有些不方便,为此,Axis2也允许将带包的POJO类发布成Web Service
   
先实现一个POJO类,代码如下: 

package service; public class MyService { public String getGreeting(String name) { return "您好 " + name; } public void update(String data) { System.out.println("<" + data + ">已经更新"); } }

这个类有两个方法,这两个方法都需要发布成Web Service方法。这种方式和直接放在pojo目录中的POJO类不同。要想将MyService类发布成Web Service,需要一个services.xml文件,这个文件需要放在meta-inf目录中,该文件的内容如下:

<service name="myService"> <description> Web Service例子 </description> <parameter name="ServiceClass"> service.MyService </parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/> </messageReceivers> </service>

其中<service>元素用于发布Web Service,一个<service>元素只能发布一个WebService类,name属性表示WebService名,如下面的URL可以获得这个WebServiceWSDL内容:

http://localhost:8080/axis2/services/myService?wsdl (这个得等到.aar文件出来之后)

其中name属性名就是上面URL"?""/"之间的部分。

<description>元素表示当前Web Service的描述,<parameter>元素用于设置WebService的参数,在这里用于设置WebService对应的类名。在这里最值得注意的是<messageReceivers>元素,该元素用于设置处理WebService方法的处理器。例如,getGreeting方法有一个返回值,因此,需要使用可处理输入输出的RPcmessageReceiver类,而update方法没有返回值,因此,需要使用只能处理输入的RPCInOnlyMessageReceiver类。

使用这种方式发布WebService,必须打包成.aar文件,..aar文件实际上就是改变了扩展名的.jar文件。在现在建立了两个文件(这两个文件夹任意):MyService.javaservices.xml。将MyService.java编译,生成MyService.classservices.xmlMyService.class文件的位置如下:

D:\ws\service\MyService.class

D:\ws\meta-inf\services.xml

   
 windows控制台中进入ws目录,并输入如下的命令生成.aar文件(实际上,.jar文件也可以发布webservice,但axis2官方文档中建议使用.aar文件发布webservice):

jar cvf ws.aar .    jar cvf AxisTest.aar .

    如下是我测试的过程

        原来发现不管要.aar,之后还需要一个“.”,即.arr.,但是最坑爹的就是这里了,加了“.”之后还是不对啊,最后的问题居然是这个后面的点要空一格,不能紧挨着.arr


      如下成功之后的文件夹情况


    最后将ws.aar文件复制到<Tomcat安装目录>\webapps\axis2\WEB-INF\services目录中,启动Tomcat后,就可以调用这个WebService了。

      已经显示webservice发布成功了,接下来就是编写客户端进行调运了,跟前面一样,也需要wsdl2java命令去生成stub类,过程我就不多说了,之前的博客里有

如下是调用客户端的代码

package service; import org.apache.axis2.AxisFault; public class MyServiceStubClient { public static void main(String[] args) { // Todo Auto-generated method stub try { MyServiceStub mss = new MyServiceStub(); MyServiceStub.GetGreeting gg = new MyServiceStub.GetGreeting(); MyServiceStub.Update up = new MyServiceStub.Update(); gg.setName("美女"); up.setData("帅哥"); try { mss.update(up); System.out.println("美女"+mss.getGreeting(gg).get_return()); } catch (Exception e) { // Todo Auto-generated catch block e.printstacktrace(); System.out.println("发生异常"); } } catch (AxisFault e) { // Todo Auto-generated catch block e.printstacktrace(); } } }


运行结果

由于“帅哥”是在服务器端打印的,所以客户端是看不到的。

在打包arr文件的时候,发现有一个build.xml文件,这个是ant脚本中的知识,在本题中暂时不涉及,以后再介绍。

 

如果想发布多个WebService,可以使用<serviceGroup>元素,如再建立一个MyService1类,代码如下:

package service public class MyService1 { public String getName() { return "bill"; } }


services.xml文件中可以使用如下的配置代码来配置MyServiceMyService1类:

<serviceGroup> <service name="myService"> <description> Web Service例子 </description> <parameter name="ServiceClass"> service.MyService </parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/> </messageReceivers> </service> <service name="myService1"> <description> Web Service例子 </description> <parameter name="ServiceClass"> service.MyService1 </parameter> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" /> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/> </messageReceivers> </service> </serviceGroup>

java 学习笔记之 webservice(一)- 入门实例,自定义 webservice 服务

java 学习笔记之 webservice(一)- 入门实例,自定义 webservice 服务


1    WebService 是用来做什么?

WebService 是一种跨编程语言和跨操作系统知识库 " 操作系统平台的远程调用技术。用于网络通信,多台机器之间的数据交互。

 

2    与 socket 的区别

1. socket 是在网络中的数据传输层,采用的是 TCP/UDP 协议,webservice 是属于应用层,采用的是 http 协议

2. socket 建立是长连接,webservice 建立的是短连接(调用服务时建立连接,调用完毕后断开连接)

 

3    WebService 入门实例

3.1  定义服务

a). 定义服务的接口:

package com.beauxie.webservice;

import javax.jws.WebService;

/**
 * 定义服务的接口
 * @author Beauxie
 *
 */
@WebService//此注解用在类上指定将此类发布成一个WebService
public interface Speaker {

  String sayHello(String name);

}

b). 创建实现这个接口的实现类:

package com.beauxie.webservice;

import javax.jws.WebService;

/**
 * 定义服务的实现类
 * @author Beauxie
 */
@WebService(endpointInterface="com.beauxie.webservice.Speaker")
public class Person implements Speaker {

	public String sayHello(String name) {
		 
		return "Hello,"+name;
	}

}

注意:接口和实现类中必须用 @WebService 注解,并且在实现类的注解中必须指定 endpointInterface 属性的值为接口的全限定名

3.2  发布服务

package com.beauxie.webservice;
import javax.xml.ws.Endpoint;

/**
 * 发布服务
 * @author Beauxie
 */
public class Service {
	
	public static void main(String[] args){
		
		//1.定义发布的地址
		String url = "http://localhost:8080/demo";
		
		//2.发布服务
		//第一个参数是指定你要发布的地址,第二个参数是你要发布的服务对象
		Endpoint.publish(url, new Person());
		
		System.out.println("服务器已启动");
	}

}
运行程序进行发布,运行结果:

 




然后打开浏览器访问 http://localhost:8080/demo?wsdl,只要在客户端浏览器能看以下 WSDL 文档,说明服务发布成功:













3.3  客户端去调用服务

如果是内部系统之间的调用,那么提供 2 个信息就可以调用 webservice:

1. wsdl 的地址

2. 接口文件(jar 包)

package com.beauxie.webservice;

import java.net.URL;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;

/**
 * 客服端调用
 * @author Beauxie
 *
 */
public class Client {
	
	public static void main(String[] args) throws Exception {
		
		//1.声明所发布的服务对应的wsdl地址
		URL url=new URL("http://localhost:8080/demo?wsdl");
		
		//2.声明所要调用的Qname
		QName qname=new QName("http://webservice.beauxie.com/", "PersonService");
		
		//3.创建客户端的服务代理对象
		Service service=Service.create(url,qname);
		Speaker speaker = service.getPort(Speaker.class);
		
		//4.调用服务的方法
		String str=speaker.sayHello("Beauxie");
		
		System.out.println(str);
	}

}
运行结果:


 

附:QName 中两个参数所对应 wsdl 文档中参数:












其实可以直接访问 http://localhost:8080/demo,但由于自己的电脑原因,无法访问,所以只能访问 wsdl 地址了。


》》未完待续,接下一篇


java学习笔记之webservice(四)--用Myeclipse在web项目中发布WebService

java学习笔记之webservice(四)--用Myeclipse在web项目中发布WebService

》》接上一篇


准备工作:

1、新建一个web项目;

2、定义服务的接口Speaker:

package com.beauxie.webservice;

import javax.jws.WebService;

/**
 * 定义服务的接口
 * @author  
 *
 */
@WebService//此注解用在类上指定将此类发布成一个WebService
public interface Speaker {
	
	String sayHello(String name);

}
3.创建这个接口的实现类Person:

package com.beauxie.webservice;

import javax.jws.WebService;

/**
 * 定义服务的实现类
 * @author Beauxie
 *
 */
@WebService(endpointInterface="com.beauxie.webservice.Speaker")
public class Person implements Speaker {

	public String sayHello(String name) {
		 
		return "Hello,"+name;
	}

}

主要步骤:

1.依次点击左上角的“File”-->“New”-->“other”,如下图所示:


2.选择"Web Service",点击“Next”,如下图所示:



3.点击"Install JAX-WS-Facet"安装JAX-WS-Facet,如下图所示:



4.选择自己所要发布服务的项目等,如下图所示:



5.在 Java class一栏中,选择web服务的实现类,(点击右边的Browse,直接搜索类名即可),其余的不用修改:



6.完成上述步骤以后,在WEB-INF目录下可以看到多了两个文件:“sun-jaxws.xml”和“web.xml”,然后再导入相关的jar包,不然会报错:java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServletContextListener 。(点击下载相关jar包)


7.打开"web.xml",可查看配置:



8.启动web项目之后,打开浏览器,访问“web.xml”中servlet(url-pattern)对应的webservice:


出现以上界面,说明服务发布成功。


总结:

1.当出现:java.lang.ClassNotFoundException: com.sun.xml.ws.transport.http.servlet.WSServletContextListener异常时,很大原因是因为忘了导入相关jar包;

2.通过“web.xml”中对应的servlet(url-pattern)访问发布的webservice,每个人端口号不同,我这里修改了tomcat的配置文件,将默认端口改成了80。


接下一篇 》》



MOSS2007自定义WebService(1)-----自定义Webservice的步骤介绍

MOSS2007自定义WebService(1)-----自定义Webservice的步骤介绍

MOSS2007自定义WebService

 

提到WebService,我们会想到asmx文件,那我们就从这个asmx文件开始:

1.    新建一个asmx文件,例如叫MyService.asmx,其内容如下:

<%@ WebService Language="C#" Class="MyServiceClass,MyServiceAssembly,Version=1.0.0.0,  Culture=neutral,PublicKeyToken=722dca430e2d0190" %>

那么就从这个里面引出了一个GACassembly出来,那么我们进行下一步

2.    使用Visual Studio创建一个ClassLibrary的项目,并且将这个项目进行强命名,为什么要进行强命名呢,就是因为我们会将生成的dll部署到GAC中供WebService引用,然后如果要部署到GAC中就需要对项目进行强命名。那么我们就讲述一下如果对项目进行强命名。

3.    强命名主要有两种方式:

(1)  项目右键---属性---签名---为程序集签名",不使用密码

(2)  使用VSTool 命令行,使用sk –k c:/Service.snk,然后使用这个snk文件对项目进行强命名即可

4.    这一步我们主要是讲一些这个Webservice的项目内容,如何类编写

   using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using Microsoft.SharePoint.Utility;
using Microsoft.SharePoint;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class MyService : System.Web.Services.WebService
{
    public MyService ()     {    }

    [WebMethod]
    public string HelloWorld()
    {
        return "Hello World";
    }
}

这里需要指出的就是继承WebService类,方法是用[WebMethod]特性即可。

5.    生成静态发现文件service.discoWebservice的描述文件service.wsdl

(1)service.asmx拷贝到c:/Program Files/Common Files/Microsoft Shared/Web Server Extensions/12/template/layouts目录下,然后打开VS2005的命令行工具,使用如下命令:

disco http://chris/_layouts/Service.asmx 生成service.discoservice.wsdl文件

(2)service.discoservice.wsdl文件中的<?xml version="1.0" encoding="utf-8"?>该语句替换为以下语句:

<%@ Page Language="C#" Inherits="System.Web.UI.Page"    %> <%@ Assembly Name="Microsoft.SharePoint,Version=12.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" %> <%@ Import Namespace="Microsoft.SharePoint.Utilities" %> <%@ Import Namespace="Microsoft.SharePoint" %>
<%@ Import Namespace="Microsoft.SharePoint.Utilities" %>
<%@ Import Namespace="Microsoft.SharePoint" %>
<% Response.ContentType = "text/xml"; %>

实际上就是把原来的纯xml变换成为一个page来解析。并且这个页面的解析是通过moss来自动处理的,是不需要我们关心的,也就是说对我们是透明的。 

(3)service.disco中的

<contractRef ref=http://chris/_layouts/service.asmx?wsdl 
docRef="http://carysun/_layouts/service.asmx" xmlns="http://schemas.xmlsoap.org/disco/scl/" />
<soap address="http://chris/_layouts/service.asmx" xmlns:q1=http://tempuri.org/ 
                    binding="q1:ServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
<soap address=http://chris/_layouts/service.asmx xmlns:q2=http://tempuri.org/ 
binding="q2:ServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" />

替换为:

<contractRef ref=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request) + "?wsdl"),Response.Output); %> docRef=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> xmlns="http://schemas.xmlsoap.org/disco/scl/" />

  <soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> xmlns:q1="http://schemas.microsoft.com/sharepoint/soap/" binding="q1:HostServiceSoap" xmlns="http://schemas.xmlsoap.org/disco/soap/" />

  <soap address=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> xmlns:q2="http://schemas.microsoft.com/sharepoint/soap/" binding="q2:HostServiceSoap12" xmlns="http://schemas.xmlsoap.org/disco/soap/" />
(4)service.wsdl中的
<soap:address location="http://chris/_layouts/service.asmx" />

<soap12:address location="http://chris/_layouts/service.asmx" /> 

替换为:
<soap:address location=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> /><soap12:address location=<% SPHttpUtility.AddQuote(SPHttpUtility.HtmlEncode(SPWeb.OriginalBaseUrl(Request)),Response.Output); %> />

对于contractRef 还有soap address这两个节的更改,实际上是在页面里面重新编码了soap的查询url,这样做的目的也
是为了moss托管的web service可以在运行时根据动态的请求来定位。 

(1)service.discoservice.wsdl改名为servicedisco.aspxservicewsdl.aspx

6.  部署WebService

主要是将service.asmxservicedisco.aspxservicewsdl.aspx拷贝到C:/Program Files/Common Files/Microsoft Shared/Web Server Extensions/12/ISAPI这个目录中,然后将我们项目生成的dll部署到GAC中即可

7.  调用WebService

使用浏览器访问http://chris/_vti_bin/serivce.asmx 即可看到 Service中提供的方法,然后可以进行调用。

以上就是我们在MOSS2007中自定义WebService的过程,希望对大家有所帮助。

关于webservice定义webservice详解的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于axis2实现webservice之使用services.xml文件发布WebService、java 学习笔记之 webservice(一)- 入门实例,自定义 webservice 服务、java学习笔记之webservice(四)--用Myeclipse在web项目中发布WebService、MOSS2007自定义WebService(1)-----自定义Webservice的步骤介绍等相关知识的信息别忘了在本站进行查找喔。

本文标签: