JAX-WS动态调用Web Service

来源:互联网 发布:2017网络热搜词 编辑:程序博客网 时间:2024/06/07 06:32

1、调用方式介绍

   调用Web Service的Java客户端一般采用以下三种方式:

   生成的stub、proxy(动态代理)以及dispatch(动态调用接口)。dispatch又分为payload和message两种方式。

   这里仅就dispatch的message方式进行介绍。那好了,现在让我们一起体验WebService动态调用的好处吧!

2、动态调用WebService

   废话不说,直接看代码,是非功过通过研究代码自见分晓!

   动态调用的详细代码如下:

   package com.majun.xml;

   import java.util.Map;
   import javax.xml.namespace.QName;
   import javax.xml.soap.MessageFactory;
   import javax.xml.soap.SOAPBody;
   import javax.xml.soap.SOAPBodyElement;
   import javax.xml.soap.SOAPElement;
   import javax.xml.soap.SOAPMessage;
   import javax.xml.ws.BindingProvider;
   import javax.xml.ws.Dispatch;
   import javax.xml.ws.Service;
   import javax.xml.ws.WebServiceException;
   import javax.xml.ws.soap.SOAPBinding;

   public class DLLClient
   {
    


     // 名字空间 
     public static final String targetNamespace = "http://service.billInface.boss.gmt/";
     //服务名
     public static final String serName = "BillWebServiceService";
     //端口名
     public static final String pName = "BillWebServicePort";
     //服务地址
     public static final String endpointAddress      = "http://localhost:8080/BillInface/BillWebServicePort?wsdl";
     //方法名
     public static final String OPER_NAME = "getInBillingLoginInfo";
     //参数名
     public static final String INPUT_NMAE = "arg0";
 
     public static void main(String[] args) throws Exception
     {
       
        QName serviceName = new QName(targetNamespace, serName);

       
        QName portName = new QName(targetNamespace, pName);

       
        javax.xml.ws.Service service = Service.create(serviceName);
        service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);

       
        Dispatch<SOAPMessage> dispatch = service.createDispatch(portName,
        SOAPMessage.class, Service.Mode.MESSAGE);

      
        BindingProvider bp = (BindingProvider) dispatch;
        Map<String, Object> rc = bp.getRequestContext();
        rc.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
        rc.put(BindingProvider.SOAPACTION_URI_PROPERTY, OPER_NAME);

        MessageFactory factory = ((SOAPBinding)bp.getBinding()).getMessageFactory();

       
        SOAPMessage request = factory.createMessage();
        SOAPBody body = request.getSOAPBody();

        QName payloadName = new QName(targetNamespace, OPER_NAME, "ns1");

        SOAPBodyElement payload = body.addBodyElement(payloadName);

       

        SOAPElement message = payload.addChildElement(INPUT_NMAE);
        message.addTextNode("x");

        SOAPMessage reply = null;

        
        try
        {
           reply = dispatch.invoke(request);
        }
        catch (WebServiceException wse)
        {
           wse.printStackTrace();
        }

        SOAPBody soapBody = reply.getSOAPBody();
        SOAPBodyElement nextSoapBodyElement = (SOAPBodyElement)soapBody.getChildElements().next ();              
        SOAPElement soapElement = (SOAPElement)nextSoapBodyElement.getChildElements().next();
  
        System.out.println("获取回应信息为:" + soapElement.getValue());  
      }
    }
2、再说明

   有了上面的代码,相信也不需要太多的解释了,对于其中的一些wsdl知识及相关原理,请去问百度吧,最好不要去问谷歌,“科学无国界,但科学家有国籍!”,我辈小小程序员就更应该蒸不起馒头,争口气了!

   哈哈,开个玩笑!百度确实不错,但是她确实不如谷歌!

   程序之路确实很艰辛,比烤鸡排都艰辛!还望我们这些底层IT分子善于发掘沿途风光!

原创粉丝点击