阿翔编程学-Web Service详细解析及使用方法(全) 包括XFire、Axis

 
Web Service 详细解析及使用方法
XFire篇
XFire简介
       XFire 是 codehaus推出的下一代的 java SOAP框架,它构建了 POJO 和 SOA 之间的桥梁,主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务,这种处理方式不仅充分发挥了 POJO 的作用,简化了 Java 应用转化为 Web 服务的步骤和过程,也直接降低了 SOA 的实现难度,为企业转向 SOA 架构提供了一种简单可行的方式。通过提供简单的API和支持标准协议,可以很方便的开发面向服务的程序。内建在STAX基于流的XML解析引擎的基础上,XFire拥有很高的性能。
XFire拥有以下的特性
       1)、 支持重要的web服务标准,如SOAP、WSDL、WS-I、WS-Addressing、WS-Security基本概要等
       2)、 高性能的SOAP 栈设计
       3) 可插拔的绑定,支持 POJO XMLBeans JAXB1.1 JAXB2 castor
       4) jsr181 规范
       5) 支持多种传输协议: HTTP JMS XMPP In-JVM
       6) 可嵌入式的 API
       7) JBI 支持
       8) 客户端和服务器端的存根创建工具
       9) JAX-WS 的早期支持
XFire简单使用
       首先先打开IDE,创建一个普通的java工程,将xfire所需要的jar和xifre的jar加入到工程所需要的类库引用中。创建一个简单但的java文件,这个文件只有一个名为add的成员方法。
提供服务实现类
package net.ruixin.webservicedemo;
public class HelloWorldServiceImpl implements IHelloWorldService {
       /**
        * 返回名称的方法
        * @param name 名称
        */
        public String sayHello(String name){
             return " 您好 ," +name;
        }
}
服务类的接口类
package net.ruixin.webservicedemo;
public interface IHelloWorldService {
        /**
          * 返回名称的方法
          * @param name 名称
          * @return 返回值
          */
        public String sayHello(String name);
}
配置services.xml
< beans xmlns = "http://xfire.codehaus.org/config/1.0" >
< service >
            < name > HelloWorldService </ name >
               < serviceClass >
                   net.ruixin.webservicedemo.IHelloWorldService
               </ serviceClass >
                < implementationClass >
                   net.ruixin.webservicedemo.HelloWorldServiceImpl
               </ implementationClass >
                < scope > application </ scope >
          </ service >
</ beans >
服务名
< name > HelloWorldService </ name >
服务类
< serviceClass > net.ruixin.webservicedemo.IHelloWorldService
</ serviceClass >
服务接口 < implementationClass > net.ruixin.webservicedemo.HelloWorldServiceImpl </ implementationClass >
服务范围
< scope > application </ scope >
测试服务类
package net.ruixin.webservicedemo;
import java.net.MalformedURLException;
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
public class HelloWorldClient {
        public static void main(String args[]) {
             Service srvcModel = new ObjectServiceFactory()
                 .create(IHelloWorldService. class );
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
                .newInstance().getXFire());
String helloWorldURL = "http://localhost:5200/xfire_sample/services/HelloWorldService" ;
             try {
                 IHelloWorldService srvc = (IHelloWorldService) factory.create(
                    srvcModel, helloWorldURL);
                 System. out .print(srvc.sayHello( "dennis" ));
             } catch (MalformedURLException e) {
            e.printStackTrace();
             }
}
}
客户端访问代码
发布服务
XFire 框架中,我们有两种方式将 POJO 发布成 Web 服务:
方式 1 :一种方式是直接使用 Web 服务接口和 Web 服务实现类( POJO )来发布;
< beans xmlns = "http://xfire.codehaus.org/config/1.0" >
< service >
        < name > HelloWorldService </ name >
        < serviceClass >
            net.rubyeye.webservicedemo.IHelloWorldService
        </ serviceClass >
        < implementationClass >
            net.rubyeye.webservicedemo.HelloWorldServiceImpl
        </ implementationClass >
        < style > wrapped </ style >
        < use > literal </ use >
        < scope > application </ scope >
</ service>
</ beans >
方式2:另一种方式是基于 JSR181 标准和注释技术将被注释的 POJO 发布成 Web 服务;
package com.test;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
@WebService (name= "Hello" ,serviceName= "Hello" ,
       targetNamespace= "http://www.oksonic.cn/xfire" )
public class Hello {
        @WebMethod
        @WebResult
        public String getName( @WebParam String name){
           return "Hello world " + name;
        }
}
< beans xmlns = "http://xfire.codehaus.org/config/1.0" >
    < service >
       < serviceClass > com.test.Hello </ serviceClass >
       < serviceFactory > jsr181 </ serviceFactory >
    </ service >
</ beans >
完整的开发过程
首先打开Eclipse ,创建一个普通的java 工程,将xfire 所需的jar 和xfire 的jar 加入到工程所需的类库引用中。
创建一个简单的java 文件,这个java 文件简单到只提供一个add 方法。
package com.kuaff.xfire.samples;
public class MathService {
  public long add(int p1, int p2) {
    return p1 + p2; 
   }
}

在src 目录下创建META-INF/xfire 目录,然后在META-INF/xfire 目录下创建services.xml 文件,文件内容为:
<beans xmlns="http://xfire.codehaus.org/config/1.0">
<service>
  <name>MathService</name>
  <namespace>
http://www.kuaff.com/xfire/samples/MathService</namespace>
  <serviceClass>com.kuaff.xfire.samples.MathService</serviceClass>
</service>
</beans>

这个文档定义了你要发布的web 服务,这个定义了一个名为MathService 的服务,服务类为com.kuaff.xfire.samples.MathService 。
这样我们的一个简单的web 服务就开发完成了,下面就要把它发布出去。
将工程bin 目录下的所有的文件复制到第一节中配置的tomcat/webapps/xfire/WEB-INF/classes 文件夹下,启动tomcat ,你就可以检查这个web 服务是否发布成功了。
打开浏览器,在浏览器地址栏中输入http://localhost:8080/xfire/services/ ,正常情况下应该浏览器应该显示类似下图所示的页面。
注意:请在浏览器中输入http://localhost:8080/xfire/services/ 而不是http://localhost:8080/xfire/services ,虽然两者显示的页面相同,但是点击页面上的链接,后者的链接会出错,因为后者后面少加了一个“/” 。
点击[wsdl] 链接,可以查看这个web 服务的wsdl 文档。
如果在你的机器上的显示如上面所示,则说明你的这个web 服务发布成功,可以正常提供基于http 的web 服务。
下面一个问题就是如何开发一个Client ,来消费(使用)这个web 服务。
XFire 、Axis 、asp.net 以及其它的一些商业产品都提供了根据wsdl 文档创建客户端代码的工具。这里采用Xfire 提供的wsgen 工具来创建客户端的访问代码。
Wsgen 是xfire 提供的一个ant task ,task 的申明如下:
<taskdef name="wsgen" classname="org.codehaus.xfire.gen.WsGenTask" classpathref="xfire jar 路径" />
这样,就可以在build.xml 文件中使用这个task :
<wsgen outputDirectory="client" wsdl="MathService.wsdl" package="com.kuaff.xfire.samples" />
outputDirectory 属性定义创建的代码所在的文件夹,wsdl 是web 服务的wsdl 文件,package 代表创建的代码的packege 。还可以通过binding 属性制定bind 类型:jaxb 或者是xmlbeans ,
这样,就会在client 文件夹下创建多个java 文件,这些文件提供了访问web 服务的方法。
在这里声明一点,创建的代码大量的使用了java 注释,这个JSE5 中提供的新特性,所以你需要使用JSE5 编译,Eclipse 也必须要3.1 以上的版本。
这段ant 脚本将创建三个文件:MathServicePortType 、MathServiceImpl 和MathServiceClient 。MathServicePortType 是这个web 服务的客户端接口存根、MathServiceImpl 实现了这个接口。MathServiceClient 封装了访问这个web 服务的方法。
最后,你可以创建一个单元测试类,用来测试这个客户端类。这个类的内容如下:
package com.kuaff.xfire.samples;
import junit.framework.TestCase;
public class MathServiceClientTest extends TestCase { 
   public void testAdd()  {
    MathServiceClient client = new MathServiceClient();
    MathServicePortType ms = client.getMathServiceHttpPort();
    long result = ms.add(10, 20);
    assertEquals(result, 30); 
  }
}
Axis篇
Axis简介
Axis是Apache组织推出的SOAP引擎,Axis项目是Apache组织著名的SOAP项目的后继项目,目前最新版本是采用Java开发的1.1版本,C++的版本正在开发之中。Axis v1.1软件包可以从 http://ws.apache.org/axis/dist/1_1/下载得到。
但是Axis不仅仅是一个SOAP引擎,它还包括:
    1)、 一个独立运行的SOAP服务器
    2)、一个servlet引擎的插件,这个servlet引擎可以是Tomcat
    3)、对WSDL的扩展支持
    4)、一个将WSDL的描述生成JAVA类的工具
    5)、一些示例代码
    6)、还有一个监控TCP/IP包的工具
SOAP
SOAP是一个基于XML的用于应用程序之间通信数据编码的传输协议。最初由微软和Userland Software提出,随着不断地完善和改进,SOAP很快被业界广泛应用,目前完全发布版本是1.1。在其发展过程中,W3C XML标准工作小组积极促成SOAP成为一个真正的开放标准。在写作此文档之时,SOAP1.2草案已经发布,1.2对1.1中相对混乱的部分做了改进。SOAP被广泛作为新一代跨平台、跨语言分布计算Web Services的重要部分。
Axis简单使用
提供服务实现类
package zpf;
public class SSOWebservice
{
    /**
      登陆并得到用户信息
      */
    public boolean login(String loginid, String password) {
       boolean ret = false ;
       if (loginid.equals( "cx" ) && password.equals( "cx" ))
           ret = true ;
       else
           ret = false ;
       return ret;
    }
}
配置web.xml
<? xml version = "1.0" encoding = "UTF-8" ?>
< web-app xmlns = "http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" version = "2.4"
    xsi:schemaLocation = "http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
    < servlet >
       < servlet-name > XFireServlet </ servlet-name >
       < servlet-class >
           org.codehaus.xfire.transport.http.XFireConfigurableServlet
       </ servlet-class >
       < load-on-startup > 0 </ load-on-startup >
    </ servlet >
    < servlet-mapping >
       < servlet-name > XFireServlet </ servlet-name >
       < url-pattern > /services/* </ url-pattern >
    </ servlet-mapping >
 
    < servlet >
       < servlet-name > AxisServlet </ servlet-name >
       < servlet-class >
           org.apache.axis.transport.http.AxisServlet
       </ servlet-class >
    </ servlet >
    < servlet >
       < servlet-name > AdminServlet </ servlet-name >
       < servlet-class >
           org.apache.axis.transport.http.AdminServlet
       </ servlet-class >
       < load-on-startup > 100 </ load-on-startup >
    </ servlet >
    < servlet >
       < servlet-name > SOAPMonitorService </ servlet-name >
       < servlet-class >
           org.apache.axis.monitor.SOAPMonitorService
       </ servlet-class >
       < init-param >
           < param-name > SOAPMonitorPort </ param-name >
           < param-value > 5001 </ param-value >
       </ init-param >
       < load-on-startup > 100 </ load-on-startup >
    </ servlet >
    < servlet-mapping >
       < servlet-name > AxisServlet </ servlet-name >
       < url-pattern > /servlet/AxisServlet </ url-pattern >
    </ servlet-mapping >
    < servlet-mapping >
       < servlet-name > AxisServlet </ servlet-name >
       < url-pattern > *.jws </ url-pattern >
    </ servlet-mapping >
    < servlet-mapping >
       < servlet-name > AxisServlet </ servlet-name >
       < url-pattern > /services/* </ url-pattern >
    </ servlet-mapping >
    < servlet-mapping >
       < servlet-name > SOAPMonitorService </ servlet-name >
       < url-pattern > /SOAPMonitor </ url-pattern >
    </ servlet-mapping >
    < mime-mapping >
       < extension > wsdl </ extension >
       < mime-type > text/xml </ mime-type >
    </ mime-mapping >
    < mime-mapping >
       < extension > xsd </ extension >
       < mime-type > text/xml </ mime-type >
    </ mime-mapping >
</ web-app >
配置server-config.wsdd
<? xml version = "1.0" encoding = "gb2312" ?>
< deployment xmlns = "http://xml.apache.org/axis/wsdd/"
    xmlns:java = "http://xml.apache.org/axis/wsdd/providers/java" >
    < globalConfiguration >
       < parameter name = "adminPassword" value = "admin" />
       < parameter name = "enableNamespacePrefixOptimization"
           value = "true" />
       < parameter name = "attachments.Directory"
           value = "D:/jakarta-tomcat-5.0.28/webapps/axis/WEB-INF/attachments" />
       < parameter name = "disablePrettyXML" value = "true" />
       < parameter name = "attachments.implementation"
           value = "org.apache.axis.attachments.AttachmentsImpl" />
       < parameter name = "sendXsiTypes" value = "true" />
       < parameter name = "sendMultiRefs" value = "true" />
       < parameter name = "sendXMLDeclaration" value = "true" />
       < requestFlow >
           < handler type = "java:org.apache.axis.handlers.JWSHandler" >
              < parameter name = "scope" value = "session" />
           </ handler >
           < handler type = "java:org.apache.axis.handlers.JWSHandler" >
              < parameter name = "scope" value = "request" />
              < parameter name = "extension" value = ".jwr" />
           </ handler >
       </ requestFlow >
    </ globalConfiguration >
    < handler name = "LocalResponder"
       type = "java:org.apache.axis.transport.local.LocalResponder" />
    < handler name = "URLMapper"
       type = "java:org.apache.axis.handlers.http.URLMapper" />
    < handler name = "Authenticate"
       type = "java:org.apache.axis.handlers.SimpleAuthenticationHandler" />
    <!-- 自定义服务开始 -->
    <!-- 单点登陆服务 add by Zhang.P.F -->
    < service name = "SSOWebservice" provider = "java:RPC" >
       < parameter name = "allowedMethods" value = "*" />
       < parameter name = "className" value = "zpf.SSOWebservice" />
       < operation name = "login" returnType = "ns:boolean" >
           < parameter name = "loginid" type = "ns:String" />
           < parameter name = "password" type = "ns:String" />
       </ operation >
    </ service >
    <!-- 自定义服务结束 -->
    < service name = "AdminService" provider = "java:MSG" >
       < parameter name = "allowedMethods" value = "AdminService" />
       < parameter name = "enableRemoteAdmin" value = "false" />
       < parameter name = "className" value = "org.apache.axis.utils.Admin" />
       < namespace > http://xml.apache.org/axis/wsdd/ </ namespace >
       < namespace > http://xml.apache.org/axis/wsdd/ </ namespace >
    </ service >
    < service name = "Version" provider = "java:RPC" >
       < parameter name = "allowedMethods" value = "getVersion" />
       < parameter name = "className" value = "org.apache.axis.Version" />
    </ service >
    < transport name = "http" >
       < requestFlow >
           < handler type = "URLMapper" />
           < handler
              type = "java:org.apache.axis.handlers.http.HTTPAuthHandler" />
       </ requestFlow >
       < parameter name = "qs:list"
           value = "org.apache.axis.transport.http.QSListHandler" />
       < parameter name = "qs:wsdl"
           value = "org.apache.axis.transport.http.QSWSDLHandler" />
       < parameter name = "qs.list"
           value = "org.apache.axis.transport.http.QSListHandler" />
       < parameter name = "qs.method"
           value = "org.apache.axis.transport.http.QSMethodHandler" />
       < parameter name = "qs:method"
           value = "org.apache.axis.transport.http.QSMethodHandler" />
       < parameter name = "qs.wsdl"
           value = "org.apache.axis.transport.http.QSWSDLHandler" />
    </ transport >
    < transport name = "local" >
       < responseFlow >
           < handler type = "LocalResponder" />
       </ responseFlow >
    </ transport >
</ deployment >
 
客户端访问代码
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
 
import javax.xml.rpc.ParameterMode;
 
public class CallC
{
   public static void main(String [] args) throws Exception {
       try {
     
           String endpoint = "http://localhost:5200/axis_sample/services/SSOWebservice" ;
           Integer i1 = new Integer(1);
           Integer i2 = new Integer(2);
           String user= new String( "1" );
           String password= new String( "2" );
           Service service = new Service();
           Call call = (Call) service.createCall();
         
           call.setTargetEndpointAddress( new java.net.URL(endpoint));
           call.setOperationName( "login" );
         
           call.addParameter( "loginid" , XMLType. XSD_STRING , ParameterMode. IN );
           call.addParameter( "password" , XMLType. XSD_STRING , ParameterMode. IN );
           call.setReturnType(XMLType. XSD_BOOLEAN );
          
           Boolean bv = false ;
           if (call!= null ) {
           bv = (Boolean)call.invoke( new Object[] {user, password});
           }
           if (bv) {
           System. out .println( " 用户登陆成功了 " );
           } else {
           System. out .println( " 用户登陆失败了 " );
           }
       }
       catch (Exception e){
           e.printStackTrace();
       }
   }
}
 
完整的开发过程
1.  Axis开发包下载.
Apache的一个项目,请下载(略)
2.  编写方法
package zpf;
import java.util.*;
import java.io.*;
public class SSOWebservice
{
   /**
      登陆并得到用户信息
   */
   Public boolean login(String loginid, String password){
      boolean ret=false;
      if(loginid.equals(“zpf”)&&password.equals(“123”))
         ret= true;
      else
         ret=false;
      return ret;
}   
/**
    得到所有部门信息
*/
 public zpf.DepartmentInfo[] getAllDepts(){
     zpf.Department dept=new zpf.Department();
        zpf.DepartmentInfo[] ret=dept.getAllDepartment();
          return ret;
 }
}
http://localhost:8080/kmwhc/services/SSOWebservice
编译,通过,不在累述
3.        修改web.xml
加入如下代码
<listener>
        <listener-class>org.apache.axis.transport.http.AxisHTTPSessionListener</listener-class>
    </listener>
      <servlet>
           <servlet-name>AxisServlet</servlet-name>
           <display-name>Apache-Axis Servlet</display-name>
           <servlet-class>
               org.apache.axis.transport.http.AxisServlet
           </servlet-class>
  </servlet>
 <servlet>
    <servlet-name>AdminServlet</servlet-name>
    <display-name>Axis Admin Servlet</display-name>
    <servlet-class>
        org.apache.axis.transport.http.AdminServlet
    </servlet-class>
    <load-on-startup>100</load-on-startup>
 </servlet>
 <servlet>
    <servlet-name>SOAPMonitorService</servlet-name>
    <display-name>SOAPMonitorService</display-name>
    <servlet-class>
        org.apache.axis.monitor.SOAPMonitorService
    </servlet-class>
    <init-param>
      <param-name>SOAPMonitorPort</param-name>
      <param-value>5001</param-value>
    </init-param>
    <load-on-startup>100</load-on-startup>
 </servlet>
 <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/servlet/AxisServlet</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>*.jws</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
    <servlet-name>AxisServlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
 </servlet-mapping>
 <servlet-mapping>
    <servlet-name>SOAPMonitorService</servlet-name>
    <url-pattern>/SOAPMonitor</url-pattern>
 </servlet-mapping>
 <!-- uncomment this if you want the admin servlet -->
    <!-- currently the W3C havent settled on a media type for WSDL;
    http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
    for now we go with the basic 'it's XML' response -->
 <mime-mapping>
    <extension>wsdl</extension>
     <mime-type>text/xml</mime-type>
 </mime-mapping>
    <mime-mapping>
    <extension>xsd</extension>
    <mime-type>text/xml</mime-type>
 </mime-mapping>
4.    布署
(1)     WEB-INF下建立文件server-config.wsdd
(2)     文件内容如下:
蓝色部分定义了服务的名称,所用的类 方法.
红色部分定义了服务的方法所用的返回值的自定义类型.
<?xml version="1.0" encoding="gb2312"?>
<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
      
       <globalConfiguration>
              <parameter name="adminPassword" value="admin"/>
              <parameter name="enableNamespacePrefixOptimization" value="true"/>
              <parameter name="attachments.Directory" value="D:/jakarta-tomcat-5.0.28/webapps/axis/WEB-INF/attachments"/>
              <parameter name="disablePrettyXML" value="true"/>
              <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
              <parameter name="sendXsiTypes" value="true"/>
              <parameter name="sendMultiRefs" value="true"/>
              <parameter name="sendXMLDeclaration" value="true"/>
              <requestFlow>
                     <handler type="java:org.apache.axis.handlers.JWSHandler">
                            <parameter name="scope" value="session"/>
                     </handler>
                     <handler type="java:org.apache.axis.handlers.JWSHandler">
                            <parameter name="scope" value="request"/>
                            <parameter name="extension" value=".jwr"/>
                     </handler>
              </requestFlow>
       </globalConfiguration>
       <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
       <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
       <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
<!-- 自定义服务开始 -->
<!-- 单点登陆服务 add by Zhang.P.F -->
<service name="SSOWebservice" provider="java:RPC">
 <parameter name="allowedMethods" value="*"/>
 <parameter name="className" value="zpf.SSOWebservice"/>
 <operation name="login" returnType="ns:boolean">
     <parameter name="loginid" type="ns:String"/>
       <parameter name="password" type="ns:String"/>
 </operation>
 <operation name="getAllDepts" returnType="ns:ArrayOf_tns2_DepartmentInfo">
   </operation>
  <typeMapping
        xmlns:ns="http://interf.kmwhc.zpf.com"
        qname="ns:DepartmentInfo"
        type="java:zpf.DepartmentInfo"
        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
 />
 <typeMapping
        xmlns:ns="urn:SSOWebservice"
        qname="ns:ArrayOf_tns2_DepartmentInfo"
        type="java:zpf.DepartmentInfo[]"
        serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
        deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
 />
 </service>
<!-- 自定义服务结束 -->
       <service name="AdminService" provider="java:MSG">
              <parameter name="allowedMethods" value="AdminService"/>
              <parameter name="enableRemoteAdmin" value="false"/>
              <parameter name="className" value="org.apache.axis.utils.Admin"/>
              <namespace>http://xml.apache.org/axis/wsdd/</namespace>
              <namespace>http://xml.apache.org/axis/wsdd/</namespace>
       </service>
       <service name="Version" provider="java:RPC">
              <parameter name="allowedMethods" value="getVersion"/>
              <parameter name="className" value="org.apache.axis.Version"/>
       </service>
       <transport name="http">
              <requestFlow>
                     <handler type="URLMapper"/>
                     <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
              </requestFlow>
              <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
              <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
              <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>
              <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>
              <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
              <parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
       </transport>
       <transport name="local">
              <responseFlow>
                     <handler type="LocalResponder"/>
              </responseFlow>
       </transport>
</deployment>
文件修改完毕后,重新启动你的应用服务器.
5.      测试
 在IE里输入 http://localhost:8080/kmwhc/services/SSOWebservice
看到页面提示如下信息表示布署成功: 
SSOWebservice
Hi there, this is an AXIS service!
Perhaps there will be a form for invoking the service here...
 6. 编译生成客户端调用包
   我用的ANT进行编译,在配置文件里加入如下代码
<!--登录服务-->
              <java2wsdl output="${client.dir}/SSOWebservice.wsdl"
                     className="zpf.SSOWebservice"
                     namespace="urn:SSOWebservice"
                     location="http://localhost:8080/kmwhc/services/SSOWebservice">
                     <mapping namespace="urn:SSOWebservice"
                            package="zpf.client" />
              </java2wsdl>
              <wsdl2java url="${client.dir}/SSOWebservice.wsdl"
                     output="${client.dir}" deployscope="session" serverSide="yes"
                     skeletonDeploy="no" noimports="no" verbose="no" testcase="no">
                     <mapping namespace="urn:SSOWebservice"
                            package="zpf.client" />
              </wsdl2java>
编译,生成wsdl文件和客户端代码.
7调用
调用代码:
zpf.client.SSOWebserviceServiceLocator sv=new zpf.client. SSOWebserviceServiceLocator();
zpf.client.SSOWebservice ssp=sv.getWebCaseservice(new java.net.URL("http://localhost:8080/kmwhc/services/SSOWebservice"));
   boolean aa=ssp.login(“admin”,”123”);
XFire和Axis的比较
XFire和Axis开发上的比较
XFire的优点
XFire方便( 简化 Web 服务开发),开发速度快,易于上手,配置简洁,可以和Spring很好的结合。
● 本地数据绑定功能。支持普通Java对象(POJO)、XMLBeans、面向XML绑定的Java架构(JAXB)和Castor等。数据绑定指定了发送至Web服务的XML请求以及返回的XML响应如何映射成Java对象。
● 使用用于XML的流式API(StAX)处理XML文档。与文档对象模型(DOM)的基于树形的方法以及用于XML的简单API(SAX)的事件驱动方法相比,StAX使用了基于拉取的机制,这不但大大加快了速度,还提高了内存的使用效率。
● 支持各种传输协议,譬如HTTP、Java消息服务(JMS)和Java虚拟机内部传输(in-JVM transport)。
● 嵌入功能,这是XFire的主要优点之一。可以把这个SOAP引擎嵌入到应用当中,完全隐藏XFire特定的所有引用,因为所有配置都是程序驱动的。
● 具有丰富的API,这样一来,非常容易定制,让开发人员可以在需要时,在不同阶段截获请求,并且进行处理。
● 符合诸多最新标准,譬如SOAP 1.1(没有编码的远程过程调用即RPC)和1.2、WSDL 1.1、Web服务互操作性组织的Basic Profile 1.0、Web服务寻址规范和Web服务安全标准。
● 性能和局限
Web服务使用许多资源,但它们的性能并不高。XFire打破了这个传统。与同类的SOAP引擎相比,XFire使用的内存大大减少(一方面是由于使用StAX),而性能却大大提高。
另外,XFire还提供了进一步优化性能的几种方法。方法之一就是使用Java虚拟机内部传输。如果知道Web服务与客户程序在同一个Java虚拟机里面运行,就可以选择使用本地传输,这样可以高速传输服务。
XFire的缺点
● 开发Web服务的一个好的做法就是,从WSDL开始着手。大多数SOAP引擎提供了利用WSDL创建服务占位模块的工具。XFire也提供了这样一个工具。但它需要使用注解,因而需要J2SE 5.0。这对仍坚持使用J2SE 1.4.X的人来说并不受欢迎,因为他们用其他方法来编写客户程序,本文给出的示例就表明了一种方法。
● 缺少支持附件的功能,不过将来的版本一定能支持该功能。
● 缺少简单易懂的用户指南,XFire开发队伍在这方面有许多工作要做。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值