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链的名称;
此处只是简要的总结下,具体的详情请参看:
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;
源代码:
参考文献:
1、 Web服务中文wiki http://zh.wikipedia.org/zh/Web%E6%9C%8D%E5%8A%A1
http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=%2Fcom.ibm.websphere.wsfep.multiplatform.doc%2Finfo%2Fae%2Fae%2Frwbs_jaxwsannotations.html