Web Service(Axis)的基本应用

[1]
Web Service简介
(1)
Spring支持各种远程访问技术,包括RMI、JAXRPC、Hessian、Burlap、Web Service以及Spring自身提供
的HTTP Invoker。
由于相对于其他远程技术,Web Service比较复杂,涉及的内容很多,对于实际的应用来说,Web
Service是使用最广、功能最全、标准化最高的远程技术。
XFire迅速成为Web Service开发框架中的闪亮新星,相比于其他Web Service框架(如Axis、GLUE等),
XFire拥有更多的优势,更重要的是XFire自身提供了对Spring强力的支持,因此在Spring中使用XFire开
发Web Service更加自然、更加方便。
(2)
Web Service简介
WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的
通讯技术。它是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册。
Web Service是建立可互操作的分布式应用程序的技术平台,开发者可以使用自己喜欢的编程语言,在各
种不同的操作系统平台上编写Web Service应用。

(3)
Web Service的特点
Web Service的主要目标是跨平台的可互操作性。为了实现这一目标,Web Service 完全基于XML、XSD(
XML Schema)等独立于平台,是创建可互操作的、分布式应用程序的新平台。
因此使用Web Service有许多优点:
1.
应用程序集成
企业级的应用程序开发者都知道,企业里经常都要把用不同语言写成的、在不同平台上运行的各种程序
集成起来,而这种集成将花费很大的开发力量。应用程序经常需要从运行的一台主机上的程序中获取数
据;或者把数据发送到主机或其它平台应用程序中去。
通过Web Service,应用程序可以用标准的方法把功能和数据“暴露”出来,供其它应用程序使用。
2.
B2B的集成
B2B 指的是Business to Business,即企业与企业之间通过互联网进行产品、服务及信息的交换。即电
子商务.
Web Service是B2B集成成功的关键。通过Web Service,公司可以只需把关键的商务应用“暴露”给指定
的供应商和客户,就可以了,Web Service运行在Internet上,在世界任何地方都可轻易实现,其运行成
本就相对较低。
(4)
Web Service的应用
1.最初的Web Service 通常是可以方便地并入应用程序的信息来源,如股票价格、天气预报、体育成绩
等等。
2.
以Web Service 方式提供现有应用程序,可以构建新的、更强大的应用程序,并利用 XML Web Service
作为构造块。

(5)
Web Service相关概念
Web Service能够通过网络,特别是万维网来描述、发布、定位及调用。Web Service的体系结构描述了
三个角色(服务提供者、服务请求者和服务中介者)及三个操作(发布、查找和绑定)。
当某个事物由三个重要部分组成时,我们常常称之为“三剑客”,如我们说Dreamweaver、Firework和
Flash是网页制作的“三剑客”,SOAP、WSDL和UUID是Web Service的“三剑客”。
1)
SOAP(Simple Object Access Protocol)――简单对象传输协议
SOAP是一个基于XML的用于应用程序之间通信的传输协议。
当用户通过UDDI找到你的WSDL描述文档后,他可以通过SOAP调用你建立的Web服务中的一个或多个操作。
SOAP是XML文档形式的调用方法的协议,规范.
SOAP所使用的传输协议,可以是HTTP、 SMTP、POP3、JMS等协议,还可以是为一些应用而专门设计的特
殊通信协议。但最常使用的还是HTTP协议,这是因为任何可以使用Web浏览器的机器都支持HTTP协议,同
时,当前许多防火墙也配置为只允许HTTP连接。

2)
WSDL(Web Services Description Language) ――Web Service描述语言
一个WSDL文档将服务定义为一个网络端点或端口(End Point)的集合。
WSDL 文件是一个 XML 文档,用于说明一组 SOAP 消息以及如何交换这些消息。大多数情况下由软件自
动生成和使用。
3)
UDDI是一种根据描述文档来引导系统查找相应服务的机制。UDDI利用SOAP消息机制(标准的XML/HTTP)
来发布,编辑,浏览以及查找注册信息。

[2]
web service的基础应用
(0)
WebService,可以使一个系统可以调用互联网另一个系统.
BS系统调用另一BS系统
(若是前台调用,则在<%@ page import="导入WS的客户端"%>,在<%%>中实现;若是后台,则进行连接到WS服
务端);
CS系统调用另一BS系统;
(1)
1.1
将axis-bin-1_4.zip解压缩后将目录中的webapps目录下的axis子目录拷贝到tomcat目录下webapps中。
验证AXIS的安装:重新启动Tomcat服务器后打开浏览器输入网址 http://localhost:8080/axis
若会出现apache-Axis页面,则表示安装成功.
1.2
点击链接"Validate":
来验证Axis所需的几个JAVA包是否齐全。点击超链接Validate后,AXIS会自动检查所需的每一个JAVA组
件,这协组件分为:必需组件以及可选组件,必须保证所有必需组件都存在,axis才可正常运行.
点击链接"list":
可以看到系统已注册的服务.
1.3
配置环境变量:(为以后的编译生成wsdd文件)
AXIS_LIB=D:\tomcat_ws\webapps\axis\WEB-INF\lib
AXISCLASSPATH=%AXIS_LIB%"axis.jar;%AXIS_LIB%"axis-ant.jar;%AXIS_LIB%"commons-discovery-
0.2.jar;%AXIS_LIB%"commons-logging-1.0.4.jar;%AXIS_LIB%"jaxrpc.jar;%AXIS_LIB%"log4j-
1.2.8.jar;%AXIS_LIB%"saaj.jar;%AXIS_LIB%"wsdl4j-1.5.1.jar;%AXIS_LIB%"activation.jar;%
AXIS_LIB%"mail.jar;
(2)
Axis提供了两种服务发布方式,一种是即时发布(Instant Deployment)(也称为DII),一种是定制发布
(Custom Deployment)。
1. 使用即时发布 Java Web Service(JWS)
  使用即时发布使用户只需有提供服务的Java类的源代码,即可将其迅速发布成Web服务。每当用户调
用这类服务的时候,Axis会自动进行编译,使用非常简单快捷。
1)
添加服务端:
使用即时发布首先需要一个实现服务功能的Java源文件.如下:
public  class  HelloClient 

       public  String  getName(String  name) 
       { 
               return  "hello  "+name; 
       } 
}
2)
将其扩展名改为.jws(Java Web Service的缩写),然后将该文件放到“D:\tomcat_ws\webapps\axis”
目录下即可。
通过访问 http://localhost:8080/axis/HelloClient.jws?wsdl可以看到这个服务的WSDL描述文件,这说
明HelloClient服务被成功发布了。这时,会在D:\tomcat_ws\webapps\axis\WEB-INF\jwsClasses产生相
应的class文件.
3)
添加客户端:
public  class  SayHelloClient2 

 public  static  void  main(String[]  args) 
 { 
  try 
  { 
//   指明服务所在位置
   String  endpoint  =  " http://localhost:8080/axis/HelloClient.jws"; 
//   创建一个Service实例,注意是必须的!
   Service  service  =  new  Service();
//   为Call设置服务的位置
   Call  call  =  null; 
   call  =  (Call)  service.createCall();
   
//   注意方法名与HelloClient.java中一样!!
   call.setOperationName(new  QName
(" http://localhost:8080/axis/HelloClient.jws","getName")); 
   call.setTargetEndpointAddress(new  java.net.URL(endpoint)); 
   String  ret  =  (String)  call.invoke(new  Object[]
{"welcome,jason"}); 
   System.out.println("return  value  is : "  +  ret); 
  }   
  catch  (Exception  ex) 
  { 
   ex.printStackTrace(); 
  } 
 } 
此方法的极限性:
服务端,必须有JAVA的源码,若只有.class文件,则此方式用不了.

(3)
Axis提供了另一种服务发布方式,这就是定制发布。

定制发布不需要构建.jws文件,但必须创建服务发布描述文件deploy.wsdd(Web Service Deployment Descriptor的缩写).
server-config.wsdd。这是WebServices的发布描述文件,作用类似于web.xml。
在spring结合中,第一个运用进,也要创建depoly.wsdd-->server-config.wsdd
在这里服务的提供者是“java:RPC”,它被内建在Axis中,而且指明了一个JAVA RPC服务,做这个处理
的类是org.apache.axis.providers.java.RPCProvider。
将该文件也放到“……\webapps\axis\samples\capacity”目录下,然后可以采用Axis提供的一个客户
端管理工具――AdminClient来完成服务的定制发布。
   你也可以调用:
 java org.apache.axis.client.AdminClient undeploy.wsdd  来取消部署。
   你也可以调用:
 java org.apache.axis.client.AdminClient list 来获得所有的已经部署的服务的列表。在这里你会
看到services, handlers, transports等等,注意这个调用只是列出了WEB-INF\server-config.wsdd的
文件内容。
   一定要注意:编译后的class文件要拷贝到web-inf/classes的目录中,如果该文件中有包存在的话,
别忘了还要在classes目录下创建包的目录

3.1
public class HelloWorld {
 public String sayHello()
 {
  return "HELLO WORLD!";
 }
}
将HelloWorld.java编译成HelloWorld.class,放到D:\tomcat_ws\webapps\axis\WEB-INF\classes中.
-->注意:
因为此类是在default包后,没有在某个包下,所以直接放到classes中即可.
若在package test中.则应该在classes中建立目录test,再放HelloWorld.class.
3.2
D:\tomcat_ws\webapps\axis\WEB-INF目录下,新建deploy.wsdd文件,即SOAP服务发布描述文件
deploy.wsdd
<deployment xmlns=" http://xml.apache.org/axis/wsdd/"
xmlns:java=" http://xml.apache.org/axis/wsdd/providers/java">
    <service name="HelloWorld" provider="java:RPC">
        <parameter name="className" value="HelloWorld"/>
        <parameter name="allowedMethods" value="sayHello"/>
    </service>
</deployment>
-->注意:
若上面放HelloWorld.java类,放于package test,则此处也要进行修改className.
在DOS下转换目录到D:\tomcat_ws\webapps\axis\WEB-INF中,进行如下的操作:
先开tomcat.否则会报错;
java -cp %AXISCLASSPATH% org.apache.axis.client.AdminClient deploy.wsdd时,
要当出现:
Processing file deploy.wsdd
<Admin>Done processing</Admin>
表示成功了.
你会发现同一目录下多了一个server-config.wsdd文件,这就是AXIS的配置文件,以后所有的服务发布
描述都会在里面找到。(当然,你可以直接修改它,不用再写deploy.wsdd)然后打开浏览器
http://localhost:8080/axis/servlet/AxisServlet,你就会看到你的服务已发布.
在server-config.wsdd文件中,部分内容如下:---->以后修改,或添加新服务,直接加入即可.
 <service name="HelloWorld" provider="java:RPC">
  <parameter name="allowedMethods" value="sayHello"/>
  <parameter name="className" value="HelloWorld"/>
 </service>
 <service name="Version" provider="java:RPC">
  <parameter name="allowedMethods" value="getVersion"/>
  <parameter name="className" value="org.apache.axis.Version"/>
 </service>
3.3
public class HelloClient
{
   public static void main(String [] args) throws Exception {
       //注意!与DII的差别仅仅在这里!!
    //DII: String endpoint=" http://localhost:8080/axis/HelloWorld.jws"
    String endpoint=" http://localhost:8080/axis/services/HelloWorld";
    Service service=new Service();
    Call call=(Call)service.createCall();
    call.setTargetEndpointAddress(new java.net.URL(endpoint));
    call.setOperationName("sayHello");
    String rs=(String)call.invoke(new Object[]{});
    System.out.println(rs);
   }
}
直接运行HelloClient,可以输出: HELLO WORLD!

[3]
spring与axis的整合

(1)
在spring框架中导入axis必需的jar包:
axis.jar; axis-ant.jar; commons-discovery-0.2.jar; commons-logging-1.0.4.jar; jaxrpc.jar;
log4j-1.2.8.jar; saaj.jar; wsdl4j-1.5.1.jar; activation.jar; mail.jar;(可选)
(2)
在原来的web.xml中加入axis的配置于<web-app>:
  <!-- axis需要引入的Servlet -->
  <servlet>
   <servlet-name>axis</servlet-name>
   <servlet-class>
    org.apache.axis.transport.http.AxisServlet
   </servlet-class>
   <load-on-startup>2</load-on-startup>
  </servlet>
  <servlet-mapping>
   <servlet-name>axis</servlet-name>
   <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
(3)
WebService服务端:
在Spring中对Web Service进行封装很简单,仅仅需要继承
org.springframework.remoting.jaxrpc.ServletEndpointSupport类,实现里面的一些方法(如:onInit)
,即可.
如下:
package com.laoer.bbscs.webservice;
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import org.springframework.remoting.jaxrpc.ServletEndpointSupport;
import com.laoer.bbscs.web.action.JLogin;
public class WSjLogin extends ServletEndpointSupport{
 
 private JLogin jlogin;
 protected void onInit() throws ServiceException {
//  在Spring容器中获取Bean的实例
  jlogin = (JLogin) getApplicationContext().getBean("JLogin");
 }
 public String getMessage(String name) throws RemoteException {
  return "登录者"+name+"的密码是:"+jlogin.ForWS(name);
 }
}
(4)
创建/添加/修改server-config.wsdd:
<deployment xmlns=" http://xml.apache.org/axis/wsdd/"
xmlns:java=" http://xml.apache.org/axis/wsdd/providers/java">
<handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
<service name="WSjLogin" provider="java:RPC">
<parameter name="className" value="com.laoer.bbscs.webservice.WSjLogin"/>
<parameter name="allowedMethods" value="*"/>
</service>
<transport name="http">
<requestFlow>
<handler type="URLMapper"/>
</requestFlow>
</transport>
</deployment>
启动tomcat,输入:http://localhost:8080/<YourProject>/services/WSjLogin?wsdl,如果能发现
WSjLogin(wdsl)等信息,恭喜你,你的所有的工作都已经完成。
(5)
WebService客户端:
在其它任意项目中创建都可.
package com.ws;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
public class WSGetJlogin {
 public static void main(String[] args)
 {
  String endpoint=" http://localhost:8080/BBSCS_8_0_3/services/WSjLogin";
  try {
   Service service=new Service();
   Call call=(Call)service.createCall();
   call.setTargetEndpointAddress(endpoint);
   call.setOperationName("getMessage");
   String bbscsPassword=(String)call.invoke(new Object[]{"shzhhufa"});
//   String bbscsPassword=(String)call.invoke(new Object[]{"hello"});
   System.out.println(bbscsPassword);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
[4]
web service实现两个系统间同步数据(文件)
在A系统中有类A,实现数据文件的写入方法a(File file);
在远程B系统中有类B,实现数据文件的读入方法b(File file);
 
如何实现两系统间的数据同步:
利用web service,将A系统中A类的a()方法,暴露出来,可以给B系统B类调用。 这样,就好像B类中本地调用A类的a()一样读取与写入文件。在写的过程,是由web service实现网络间的传输.
 
 

你可能感兴趣的:(职场,休闲)