一:简介
Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。
Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。Web Service是自描述、 自包含的可用网络模块, 可以执行具体的业务功能。Web Service也很容易部署, 因为它们基于一些常规的产业标准以及已有的一些技术,诸如标准通用标记语言下的子集XML、HTTP。Web Service减少了应用接口的花费。Web Service为整个企业甚至多个组织之间的业务流程的集
二:需要知识
XML. Extensible Markup Language -扩展性标记语言 
 XML,用于传输格式化的数据,是Web服务的基础。 
 namespace-命名空间。 
 xmlns=“http://itcast.cn” 使用默认命名空间。 
 xmlns:itcast=“http://itcast.cn”使用指定名称的命名空间。
WSDL – WebService Description Language – Web服务描述语言。 
 通过XML形式说明服务在什么地方-地址。 
 通过XML形式说明服务提供什么样的方法 – 如何调用。
SOAP-Simple Object Access Protocol(简单对象访问协议) 
 SOAP作为一个基于XML语言的协议用于有网上传输数据。 
 SOAP = 在HTTP的基础上+XML数据。 
 SOAP是基于HTTP的。 
 SOAP的组成如下: 
 Envelope – 必须的部分。以XML的根元素出现。 
 Headers – 可选的。 
 Body – 必须的。在body部分,包含要执行的服务器的方法。和发送到服务器的数据。
三:wsdl语言解析
Wsdl文档从下往上读
Types - 数据类型定义的容器,它使用某种类型系统(一般地使用XML Schema中的类型系统)。(入参和出参的数据类型) 
 Message - 通信消息的数据结构的抽象类型化定义。使用Types所定义的类型来定义整个消息的数据结构(入参和出参)。 
 Operation - 对服务中所支持的操作的抽象描述,一般单个Operation描述了一个访问入口的请求/响应消息对(方法)。 
 PortType - 对于某个访问入口点类型所支持的操作的抽象集合,这些操作可以由一个或多个服务访问点来支持(服务类)。 
 Binding - 特定服务访问点与具体服务类的绑定(不看内容,看关系)。 
 Port - 定义为webservice单个服务访问点。 
Service- 相关服务访问点的集合。
四:webService调用网站
http://www.webxml.com.cn
五:生成客户端代码
- wsimport是jdk自带的,可以根据wsdl文档生成客户端调用代码的工具.
- 服务器端的WebService是用什么语言写的,都将在客户端生成Java代码.服务器端用什么写的并不重要.
- wsimport.exe位于JAVA_HOME\bin目录下. 
 常用参数为:-d<目录> - 将生成.class文件。默认参数。
 • -s<目录> - 将生成.java文件和class文件。
 • -p<生成的新包名> -将生成的类,放于指定的包下。
 • (wsdlurl) - http://server:port/service?wsdl,必须的参数。
 示例:
 D:/> wsimport –s . http://192.168.0.20/person?wsdl
六:soap协议版本1.1和1.2的理解
1) SOAP1.1请求消息体
POST /WebServices/MobileCodeWS.asmx HTTP/1.1
Host: webservice.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/getMobileCodeInfo"
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <getMobileCodeInfo xmlns="http://WebXml.com.cn/"> <mobileCode>string</mobileCode> <userID>string</userID> </getMobileCodeInfo> </soap:Body> </soap:Envelope> 
 2) SOAP1.1相应消息体
HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <getMobileCodeInfoResponse xmlns="http://WebXml.com.cn/"> <getMobileCodeInfoResult>string</getMobileCodeInfoResult> </getMobileCodeInfoResponse> </soap:Body> </soap:Envelope> 
 而1.1和1.2的主要的区别:Content-Type的不同。
七:利用jdk发布webservice服务
注意:用Jdk1.6.0_21以后的版本发布一个WebService服务.
说明: 在JDK1.6中JAX-WS规范定义了如何发布一个webService服务。 
 JAX-WS是指Java Api for XML – WebService. 
 与Web服务相关的类,都位于javax.xml.ws.*包中。 
 主要类有: 
 a) @WebService - 它是一个注解,用在类上指定将此类发布成一个webservice服务. 
 b) Endpoint – 此类为端点服务类,它的方法publish用于将一个已经添加了@WebService注解对象绑定到一个地址的端口上。Endpoint是jdk提供的一个专门用于发布服务的类,它的publish方法接收两个参数,一个是本地的服务地址,二是提供服务的类。它位于javax.xml.ws.*包中。 
 static Endpoint.publish(String address, Object implementor) 在给定地址处针对指定的实现者对象创建并发布端点。stop方法用于停止服务。 
 其他注意事项: 
 1) 给类添加上@WebService注解后,类中所有的非静态方法都将会对外公布。不支持静态方法,final方法。 
 2) 如果希望某个方法(非static,非final)不对外公开,可以在方法上添加@WebMethod(exclude=true),阻止对外公开。 
 3) 如果一个类上,被添加了@WebService注解,则必须此类至少有一个可以公开的方法,否则将会启动失败。 
 4) 服务类中不能没有方法 
 5) @WebMethod(exclude=true)屏蔽方法
helloService.java
package org.sihai.cxf;
import javax.jws.WebService;
import javax.xml.ws.BindingType;
@WebService
public class HelloService {
    public String sayHello(String name){
        return "hello" + name;
    }
} 
 发布类: 
 cxfTest.java
package org.sihai.cxf;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
public class TestCxf {
    public static void main(String[] args) {
        JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();//设置服务工厂bean
        sf.setAddress("http://localhost:8888/hello");//设置服务地址
        sf.setServiceBean(new HelloService());//设置服务类
        sf.setServiceClass(HelloService.class);
        sf.create();
    }
} 
        
             