• 升级到 JDK 5.0 Update 1 or 2 定制部署 WebServices Axis 终于正常了!


    升级到 JDK 5.0 Update 1 or 2 定制部署 WebServices - Axis 终于正常了!

    JDK 1.4.x 是正常的!
    但是 JDK 5.0 定制部署 WebServices - Axis 时,执行命令行:
    java org.apache.axis.client.AdminClient deploy.wsdd
    总不正常!
    升级到 Update 1:
    java version "1.5.0_01"
    Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_01-b08)
    Java HotSpot(TM) Client VM (build 1.5.0_01-b08, mixed mode, sharing)
    终于又可以了!
    相关下载:

    JDK 5.0 Update 1:
    http://dlc.sun.com/jdk/jdk-1_5_0_01-windows-i586-p.exe

    Resin 2.1.16 (推荐,因为相对于 Tomcat 小巧)
    http://www.caucho.com/download/resin-2.1.16.zip

    Tomcat 5.5.7
    http://apache.justdn.org/jakarta/tomcat-5/v5.5.7/bin/jakarta-tomcat-5.5.7.zip

    Apache WebServices - Axis v1.1: (June 16, 2003)
    http://apache.freelamp.com/ws/axis/1_1/axis-1_1.zip
    解压后,将 axis-1_1/webapps/ 目录下的 axis 目录复制到 Resin 或 Tomcat 的 webapps 目录下!

    JavaMail API 1.3.2 FCS:
    http://192.18.97.52/ECom/EComTicketServlet/BEGIN0C28A9F726724B9DD60F1DA518A6C32A/-2147483648/755528103/1/540782/540770/755528103/2ts+/westCoastFSEND/javamail-1_3_2-oth-JPR/javamail-1_3_2-oth-JPR:1/javamail-1_3_2.zip

    JavaBeans(TM) Activation Framework 1.0.2:
    http://192.18.97.131/ECom/EComTicketServlet/BEGIN145B389A284A19AC4F88E80C4CFBA0D3/-2147483648/755539779/1/359918/359906/755539779/2ts+/westCoastFSEND/7017-jaf-1.0.2-oth-JPR/7017-jaf-1.0.2-oth-JPR:1/jaf-1_0_2-upd.zip

    XML Security Version 1.2 of the Java library:
    http://xml.apache.org/security/dist/java-library/xml-security-bin-1_2_0.zip

    清单:
    activation.jar
    axis-ant.jar
    axis.jar
    commons-discovery.jar
    commons-logging-api.jar
    commons-logging.jar
    jaxrpc.jar
    log4j-1.2.8.jar
    mail.jar
    saaj.jar
    stylebook-1.0-b3_xalan-2.jar
    wsdl4j.jar
    xalan.jar
    xercesImpl.jar
    xml-apis.jar
    xmlParserAPIs.jar
    xmlsec.jar
    xmlsecSamples.jar
    xmlsecTests.jar

    Class1.java 文件保存到 /webapps/axis/WEB-INF/classes/Class1.java
    执行: javac Class1.java 编译成 Class1.class:
    public class Class1
    {
     public static void main()
     {
      System.out.println("Hello World!");
      //System.out.println(new jwsClass1().SayHelloTo("世界!"));
     }
     public String SayHelloTo(String Who)
     {
      return "你好: " + Who;
     }
     public String SayHelloToo(String Who)
     {
      return "你好: " + Who;
     }
    }

    http://localhost:1080/axis/services/Class1Service?wsdl
    另存为: xx.wsdl
    deploy.wsdd (undeploy.wsdd) 文件,
    deploy.wsdd (undeploy.wsdd) 部署文件
    <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
     <service name="Class1Service" provider="java:RPC">
      <parameter name="className" value="Class1"/>
      <parameter name="allowedMethods" value="*"/>
     </service>
    </deployment>

    客户端:

    (a)从 WSDL 文件生成客户端存根 (stub) 代码,服务端框架 (skeleton) 代码以及 WSDL 中的数据类型文件(生成与之对应的 Java 代码)
    可由命令行生成::
    java org.apache.axis.wsdl.WSDL2Java --skeletonDeploy true xx.wsdl

    1. deploy.wsdd : MyService 服务的部署描述文件
    2. MyService.java : MyService 服务的接口文件
    3. MyServiceService.java : 获得 MyService 服务的接口文件
    4. MyServiceServiceLocator.java : 实现 MyServiceService 接口
    5. MyServiceSoapBindingImpl.java : 实现 MyService 接口,应向其中补充业务逻辑
    6. MyServiceSoapBindingSkeleton.java : MyService 服务的服务端框架代码,实现 MyService, org.apache.axis.wsdl.Skeleton 接口
    7. MyServiceSoapBindingStub.java :MyService 服务的客户端存根代码,实现 MyService 接口
    8. undeploy.wsdd : 注销 MyService 服务的部署描述文件

    (b)
    动态调用 WebServices :
    参阅: 王咏刚
    wsCaller:Web Service通用客户端和测试工具
    http://www.contextfree.net/wangyg/c/wsCaller/wsCaller.html

    import org.apache.axis.Constants;
    import org.apache.axis.encoding.ser.SimpleDeserializer;
    import org.apache.axis.wsdl.gen.Parser;
    import org.apache.axis.wsdl.symbolTable.*;

    import javax.wsdl.*;
    //import javax.wsdl.extensions.soap.SOAPAddress;
    import javax.xml.namespace.QName;
    import javax.xml.rpc.Call;
    import javax.xml.rpc.encoding.Deserializer;
    import javax.xml.rpc.encoding.DeserializerFactory;

    import java.util.*;

    //import localhost.axis.services;
    // Web Service Dynamic Invoker

    public class DynamicInvoker
    {
     private Parser wsdlParser = null;
     private Map services = null;

     public DynamicInvoker(String wsdlURL) throws Exception
     {
      wsdlParser = new Parser();
      wsdlParser.run(wsdlURL);
      services = enumSymTabEntry(ServiceEntry.class);
     }

     public Map invoke(String serviceName,
           String portName,
           String operationName,
           Vector parameterValues) throws Exception
     {
      Vector inputs = new Vector();
      String returnName = null;

      ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName);
      Service service = serviceEntry.getService();
      org.apache.axis.client.Service clientService = new
        org.apache.axis.client.Service(wsdlParser, service.getQName());

      Call call = clientService.createCall(QName.valueOf(portName), QName.valueOf(operationName));
      ((org.apache.axis.client.Call) call).setTimeout(new Integer(15 * 1000));

      BindingEntry bindingEntry = getBindingEntry(serviceName, portName);
      Operation o = getOperation(bindingEntry, operationName);
      Parameters parameters = bindingEntry.getParameters(o);

      if (parameters.returnParam != null)
      {
       //QName returnType = org.apache.axis.wsdl.toJava.Utils.getXSIType(parameters.returnParam);
       QName returnQName = parameters.returnParam.getQName();
       returnName = returnQName.getLocalPart();
      }

      int size = parameters.list.size();
      for (int i = 0; i < size; i++)
      {
       Parameter p = (Parameter) parameters.list.get(i);
       switch (p.getMode())
       {
        case Parameter.IN :
         inputs.add(getParamData((org.apache.axis.client.Call) call
               , p
               , (String) parameterValues.elementAt(i)));
         break;
        case Parameter.OUT :
         break;
        case Parameter.INOUT :
         inputs.add(getParamData((org.apache.axis.client.Call) call,
               p,
               (String) parameterValues.elementAt(i)));
         break;
       }
      }

      Object ret = call.invoke(inputs.toArray());
      Map outputs = call.getOutputParams();
      HashMap map = new HashMap();
      if (ret != null && returnName != null)
      {
       map.put(returnName, ret);
      }
      if (outputs != null)
      {
       for (Iterator i = outputs.keySet().iterator(); i.hasNext();)
       {
        Object obj = i.next();
        String name;
        Object value;
        if (obj.getClass().getName().equals("java.lang.String"))
        {
         name = (String) obj;
        }
        else
        {
         name = ((QName) obj).getLocalPart();
        }
        value = outputs.get(obj);
        map.put(name, value);
       }
      }
      return map;
     }

     public Vector enumServiceNames()
     {
      Vector v = new Vector();
      Iterator i = services.keySet().iterator();
      while (i.hasNext())
      {
       String s = (String) i.next();
       v.addElement(s);
      }
      return v;
     }

     public Vector enumPortNames(String serviceName)
     {
      Vector v = new Vector();
      ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName);
      Map ports = serviceEntry.getService().getPorts();
      Iterator i = ports.keySet().iterator();
      while (i.hasNext())
      {
       String s = (String) i.next();
       v.addElement(s);
      }
      return v;
     }

     public Vector enumOperationNames(String serviceName, String portName)
     {
      Vector v = new Vector();
      BindingEntry entry = getBindingEntry(serviceName, portName);
      Set operations = entry.getOperations();
      Iterator i = operations.iterator();
      while (i.hasNext())
      {
       Operation o = (Operation) i.next();
       String s = o.getName();
       v.addElement(s);
      }
      return v;
     }

     public Parameters enumParameters(String serviceName
             , String portName
             , String operationName)
     {
      BindingEntry entry = getBindingEntry(serviceName, portName);
      Operation o = getOperation(entry, operationName);
      Parameters parameters = entry.getParameters(o);
      return parameters;
     }

     public String getParameterModeString(Parameter p)
     {
      String ret = null;
      switch (p.getMode())
      {
       case Parameter.IN:
        ret = "[IN]";
        break;
       case Parameter.INOUT:
        ret = "[IN, OUT]";
        break;
       case Parameter.OUT:
        ret = "[OUT]";
        break;
      }
      return ret;
     }

     private BindingEntry getBindingEntry(String serviceName, String portName)
     {
      ServiceEntry serviceEntry = (ServiceEntry) services.get(serviceName);
      Port port = serviceEntry.getService().getPort(portName);
      Binding binding = port.getBinding();
      SymbolTable table = wsdlParser.getSymbolTable();
      return table.getBindingEntry(binding.getQName());
     }

     private Operation getOperation(BindingEntry entry, String operationName)
     {
      Set operations = entry.getOperations();
      Iterator i = operations.iterator();
      while (i.hasNext())
      {
       Operation o = (Operation) i.next();
       if (operationName.equals(o.getName()))
       {
        return o;
       }
      }
      return null;
     }

     // return Map of <QName.getLocalPart, SymTabEntry>
     private Map enumSymTabEntry(Class cls)
     {
      HashMap ret = new HashMap();
      HashMap map = wsdlParser.getSymbolTable().getHashMap();
      Iterator iterator = map.entrySet().iterator();
      while (iterator.hasNext())
      {
       Map.Entry entry = (Map.Entry) iterator.next();
       QName key = (QName) entry.getKey();
       Vector v = (Vector) entry.getValue();
       int size = v.size();
       for (int i = 0; i < size; ++i)
       {
        SymTabEntry symTabEntry = (SymTabEntry) v.elementAt(i);
        if (cls.isInstance(symTabEntry))
        {
         ret.put(key.getLocalPart(), symTabEntry);
        }
       }
      }
      return ret;
     }

     private Object getParamData(org.apache.axis.client.Call c, Parameter p,
            String arg) throws Exception
     {
      // Get the QName representing the parameter type
      QName paramType = org.apache.axis.wsdl.toJava.Utils.getXSIType(p);

      TypeEntry type = p.getType();
      if (type instanceof BaseType && ((BaseType) type).isBaseType())
      {
       DeserializerFactory factory = c.getTypeMapping().getDeserializer(paramType);
       Deserializer deserializer = factory.getDeserializerAs(Constants.
                      AXIS_SAX);
       if (deserializer instanceof SimpleDeserializer)
       {
        return ((SimpleDeserializer) deserializer).makeValue(arg);
       }
      }
      throw new RuntimeException("not know how to convert '" + arg
               + "' into " + c);
     }
    }

    class AppTest
    {
     public static void main(String[] args) throws Exception
     {
      System.out.println("Hello World!");
      //动态调用 WebServics
      String location = "http://localhost:1080/axis/services/Class1Service?wsdl";
      DynamicInvoker invoker = new DynamicInvoker(location);
      Vector vServices = invoker.enumServiceNames();
      Object[] Services = vServices.toArray();
      Arrays.sort(Services);
      for (int i = 0; i < Services.length; i++)
      {
       String serviceName = (String) Services[i];
       System.out.println(serviceName);
       Vector V = invoker.enumPortNames(serviceName);
       String portName = (String) V.elementAt(0);
       V = invoker.enumOperationNames(serviceName, portName);
       Object[] OperationNames = V.toArray();
       Arrays.sort(OperationNames);
       for (int j = 0; j < OperationNames.length; j++)
       {
        String operationName = (String) OperationNames[j];
        System.out.println("/t" + (String) OperationNames[j]);
        Parameters parameters = invoker.enumParameters(serviceName, portName, operationName);
        Vector v = parameters.list;
        Vector parameterValues = new Vector();
        for (int k = 0; k < v.size(); k++)
        {
         Parameter para = (Parameter) v.elementAt(k);
         System.out.print("/t/t" + para.getQName().getLocalPart());
         if (para.getType().getQName().getLocalPart().equals("string"))
         {
          parameterValues.addElement("asdasdas");
         }
         else
         {
          parameterValues.addElement(null);
         }
         System.out.print("/t" + para.getType().getQName().getLocalPart());
         System.out.println("/t" + invoker.getParameterModeString(para));
        }
        Map result = invoker.invoke(serviceName, portName, operationName, parameterValues);
        for (Iterator it = result.keySet().iterator(); it.hasNext();)
        {
         String name = (String) it.next();
         Object value = result.get(name);
         String line;
         if (value != null)
         {
          line = name + "=" + result.get(name).toString() + "/n";
         }
         else
         {
          line = name + "=(null)/n";
         }
         System.out.println(line);
        }
       }
      }

      //调用代理类调用 WebServices
      localhost.axis.services.Class1Service.Class1 x = new localhost.axis.services.Class1Service.Class1ServiceLocator().getClass1Service();
      //((localhost.axis.services.Class1Service.Class1ServiceSoapBindingStub) x).setMaintainSession(true);
      System.out.println(x.sayHelloTo("萨达三 adas"));
     }
    }

  • 相关阅读:
    head命令
    less命令
    解决get方法传递URL参数中文乱码问题
    The method convert(String) of type DateConverter must override a superclass method
    Tomcat Can't load AMD 64-bit .dll on a IA 32
    聚合函数查询 group by having
    string[] 清理重复+反转显示
    C# GetValueList 获得字符串中开始和结束字符串中间得值列表
    C# GetValue 正则获取开始结束代码
    string [] 去除重复字符两个方法
  • 原文地址:https://www.cnblogs.com/Microshaoft/p/2485738.html
Copyright © 2020-2023  润新知