现在的位置: 首页 > 综合 > 正文

WebService学习笔记(一)

2013年12月05日 ⁄ 综合 ⁄ 共 3137字 ⁄ 字号 评论关闭

1、WebService简介

WebService是一种面向服务的架构的技术,通过标准的Web协议提供服务,目的是保证不同平台的应用服务可以互操作。

根据W3C的定义,Web服务(Web service)应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务通常是许多应用程序接口(API)所组成的,它们透过网络,例如国际互联网(Internet)的远程服务器端,执行客户所提交服务的请求。

尽管W3C的定义涵盖诸多相异且无法介分的系统,不过通常我们指有关于主从式架构(Client-server)之间根据SOAP协议进行传递XML格式消息。无论定义还是实现,WEB服务过程会由服务器提供一个机器可读的描述(通常基于WSDL)以辨别服务器所提供的WEB服務。另外,虽然WSDL不是SOAP服务端点的必要条件,但目前基于Java的主流WEB服务开发框架往往需要WSDL实现客户端的源代码生成。一些工业标准化组织,比如WS-I,就在WEB服务定义中强制包含SOAP和WSDL。

2、WebService相关注解

根据JSR 181规范,WebService 常用到的注解包括@WebService, @WebMethod, @WebParam, @WebResult, @HandlerChain等。

@WebService 用来标注PortType实现类或PortType接口。常用属性如下:

  • name: 标注的PortType类型;
  • serviceName: 生成的Service名称;
  • portName: 调用port的名称
  • endpointInterface: 使用portType接口定义时使用。

@WebMethod 用来标注服务提供的方法。

  • operationName: 定义WSDL里描述的方法的名称;
  • action: 定义action的名称
  • exclude: 定义该方法是否加入到web service对外提供的接口中。

@WebParam 用来标注提供服务的具体方法的参数。

  • name: 生成WSDL时用来描述方法参数的名称。
  • mode: 参数的类型,有IN、OUT、INOUT;
  • header:定义参数是否位于header中传输;

@WebResult 用来标注服务提供方法的返回值;

  • name: 生成WSDL时描述方法的返回名称;
  • header: 返回的值是否放在SOAP Header中传输。

@HandlerChain 用来标注WebService服务器端使用到的handler。

  • file: 定义handler链的文件;
  • name: handler链的名称;

此处只是简要的总结下,具体的详情请参看:

JAX-WS 注释 

http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=%2Fcom.ibm.websphere.wsfep.multiplatform.doc%2Finfo%2Fae%2Fae%2Frwbs_jaxwsannotations.html

3、WebService开发步骤

下面以JDK6.0自带的JWX-WS为例,讲述开发一个HelloWorld的示例;

A) 服务器端程序

i)生成WebService注释类。

package org.study.service;

import javax.jws.WebParam;
import javax.jws.WebService;

@WebService
public class HelloWorld {

	/**
	 * 输入用户名称,返回对用户的问候。
	 * 
	 * @param name 用户名称
	 * @return 问候语句
	 */
	public String sayHello(@WebParam(name="name")String name){
		return "welcome "+name+", to web-service world!";
	}
}

生成WebService实现类。

ii)发布WebService接口。

package org.study.service.publisher;
import javax.xml.ws.Endpoint;

import org.study.service.HelloWorld;

public class ServicePublisher {
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("====正在启动Service服务器程序====");
        Endpoint.publish("http://localhost/service/helloWorld", new HelloWorld());
        System.out.println("====Service服务器启动完成=====");
        System.out.println("可以通过地址 [http://localhost/service/helloWorld?wsdl]访问服务相关描述信息!");
    }
}

运行这个Publisher程序,发布WebService,可以访问 http://localhost/service/helloWorld?wsdl访问服务描述信息。

B)客户端程序

i) 根据WSDL描述信息生成WebService访问接口

新建Java工程helloWorldServiceClient, 在源文件夹src下,新建importWs.bat内容如下:

# 根据wsdl生成相关的service文件
wsimport -s . -d ../bin http://localhost/service/helloWorld?wsdl

然后运行: 生成相关的service java文件和class文件。

注意: 运行importWs.bat之前,需已经运行Service服务端程序。 即http://localhost/service/helloWorld?wsdl可访问。

ii) 编写客户端代码:

package org.study.service.client;

import org.study.service.HelloWorld;
import org.study.service.HelloWorldService;

public class HelloWorldClient {
	
	public static void main(String[] args){
		HelloWorldService service = new HelloWorldService();
		HelloWorld portType = service.getHelloWorldPort();
		// invoke service method
		String welcomeStr = portType.sayHello("Walker Jong");
		System.out.println(welcomeStr);
	}
}

执行客户端代码,即可访问service;

源代码:

helloWorldServiceServer.rar

helloWorldServiceClient.rar

参考文献:

1、 Web服务中文wiki   http://zh.wikipedia.org/zh/Web%E6%9C%8D%E5%8A%A1

2、JAX-WS 注释 

http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=%2Fcom.ibm.websphere.wsfep.multiplatform.doc%2Finfo%2Fae%2Fae%2Frwbs_jaxwsannotations.html

抱歉!评论已关闭.