webservice基础

来源:互联网 发布:oracle导入txt数据 编辑:程序博客网 时间:2024/06/02 07:31

1.什么是webservice?

webservice是一种跨编程语言和跨操作系统平台的远程调用技术。

所谓的远程调用,就是一台计算机a上的一个程序可以调用另一台计算机b上的一个对象的方法,比如:银联提供给商场的pos机刷卡系统。

什么情况下可能用到远程调用技术呢?

例如,amazon,天气预报系统,淘宝网,校内网,百度等把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能,这样扩展了自己系统的市场占有率,往大的概念上吹,就是所谓的SOA(面向服务体系)应用。

所谓的跨编程语言就是服务端程序采用java语言编写,客户端程序则可以采用其他编程语言编写,反之亦然。

所谓的跨操作系统平台就是服务端程序和客户端程序可以在不同的操作系统平台上运行。

除了webservice外,常用的远程调用技术还有RMI(Remote Method Invoke)和CORBA,由于webservice的跨编程语言和跨平台的特点,因此比其他两种技术应用更为广泛,但性能略低。

2.webservice的调用原理

webservie采用SOAP协议实现跨编程语言和跨操作系统平台。

WebService采用HTTP协议传输数据,采用XML格式封装数据(即XML中说明调用远程服务对象的哪个方法,传递的参数是什么,以及服务对象的返回结果是什么)。

WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议(simple object access protocol,简单对象访问协议) 

SOAP协议 = HTTP协议 + XML数据格式 SOAP协议是基于HTTP协议的,两者的关系就好比高速公路是基于普通公路改造的,在一条公路上加上隔离栏后就成了高速公路。

商店的服务员只要收到了钱就给客户提供货物,商店服务员不用关心客户是什么性质的人,客户也不用关心商店服务员是什么性质的人。同样, WebService客户端只要能使用HTTP协议把遵循某种格式的XML请求数据发送给WebService服务器, WebService服务器再通过HTTP协议返回遵循某种格式的XML结果数据就可以了,WebService客户端与服务器端不用关心对方使用的是什么编程语言。

HTTP协议和XML是被广泛使用的通用技术,各种编程语言对HTTP协议和XML这两种技术都提供了很好的支持,WebService客户端与服务器端使用什么编程语言都可以完成SOAP的功能,所以,WebService很容易实现跨编程语言,跨编程语言自然也就跨了操作系统平台。

3.webservice调用之前的工作

WSDL文件 好比我们去商店买东西,首先要知道商店里有什么东西可买,然后再来购买,商家的做法就是张贴广告海报。

WebService客户端要调用一个WebService服务,首先要有知道这个服务的地址在哪,以及这个服务里有什么方法可以调用,所以,WebService务器端首先要通过一个WSDL文件来说明自己家里有啥服务可以对外调用,服务是什么(服务中有哪些方法,方法接受的参数是什么,返回值是什么),服务的网络地址用哪个url地址表示,服务通过什么方式来调用。

WSDL(webservice description language)是基于XML格式的,它是WebService客户端和服务器端都能理解的标准格式,其中描述的信息可以分为what,where,how等部分! WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。

客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址: 注册到UDDI服务器,以便被人查找 直接告诉给客户端调用者,例如,在自己网站给出信息或邮件告诉。

4.webservice的工作过程

5.webservice的开发应用

WebService开发可以分为服务器端开发和客户端开发两个方面: 把公司内部系统的业务方法发布成WebService服务,供远程合作单位和个人调用。(借助一些WebService框架可以很轻松地把自己的业务对象发布成WebService服务,Java方面的典型WebService框架包括:axis,xfire,cxf等,java ee服务器通常也支持发布WebService服务,例如JBoss。这框架应用不是学习的重点,看看相关的技术手册都很轻松地掌握,关键还是要了解WebService的工作原理。)

6.WebService框架的底层实现原理

技术实现原理: 各类WebService框架的本质就是一个大大的Servlet,当远程调用客户端给它通过http协议发送过来soap格式的请求数据时,它分析这个数据,就知道要调用哪个java类的哪个方法,于是去查找或创建这个对象,并调用其方法,再把方法返回的结果包装成soap格式的数据,通过http响应消息回给客户端。

(本文是从网上摘抄的,供大家学习参考)

实例搭建

源自:http://tech.it168.com/j/2007-09-06/200709062113673.shtml 
一、实验环境 
  win2k + jdk1.6  + javee5.0  + Myeclipse5.1 
jdk和javee5.0均可从 
http://java.sun.com/javase/downloads/index.jsp 
下载,安装文件名为 
jdk-6-windows-i586.exe 
java_ee_sdk-5_02-windows.exe 
没有myeclipse的也可以用eclipse代替,只要ide能执行 
ant脚本就可以. 

二、第一个最简单的例子 
jsee5安装以后会在系统中建立一个Application Server pe9,这是sun自带的网络服务器, 
和tomcat、weblogic的性质类似。 
在D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws下有一个自带的web service入门例子, 
(D:\Sun\SDK\为我机器上javaee5的安装路径) 
我们就先实验它,来理解webservice的本质 
1、把jdk的安装路径如D:\Java\jdk1.6.0\bin 加到系统的path环境变量中 
2、运行sun自带的网络服务器,具体方法为 
    开始->程序->Sun Microsystems->Application Server PE 9->Start Default Server 
    然后当弹出的cmd窗口中出现提示“按任意键继续时”输入回车,窗口会关闭,此时在浏览器输入 
    http://localhost:8080,应该出现如下内容: 
    

Java代码 
Sun Java System Application Server Platform Edition 9.0    Your server is up and running!

  

  
说明服务器已经启动了 

3、在Myeclipse打开刚才的例子目录D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws 
下的build.xml文件,这个一个ant脚本,具体含义我们以后再讲,现在先执行它 
4、在build.xml文件中单击右键,在弹出菜单中选择"run as"->"1 ant build",此时build.xml里的 
内容会被执行,在Myeclipse的console中会输出: 
Java代码 
buildfile: D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws\build.xml  init:  compile-deploy-service:       [echo] d:/Sun/SDK  get-artifacts-windows:  get-artifacts-unix:  get-artifacts:  compile-client:      [javac] Compiling 1 source file to D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws\build  run-client-windows:       [exec] Hello result = Hello Administrator!  run-client-unix:  run-client:  all:  BUILD SUCCESSFUL  Total time: 43 seconds 


其中 
[exec] Hello result = Hello Administrator! 
的输出结果说明客户端调用服务器的webservice已经成功。 
第一个例子就完成了。我们下面会对这个例子进行详细讲解. 

四、例子源代码剖析 

D:\Sun\SDK\samples\javaee5\webservices\hello-jaxws(以后简称为hello-jaxws) 
项目里的源文件只有三个 
hello-jaxws\src\endpoint\Hello.java   提供webservice的服务器端实现类 
hello-jaxws\src\client\Client.java    调用webservice的客户端测试类 
hello-jaxws\build.xml                 自动编译的ant脚本 

下面我们把这三个文件的内容看一下 
1、服务器端的service实现类文件Hello.java, 

Java代码 
/* src\endpoint\Hello.java文件的内容 */  package endpoint;  import javax.jws.WebService;  @WebService  public class Hello  {  public String getHello(String name)  {  return "Hello " + name + "!";  }  }  



有这个文件可以看出,编写一个service的实现类,把编写普通的java类 
差不多,只不过又多了三点 
①要在该类前一个@WebService说明, 
②引入javax.jws.WebService; 
③在公开的方法前加@WebMethod说明,如果不加的话, 
所有的public方法都会自动变成service的对外接口. 

2、客户端测试类的实现文件 
Java代码 
/* src\client\Client.java文件的内容 */  package client;  import javax.xml.ws.WebServiceRef;  import endpoint.HelloService;  import endpoint.Hello;  public class Client  {  @WebServiceRef(wsdlLocation="http://localhost:8080/Hello/HelloService?WSDL")  static HelloService service;  public static void main(String[] args)  {  Client client = new Client();  client.doHello();  }  public void doHello()  {  try          {  Hello port = service.getHelloPort();  String ret = port.getHello(System.getProperty("user.name"));  System.out.println("Hello result = " + ret);  }  catch(Exception e)  {  e.printStackTrace();  }  }  }  



客户端调用代码要点为: 
①导入WebServiceRef包 
  import javax.xml.ws.WebServiceRef; 
②导入本地生成的stub类,另外编译时也要指明stub类的路径 
import endpoint.HelloService; 
import endpoint.Hello; 
③指明服务器的wsdl路径 
@WebServiceRef(wsdlLocation="http://localhost:8080/myhello/HelloService?WSDL") 
④声明一个静态的service对象 
static HelloService service; 
⑤对要调用的远程方法声明一个代理对象,通过代理来调用真正的远程方法 
Hello port = service.getHelloPort(); 
    String ret = port.getHello(System.getProperty("user.name")); 

3、ant 脚本build.xml 
<!-- ant 脚本build.xml的内容 -->  <?xml version="1.0" encoding="UTF-8"?>  <project name="hello-jaxws" default="all" basedir=".">      <!-- include user specific build properties -->    <!-- 导入预先j2ee预先写好的设置文件-->      <property file="../../../bp-project/build.properties"/>      <property file="${user.home}/build.properties"/>      <property file="../../../bp-project/app-server.properties"/>    <!-- 设置发布目录和类的输出目录 -->      <property name="autodeploydir" value="${javaee.domaindir}/autodeploy"/>      <property name="classesdir" value="./build"/>    <!-- 设置java的类库路径 -->      <path id="classpath">          <pathelement location="${javaee.home}/lib/j2ee.jar"/>          <pathelement location="${classesdir}"/>      </path>    <!-- 项目的最终任务 -->      <target name="all" depends="run-client">          <!--antcall target="restore"/-->      </target>    <!-- 测试操作系统环境-->      <target name="init">          <condition property="windows">              <os family="windows" />  </condition>          <condition property="unix">              <os family="unix" />  </condition>      </target>    <!-- 编译服务器端并把它自动发布到sun的服务器上 -->      <target name="compile-deploy-service" depends="init">          <mkdir dir="${classesdir}"/>          <echo message="${javaee.home}"/>          <javac  srcdir="./src"  includes="endpoint/**"              destdir="${autodeploydir}"              classpath="${javaee.home}/lib/j2ee.jar"  />          <waitfor maxwait="100" maxwaitunit="second">             <or>                  <available file="${autodeploydir}/endpoint/Hello.class_deployed"/>                  <available file="${autodeploydir}/endpoint/Hello.class_deployFailed"/>             </or>          </waitfor>          <condition property="deploy_succeeded">                  <available file="${autodeploydir}/endpoint/Hello.class_deployed"/>          </condition>          <condition property="deploy_failed">                  <available file="${autodeploydir}/endpoint/Hello.class_deployFailed"/>          </condition>      </target>      <target name="get-artifacts" depends="compile-deploy-service,get-artifacts-windows,get-artifacts-unix"/>   <!-- 生成客户端所需的stub -->      <target name="get-artifacts-windows" if="windows">          <exec executable="${javaee.home}/bin/wsimport.bat">              <arg line="-keep -d ${classesdir} http://${javaee.server.name}:${javaee.server.port}/Hello/HelloService?WSDL"/>          </exec>      </target>      <target name="get-artifacts-unix" if="unix">          <exec executable="${javaee.home}/bin/wsimport">              <arg line="-keep -d ${classesdir} http://${javaee.server.name}:${javaee.server.port}/Hello/HelloService?WSDL"/>          </exec>      </target>     <!-- 编译客户端 -->      <target name="compile-client" depends="get-artifacts">          <javac srcdir="./src/client" destdir="${classesdir}">              <classpath refid="classpath"/>          </javac>      </target>    <target name="run-client" depends="compile-client,run-client-windows,run-client-unix"/>    <!-- 执行客户端 -->      <target name="run-client-windows" if="windows">          <exec executable="${javaee.home}/bin/appclient.bat" dir="${classesdir}">              <arg value="client.Client"/>  </exec>  </target>      <target name="run-client-unix" if="unix">  <exec executable="${javaee.home}/bin/appclient" dir="${classesdir}" failifexecutionfails="false">              <arg value="client.Client"/>  </exec>  </target>    <!-- 以下几个任务用与清理和卸载-->      <!-- 删除生成的类文件-->      <target name="clean">      <delete dir="${classesdir}"/>      </target>   <!-- 删除和卸载服务器的webservice-->      <target name="restore">          <delete>          <fileset dir="${autodeploydir}/endpoint" includes="Hello*.*"/>          </delete>      </target>      <target name="undeploy">          <antcall target="restore"/>      </target>  </project> 




0 0
原创粉丝点击