`

Web Service学习,用于web service实现的两个主要的框架axis和xfire.

阅读更多

   今天继续学习web service,王老师讲了web service中使用的wsdl(网络服务描述语言)和用于web service实现的两个主要的框架,axis,xfire.王老师提到。axis技术要早,比较成熟和稳定。xfire在新的软件系统中比较常用。
   Web Services 技术
SOAP    它把成熟的基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起。HTTP用于实现SOAP的RPC风格的
传输,而XML是它的编码模式。一个SOAP请求的HTTP体是一个XML文档,它包含方法中[in]和[in,out]参数的值。这些 值被编码成为一个显著的调用元素的子元素,这个调用元素具有SOAPMethodNameHTTP头的方法名和名域URI。调用 元素必须出现在标准的SOAP<Envelope> 和<Body>元素内,SOAP的XML特性是为把数据类型的实例序列化成XML的编 码模式。
    WSDL是 “网络服务描述语言 (Web Services Description Language)”的缩写。它是为自如地表述多种类型的网络服务
而设定,可以用于描述 SOAP 网络服务。 一个 WSDL 文件不过就是一个文件。更具体地讲,是一个 XML 文件。通常存储于你所访问的 SOAP 网络服务这个被描 述对象所在的服务器上。
在 WSDL 文件中描述了调用相应的 SOAP 网络服务的一切:

  服务 URL 和命名空间
  网络服务的类型 (可能是 SOAP 的函数调用,但我说过,WSDL 足够自如地去  描述网络服务的广泛内容)
  有效函数列表
  每个函数的参数
  每个参数的类型
  每个函数的返回值及其数据类型
换言之,一个 WSDL 文件告诉你调用 SOAP 所需要知道的一切。

 

axis 安装配置
安装JDK
安装并配置Tomcat
从官方网站
http://ws.apache.org/axis 下载最新的Axis项目打包文件,并将webapps下axis目录拷贝到Tomcat的webapps

目录下
验证Axis的安装,发布一个服务,浏览所发布的服务。
   即时发布
使用即时发布首先需要一个实现服务功能的Java源文件,将其扩展名改为.jws (Java Web Service的缩写),然后将该
文件放到Tomcat下面的webapps\axis目录下即可。但是JWS的web服务发布是一个很简单的Web服务发布方式,在页面 中你不能使用包,而且由于代码是在运行期被编译的,所以在部署之后,你也很难找到错误所在。
   定制发布
编写要发布为服务的java类
编译生成的class文件应该放在Tomcat下的webapps\axis\WEB-INF\classes\下面编写deploy.wsdd 文件描述服务的名称,入口等信息切换到命令航下,执行
  java org.apache.axis.client.AdminClient deploy.wsdd
  服务器端发布以后,客户端就可以调用其服务了,客户端的调用有三种方式
  1.DLL动态接口调用方式(Dynamic Invocation Interface)
  2.动态代理方式(Dynamic Proxy)
  3.静态方式 (Stubs)
当前主流的两种web service技术是axis和xfire,先看一下axis的这三种方式的服务调用,ddl方式
  public static void main(String [] args) {
       try {
           String endpoint =
                    "
http://localhost:8080/axis/services/test1 ";
           //实例化一个服务对象service
           Service  service = new Service();
          
          //创建一个空的调用对象Call,设置Call的操作名称,目标地址,传入参数等等
           //执行调用后即可得到返回的结果
           Call     call    = (Call) service.createCall();
           call.setTargetEndpointAddress( new java.net.URL(endpoint) );
           //QName读取节点   "
http://soapinterop.org/ "是namespace
           call.setOperationName(new QName("
http://soapinterop.org/ ", "add3") );

           Integer ret = (Integer) call.invoke( new Object[] { 1,3 } );

           System.out.println( ret);
       } catch (Exception e) {
           System.err.println(e.toString());
       }
   }

动态代理方式
动态代理需要一个本地的接口作为代理
public interface ITestDynameicProxy extends Remote {
     public String getMessage() throws RemoteException;
}

public static void main(String[] args) throws Exception {
     String wsdlUrl = "
http://localhost:8080/axis/test/Test.jws?wsdl ";
     String nameSpaceUri = "
http://soapinterop.org/ ";
     String serviceName = "Test1Service";
     String portName = "Test1";
     ServiceFactory serviceFactory = ServiceFactory.newInstance();
     Service service = serviceFactory.createService(
      new URL(wsdlUrl), new QName(nameSpaceUri,serviceName));
     //创建代理
     ITestDynameicProxy proxy = (ITestDynameicProxy)service.getPort(
       new QName(nameSpaceUri,portName),ITestDynameicProxy.class);
     System.out.println(proxy.getMessage());
}
    通过输入wsdl地址,命名空间地址和服务名,用服务工厂创建出一个服务实例,再通过设置端口名得到一个服务类

型的服务代理对象,通过该代理,就可以直接访问web服务了。
    静态方式:
按常规方式发布一个web service
得到wsdl文件
通过web页面直接另存为
通过Java2WSDL工具类生成
(java org.apache.axis.wsdl.Java2WSDL -o demo1.wsdl -l
http://localhost:8080/axis/services/demo -n

http://www.itcast.cn/    test.Demo)
利用WSDL2Java工具类生成客户端调用代码
(java org.apache.axis.wsdl.WSDL2Java demo.wsdl -p client)
在生成的代码基础上,进行客户端的调用 
     public static void main(String[] args) throws ServiceException, RemoteException {
 DemoServiceLocator demoService = new DemoServiceLocator();
 Demo demo = demoService.getdemo();
 System.out.println(demo.getMessage());
 }
xfire类似Axis,也有三种客户端调用的方式
     dll方式
 public static void main(String[] args) throws MalformedURLException,
  Exception {
   Client client = new Client(
      new URL("
http://localhost:8080/xfire/services/HelloWorld?wsdl "));
   Object[] results = client.invoke("example", new Object[] { "name" });
   System.out.println((String) results[0]);
}
动态代理方式,这也是要学习的银联项目中要用到的

public static void main(String[] args) {
//1-制造一个service对象,来利用web service所提供的服务
Service service = new ObjectServiceFactory().create(firstPortType.class);
//2-制作一个XFire的代理工厂,有了代理之后,调用web service的方法就好像是在本地进行调用了
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory.newInstance().getXFire());
//3-获取web service提供服务的网址
String sayHelloURL = "
http://localhost:8080/axis/services/Version ";
//4-开始使用web service
try {
firstPortType test = (firstPortType)factory.create(service, sayHelloURL);
String str = test.getVersion();
System.out.println(str);
} catch (Exception e) {
e.printStackTrace();
}
}

分享到:
评论
1 楼 king_jw 2012-08-29  
不错,学习了

相关推荐

Global site tag (gtag.js) - Google Analytics