`

Web Service概述二 (转载)

阅读更多

JavaSE6.0下的Web Service
从JavaSE6.0开始,Java引入了对Web Service的原生支持。我们只需要简单的使用Java的Annotation标签即可将标准的Java方法发布成Web Service。(PS:Java Annotation资料请参考 JDK5.0 Annotation学习笔记(一)

但不是所有的Java类都可以发布成Web Service。Java类若要成为一个实现了Web Service的bean,它需要遵循下边这些原则:

  •  这个类必须是public类
  •  这些类不能是final的或者abstract
  •  这个类必须有一个公共的默认构造函数
  •  这个类绝对不能有finalize()方法


下面我们将通过一个具体的Java Web Service代码例子,配合上述的WSDL文件,讲述如何编写JavaSE6.0的原生Web Service应用。

完整的Java Web Service类代码

Java代码
  1. package  org.jsoso.jws.server;   
  2.   
  3. import  java.util.ArrayList;   
  4. import  javax.jws.WebMethod;   
  5. import  javax.jws.WebParam;   
  6. import  javax.jws.WebResult;   
  7. import  javax.jws.WebService;   
  8. import  javax.jws.WebParam.Mode;   
  9. import  javax.jws.soap.SOAPBinding;   
  10. /   
  11.  * 提供WebService服务的类   
  12.  */   
  13. @WebService (name= "Example" , targetNamespace= "http://www.jsoso.com/wstest" , serviceName= "Example" )   
  14. @SOAPBinding (style=SOAPBinding.Style.RPC)   
  15. public   class  Example {   
  16.      private  ArrayList<Person> persons =  new  ArrayList<Person>();;   
  17.      /**  
  18.      *   
  19.      * 返回一个字符串  
  20.      * @param userName  
  21.      * @return  
  22.      */   
  23.      @WebMethod (operationName= "toSayHello" ,action= "sayHello" ,exclude= false )   
  24.      @WebResult (name= "returnWord" ) //自定义该方法返回值在WSDL中相关的描述   
  25.      public  String sayHello( @WebParam (name= "userName" )String userName) {   
  26.          return   "Hello:"  + userName;   
  27.     }   
  28.   
  29.      /**  
  30.      * web services 方法的返回值与参数的类型不能为接口  
  31.      * @param person  
  32.      * @return  
  33.      * @throws HelloException  
  34.      */   
  35.      @WebMethod (operationName= "sayHello" , action= "sayHello" )   
  36.      @WebResult (partName= "personList" )   
  37.      public  Person[] sayHello( @WebParam (partName= "person" , mode=Mode.IN)Person person,    
  38.             String userName)  throws  HelloException {   
  39.          if  (person ==  null  || person.getName() ==  null ) {   
  40.              throw   new  HelloException( "说hello出错,对像为空。。" );   
  41.         }   
  42.         System.out.println(person.getName() +  " 对 "  + userName +  " 说:Hello,我今年"  + person.getAge() +  "岁" );   
  43.         persons.add(person);   
  44.          return  persons.toArray( new  Person[ 0 ]);   
  45.     }   
  46. }  
package org.jsoso.jws.server;

import java.util.ArrayList;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.jws.WebParam.Mode;
import javax.jws.soap.SOAPBinding;
/
 * 提供WebService服务的类
 */
@WebService(name="Example", targetNamespace="http://www.jsoso.com/wstest", serviceName="Example")
@SOAPBinding(style=SOAPBinding.Style.RPC)
public class Example {
	private ArrayList<Person> persons = new ArrayList<Person>();;
	/**
	 * 
	 * 返回一个字符串
	 * @param userName
	 * @return
	 */
	@WebMethod(operationName="toSayHello",action="sayHello",exclude=false)
	@WebResult(name="returnWord")//自定义该方法返回值在WSDL中相关的描述
	public String sayHello(@WebParam(name="userName")String userName) {
		return "Hello:" + userName;
	}

	/**
	 * web services 方法的返回值与参数的类型不能为接口
	 * @param person
	 * @return
	 * @throws HelloException
	 */
	@WebMethod(operationName="sayHello", action="sayHello")
	@WebResult(partName="personList")
	public Person[] sayHello(@WebParam(partName="person", mode=Mode.IN)Person person, 
			String userName) throws HelloException {
		if (person == null || person.getName() == null) {
			throw new HelloException("说hello出错,对像为空。。");
		}
		System.out.println(person.getName() + " 对 " + userName + " 说:Hello,我今年" + person.getAge() + "岁");
		persons.add(person);
		return persons.toArray(new Person[0]);
	}
}



Annotation 1@WebService(name="Example", targetNamespace="http://www.jsoso.com/wstest", serviceName="Example")
@WebService标签主要将类暴露为WebService,其中targetNamespace属性定义了自己的命名空间,serviceName则定义了< definitions >标签和<service>标签的name属性。

Annotation 2:@SOAPBinding(style=SOAPBinding.Style.RPC)
@SOAPBinding标签定义了WSDL文档中SOAP的消息协议,其中style属性对应SOAP的文档类型,可选的有RPC和DOCUMENT

Annotation 3:@WebMethod(operationName="toSayHello",action="sayHello",exclude=false)
@WebMethod定义Web Service运作的方法,
属性action 对应操作的活动 ,如<soap:operation soapAction="sayHello" />
属性operationName匹配的wsdl:operation 的名称,如<operation name="toSayHello" parameterOrder="userName">
属性exclude 用于阻止将某一继承方法公开为web服务,默认为false

Annotation 4:@WebResult(name="returnWord")
@ WebResult定义方法返回值得名称,如<part name="returnWord" type="xsd:string" />

Annotation 5:@WebParam(partName="person", mode=Mode.IN
@WebParam定义方法的参数名称,如<part name="person" type="tns:person" />,其中mode属性表示参数的流向,可选值有IN / OUT / INOUT

这 里要着重说明的是,上述Web Service类的sayHello方法中,带有HelloException这个异常声明,造成该服务类不能直接发布成Web Service。需要使用wsgen工具为其生存异常Bean。关于wsgen工具的使用,请参考wsgen与wsimport命令说明

发布一个的Java Web Service
在 完成了上述的Web Service Annotation注释后,我们使用wsgen工具为其进行服务资源文件的构造(这里主要是生成一个名为 org.jsoso.jws.server.jaxws.HelloExceptionBean的异常bean类),最后使用以下的类发布Web 服务:

Java代码
  1. package  org.jsoso.jws.server;   
  2.   
  3. import  java.util.LinkedList;   
  4. import  java.util.List;   
  5. import  javax.xml.ws.Binding;   
  6. import  javax.xml.ws.Endpoint;   
  7. import  javax.xml.ws.handler.Handler;   
  8.   
  9. /**  
  10.  * @author zsy 启动web services服务  
  11.  */   
  12. public   class  StartServer {   
  13.   
  14.      /**  
  15.      * @param args  
  16.      */   
  17.      public   static   void  main(String[] args) {   
  18.          /*  
  19.          * 生成Example 服务实例  
  20.          */   
  21.         Example serverBean =  new  Example();   
  22.          /*  
  23.          * 发布Web Service到http://localhost:8080/hello地址  
  24.          */   
  25.         Endpoint endpoint =    
  26.            Endpoint.publish( "http://localhost:8080/hello" , serverBean);   
  27.         Binding binding = endpoint.getBinding();   
  28.          /*  
  29.          * 设置一个SOAP协议处理栈  
  30.          * 这里就简单得打印SOAP的消息文本  
  31.          */   
  32.         List<Handler> handlerChain =  new  LinkedList<Handler>();   
  33.         handlerChain.add( new  TraceHandler());   
  34.         binding.setHandlerChain(handlerChain);   
  35.         System.out.println( "服务已启动 http://localhost:8080/hello" );   
  36.     }   
  37. }  
package org.jsoso.jws.server;

import java.util.LinkedList;
import java.util.List;
import javax.xml.ws.Binding;
import javax.xml.ws.Endpoint;
import javax.xml.ws.handler.Handler;

/**
 * @author zsy 启动web services服务
 */
public class StartServer {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/*
		 * 生成Example 服务实例
		 */
		Example serverBean = new Example();
		/*
		 * 发布Web Service到http://localhost:8080/hello地址
		 */
		Endpoint endpoint = 
           Endpoint.publish("http://localhost:8080/hello", serverBean);
		Binding binding = endpoint.getBinding();
		/*
		 * 设置一个SOAP协议处理栈
		 * 这里就简单得打印SOAP的消息文本
		 */
		List<Handler> handlerChain = new LinkedList<Handler>();
		handlerChain.add(new TraceHandler());
		binding.setHandlerChain(handlerChain);
		System.out.println("服务已启动 http://localhost:8080/hello");
	}
}


在控制台运行这个类,就可以使用URL :http://localhost:8080/hello?wsdl 浏览到上文所描述的WSDL的全文了。这说明您的第一个Web Service应用发布成功!

构建Web Service客户端
使用JavaSE6.0构建Web Service的客户端是一件相当简单的事。这里我们要使用到JDK中的另一个命令行工具wsimport。在控制台下输入以下命令:

引用
wsimport -d ./bin -s ./src -p org.jsoso.jws.client.ref http://localhost:8080/hello?wsdl


即可在包org.jsoso.jws.client.ref中生成客户端的存根及框架文件。其中我们要使用的类只有两个:服务类Example_Service和本地接口Example。编写如下客户端,即可调用Web Service服务:

Java代码
  1. package  org.jsoso.jws.client;   
  2.   
  3. import  org.jsoso.jws.client.ref.*;   
  4.   
  5. public   class  RunClient {   
  6.   
  7.      /**  
  8.      * @param args  
  9.      */   
  10.      public   static   void  main(String[] args) {   
  11.          //初始化服务框架类   
  12.         Example_Service service =  new  Example_Service();   
  13.          //或者本地服务借口的实例   
  14.         Example server = (Example) service.getExamplePort();   
  15.          try  {   
  16.              //调用web service的toSayHello方法   
  17.             System.out.println( "输入toSayHello的返回值——"  + server.toSayHello( "阿土" ));            
  18.              Person person =  new  Person();   
  19.              person.setName( "阿土" );   
  20.              person.setAge( 25 );   
  21.               //调用web service的sayHello方法   
  22.              server.sayHello(person,  "机器人" );   
  23.                 
  24.              person =  new  Person();   
  25.              person.setName( "aten" );   
  26.              person.setAge( 30 );   
  27.               //调用web service的sayHello方法   
  28.              PersonArray list = server.sayHello(person,  "机器人" );   
  29.              //输出返回值   
  30.              System.out.println( "\n以下输入sayHello的返回值——" );   
  31.              for  (Person p : list.getItem()) {   
  32.                 System.out.println(p.getName() +  ":"  + p.getAge());   
  33.             }              
  34.         }  catch  (HelloException_Exception e) {   
  35.             e.printStackTrace();   
  36.         }   
  37.     }   
  38. }  
package org.jsoso.jws.client;

import org.jsoso.jws.client.ref.*;

public class RunClient {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
        //初始化服务框架类
	    Example_Service service = new Example_Service();
        //或者本地服务借口的实例
        Example server = (Example) service.getExamplePort();
        try {
            //调用web service的toSayHello方法
          	System.out.println("输入toSayHello的返回值——" + server.toSayHello("阿土"));        	
        	 Person person = new Person();
             person.setName("阿土");
             person.setAge(25);
             //调用web service的sayHello方法
			 server.sayHello(person, "机器人");
			 
			 person = new Person();
             person.setName("aten");
             person.setAge(30);
             //调用web service的sayHello方法
             PersonArray list = server.sayHello(person, "机器人");
            //输出返回值
             System.out.println("\n以下输入sayHello的返回值——");
			for (Person p : list.getItem()) {
				System.out.println(p.getName() + ":" + p.getAge());
			}			
		} catch (HelloException_Exception e) {
			e.printStackTrace();
		}
	}
}


届此,本次Web Service的学习暂告一个段落。Java Web Service是一个相当庞大的知识体系,其中涉及的相关技术较多,这里无法一一道来,我们将会在今后的开发和使用中,同大家做进一步深入的探讨和学习。

附录:wsgen与wsimport命令说明

wsgen
wsgen 是在JDK的bin目录下的一个exe文件(Windows版),该命令的主要功能是用来生成合适的JAX-WS。它读取Web Service的终端类文件,同时生成所有用于发布Web Service所依赖的源代码文件和经过编译过的二进制类文件。这里要特别说明的是,通常在Web Service Bean中用到的异常类会另外生成一个描述Bean,如果Web Service Bean中的方法有申明抛出异常,这一步是必需的,否则服务器无法绑定该对像。此外,wsgen还能辅助生成WSDL和相关的xsd文件。wsgen从资 源文件生成一个完整的操作列表并验证web service是否合法,可以完整发布。
命令参数说明:

  •  -cp 定义classpath
  •  -r 生成 bean的wsdl文件的存放目录
  •  -s 生成发布Web Service的源代码文件的存放目录(如果方法有抛出异常,则会生成该异常的描述类源文件)
  •  -d 生成发布Web Service的编译过的二进制类文件的存放目录(该异常的描述类的class文件)


命令范例: wsgen -cp ./bin -r ./wsdl -s ./src -d ./bin -wsdl org.jsoso.jws.server.Example

wsimport
wsimport 也是在JDK的bin目录下的一个exe文件(Windows版),主要功能是根据服务端发布的wsdl文件生成客户端存根及框架,负责与Web Service 服务器通信,并在将其封装成实例,客户端可以直接使用,就像使用本地实例一样。对Java而言,wsimport帮助程序员生存调用web service所需要的客户端类文件.java和.class。要提醒指出的是,wsimport可以用于非Java的服务器端,如:服务器端也许是C# 编写的web service,通过wsimport则生成Java的客户端实现。
命令参数说明:

  •  -d 生成客户端执行类的class文件的存放目录
  •  -s 生成客户端执行类的源文件的存放目录
  •  -p 定义生成类的包名


命令范例: wsimport -d ./bin -s ./src -p org.jsoso.jws.client.ref http://localhost:8080/hello?wsdl

分享到:
评论

相关推荐

    C#Web Service C#Web Service C#Web Service

    C# Web Service是一种基于.NET Framework的开发技术,用于创建分布式应用程序,使得不同系统间能够通过互联网进行通信。这种服务提供了一种标准化的方式,允许应用程序通过HTTP协议交换数据,因此,即使它们是由不同...

    service now web service

    ### Service Now Web Service知识点 #### 一、简介与概述 **Service Now Web Service**是一种集成解决方案,它允许不同应用程序之间通过网络进行通信。Service Now 支持多种类型的 Web 服务,包括作为提供者...

    D6 SOAP_WEB SERVICE程序设计.part1.rar

    delphi下soap编程指导 第一章 SOAP和Web Service的概念 第二章 组件模型、Internet/Intranet和...第十二章 Web service和执行效率 第十三章 Delphi的Soap和Web Service之幕后制作 第十四章 在Internet上使用Web Service

    PB11开发Web Service应用

    二、PB11中的Web Service开发 1. **创建Web Service客户端**:PB11提供了一个直观的向导,帮助开发者通过WSDL文件创建Web Service代理类。这使得开发者能够轻松地调用远程Web Service的方法,如同调用本地对象一样。...

    嵌入式Web Service

    二、嵌入式Web Service概述 嵌入式Web Service是指运行在嵌入式设备上的Web服务,能够通过网络协议与其他设备或服务器进行交互。与传统Web服务相比,它更侧重于资源受限环境下的高性能、低功耗和实时性,适用于智能...

    web service 教程

    webservice 从表面上看Web service 就是一个应用程序它向外界暴露出一个能够通过Web进行调用的API。这就是说你能 够用编程的方法通过Web来调用这个应用程序。 对Web service 更精确的解释 Web ...

    Java完整的Web Service示例代码,学会做web service程序

    本示例代码将帮助你理解和实现一个完整的Web Service程序。 首先,我们来看"xfire-client"部分。XFire是早先的一个Java Web Service框架,它简化了客户端和服务端的开发。在Java中,创建Web Service客户端通常涉及...

    web service reference

    #### 二、Web Service的作用 Web Service主要作用包括: - **实现应用间的集成**:通过Web Service,不同平台、不同语言编写的程序可以进行交互。 - **分布式计算**:允许跨网络、跨平台的服务交互,构建分布式计算...

    典型的Web Service结构

    #### 一、Web Service 概述 Web Service是一种标准的、跨平台的应用程序接口(API),它允许不同技术、不同语言编写的软件通过网络进行交互。无论Web Service是使用何种工具和技术开发的,只要采用SOAP协议并通过HTTP...

    基于Delphi的Web Service 客户端调用

    #### 一、Web Service 概述 ##### 1.1 Web Service 的定义及特点 Web Service 是一种新型的网络应用程序,它具有自包含(Self-Contained)、自描述(Self-Describing)以及模块化的特点。Web Service 通过网络发布...

    创建和访问Web Service

    【创建和访问Web Service】 1. **概述** Web Service是一种基于开放标准的互联网通信协议,它允许不同系统、不同平台的应用程序之间进行交互。通过使用XML(可扩展标记语言)作为数据交换格式,Web Service确保了跨...

    实战Delphi6.Kylix2.SOAP.Web Service程序设计篇李维著.zip

    《实战Delphi6.Kylix2.SOAP.Web Service程序设计篇》是由知名技术专家李维编著的一本专业书籍,主要面向的是希望深入理解和应用Delphi6、Kylix2、SOAP以及Web Service技术的开发者。这本书详细介绍了如何利用这些...

    编写基于.net的WEB SERVICE.rar

    一、Web Service概述 Web Service是通过XML、SOAP(简单对象访问协议)和WSDL(Web服务描述语言)等标准定义的接口,可以被任何支持这些标准的客户端调用。其核心优势在于实现了分布式计算,允许不同的应用系统之间...

    web service课件

    西北某高等院校研究生的web service课件,英文版的,总共7个ppt,比较简练,适合想快速了解学习web service的学生下载学习,分别是Web Services(ch3.1)、Web Services(ch3.2)、Web Services(ch3.3)、Web Services(ch...

    Visual C++源代码 102 如何异步调用Web Service程序

    Visual C++源代码 102 如何异步调用Web Service程序Visual C++源代码 102 如何异步调用Web Service程序Visual C++源代码 102 如何异步调用Web Service程序Visual C++源代码 102 如何异步调用Web Service程序Visual ...

    T100 Web Service开发,调试整合重启检查说明(简体版)

    ### T100 Web Service 开发、调试及整合重启检查说明 #### 文件概述 本文件主要针对T100 Web Service的开发、调试以及在遇到问题时如何进行整合重启检查进行了详细说明。适用于T100项目的工程师和服务人员,帮助...

    Web Service

    1.Web service經典開發文檔! 2.它是一個軟件系統﹐為了支持跨網絡的機器間相相互交互而設計。Web Service服務通常被定義為一組模塊化的API﹐它們可以通過網絡進行調用﹐來執行遠程系統的請求服務。 3.XFire 是 ...

    web service学习笔记

    #### 一、Web Service 的定义与概述 Web Service 开启了一种全新的应用模式,即“软件即服务”(Software as a Service, SaaS)。这一模式将原本基于客户端的“胖客户端”结构转变为基于浏览器的“瘦客户端”结构。...

    Web_Service开发指南

    #### 二、Web Service的关键技术 1. **SOAP (Simple Object Access Protocol)**:一种轻量级的协议用于在Web上交换结构化的和固有的类型的信息。SOAP消息由XML编码,通常使用HTTP传输。它定义了一种消息框架,使得...

    用vfp编写Web Service

    【标题】:用Visual FoxPro(VFP)编写Web Service 在信息技术日新月异的今天,Web Service作为实现跨平台、跨系统间数据交换的重要技术,已经广泛应用于各种应用场景。Visual FoxPro(VFP),作为一款老牌的数据库...

Global site tag (gtag.js) - Google Analytics