对于webservice一种通俗易懂的解释,个人觉得对于刚刚接触的人来说是比较易于接受跟理解的:

webservice 只就是POST类型的 HTTP请求;以往的HTTP请求都是 浏览器从FORM 里发出的
用于提交 表单,比如 浏览器提交 username=tom&password="123456" 给服务器,服务器验证完 用户名和密码正确后 再返回字符串 "success".
后来 发现 可以把提交的内容做的更复杂, 因为服务器可以接受更多东西以计算。
比如:提交给服务器 <username>tom</username>
<password>123456</password>
<bothdata>19800305</bothdate>
........ 还有很长就不写了
然后服务器返回<result>success</result>

但是这种新的提交方法 再叫作POST表单请求就不合适了,起个新的名子吧,就叫WEBSERVICE,这种提交的格式就叫做 XML 。因为这东西 比 原来那个

username=tom&password="123456" 更容易被人读懂,而且可以存储表达更多东西。

至于于那个WDSL 就是一种格式规范,他就像是小学语文规定“每个新段落开头要空两个字” 没什么区别它规定了 提交WEBSERVICE 时 应该

把 开头写什么标示,结尾写什么标示,.....

=================================================================

大纲:

1,Web Service是什么
2,Web Service可以做什么
3,Web Service 什么时候用
4,Web Service如何构建和应用

1 Web service是什么
Web Service是什么,web service就是一种基于web 的服务,但这个服务需要供求双方按照规定去做才能实现的服务。
Web Service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把能调用这个Web service 的应用程序叫做客户端程序。
Web Service 希望实现不同的系统之间能够用“软件-软件对话”的方式相互调用,打破了软件应用、网站和各种设备之间的格格不入的状态,实现“基于Web无缝集成”的目标。
这种服务里包含几个概念:


UDDI:统一描述、发现和集成(Universal Description, Discovery, and Integration,UDDI)

UDDI 的目的是为电子商务建立标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业能够发现的访问协议的实现标准。 其中包含注册用户企业的地址、联系方法、已知的企业标识。行业类别,也包含关于该企业所提供的Web Service的技术信息。


WSDL:Web 服务描述语言(Web Services Description Language,WSDL)
Web Service描述语言WSDL就是用机器能阅读的方式提供的一个正式描述文档而基于XML的语言,用于描述Web Service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读解析的的,又是人可阅读的。
当你向别人介绍你提供的WebService的功能和函数参数时候,你可能会自己写一套文档,你甚至可能会口头上告诉需要使用你的Web Service的人。这些非正式的方法至少都有一个严重的问题:当程序员坐到电脑前,想要使用你的Web Service的时候,他们的工具(如Visual Studio)无法给他们提供任何帮助,因为这些工具根本就不了解你的WebService。解决方法是:用机器能阅读的方式提供一个正式的描述文档。Web service描述语言(WSDL)就是这样一个基于XML的语言,用于描述Web service及其函数、参数和返回值。因为是基于XML的,所以WSDL既是机器可阅读的,又是人可阅读的,这将是一个很大的好处。


SOAP简单对象访问协议(SOAP,全写为Simple Object Access Protocol)是一种标准化的通讯规范,主要用于Web服务(Web Service)中。它是用于交换XML编码信息的轻量级协议。SOAP是个通信协议, SOAP在HTTP协议的基础上,把编写成XML的REQUEST参数, 放在HTTP BODY上提交个WEB SERVICE服务器, 处理完成后,结果也写成XML作为RESPONSE送回用户端。简单的说 SOAP就是HTTP+XML处理的协议。

2 web service之咖啡连锁店采购的故事

网上有一个咖啡连锁店采购咖啡的故事,我结合自己的理解简化了一下这个故事,便于对Web Service的更好理解。
有一个咖啡连锁店的老板叫Coffee Break,要拓展自己销售的咖啡品种,他指示他的采购经理去寻找一些新的咖啡提供商,得到他们的咖啡全部价格,并且在需要时能够立即下订单,Coffee Break能够分析他们的价格,并决定选用哪一种咖啡,从哪个公司进货。

采购经理就将具体任务分配给软件工程师,软件工程师认为寻找新的咖啡提供商的最好办法是搜索UDDI注册中心.假定所有的咖啡供应商都在UDDI中注册了。(包含地址、联系方法、企业标识。行业类别,包含关于该企业所提供的Web Service的技术服务信息)。
软件工程师给UDDI发送指令 进行相关咖啡提供商信息的搜索。UDDI注册中心搜索完成后,注册中心将发回那些符合条件的咖啡经销商的信息。
工程师的下一步工作就是从这些分销商名单中列出他们的咖啡销售价格。
工程师分析这些咖啡经销商的信息,查看他们提供的Web Service 服务 分析WSDL文本,然后得到了获取咖啡销售价格的方法和相应的网址.他就通过访问web service的方式向那些具体的咖啡经销商网址发出请求,以获得其销售的咖啡价格。
每个咖啡分销商都会接受到这样的请求,在他发出销售价格之前,他也会先去查询一下产品的当前期货价格,这样Coffee Break就得到了最新的XML文本格式的咖啡价格。
而工程师这边的客户端 和 咖啡经销商web service服务端的信息交互 都是 基于SOAP协议发送xml文本来实现的。
Web Service 是将XML文本在各个网站之间传送和接受,以达到信息交换的目的。在接收和传送时依靠SOAP协议。

3 Web Service可以做什么

Web Servcie最主要的优点是: 即跨语言,跨平台的不同系统之间的通信。 现在企业内部的很多系统集成,企业和企业之间的系统集成的问题。Web Service是主要的解决方案。(服务重用,降低开发成本,只开放自己愿意开放的服务)。

4 Web service 什么时候用

Web Service ,RMI,Socket 是现在主要的系统交互方式。

RMI为Java平台的分布式计算提供了一个简单而直接的模型。因为Java的RMI技术是基于Java平台的,所以它将Java平台的安全性和可移植性等优点带到了分布式计算中。RMI大大扩展Java的网络计算能力,它为编写基于分布式对象技术的企业级Internet/Intranet应用提供了强大的系统平台支持。远程方法调用作为Java分布式对象技术成为Java核心的API之一(在java.rmi.* 包)。RMI的引入,使得Java程序之间能够实现灵活的,可扩展的分布式通信。

Socket的英文原义是“孔”或“插座”。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,象一个多孔插座。一台主机犹如布满各种插座的房间,每个插座有一个编号,有的插座提供220伏交流电, 有的提供110伏交流电,有的则提供有线电视节目。 客户软件将插头插到不同编号的插座,就可以得到不同的服务。

java中也提供有Socket编程方式,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

RMI是JAVA的首选远程调用协议,非常高效稳定,特别是在少数据量的远程调用方面,与其他通讯协议的差距尤为明显。Web Service的效率是其1/10

RMI与Socket相比,传输相同的有效数据,RMI需要占用更多的网络带宽资源。

一旦你的应用需要在client与server之间传输大量的数据,极端的,比如FTP应用,则RMI是不适合的,我们应该使用 Socket。

RMI技术比较socket的网络编程主要有以下几个方面:
第一、RMI是面向对象的,而后者不是。
第二、RMI是与语言相绑定的。比如当你使用Java RMI技术的时候,客户端与服务器端都必须使用Java开发。而socket的网络编程是使用独立于开发语言的,甚至独立于平台。基于Socket的网络编程,客户端与服务器端可以使用不同开发语言和不同的平台。

RMI的使用约束是 交互的两个系统都必须是Java语言。

Socket的使用主要应用于c/s的系统架构中。

Web Service 是基于SOAP的服务,实现起来最简单,而且交互的系统没有语言限制。

在搭建应用实现方面的容易程度方面

应用容易程度 Web Service>RMI>Socket

5 Web Service如何构建和应用

在 java语言方面现在主要的Web Service框架是Axis2, Xfire, Cxf
新一代的 Web Services 框架如 Axis2、CXF 都是由原来的项目中逐渐演化而来的,Axis2 是由大家熟悉的 Axis 1.x 系列演化过来,而 Apache CXF 则是由 Celtix 和 XFire 项目整合而生。
Axis2很久没更新了,Xfire转做CXF,而 CXF适用于spring2.0,spring1.0不支持
如果应用程序需要多语言的支持,Axis2 应当是首选了; 如果应用程序是遵循 Spring 哲学路线的话,Apache CXF 是一种更好的选择。





webservice编程基础—cxf (还没花时间好好研究)

博客分类:

WebSevice

最近研究了一下cxf的使用,主要的步骤如下:
一, 下载最新的cxf包apache-cxf-2.6.2.tar.zip,并解压,有一个lib文件,里面的jar包,就是webservice需要的(不完全需要,看你的应用,但是懒的分),加载进你的webservice的工程即可。
二, 配置两个配置文件,为beans.xml和web.xml,内容如下:
beans.xml
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:jaxws="http://cxf.apache.org/jaxws"

xsi:schemaLocation="

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

<import resource="classpath:META-INF/cxf/cxf.xml" />

<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />

<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

<jaxws:endpoint id="HelloWorld" address="/HelloWorld" implementor="com.demo.HelloWorldImpl"/>
</beans>
需要注意的是,上面红色的部分,其中,id不用管,主要是和spring集成需要的吧,address就是你的服务名,这里配置为HelloWorld。Implementor配置的是服务的实现类,这里是com.demo包里的类HelloWorldImpl。

Web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:j2ee="http://java.sun.com/xml/ns/j2ee">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/beans.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>

</listener>


<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/services/*</url-pattern>
</servlet-mapping>
</web-app>
上面红色部分是在weblogic配置需要主要的(在上一篇文章中提过)。
下面是服务端的代码:
HelloWorld.java:
package com.demo;
import java.util.ArrayList;
import java.util.List;
import javax.jws.WebParam;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
//@WebParam(name="text",targetNamespace="http://demo.com/")
String sayHi(@WebParam(targetNamespace="http://demo.com/")String text);
String sayHiToUser(@WebParam(targetNamespace="http://demo.com/")User user);
ArrayList<String> SayHiToUserList(@WebParam(targetNamespace="http://demo.com/")List<User> userList);

}


HelloWorldImpl.java
package com.demo;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

//注解
//@WebService(endpointInterface="com.demo.HelloWorld",serviceName="HelloWorld")
public class HelloWorldImpl implements HelloWorld {

Map<Integer, User> users = new LinkedHashMap<Integer, User>();

public String sayHi(String text) {
return "Hello " + text;
}
public String sayHiToUser(User user) {
users.put(users.size()+1, user);
return "Hello "+ user.getName();
}
public ArrayList<String> SayHiToUserList(List<User> userList) {
String[] result = new String[userList.size()];
ArrayList<String> list = new ArrayList<String>();
int i=0;
for(User u:userList)
{
result[i] = "Hello " + u.getName();
list.add(result[i]);
i++;
}
return list;
}
}

注意在HellWorld.java中@WebService是表明如下的接口是webservice接口,不能删除。如果不加@WebParam(targetNamespace)以指定参数的命名空间,用xfire根据wsdl生成客户端时,会出现错误。原因为:
查看soap信息,发现在soap信息中多加入了namespace:ns2。如下:<ns2:operation xmlns:ns4="" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="url2" xsi:type="ns4:url4">
原因是服务器端的operation是没有定义targetNamespace,而xfire生成客户端时,如果也没有定义targetNamespace,它会默认的取Service的targetNamespace。

部署在Weblogic时,可能会出现jar包冲突:
解决办法是:
在startWebLogic.cmd。配置:
set CLASSPATH_CXF=E:\JavaWorkSpace\CXFServer2\WebRoot\WEB-INF\lib\geronimo-ws-metadata_2.0_spec-1.1.3.jar
set CLASSPATH=%CLASSPATH_CXF%;%CLASSPATH%;%MEDREC_WEBLOGIC_CLASSPATH%
大概就是这些了,很容易吧。

PS:使用xfire调用cxf的服务时,如果传递List类型时,可能会出现问题,不知道什么原因,麻烦哪位大哥知道,告诉我,我们一起学习吧。