Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术。是:通过SOAP在 Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
XML:(Extensible Markup Language)扩展型可标记语言。面向短期的临时数据处理、面向万维网络,是Soap的基础。
Soap:(Simple Object Access Protocol)简单对象存取协议。是XML Web Service 的通信协议。当用户通过UDDI找到你的WSDL描述文档后,他通过可以SOAP调用你建立的Web服务中的一个或多个操作。SOAP是XML文档形式的 调用方法的规范,它可以支持不同的底层接口,像HTTP(S)或者SMTP。
WSDL:(Web Services Description Language) WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自动生成和使用。
UDDI (Universal Description, Discovery, and Integration) 是一个主要针对Web服务供应商和使用者的新项目。在用户能够调用Web服务之前,必须确定这个服务内包含哪些商务方法,找到被调用的接口定义,还要在服 务端来编制软件,UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)来发布,编辑,浏览 以及查找注册信息。它采用XML格式来封装各种不同类型的数据,并且发送到注册中心或者由注册中心来返回需要的数据。
Apache CXF一个开源的Service框架,它实现了JCP与Web Service中一些重要标准。CXF简化了构造,集成,面 向服务架构(SOA)业务组件与技术的灵活复用。在CXF中,Service使用WSDL标准定义并能够使用各种不同的消息 格式(或binding)和网络协议(transports)包括SOAP、XML(通过HTTP或JMS)进行访问。CXF同样支持多种model 如:JAX-WS,JBI,SCA和CORBA service。CXF设计成可灵活部署到各种容器中包括Spring-based,JBI,SCA, Servlet和J2EE容器。
Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目的精华,提供了对 JAX-WS 全面的支持,并且提供了多种 Binding 、DataBinding、Transport 以及各种 Format 的支持,并且可以根据实际项目的需要,采用代码优先(Code First)或者 WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。目前它仍只是 Apache 的一个孵化项目。
地址:http://cxf.apache.org/download.html
导入CXF至少需要的包:
package com.lin.ws.entity; public class User{ private Integer id; private String name; private String password; public User() { super(); // TODO Auto-generated constructor stub } public User(Integer id, String name, String password) { super(); this.id = id; this.name = name; this.password = password; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", password=" + password + "]"; } }
package com.lin.ws.intf; import javax.jws.WebService; import com.lin.ws.entity.User; /** * 服务的接口 * @author lin * */ //暴露的事这个接口 @WebService public interface IUserService { public void addUser(User user); public User getUserById(Integer id); public Integer countOfUser(); }
package com.lin.ws.impl; import java.util.Random; import javax.jws.WebService; import com.lin.ws.entity.User; import com.lin.ws.intf.IUserService; /** * 服务实现类 * @author lin * */ //注解指定该服务的接口,和服务的名称 @WebService(endpointInterface="com.lin.ws.intf.IUserService",serviceName="UserService") public class UserServiceImpl implements IUserService { @Override public void addUser(User user) { System.out.println("Add a user:"+user.toString()); } @Override public User getUserById(Integer id) { System.out.println("Get a user by id:"+id); return null; } @Override public Integer countOfUser() { Integer count = (new Random()).nextInt(); System.out.println("Return the count of users: "+count); return count; } }
package com.lin.ws.main; import javax.xml.ws.Endpoint; import com.lin.ws.impl.UserServiceImpl; import com.lin.ws.intf.IUserService; public class ServerMain { public static void main(String[] args) { System.out.println("Publishing the service..."); IUserService userService = new UserServiceImpl(); //发布webService服务,http://localhost:8080/UserService是该服务的地址,userService是该服务的服务端实现类 Endpoint.publish("http://localhost:8080/UserService", userService); System.out.println("Publish finish..."); } }
发布服务后,在浏览器里输入
http://localhost:8080/UserService?wsdl
查看服务的WSDL文档:
WSDl是描述该服务的一个XML文件,可以从该文档中清楚地知道服务的具体输入输出和参数类型(相当于知道一些服务端方法),具体网上可以搜WSDL文档的详解.
在命令终端进入客户端项目的src文件夹,执行apache-cxf/bin下的wsdl2java文件,wsdl2java wsdl文档地址
然后客户端项目的src里就有了一些java文件
package com.lin.ws.main; import com.lin.ws.impl.UserService; import com.lin.ws.intf.IUserService; import com.lin.ws.intf.User; public class ClientMain { public static void main(String[] args) { //wsdl2java工具生成的类,该;类继承子Service UserService factory = new UserService(); IUserService userService = factory.getUserServiceImplPort(); //调用服务 userService.addUser(new User()); userService.countOfUser(); userService.getUserById(1); System.out.println("Invoke Server Finish..."); } }
我的一个WebService入门小例子就完成了.
项目的目录结构
服务端:
客户端: