GVKun编程网logo

WebService Axis(webservice axis2)

16

最近很多小伙伴都在问WebService学习笔记和webservice入门教程这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展axis2webservice学习笔记、axis2we

最近很多小伙伴都在问WebService学习笔记webservice入门教程这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展axis2 webservice学习笔记、axis2 webservice学习笔记一、axis2 webservice学习笔记三、axis2 webservice学习笔记二等相关知识,下面开始了哦!

本文目录一览:

WebService学习笔记(webservice入门教程)

WebService学习笔记(webservice入门教程)

对于跨系统的数据交换非常有优势

注意:WebService是一个协议,相当于http协议。
    Axis 客户端编程,相当于IE编程。
    Axis 服务器编程,相当Web应用服务器编程。
    注意这3个方面是在写程序的角度有很大的独立性。

学习阶段:
4。关于WebService.
     web service 是一个规范、标准。这个标准需要具体的实现。就象J2EE规范需要有支持这个规范的服务器才能被我们使用一样。

     webservice的实现目前主要有:
     1。sun的JWSDP-Java Web服务开发人员包(Java Web Services Developer Pack,JWSDP)是一个工具和库的集合
     2。AXIS APACHE开源项目的一个子项目。
     3。XFire   也是个开源项目。

· SOAP:远程调用。 
    · uddi:贸易、目录服务。 
    · WSDL:描述Web服务特征。

一个WSDL文档在定义网络服务时遵循以下几个原理: 
    · 类型:使用某种类型的系统进行数据类型定义的容器(如XSD) 
    · 消息:一种抽象的、被定义类型的通信数据 
    · 操作:由服务所支持的一个抽象描述的动作 
    · 端口类型:由一个或多个端点支持的一个操作的抽象集合 
    · 绑定:针对一个特定端口类型的具体的协议和数据格式规范 
    · 端口:被定义成一个结合绑定和网络地址的一个单一的端点 
    · 服务:相关端点的集合 
    由此可见,WSDL为客户提供了一个服务描述的模板。

SOAP是一个协议规范,定义了传递XML-encoded数据时的统一方式;同时它也定义了使用HTTP作为底层通信协议时,执行远程调用(RFC)的方法。

uddi为客户提供了一种动态查找其它Web服务的机制。可以将它看作商业应用程序的DNS服务。

?WebService如何实现身份验证?在每个请求的时候都把用户名和密码
     同时使用Web服务的身份验证和授权技术,提高系统的安全性。由于Web Service在安全性方面的标准刚刚出台,还没有实际应用,所以系统在身份认证和授权技术方面的实现还比较简单,只提供简单的密码和授权认证。

     用hanlder是否可以?

 

 


关于Axis1.4
可以在浏览器地址栏中输入地址得到相关的soap原代码、调用webservice服务。
     例如:http://loalhost/axis/HelloService.jws?method=sayHello&parameter=ipaddr
       这是在sayHello函数只有一个参数的情况下可以使用的。

在Tomcat服务器中,java -cp %AXISCLAsspATH% org.apache.axis.client.AdminClient deploy.wsdd到底做了什么:
    只是把deploy.wsdd的service里的内容放到server_config.wsdd里
    答:org.apache.axis.client.AdminClient的作用分2步:
    1步,是把deploy.wsdd里的service标记放到server_config.wsdd里。
    注意:这一步是我们手工也可以做的。
    2步,更新内存里的server_config.wsdd为最新的。
    这步是手工不能做的。

    如果
    第一步,手动加入service标记到server_config.wsdd中,
    第二步,那么重起Tomcat让服务器从新读一次server_config.wsdd。
    与org.apache.axis.client.AdminClient执行的效果是一样的。


    EndPoint地址:
     客户端访问的时候设置的call.setTargetEndpointAddress("http://localhost:8080/axis/Distance.jws");与.wsdl文件里这部分对应:
     - <wsdl:service name="distanceService">
     - <wsdl:port binding="impl:distanceSoapBinding" name="distance">
       <wsdlsoap:address location="http://127.0.0.1:8080/axis/Distance.jws" /> 
       </wsdl:port>
       </wsdl:service>

Axis支持三种web service的部署和开发,分别为:
  1、Dynamic Invocation Interface ( DII)    (.jws放到Web的跟目录下,直接用Service 和Call类调用)
  2、Stubs方式
             (.java放到java的包里,然后修改server-config.wsdd就行了。
             至于Handler和client stub(生成测试文件)都是可选的。
             )
  3、Dynamic Proxy方式         (.jws放到Web的跟目录下, 在写个接口,在客户端用ServiceFactory、Service和哪个接口接口调用)

Axis支持三种web service的部署到底有几种:为什么Stubs方式 和其他文章的制定发布方式不同。
      这篇文章中,Stubs方式的Handler和client stub部分是多余的。不是ws必须的。所以与其他文章中制定发布是一样的

在Stub的部署方式中,client stub的作用:测试吗
答:   client stub是由Axis提供的。
   client stub是指:如下一个命令
   执行下面的命令生存client stub
   java org.apache.Axis.wsdl.WSDL2Java -p client http://localhost:8080/Axis/services/SayHello.jws?wsdl   
   执行如下命令生成SayHello.wsdl
   java org.apache.Axis.wsdl.Java2WSDL -oSayHello.wsdl -l http://localhost:8080/Axis/services/SayHello -nsayhello server.SayHello
   执行如下命令生成client stub
   java org.apache.Axis.wsdl.WSDL2Java SayHello.wsdl -p client
     生成的stub client文件列表为:  
     1.SayHello.java  
     2.SayHelloService.java。  
     3.SayHelloServiceLocator.java  
     4.SayHelloSoapBindingStub.java
   这些文件封装了ServiceFactory、Service 和Call等类。可以用这些文件里的类调用WS比较方便。
   可以用到测试里,直接用他们变成也挺好。但这些都是client部分的东西,与ws服务本身无关,不影响ws的正常运行。

WS可以使用自定义类型,这样使用client stub就很方便了。


\Tomcat 5.0\webapps\axis\WEB-INF里保存了.jws生成的.class文件。

关于WTP
Tomcat下的Axis没有生成wsdl文件,WTP为什么要生成吗。有用吗。如果删除会不回影响ws的运行。
   答:会影响部署,但不影响运行。如果保留文件,但把.wsdl文件的内容全删了并不影响WS运行,发布也能成功。

.wsdl,AXIS和WSDD(.wsdd文件和server-config.wsdd),.java(.class)的关系。
     .wsdl,是WebService的类型定义,
     就象.java文件中定义类的类型和相关信息一样。
     soap请求一个wsdl所定义的WebService(或称功能)。Axis根据server-config.wsdd文件里的信息把.java文件与之.wsdl关联。


?WebService能否实现类似目前我们所使用的3层框价的框架?有什么优势和劣势。


总结java后的参数。-classpath、-cp、-D java.ext.dirs

Axis1与Axis2的区别。
见文章:在网站http://www.opentown.info/,Understanding Axis2 Deployment Architecture ——理解Axis2部署体系 
      

soap client工具是什么
答:soap是一个协议,就象html,但html有ie等浏览器,使用soap的时候,编程的时候没有这些soap浏览器,就需要工具生成一些重复的代码。

如何向WTP那样保留.wsdl文件

   执行下面的命令生存client stub
   java org.apache.Axis.wsdl.WSDL2Java -p client http://localhost:8080/Axis/services/SayHello.jws?wsdl   

   还有一个类org.apache.axis.wsdl.Java2WSDL,也许也可以。

WTP开发的Tomcat运行的WebService,也可以想Tomcat中手工写的文件那样在IE的地址栏请求,并获得结果吗
      完全可以用类似http://127.0.0.1:8080/ws/services/Pdd?method=getStr&parameter=SoEasy的方式请求并得到如下结果。
          <?xml version="1.0" encoding="UTF-8" ?> 
     - <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     - <soapenv:Body>
     - <getStrResponse xmlns="">
       <ns1:getStrReturn xmlns:ns1="http://ws.forecast.cn">Hello: SoEasy</ns1:getStrReturn> 
       </getStrResponse>
       </soapenv:Body>
       </soapenv:Envelope>
     但是与Tomcat中手工写的文件不同的是.wsdl必须存在。如果不存在就pulish不成功。导致WebService运行不起来。
     这个问题是部署的问题。
     如果把.wsdl里的文件内容全都删除但保留这个文件。通过地址栏就可以访问了Webservice了。
     通过WebService?wsdl也可以看到完整的.wsld文件。可见。哪个文件在通过地址栏访问的时候是没有用的。

WTP还有一个客户端项目,这个项目是用client stub相关工具生成的。是个测试项目不产生他也一样运行WebService。

包org.apache.Axis和org.apache.axis在版本上的区别:
   大写的Axis可能是作者笔误,或者是老版本。
   到apache官方网站上,各种版本全是打包的下载太麻烦。
   再说没有什么意义。不再查了

现在感觉WTP在发布ws的时候,很麻烦,也是这是为了适应,更复杂的设计,毕竟现在所做的例子都是非常简单的。
比如,也许可以自动根据xml生成对象等。——可以的。

在客户端和服务端都是java的时候是可以把一些对象作为WS的输入和输出。通过ClientStub的方式直接得到对象。
但在传输的时候xml,具体是什么格式的。知道了具体的格式,也就可以让C等其他语言进行解析了。
支持返回值是Bean的ws。调用一下就能看到格式了。

http://www.eclipse.org/webtools/initial-contribution/IBM/evalGuides/WebServicesToolsEval.html?p=1上的
Web Services Tools Evaluation Guide
     Extensible Wizards for creating Web service clients from WSDL. 
     这句话解释了,为什么要生成.wsdl文件
     Included in the contribution are tools for building Apache Axis Web services and Web service clients on Apache Tomcat. 
     测试程序最好运行在Apache Tomcat. 上。

     Using the Web Services Explorer to test a Web service
     通过eclipse内置浏览器的地址得到了.http://localhost:0/wsexplorer/wsexplorer.jsp?org.eclipse.wst.ws.explorer=4这个连接
     在eclipse文件夹里搜索wsexplorer找到一个wsexplorer.war包放到Tomcat/webapps/中,访问上边的地址得到错误.提示类没有找到
     估计是有些.jar没有考过来.
     又把wsexplorer文件夹考过来,也抛出异常,放弃。
     没有测试成功.

     写完java类的发布成WebService基本也没有
    部署的时候的错误。
    IWAB0398E Error in generating WSDL from Java java.lang.NoClassDefFoundError
     把HMW他们项目的.jar包考过来也没有解决问题

     部署没有成功。
WTP是个大垃圾,BUG太多了。

?上次只搜索错误了.应该搜索一下中文的完整的WTP发布WS的过程,我看的是官方文档,实际可能还有别的方法。不搜错误,搜方法。

放弃WTP作为开发工具。直接用eclispe+myeclipse+weblogic+手工配置。

Axis在weblogic上的应用。
- Unable to find config file.   Creating new servlet engine config file: /WEB-INF/server-config.wsdd
但无论在weblogic还是eclipse的workspace中都没有找到这个文件。
准备:把\axis-src-1_4\axis-1_4\webapps\axis\WEB-INF\lib考到\Webroot\WEB-INF\lib中,添加构件路径。这些.jar才是必须的。
1。制定发布:
       1。1。在运行java org.apache.axis.client.AdminClient deploy.wsdd的时候把他放在eclipse的workspace\WSServer\Webroot\WEB-INF\classes\sls>,
    执行发生异常,没有成功。
    异常如下
    E:\workspace\eclipse\WSServer\Webroot\WEB-INF\classes\sls>java org.apache.axis.client.AdminClient deploy.wsdd
    Processing file deploy.wsdd
    Exception: AxisFault
     faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
     faultSubcode:
     faultString: java.net.ConnectException: Connection refused: connect
     faultActor:
     faultNode:
     faultDetail:
     {http://xml.apache.org/axis/}stackTrace:java.net.ConnectException: Connection refused: connect
     at java.net.PlainSocketImpl.socketConnect(Native Method)
     at java.net.PlainSocketImpl.doConnect(UnkNown Source)
     at java.net.PlainSocketImpl.connectToAddress(UnkNown Source)
     at java.net.PlainSocketImpl.connect(UnkNown Source)
     at java.net.socksSocketImpl.connect(UnkNown Source)
     at java.net.socket.connect(UnkNown Source)
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
     at sun.reflect.NativeMethodAccessorImpl.invoke(UnkNown Source)
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(UnkNown Source)
     at java.lang.reflect.Method.invoke(UnkNown Source)
     at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSocketFactory.java:153)
     at org.apache.axis.components.net.DefaultSocketFactory.create(DefaultSocketFactory.java:120)
     at org.apache.axis.transport.http.HTTPSender.getSocket(HTTPSender.java:191)
     at org.apache.axis.transport.http.HTTPSender.writetoSocket(HTTPSender.java:404)
     at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:138)

     at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
     at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
     at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
     at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
     at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
     at org.apache.axis.client.Call.invoke(Call.java:2767)
     at org.apache.axis.client.Call.invoke(Call.java:1792)
     at org.apache.axis.client.AdminClient.process(AdminClient.java:439)
     at org.apache.axis.client.AdminClient.process(AdminClient.java:404)
     at org.apache.axis.client.AdminClient.process(AdminClient.java:410)
     at org.apache.axis.client.AdminClient.process(AdminClient.java:320)
     at org.apache.axis.client.AdminClient.main(AdminClient.java:463)

     {http://xml.apache.org/axis/}hostname:kangxiaoguang
    在weblogic目录下执行抛出同样的异常。

   1。2。
   首先获得server-config.wsdd,使用文章:AxisDevelopGuide.doc用Axis开发基于Java的Web服务,中的java -cp %AXISCLAsspATH% org.apache.axis.client.AdminClient deploy.wsdd命令。deploy内容如下:
  <deployment xmlns="http://xml.apache.org/axis/wsdd/"
   xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
   <service name="Capacity" provider="java:RPC">
   <parameter name="className" value="samples.capacity.Capacity"/>
   <parameter name="allowedMethods" value="*"/>
   </service>
   </deployment>
   用饶过这个命令的方式直接编写server-config.wsdd,然后从新启动。由于虽然控制台中提示建立了server-config.wsdd,但在文件系统中(无论Tomcat还时候Weblogic)找不到server-config.wsdd。所以要手工生成。
   测试成功,更改.java类的时候不需要重新启动服务器,在改动server-config.wsdd要让他生效,需要重新启动。
  
   有时可能发生下边这个异常,但对程序没有影响。一般产生在编辑文件后的第一次请求WS
    <2006-5-12 下午10时19分52秒 CST> <Error> <HTTP> <BEA-101309> <[ServletContext(id=32433147,name=WSServer,context-path=/WSServer)] Could not deserialize the context attribute "AxisEngine"
     java.io.NotSerializableException: org.apache.axis.configuration.FileProvider

   当返回值是的bean的时候,?wsdl多了<wsdl:types>标记,定义这种自定义类型,
    此时调用WS,对应的函数已经执行了。但返回值是异常,因为Axis不知道如何序列化这个类。
    在server-config.wsdd 中加入<beanMapping qname="ns:loca" classname="sls.WsBean"></beanMapping>标记,让Axis知道如何序列化这个类。
    结果还是不成功,连函数都不执行了。?wsdl报服务器内部错误,但在控制台中没有显示。
    直接调用WS得到soapenv:Server.userException java.lang.NullPointerException kangxiaoguang 错误。

    在server-config.wsdd 中加入的beanMapping标记改成如下:
    <beanMapping languageSpecificType="java:sls.WsBean" qname="ns1:WsBean" 
     xmlns:ns1="urn:BeanService"/>
     并且是加在service标记中。
      languageSpecificType属性指定JavaBean类文件位置,例如:
      languageSpecificType="java:com.ronghao.axis.Order"
      qname属性指定JavaBean类的名字
      其他是固定的。
    完整的标记是:
     <service name="Fws" provider="java:RPC">
      <parameter name="allowedMethods" value="*"/>
      <parameter name="className" value="sls.Fws"/>
      <beanMapping languageSpecificType="java:sls.WsBean" qname="ns1:WsBean" 
      xmlns:ns1="urn:BeanService"/>
     </service>
     测试成功
     返回结果:
       <?xml version="1.0" encoding="UTF-8" ?> 
    - <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2001/XMLSchema-instance">
    - <soapenv:Body>
    - <helloWSResponse soapenv:encodingjavascript:void()"data="/link?url=http://schemas.xmlsoap.org/soap/encoding/"rel="nofollow" target="_blank">http://schemas.xmlsoap.org/soap/encoding/">
      <helloWSReturn href="#id0" /> 
      </helloWSResponse>
    - <multiRef id="id0" soapenc:root="0" soapenv:encodingjavascript:void()"data="/link?url=http://schemas.xmlsoap.org/soap/encoding/"rel="nofollow" target="_blank">http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns1:WsBean" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="urn:BeanService">
      <ib xsi:type="xsd:int">121</ib> 
      <sb xsi:type="xsd:string">SoGood</sb> 
      </multiRef>
      </soapenv:Body>
      </soapenv:Envelope>
      以下是这个返回值的java代码。
      public class WsBean implements Serializable
     {
         private String sb;
         private int ib;
        
         public int getIb()
         {
      return ib;
         }
         public void setIb(int ib)
         {
      this.ib = ib;
         }
         public String getSb()
         {
      return sb;
         }
         public void setSb(String sb)
         {
      this.sb = sb;
         }
     }
      理想的结果是WS对复杂的bean能返回一个根据属性名成声的xml文件。
      这个返回值的格式,要复杂些但与自己想要的基本相同。

   注意,返回的bean的属性中完全可以使用List接口作为Bean的属性。实际赋的对象是ArrayList类型的。
   并且,ArrayList中的元素,也可以是个Bean。Axis可以清晰的把这些解析成xml返回给IE,或其他soap客户端。
   但要是用List,Map作为WS的参数,可能就会有问题。
  
   在IE地址栏中有get方式访问WS,有多个参数的时候可以写成,
  http://localhost:7001/WSServer/services/Fws?method=helloWS&方法中的参数名1=SoGood&方法中的参数名2=fdfes。    这样能把值准确的赋到对应的变量上,也可以用parameter1、parameter2等代替参数名,但是同过什么顺序赋值的,还没有搞清楚。

axis2 webservice学习笔记

axis2 webservice学习笔记

Axis2 创建webservice客户端和服务端

 

1、环境

Axis2:axis2-1.4.1(下载axis2-1.4.1-bin,并解压到指定路径)

Eclipse:Eclipse Java EE IDE for Web Developers. Version:Indigo Release

JAVA:jdk1.5.0_07

服务器:tomcat6.0(如果非安装版的不好使,可换成安装版)

 

2、安装eclipse并打开,进入:Window->Preferences->Web Services->Axis2 Preferences做如下设置(设置axis2的路径):

 

3、在eclipse中新建JAVA project(demo工程),并新建类HelloService.java,如下图所示。

 

 

4、编写HelloService.java类(即服务端的类),其中sayHello方法为服务端的方法。代码如下:

package com.sample.services;

 

public class HelloService {

 

   public static void main(String[] args) {

     

   } 

   public String sayHello(String name){

     

      return "Hello:"+name;

   }

}

 

5、新建webservice,点next


6、新建webservice对话框,需在两红色区域做些设置,第一个选择刚刚建立的HelloService的类,作为需要实现的服务。在第二个红色区域中,设置运行的服务器,webservice运行环境,及建立service工程的名称,这三个点击即都可以做修改。

  



完成以上配置后,选择next即可(后续都默认操作),并在最后一步启动tomcat服务,则tomcat自动完成部署。

7、Eclipse空间中自动生成了webService工程。同时发现对应的src无java类信息,则可以从第一次新建的demo项目中拷贝过来,并修改java类的编译路径,具体设置如下:

 

8、重新编译后,再次部署并重启tomcat服务。

查看服务端地址:http://localhost:8080/webService/,点击Services可查看具体的服务名信息。如正常显示如下图所示,则部署成功。

 

其中HelloService为刚刚部署的服务,对应的客户端请求地址为:

http://localhost:8080/webService/services/HelloService

 

9、编写客户端,代码如下:

package com.sample.services;

 

import javax.xml.namespace.QName;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.rpc.client.RPCServiceClient;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

 

public class Test

{

   public static Log log = LogFactory.getLog(Test.class);

  

   public static void main(String[] args)throws Exception

    {

        //使用RPC方式调用WebService   

        RPCServiceClient serviceClient = new RPCServiceClient();

        Options options = serviceClient.getoptions();

        //查看服务端地址:http://localhost:8080/webService/

        //指定调用WebServiceURL

        EndpointReference targetEPR = new EndpointReference("http://localhost:8080/webService/services/HelloService");

        options.setTo(targetEPR);

        //指定方法的参数值

        Object[] opAddEntryArgs = new Object[] {"zengms"};

        //指定方法返回值的数据类型的Class对象

        Class[] classes = new Class[] {String.class};

        //指定要调用的getGreeting方法及WSDL文件的命名空间

        QName opAddEntry = new QName("http://services.sample.com","sayHello");

        // 调用方法并输出该方法的返回值 

        String str=(String) serviceClient.invokeBlocking(opAddEntry,opAddEntryArgs,classes)[0];

        System.out.println(str);

    }

}

 

执行客户端代码,传入参数:test,后台打印为:Hello:test

调试成功。


如果下发布多个WebService,可以使用<serviceGroup>元素,编写MyServices.java类(即服务端的类),其中sayHello方法为服务端的方法。代码如下:

package com.sample.services;

 

public class MyServices{

 

   static void main(String[] args) {

     

   } 

   public String sayHello(String name){

     

      return "MyServices:"+name;

   }

}

 在services.xml文件中做如下配置即可:

<serviceGroup>
	<service name="SttServices">
		<Description>
			SttServices
		</Description>
		<messageReceivers>
			<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/>
			<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" />
		</messageReceivers>
		<parameter name="ServiceClass" locked="false">com.stt.inter.services.SttServices
		</parameter>
	</service>

	<service name="MyServices">
		<Description>
			MyServices
		</Description>
		<messageReceivers>
			<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/>
			<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver" />
		</messageReceivers>
		<parameter name="ServiceClass" locked="false">com.stt.inter.services.MyServices
		</parameter>
	</service>
</serviceGroup>

注意:当前使用的环境及版本,不需要使用 axis2-1.4.1-war.zip 及相关插件。

 附录:

经测试1.5.31.6.0版本中都会出现类AxisAdminServlet无法找到,主要的原因是这两个版本中的jar包中都不存在AxisAdminServlet类,这样导致service服务无法启动以及不能进入service的管理控制台。对这种情况可以通过以下方式解决:

找到当前版本对应的war包,如:axis2-1.6.0-war.zip并解压到指定目录,打开解压后的axis2.aar包,在WEB-INF/classes目录下有需要的类AxisAdminServlet,则可以将classes目录下所有的class文件打成jar包,重新放到工程目录中即可。

同时做如下更改(都是根据后台日志报错做的修改):

1、修改web.xml中AxisAdminServlet的<servlet-class>项为:org.apache.axis2.webapp.AxisAdminServlet
2、修改axis2.xml文件中transportReceiver节点的class熟悉配置修改为org.apache.axis2.transport.http.AxisServletListener,

 

另把环境换成WebLogic Server Version: 10.3.0.0 +axis2-1.6.0+jdk1.5+Eclipse Indigo Release,按照如上步骤再次操作,先在tomcat中部署测试后将生成的webservice服务端应用部署至weblogic域下可正常启动并调用正常。但是有weblogic9版本会有好多jar包有冲突问题。


jar包命令:

进入dos操作符窗口

cd进入要打成jar包的class文件所有文件夹目录

jar cvf[生成jar的名称.jar] [列出class文件]

 

如:jar cvf  名称.jar ./文件夹            ——表示将当前文件夹下的classjar

 

jar cvfibstool.jar com/cn/ibs/TurnD.class com/cn/ibs/TurnB.class

二、把一个文件夹下面的所有class文件打成jar

jar cvfibstool.jar * 回车

 

服务端打aar包命令:

用java cvf hello.aar和axis插件都可以。

axis2 webservice学习笔记一

axis2 webservice学习笔记一

axis2 webservice axis  包括以下几部分 消息子系统 传输框架子系统 数据编码子系统 下载axis2 地址如下: http://axis.apache.org/axis2/java/core/download.cgi 环境搭建 1 eclipse 新建工程axis2webservice 2 axis2-1.6.2-bin\axis2-1.6.2\webapp\axis2-web整个文件夹放到webcontent目录下 3 添加servlet解析所用jar包     javax.servlet.jsp.jar     servlet-api-2.5.jar 4 WEB-INF下新建service文件夹 5 repository\modules目录放到WEB-INF目录下 service服务端 示例代码helloworld 1 /**  * axis2webservice的service端  *   * @time 上午11:36:53  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class HelloWorld { public OMElement sayHello(OMElement element) { element.build(); element.detach(); return element; } } 2 在service目录中新建与工程同名文件夹HelloWorld    并在该目录下添加service.xml   示例代码如下:   <service name="HelloWorld" >     <parameter name="ServiceClass"  locked="xsd:false">cn.yue.axis2service</parameter>     <operation name="sayHello">          <actionMapping>urn:sayHello</actionMapping>         <messageReceiver />     </operation> </service> 3修改web.xml文件     <servlet>         <servlet-name>AxisServlet</servlet-name>         <servlet-class>             org.apache.axis2.transport.http.AxisServlet         </servlet-class>         <load-on-startup>1</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>         <servlet-name>AxisAdminServlet</servlet-name>         <servlet-class>org.apache.axis2.transport.http.AxisAdminServlet</servlet- class>         <load-on-startup>100</load-on-startup>    </servlet>    <servlet-mapping>        <servlet-name>AxisAdminServlet</servlet-name>        <url-pattern>/axis2-admin/*</url-pattern>    </servlet-mapping>      注:  org.apache.axis2.transport.http.AxisAdminServlet找不到类  直接导原码 4将工程部署到tomcat  http://localhost:8089/axis2-web/ 客户端 四种不同类型客户端 1 block 阻塞式客户端   /**  * 传统客户端(阻塞式)  *   * @time 下午1:49:52  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class HelloWorldClient { private static EndpointReference endpointReference = new EndpointReference ("http://localhost:8089/services/HelloWorld"); public void sayHello() { Options options = new Options(); options.setAction("urn:sayHello"); options.setTo(endpointReference); ServiceClient sender = null; try { sender = new ServiceClient(); sender.setoptions(options); OMFactory factory = OMAbstractFactory.getoMFactory(); OMNamespace namespace = factory.createOMNamespace ("http://axis2service.yue.cn",""); OMElement method = factory.createOMElement("sayHello",  namespace); OMElement name = factory.createOMElement("name",namespace); name.setText("yue"); method.addChild(name); method.build(); OMElement response = sender.sendReceive(method); System.out.println(response); OMElement element = response.getFirstChildWithName(new  QName("http://axis2service.yue.cn","name")); System.out.println(element.getText()); } catch (AxisFault e) { System.out.println("error"); e.printstacktrace(); } } /** * @param args */ public static void main(String[] args) { HelloWorldClient client = new HelloWorldClient(); client.sayHello(); } } 2 non block 非阻塞式客户端 /**  *   * @time 下午3:27:21  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class HelloWorldNonBlockCB implements AxisCallback { private boolean complete = false; @Override public void onMessage(MessageContext msgContext) { System.out.println(msgContext.getEnvelope().getBody()); OMElement element = msgContext.getEnvelope().getBody ().getFirstElement(); OMElement result = element.getFirstChildWithName(new QName ("http://axis2service.yue.cn","name")); System.out.println(result.getText()); synchronized (this) { this.notify(); } } @Override public void onFault(MessageContext msgContext) { System.out.println(msgContext.getEnvelope().getBody().getFault ().toString()); synchronized (this) { this.notify(); } } @Override public void onError(Exception e) { e.printstacktrace(); synchronized (this) { this.notify(); } } @Override public void onComplete() { this.complete = true; synchronized (this) { this.notify(); } } public boolean isComplete() { return complete; } } /**  * 非阻塞式  *   * @time 下午3:37:31  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class HelloWorldClient2 { private static EndpointReference endpointReference = new EndpointReference ("http://localhost:8089/services/HelloWorld"); public void sayHello() { OMFactory factory = OMAbstractFactory.getoMFactory(); OMNamespace namespace = factory.createOMNamespace ("http://axis2service.yue.cn",""); OMElement method = factory.createOMElement("sayHello",namespace); OMElement name = factory.createOMElement("name",namespace); name.setText("zhenhua"); method.addChild(name); method.build(); Options options = new Options(); options.setTo(endpointReference); ServiceClient sender = null; try { HelloWorldNonBlockCB blockCB = new HelloWorldNonBlockCB(); sender = new ServiceClient(); sender.setoptions(options); sender.sendReceiveNonBlocking(method,blockCB); synchronized (blockCB) { try { blockCB.wait(); } catch (InterruptedException e) { e.printstacktrace(); } } } catch (AxisFault e) { e.printstacktrace(); } finally { if (null != sender) { try { sender.cleanup(); } catch (AxisFault e) { e.printstacktrace(); } } } } public static void main(String[] args) { HelloWorldClient2 client2 = new HelloWorldClient2(); client2.sayHello(); } }      4 双工非阻塞   在客户端打开一个监听   设置客户端为双工全开   寻址   engageModule(Constants.MODULE_ADDRESSING); /**  * 非阻塞全双工  *   * @time 下午4:04:55  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class HelloWorldDualNonBlock { private static EndpointReference endpointReference = new EndpointReference ("http://localhost:8089/services/HelloWorld"); public void sayHello() { OMFactory factory = OMAbstractFactory.getoMFactory(); OMNamespace namespace = factory.createOMNamespace ("http://axis2service.yue.cn",namespace); name.setText("yuezhenhua"); method.addChild(name); method.build(); Options options = new Options(); options.setTo(endpointReference); //设置客户端为双工全开 options.setTransportInProtocol(Constants.TRANSPORT_HTTP); //在客户端打开一个监听 options.setUseSeparateListener(true); options.setAction("urn:sayHello"); ServiceClient sender = null; HelloWorldNonBlockCB blockCB = new HelloWorldNonBlockCB(); try { sender = new ServiceClient(); //寻址 sender.engageModule(Constants.MODULE_ADDRESSING); sender.setoptions(options); sender.sendReceiveNonBlocking(method,blockCB); synchronized (blockCB) { try { blockCB.wait(); } catch (InterruptedException e) { e.printstacktrace(); } } } catch (AxisFault e) { e.printstacktrace(); } finally { try { if (null != sender) { sender.cleanup(); } } catch (AxisFault e) { e.printstacktrace(); } } } public static void main(String[] args) { HelloWorldDualNonBlock client = new HelloWorldDualNonBlock(); client.sayHello(); } } axis2-1.6.2-bin\axis2-1.6.2\conf目录下的axis2.xml文件放到service端的WEB-INF目录下

axis2 webservice学习笔记三

axis2 webservice学习笔记三

soap协议 1 客户端与服务端使用soap进行通信 示例代码: service端: /**  * 使用soap协议进行通信  *   * @time 下午7:40:34  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class SoapService { public static OMElement requestSoap = null; public OMElement request(OMElement soapBody) { requestSoap = soapBody; Iterator it = requestSoap.getChildElements(); OMElement issuerElement = (OMElement) it.next(); OMElement serialElement = (OMElement) it.next(); OMElement revocationDateElement = (OMElement) it.next(); String issuer = issuerElement.getText(); String serial = serialElement.getText(); String revocationDate = revocationDateElement.getText(); System.out.println("issuer=" + issuer + "\n serial=" + serial +  "revocationDate=" + revocationDate); OMFactory factory = OMAbstractFactory.getoMFactory(); OMNamespace namespace = factory.createOMNamespace ("http://soapstyle.axis2service.yue.cn",""); OMElement soapResponse = factory.createOMElement("SoapResponse",  namespace); OMElement soaplssuer = factory.createOMElement("Issuer",namespace); soaplssuer.setText("issuer:" + issuer); soapResponse.addChild(soaplssuer); OMElement soapSerial = factory.createOMElement("Serial",namespace); soapSerial.setText("serial:" + serial); soapResponse.addChild(soapSerial); OMElement soapRevokeDate = factory.createOMElement("RevocationDate",  namespace); soapRevokeDate.setText("RevocationDate" + revocationDate); soapResponse.addChild(soapRevokeDate); soapResponse.build(); return soapResponse; } } <service name="SoapService" >     <description>         revoking certificate.     </description>          <parameter name="ServiceClass"  locked="false">cn.yue.axis2service.soapstyle.soapService</parameter>     <operation name="request">     <messageReceiver             />     <actionMapping>urn:request</actionMapping>     </operation> </service> 客户端 /**  * soap协议通信客户端  *   * 非阻塞(异步)全双工  *   * @time 下午4:04:55  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class SoapServiceDualNonBlock { private static EndpointReference endpointReference = new EndpointReference ("http://localhost:8089/services/SoapService"); private static boolean finish = false; public void request() { OMFactory factory = OMAbstractFactory.getoMFactory(); OMNamespace namespace = factory.createOMNamespace ("http://soapstyle.axis2service.yue.cn",""); OMElement issuer = factory.createOMElement("Issuer",namespace); OMElement serial = factory.createOMElement("Serial",namespace); OMElement revocationDate = factory.createOMElement("RevocationDate",  namespace); issuer.setText("yuezhenhua"); serial.setText("1234567"); revocationDate.setText("2012-11-21"); OMElement requestSoapMessage = factory.createOMElement("request",  namespace); requestSoapMessage.addChild(issuer); requestSoapMessage.addChild(serial); requestSoapMessage.addChild(revocationDate); requestSoapMessage.build(); Options options = new Options(); options.setTo(endpointReference); ServiceClient sender = null; try { AxisCallback callback = new AxisCallback() { @Override public void onMessage(MessageContext msgContext) { OMElement result = msgContext.getEnvelope ().getBody().getFirstElement(); System.out.println("result:" + result); finish = true; } @Override public void onFault(MessageContext msgContext) { System.out.println("onFault=" +  msgContext.getEnvelope().getBody().getFault().toString()); } @Override public void onError(Exception e) { e.printstacktrace(); } @Override public void onComplete() { System.out.println("onComplete"); } }; sender = new ServiceClient(); sender.setoptions(options); System.out.println("=======invoke the service==="); sender.sendReceiveNonBlocking(requestSoapMessage,callback); synchronized (callback) { if (!finish) { try { callback.wait(1000); } catch (InterruptedException e1) { e1.printstacktrace(); } } if (!finish) { throw new AxisFault("Server was shutdown as  the async response take too long to complete"); } } } catch (AxisFault e1) { e1.printstacktrace(); } finally { if (null != sender) { try { sender.cleanup(); } catch (AxisFault e) { e.printstacktrace(); } } } } public static void main(String[] args) { SoapServiceDualNonBlock client = new SoapServiceDualNonBlock(); client.request(); } } 2 服务端将exception以soapFault的形式抛给客户端 /**  * 将exception以soapfault形式抛给客户端  *   * @time 下午9:00:52  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class SoapFaultService { private int i = 0; public OMElement getPrice(OMElement request) throws AxisFault { if (null == request) { SOAPFault fault = getSoapFault(); return fault; } OMFactory factory = OMAbstractFactory.getoMFactory(); OMNamespace namespace = factory.createOMNamespace ("http://soapstyle.axis2service.yue.cn",""); OMElement response = factory.createOMElement("Price",namespace); response.setText(String.valueOf(i++)); return response; } private SOAPFault getSoapFault() { MessageContext context = MessageContext.getCurrentMessageContext(); SOAPFactory factory = null; if (context.isSOAP11()) { factory = OMAbstractFactory.getSOAP11Factory(); } else { factory = OMAbstractFactory.getSOAP12Factory(); } SOAPFault fault = factory.createSOAPFault(); SOAPFaultCode faultCode = factory.createSOAPFaultCode(fault); faultCode.setText("13"); factory.createSOAPFaultValue(faultCode); SOAPFaultReason faultReason = factory.createSOAPFaultReason(fault); faultReason.setText("request can not be null!"); factory.createSOAPFaultText(faultReason); factory.createSOAPFaultDetail(fault); return fault; } } <service name="SoapFaultService" >     <description>         revoking certificate.     </description>          <parameter name="ServiceClass"  locked="false">cn.yue.axis2service.soapstyle.soapFaultService</parameter>     <operation name="getPrice">     <messageReceiver             />     <actionMapping>urn:getPrice</actionMapping>     </operation> </service> 客户端 /**  * 客户端接收从服务器端传来的以soapfault形式的exception  *   * 非阻塞(异步)全双工  *   * @time 下午4:04:55  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class SoapFaultServiceDualNonBlock { private static EndpointReference endpointReference = new EndpointReference ("http://localhost:8089/services/SoapFaultService"); private static boolean finish = false; ServiceClient sender = null; public void getPrice() { try { OMFactory factory = OMAbstractFactory.getoMFactory(); OMNamespace namespace = factory.createOMNamespace ("http://soapstyle.axis2service.yue.cn",""); // OMElement request = factory.createOMElement("Price",  namespace); Options options = new Options(); options.setTo(endpointReference); options.setAction("urn:getPrice"); options.setTransportInProtocol(Constants.TRANSPORT_HTTP); options.setUseSeparateListener(true); AxisCallback callback = new AxisCallback() { @Override public void onMessage(MessageContext msgContext) { OMElement result = msgContext.getEnvelope ().getBody().getFirstElement(); System.out.println("price:" + result); finish = true; } // 用于接收服务端抛过来的exception @Override public void onFault(MessageContext msgContext) { QName errorCode = new QName("faultcode"); QName reason = new QName("faultString"); OMElement faultElement =  msgContext.getEnvelope().getBody().getFault(); System.out.println("ErrorCode[" +  faultElement.getFirstChildWithName(errorCode).getText() + "] caused by:" +  faultElement.getFirstChildWithName(reason).getText()); } @Override public void onError(Exception e) { e.printstacktrace(); } @Override public void onComplete() { System.out.println("onComplete"); } }; sender = new ServiceClient(); sender.setoptions(options); sender.engageModule("addressing"); try { sender.sendReceiveNonBlocking(null,callback); } catch (Exception e2) { e2.printstacktrace(); System.out.println(e2.getMessage()); } synchronized (callback) { if (!finish) { try { callback.wait(1000); } catch (InterruptedException e1) { e1.printstacktrace(); } } } } catch (AxisFault e) { e.printstacktrace(); } finally { try { sender.cleanup(); } catch (AxisFault e) { e.printstacktrace(); } } } public static void main(String[] args) { SoapFaultServiceDualNonBlock client = new  SoapFaultServiceDualNonBlock(); client.getPrice(); } } 3 使用swa(soap with attachment)来进行附件的传送 axis2有两种附件传输形式  mtom  swa  soap with attachment  客户端把要上传的文件,转成二进制码由soap的request一起发送到服务器端(attchmentID) /**  * 接收客户端上传文件  *   * @time 下午7:47:34  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class FileUploadService { public String uploadFile(String name,String attchmentID) { FileOutputStream fileOutputStream = null; StringBuffer uploadFilePath = new StringBuffer(); String fileNamePrefix = ""; String fileName = ""; try { MessageContext context =  MessageContext.getCurrentMessageContext(); Attachments attachments = context.getAttachmentMap(); DataHandler dataHandler = attachments.getDataHandler (attchmentID); fileNamePrefix = name.substring(name.indexOf("."),  name.length()); fileName = "11"; System.out.println("fileName:" + fileName); System.out.println("fileNamePrefix:" + fileNamePrefix); uploadFilePath.append("d:/"); uploadFilePath.append(fileName); uploadFilePath.append(fileNamePrefix); System.out.println("uploadFilePath:" + uploadFilePath); File file = new File(uploadFilePath.toString()); fileOutputStream = new FileOutputStream(file); dataHandler.writeto(fileOutputStream); fileOutputStream.flush(); } catch (IOException e) { e.printstacktrace(); } finally { try { if (null != fileOutputStream) { fileOutputStream.close(); } fileOutputStream = null; } catch (IOException e) { e.printstacktrace(); } } return "success"; } } <service name="FileUploadService" >     <parameter name="ServiceClass"  locked="false">cn.yue.axis2service.fileupload.FileUploadService</parameter>     <operation name="uploadFile">    <messageReceiver             https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver"/>    <actionMapping>urn:uploadFile</actionMapping>     </operation> </service> 客户端 /**  * 上传文件  *   * @time 下午8:07:05  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class FileUploadClient { private static EndpointReference reference = new EndpointReference ("http://localhost:8089/services/FileUploadService"); public void uploadFile() { try { String filePath = "d:/AppCan/xizan.jpg"; String destFile = "xizan.jpg"; Options options = new Options(); options.setTo(reference); options.setProperty(Constants.Configuration.ENABLE_SWA,  Constants.VALUE_TRUE); options.setSoapVersionURI (SOAP11Constants.soAP_ENVELOPE_NAMESPACE_URI); options.setTimeOutInMilliSeconds(10000); options.setAction("urn:uploadFile"); ConfigurationContext context =  ConfigurationContextFactory.createConfigurationContextFromFileSystem ("D:/workspace4/axis2webservice/WebContent/WEB-INF/modules",null); ServiceClient sender = new ServiceClient(context,null); OperationClient mepClient = sender.createClient (ServiceClient.ANON_OUT_IN_OP); MessageContext messageContext = new MessageContext(); FileDataSource fileDataSource = new FileDataSource(new File (filePath)); DataHandler handler = new DataHandler(fileDataSource); String attachmentID = messageContext.addAttachment(handler); SOAPFactory factory = OMAbstractFactory.getSOAP11Factory(); SOAPEnvelope envelope = factory.getDefaultEnvelope(); OMNamespace namespace = factory.createOMNamespace ("http://fileupload.axis2service.yue.cn",""); OMElement uploadFile = factory.createOMElement("uploadFile",  namespace); OMElement nameEle = factory.createOMElement("name",  namespace); nameEle.setText(destFile); OMElement idEle = factory.createOMElement("attchmentID",  namespace); idEle.setText(attachmentID); uploadFile.addChild(nameEle); uploadFile.addChild(idEle); envelope.getBody().addChild(uploadFile); System.out.println("message==" + envelope); messageContext.setEnvelope(envelope); mepClient.addMessageContext(messageContext); mepClient.execute(true); MessageContext response = mepClient.getMessageContext (WSDLConstants.MESSAGE_LABEL_IN_VALUE); SOAPBody body = response.getEnvelope().getBody(); OMElement element = body.getFirstChildWithName(new QName ("http://fileupload.axis2service.yue.cn","return")); System.out.println(element.getText()); } catch (AxisFault e) { e.printstacktrace(); } } public static void main(String[] args) { FileUploadClient client = new FileUploadClient(); client.uploadFile(); } }

axis2 webservice学习笔记二

axis2 webservice学习笔记二

使用简单java类型构建webservice 示例代码如下: service端 /**  * 使用简单的java类型构建webservice  *   * @time 下午6:45:28  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class HelloJava { public String sayHello(String name) throws XMLStreamException { StringBuffer sb = new StringBuffer(); sb.append("hello "); sb.append(name); return sb.toString(); } } <service name="HelloJava" >     <parameter name="ServiceClass"  locked="false">cn.yue.axis2service.jstyle.HelloJava</parameter>     <messageReceivers>     <messageReceiver              mep="http://www.w3.org/2004/08/wsdl/in-out"            https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver"/>     </messageReceivers>       <actionMapping>urn:sayHello</actionMapping> </service> 客户端 /**  * 阻塞回调  *   * @time 下午3:27:21  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class HelloJavaNonBlockCB implements AxisCallback { private boolean complete = false; @Override public void onMessage(MessageContext msgContext) { System.out.println(msgContext.getEnvelope().getBody()); OMElement element = msgContext.getEnvelope().getBody ().getFirstElement(); //此处第二个参数用return OMElement result = element.getFirstChildWithName(new QName ("http://jstyle.axis2service.yue.cn","return")); System.out.println(result.getText()); synchronized (this) { this.notify(); } } @Override public void onFault(MessageContext msgContext) { System.out.println(msgContext.getEnvelope().getBody().getFault ().toString()); synchronized (this) { this.notify(); } } @Override public void onError(Exception e) { e.printstacktrace(); synchronized (this) { this.notify(); } } @Override public void onComplete() { this.complete = true; synchronized (this) { this.notify(); } } public boolean isComplete() { return complete; } } **  * service端用java的简单类型  *   * 非阻塞(异步)全双工  *   * @time 下午4:04:55  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class HelloJavaDualNonBlock { private static EndpointReference endpointReference = new EndpointReference ("http://localhost:8089/services/HelloJava"); public void sayHello() { OMFactory factory = OMAbstractFactory.getoMFactory(); OMNamespace namespace = factory.createOMNamespace ("http://jstyle.axis2service.yue.cn",""); OMElement method = factory.createOMElement("sayHello",namespace); OMElement name = factory.createOMElement("name",namespace); name.setText("yuezhenhua"); method.addChild(name); method.build(); Options options = new Options(); options.setTo(endpointReference); // 设置客户端为双工全开 options.setTransportInProtocol(Constants.TRANSPORT_HTTP); // 在客户端打开一个监听 options.setUseSeparateListener(true); options.setAction("urn:sayHello"); ServiceClient sender = null; HelloJavaNonBlockCB blockCB = new HelloJavaNonBlockCB(); try { sender = new ServiceClient(); // 寻址 sender.engageModule(Constants.MODULE_ADDRESSING); sender.setoptions(options); sender.sendReceiveNonBlocking(method,blockCB); synchronized (blockCB) { try { blockCB.wait(); } catch (InterruptedException e) { e.printstacktrace(); } } } catch (AxisFault e) { e.printstacktrace(); } finally { try { if (null != sender) { sender.cleanup(); } } catch (AxisFault e) { e.printstacktrace(); } } } public static void main(String[] args) { HelloJavaDualNonBlock client = new HelloJavaDualNonBlock(); client.sayHello(); } } soap ui生成的客户端 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"  xmlns:jst="http://jstyle.axis2service.yue.cn">    <soapenv:Header/>    <soapenv:Body>       <jst:sayHello>          <!--Optional:-->          <jst:name>yuezhenhua</jst:name>       </jst:sayHello>    </soapenv:Body> </soapenv:Envelope> java 代码实现 OMFactory factory = OMAbstractFactory.getoMFactory(); OMNamespace namespace = factory.createOMNamespace ("http://jstyle.axis2service.yue.cn",namespace); name.setText("yuezhenhua"); method.addChild(name); method.build(); 复杂类型的webservcie service端 示例代码如下: /**  *   * @time 下午7:50:05  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class Person implements Serializable,Cloneable { private static final long serialVersionUID = 1L; private String name = ""; private String age = ""; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } protected Object clone() { Object object = null; try { object = super.clone(); } catch (CloneNotSupportedException e) { e.printstacktrace(); object = null; } return object; } } /**  * java复杂类型  *   *   *   * @time 下午7:53:21  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class PersonService { public OMElement getPersons(OMElement person) { Person person2 = new Person(); List<Person> persons = new ArrayList<Person>(); person2.setAge("28"); person2.setName("yuezhenhua"); persons.add((Person) person2.clone()); person2.setAge("22"); person2.setName("zhansan"); persons.add((Person) person2.clone()); OMElement element = BeanUtil.getoMElement(new QName("root"),  persons.toArray(),new QName("person"),false,null); return element; } } <service name="PersonService" >     <parameter name="ServiceClass"  >cn.yue.axis2service.javacomplextype.PersonService</parameter>     <operation name="getPersons">          <actionMapping>urn:getPersons</actionMapping>         <messageReceiver />     </operation> </service> 客户端 /**  *   * @time 下午7:50:05  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class Person implements Serializable,Cloneable { private static final long serialVersionUID = 1L; private String name = ""; private String age = ""; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } protected Object clone() { Object object = null; try { object = super.clone(); } catch (CloneNotSupportedException e) { e.printstacktrace(); object = null; } return object; } } /**  * 阻塞回调  *   * @time 下午3:27:21  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class GetPersonNonBlockCB implements AxisCallback { @Override public void onMessage(MessageContext msgContext) { OMElement result = msgContext.getEnvelope().getBody ().getFirstElement(); System.out.println("result=" + result); if (null == result) { return; } @SuppressWarnings("rawtypes") Iterator iterator = result.getChildElements(); while (iterator.hasNext()) { OMNode omNode = (OMNode) iterator.next(); if (omNode.getType() == OMNode.ELEMENT_NODE) { OMElement element = (OMElement) omNode; if (element.getLocalName().toLowerCase().equals ("person")) { try { Person person = (Person)  BeanUtil.processObject(element,Person.class,null,true,new DefaultObjectsupplier (),null); System.out.println("person name=" +  person.getName() + " \n person age=" + person.getAge()); } catch (AxisFault e) { e.printstacktrace(); } } } } synchronized (this) { this.notify(); } } @Override public void onFault(MessageContext msgContext) { System.out.println(msgContext.getEnvelope().getBody().getFault ().toString()); synchronized (this) { this.notify(); } } @Override public void onError(Exception e) { e.printstacktrace(); synchronized (this) { this.notify(); } } @Override public void onComplete() { synchronized (this) { this.notify(); } } } /**  * service端用java的简单类型  *   * 非阻塞(异步)全双工  *   * @time 下午4:04:55  * @author retacn yue  * @Email zhenhuayue@sina.com  */ public class GetPersonDualNonBlock { private static EndpointReference endpointReference = new EndpointReference ("http://localhost:8089/services/PersonService"); public void getPersons() { Options options = new Options(); options.setTo(endpointReference); options.setAction("urn:getPersons"); // 设置客户端为双工全开 options.setTransportInProtocol(Constants.TRANSPORT_HTTP); // 在客户端打开一个监听 options.setUseSeparateListener(true); ServiceClient sender = null; GetPersonNonBlockCB blockCB = new GetPersonNonBlockCB(); try { sender = new ServiceClient(); sender.setoptions(options); // 寻址 sender.engageModule(Constants.MODULE_ADDRESSING); OMFactory factory = OMAbstractFactory.getoMFactory(); OMNamespace namespace = factory.createOMNamespace ("http://javacomplextype.axis2service.yue.cn",""); OMElement method = factory.createOMElement("getPersons",  namespace); OMElement person = factory.createOMElement("person",  namespace); person.setText(""); method.addChild(person); sender.sendReceiveNonBlocking(method,blockCB); synchronized (blockCB) { try { blockCB.wait(); } catch (InterruptedException e) { e.printstacktrace(); } } } catch (AxisFault e) { e.printstacktrace(); } finally { try { if (null != sender) { sender.cleanup(); } } catch (AxisFault e) { e.printstacktrace(); } } } public static void main(String[] args) { GetPersonDualNonBlock client = new GetPersonDualNonBlock(); client.getPersons(); } }

今天关于WebService学习笔记webservice入门教程的介绍到此结束,谢谢您的阅读,有关axis2 webservice学习笔记、axis2 webservice学习笔记一、axis2 webservice学习笔记三、axis2 webservice学习笔记二等更多相关知识的信息可以在本站进行查询。

本文将带您了解关于WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息的新内容,同时我们还将为您解释获取webservice数据的相关知识,另外,我们还将为您提供关于axis 下的WebService 获取客户端IP代码、Axis1.4框架 实现webservice服务器和客户端、CXF 部署WebService 在服务端回去客户端IP的方法、eclipse 中搭建 webservice 的客户端和服务端的实用信息。

本文目录一览:

WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息(获取webservice数据)

WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息(获取webservice数据)

WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息,所在城市- - 
 
 
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Management;
using System.Net;
using System.Runtime.InteropServices;
using System.IO;
namespace CHardwardInfo
{
    /// <summary>
    /// Service1 的摘要说明。
    /// GetHostName() 获取机器名
    /// GetHostIP() 获取服务器IP
    /// GetHostMac() 获取服务器MAC地址
    /// GetCustomerIP() 获取客户端动态IP地址
    /// GetCustomerMacInfo() 获取内部网客户端MAC地址
    /// GetCustomerbroswer()客户端浏览器信息
    /// GetcpuId() .获取CPU编号
    /// GetMainHarddiskId 获取主硬盘编号
    ///要引用一个公用  //Webservice:http://www.youthbar.com/IpSearch/GetAddressByIP.asmx
    /// </summary>

    public class Service1 : System.Web.Services.WebService
    {
        [DllImport("Iphlpapi.dll")]
        private static  extern int SendARP(Int32 dest,Int32 host,ref Int64 mac,ref Int32 length);
        [DllImport("Ws2_32.dll")]
        private static extern Int32 .Net_addr(string ip);
        public Service1()
        {
            //CODEGEN: 该调用是 ASP.Net Web 服务设计器所必需的
            InitializeComponent();
        }

        #region 组件设计器生成的代码
       
        //Web 服务设计器所必需的
        private IContainer components = null;
               
        /// <summary>
        /// 设计器支持所需的方法 - 不要使用代码编辑器修改
        /// 此方法的内容。
        /// </summary>
        private void InitializeComponent()
        {
        }

        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        protected override void dispose( bool disposing )
        {
            if(disposing && components != null)
            {
                components.dispose();
            }
            base.dispose(disposing);       
        }
       
        #endregion

        // WEB 服务示例
        // HelloWorld() 示例服务返回字符串 Hello World
        // 若要生成,请取消注释下列行,然后保存并生成项目
        // 若要测试此 Web 服务,请按 F5 键

        [WebMethod]
        public string GetHostName()
        {
            return System.Net.Dns.GetHostName();
        }
        [WebMethod]
        public string GetcpuId()
        {
            System.Management.ManagementClass mc=new ManagementClass("Win32_Processor");
            System.Management.ManagementObjectCollection moc=mc.GetInstances();
            string strcpuID=null;
            foreach(System.Management.ManagementObject mo in moc)
            {
                strcpuID=mo.Properties["ProcessorID"].Value.ToString();
                break;
            }
            return strcpuID;

        }
        [WebMethod]
        public string GetMainHarddiskId()

        {

            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
            String strHarddiskID = null ;
            foreach(ManagementObject mo in searcher.Get())
            {  
                strHarddiskID = mo["SerialNumber"].ToString().Trim();
                break;        
            }
            return strHarddiskID ;

        }
        [WebMethod]
        public string GetHostIP()
        {
            string s="";
            System.Net.IPAddress[] addressList = Dns.GetHostByName(Dns.GetHostName()).AddressList; 
            for (int i = 0; i < addressList.Length; i ++)
            {
                s += addressList[i].ToString();
            }
            return  s;
        }
        [WebMethod]
        public string GetHostMAC()
        {
            string mac="";
            System.Management.ManagementClass mc=new ManagementClass("Win32.NetworkAdapterConfiguration");
            ManagementObjectCollection moc=mc.GetInstances();
            foreach(ManagementObject mo in moc)
            {
                if(mo["IPEnabled"].ToString()=="True")
                    mac=mo["MacAddress"].ToString();                   
            }
            return mac;
        }
        [WebMethod]
        public string GetCustomerIP()
        {
            string CustomerIP="";
            if(HttpContext.Current.Request.ServerVariables["HTTP_VIA"]!=null)
            {
                CustomerIP=HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();

            }
            else
            {
                CustomerIP=HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"].ToString();


            }
            return CustomerIP;
       
                
        }
        [WebMethod]
        public string GetCustomerbroswer()
        {
           
            return HttpContext.Current.Request.ServerVariables["HTTP_USER_AGENT"].ToString();
        }
        [WebMethod]
        public string GetCustomerMacInfo(string HostIP,string CustomerIP)
        {

            Int32 ldest= .Net_addr(CustomerIP);//目的地的ip
            Int32 lhost= .Net_addr(HostIP);//本地的ip
            Int64 macinfo=new Int64();
            Int32 len=6;
            //int len=macinfo.Length;
            SendARP(ldest,ref macinfo,ref len);
            string originalMACAddress = Convert.ToString(macinfo,16);

            if (originalMACAddress.Length<12)

            {

                originalMACAddress = originalMACAddress.PadLeft(12,''0'');

            }

            string macAddress;

            if(originalMACAddress!="0000" && originalMACAddress.Length==12)

            {

                string mac1,mac2,mac3,mac4,mac5,mac6;

                mac1=originalMACAddress.Substring(10,2);

                mac2=originalMACAddress.Substring(8,2);

                mac3=originalMACAddress.Substring(6,2);

                mac4=originalMACAddress.Substring(4,2);

                mac5=originalMACAddress.Substring(2,2);

                mac6=originalMACAddress.Substring(0,2);

                macAddress=mac1+"-"+mac2+"-"+mac3+"-"+mac4+"-"+mac5+"-"+mac6;

            }

            else

            {

                macAddress="";

            }
            return macAddress.toupper();
        }
        [WebMethod]
        public string GetAddressByIp(string userIP)
        {
            getAddress.GetAddressByIP address=new getAddress.GetAddressByIP();
            return address.GetAddress(userIP).ToString();
        }

    } }  

axis 下的WebService 获取客户端IP代码

axis 下的WebService 获取客户端IP代码

import javax.servlet.http.*;
import javax.xml.rpc.server.*;
import org.apache.axis.MessageContext;
import org.apache.axis.transport.http.HTTPConstants;
public class BaseService {   public String getClientIp(){     MessageContext  mc  =  MessageContext.getCurrentContext();     HttpServletRequest  request  =  (HttpServletRequest)  mc.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);     System.out.println("remote  ip:  "  +  request.getRemoteAddr());     return request.getRemoteAddr();   } }

Axis1.4框架 实现webservice服务器和客户端

Axis1.4框架 实现webservice服务器和客户端

一:软件环境

  1. win7旗舰版, Eclipse,JDK1.6,tomcat6.0,Axis1.4的包。 至于Axis1.4包网上可以下载,如果是在找不到可以留言给我。

二:摘要

将解压后的 axis-1_4\webapps\下的axis 目录考到 %TOMCAT_HOME%/Webapps/ 目录下
启动tomcat后在浏览器里输入 http://localhost:8080/axis 会看到下图所示

点击上图中的 链接,页面上会提示已经有的包和缺少的包的信息,根据提示将必须的包下载全,将这些类包复制到 %tomcathome%/webapps/axis/WEB-INF/lib/目录下重新启动tomcat,直到Validation页面中看不到有Error与Warning的提示信息。

Axis支持三种web service的客户端访问方式,分别为:

    • Dynamic Invocation Interface ( DII)
    • Dynamic Proxy方式
    • Stubs方式

PS:看到很多资料将上述方式列为Web Servcie的三种“部署和开发方法,个人觉得有些欠妥

下面介绍axis部署和发布web service的方式:

    • JWS  - 即时发布
    • WSDD  –定制发布

三:JWS --即时发布

 JWS(Java WebService)是最简单的一种方式。Axis允许把普通Java类的源文件的扩展名改为.jws,然后把它简单的copy到AXIS_HOME下。这样,Axis 会自动编译.jws文件,
 并把它自动加入到Java Web Servie的服务中。非常简单和灵活,但是这种方式的缺点是:只能是java源代码,同时类中不能含有包名。具体过程如下

1. 用Eclipse或者文本编辑器编写一个java类 SayHello.java(此类不含包名)

public class SayHello {
     public String sayMsg(String name){
         return "Hello: "+name;
     }
 }

  2. 将上面的类(SayHello.java)copy到 %tomcat_home%/webapps/axis/ 目录下,只需要把类的源文件(不是class)到这个目录下,重命名为:SayHello.jws

3. 打开浏览器输入: http://localhost:8080/axis/SayHello.jws 会看到:

点击上图  Click to see the WSDL 的链接,就可以看到生成的wsdl。

4. 使用 Dynamic Invocation Interface ( DII) 方式访问客户端 实现如下:

复制代码
package client;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;

public class TestClient {

    /**
     * @see axis框架实现简单的 webService客户端, 读webServicez服务器内容,如果有问题请留言
     * @param webUrl 设置调用的wsdl路径, 即访问的路径
     * @param method 设置调用的方法名
     * @param parameters 设置调用的方法的参数
     * @author 邓龙胜(微信simpledls)
     * @throws Exception
     */
    public static void readerWebserviceContent(String webUrl,String method,Object[] parameters) throws Exception {
        
        Service service = new Service();
        Call call = (Call) service.createCall();
        // 这里是要调用的方法名
        call.setOperationName(method);
        // 设置调用的wsdl路径, 即访问的路径
        call.setTargetEndpointAddress(webUrl);
        // parameters 是为方法传递参数, 必须和调用的方法体的参数类型和数量一致
        String val = (String) call.invoke(parameters);
        System.out.println("这是webservice服务器返回的信息:\n" + val);
    }
    
    
    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        String webUrl = "http://192.168.1.121:8080/axis/SayHello.jws";
        String method = "sayMsg";
        Object[] parameters= new Object[] { "axis web service" };
        TestClient.readerWebserviceContent(webUrl, method, parameters);
    }
}
复制代码

 

四:WSDD(Web Service Deployment Descriptor)文件发布Web Service

  1. 为了使大家懂的如何映射实体类,故下文我将用 实体类(javaBean) 作为参数的方式引导大家,那么先在项目中新建一个JavaBean:UserBean.java 代码如下:
复制代码
package wsaxis.bean;

public class UserBean {
    
    private String userName; //姓名
    private Integer age;     //年龄
 
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    } 
}
复制代码

2. 创建一个 MessageService.java 类, 代码如下:

复制代码
package wsaxis;

import wsaxis.bean.UserBean;

public class MessageService {
     /**
     * UserBean 作为参数*/
    public String getBeanStr(UserBean bean) {
        return "You Name:" + bean.getUserName() + " , You Age:" + bean.getAge();
    }
}
复制代码

3. 创建一个 deploy.wsdd 文件, 该文件主要用于生成发布文件 server-config.wsdd ,  在项目中依次点击: new --> other -->file  内容如下:

复制代码
<deployment name="test" xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
  <service name="MessageService" provider="java:RPC"use="encoded">
    <parameter name="className" value="wsaxis.MessageService"/>
    <parameter name="allowedMethods" value="*"/>
         <typeMapping xmlns:ns1="http://wsaxis.michael.com" qname="ns1:userBean"
             type="java:wsaxis.bean.UserBean"
             serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
             deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
        encoding/>
  </service>
</deployment>
复制代码

上面要注意: value="wsaxis.MessageService" , 这个 MessageService 就是你创建的那个 MessageService.java,路径一定不要搞错 !

       type="java:wsaxis.bean.UserBean", 这个 UserBean 就是你创建的那个 UserBean.java , 路径一定不要搞错 !

4. 创建一个 undeploy.wsdd 文件, 该文件主要用于取消发布 web service , 创建方法同上。 其内容如下

<undeployment
    xmlns="http://xml.apache.org/axis/wsdd/">
  <!-- Services from MessageService WSDL service -->
  <service name="MessageService"/>
</undeployment>

5. 将上面写好的两个类已编译好的class文件复制到 %tomcat_home%/axis/WEB-INF/class/ 目录下,(注意:要完整的目录结构复制过来),然后在把两个wsdd文件复制到%tomcat_home%/axis/WEB-INF/ 目录下,打开cmd进入 %tomcat_home%/axis/WEB-INF/ 目录下:

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8080 deploy.wsdd 

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8080 -s /axis/servlet/AxisServlet deploy.wsdd

java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient –lhttp://localhost:8080/axis/services/MessageService deploy.wsdd

分别用CMD 输入如上命令,如果成功系统会提示如下:

Processing file deploy.wsdd
<Admin>Done processing</Admin>

(有可能第三条不成功,但是没关系,主要看下 %tomcat_home%/axis/WEB-INF/  目录下是否已经生成 server-config.wsdd 文件) , 如果有此文件 则在浏览器输入

http://localhost:8080/axis/services/MessageService   会看到下图

 

6. 生成client

打开cmd进入 %tomcat_home%/axis/WEB-INF/ 目录下:

java -Djava.ext.dirs=lib org.apache.axis.wsdl.WSDL2Java -p client http://localhost:8080/axis/services/MessageService?wsdl

输入以上命令,会在当前的目录下生成 client 文件夹,这个目录里文件就是 客户端源码。

7.使用 Stubs 方式访问客户端 实现如下:

复制代码
package wsaxis;

import java.net.URL;
import javax.xml.namespace.QName;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.ser.BeanDeserializerFactory;
import org.apache.axis.encoding.ser.BeanSerializerFactory;
import wsaxis.bean.UserBean;

public class TestStubClient {
    
     /**
      *@see    axis框架实现简单的 Stubs方式 webService客户端, 读取基于WSDD方式生成的webServicez服务器内容
     * @param namespaceURI 命名空间URL
     * @param localPart 本地部分名
     * @param method 要调用的方法名
     * @param wsdlUrl 服务的绝对路径
     * @param userBean 用户实体
     * @author 邓龙胜(微信simpledls)
     * @date 2015.12.11
     * @throws Exception
     */
    public static void readerWebserviceContent(String namespaceURI,String localPart,String method,
            String wsdlUrl,UserBean userBean) throws Exception {
        
        QName qname = new QName(namespaceURI,localPart);
        Service s = new Service();
        Call call = (Call) s.createCall();
        // 注册这个bean为可序列化的.传递参数x
        call.registerTypeMapping(UserBean.class, qname,new BeanSerializerFactory(UserBean.class, qname),
                new BeanDeserializerFactory(UserBean.class, qname));
        // 设置一下调用方法名.
        call.setOperationName(method);
        // 设置一下这个服务的绝对路径.
        call.setTargetEndpointAddress(new URL(wsdlUrl));
        // 通知方法,并返回结果
        String str = (String) call.invoke(new Object[] {userBean});
        System.out.println("web service 返回信息:\n" + str);
    }
    
    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        String namespaceURI = "http://wsaxis.michael.com";
        String localPart = "denglongsheng";
        String method = "getBeanStr";
        String wsdlUrl = "http://localhost:8080/axis/services/MessageService?wsdl";
        //实例化一个UserBean,这个UserBean是生成client的UserBean
        UserBean userBean = new UserBean();
        userBean.setAge(33);
        userBean.setUserName("DLSssadf");
        //调用读取的方法
        TestStubClient.readerWebserviceContent(namespaceURI, localPart, method, wsdlUrl, userBean);
    }

}
复制代码

 

五.通过WSDD文件卸载发布的 webservice:

1.打开cmd进入%tomcat_home%/axis/WEB-INF/目录下:
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient undeploy.wsdd

2.如果不是默认8080端口需要加上参数: -p 8082:
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -p 8082 undeploy.wsdd

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

六. 完。

CXF 部署WebService 在服务端回去客户端IP的方法

CXF 部署WebService 在服务端回去客户端IP的方法

最近在做 一个 WebService的服务端,遇到了问题就像把每个客户端请求的记录都给记下来,找了好久 这个可以了;小弟文字表达能力不太好,所以就只把关键代码贴上来

import javax.annotation.Resource;

import javax.xml.ws.WebServiceContext;

import org.apache.cxf.transport.http.AbstractHTTPDestination;
import javax.servlet.http.HttpServletRequest;

public class Send{

      @Resource

      private WebServiceContext context;

public String getIp() {
   MessageContext ctx = context.getMessageContext();
   HttpServletRequest request = (HttpServletRequest)
   ctx.get(AbstractHTTPDestination.HTTP_Request);
   String ip=request.getRemoteAddr();
   return ip; 

}

}

eclipse 中搭建 webservice 的客户端和服务端

eclipse 中搭建 webservice 的客户端和服务端

由于在工作中需求要用到 webservice 技术,进行数据交换。研究了一下 webservice,网上资料很多,看的一头雾水,找到几篇能做出来的博客,而且还比较简单,加上个人在使用过程中遇到的一些问题和想法在此分享一下。
环境:win10 64 位,eclipse,jdk1.7,tomcat v7.0
参考博客:
①http://blog.csdn.net/qq_18860653/article/details/53758555
②http://blog.csdn.net/hanxuemin12345/article/details/40163757
③http://blog.csdn.net/greatfeather/article/details/46010277
说明:博客①中的方法能实现,但是我感觉有点复杂。
博客②中的方法使用注解方式发布,较简单。
博客③中的方法和 spring 结合在一起,我用的是②和③结合的。

一。在 Java 项目中发布一个 WebService 服务:

建立一个 JavaWebService 的 web 项目,建立相对应的 com.test.javabean,com.test.servlet,com.test.webservice 包

1.* 类 Student,这个是实体

package com.test.javabean;

import java.io.Serializable;

public class Student implements Serializable{

private String ID;
private String Name;
private String Sex;
private int age;
public String getID() {
return ID;
}
public void setID(String iD) {
ID = iD;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getSex() {
return Sex;
}
public void setSex(String sex) {
Sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [ID=" + ID + ", Name=" + Name + ", Sex=" + Sex + ", age=" + age + "]";
}

}

2.* 类 CStudentServlet,这个类是将发布服务的代码放到 servlet 里面了,然后写入配置文件,可以自己启动,自己发布。

package com.test.servlet;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Properties;

import javax.jws.WebService;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.Endpoint;

import com.test.webservice.CStudent;

public class CStudentServlet extends HttpServlet{
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
System.out.println ("正在启动 WebService 服务:http://192.168.56.1:8082/JavaWebService/Student");
Endpoint.publish ("http://localhost:8083/JavaWebService/Student", new CStudent ());// 这个端口号 8083 按自己 tomcat 的实际端口来设置,默认的是 8080
}

/**
* @see Servlet#getServletConfig()
*/
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}

public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println ("进入 WSServlet 的 service () 方法");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}

}

3.** 类 CStudent,这个类里面的方法是服务真正发布出去的。
package com.test.webservice;

import javax.jws.WebService;

import com.test.javabean.Student;

@WebService
public class CStudent {
public Student getStudent(String name) throws java.rmi.RemoteException{
Student student = new Student();
student.setName(name);
student.setAge(14);
student.setID("25");
student.setSex("Male");
return student;

}
}

注:关键在 @webservice 的注解。类上面加 @webservice 注解,就代表这个类里面的方法都对外发布,详细解释参考百度。

4. 下一步需要将 servlet 配置为自启动,您只要在 web.xml 中增加如下内容就可以了:

 

<servlet>
<servlet-name>CStudentServlet</servlet-name>
<servlet-class>com.test.servlet.CStudentServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CStudentServlet</servlet-name>
<url-pattern>/servlet/CStudentServlet</url-pattern>
</servlet-mapping>

 

这样写完,启动服务器,就可以自动运行 servlet, 发布服务了。

5. 在 tomcat 中发布 JavaWebService. 不知道如何发布的看上面③中的链接

 


6.tomcat 启动成功以后,打开浏览器,输入 http://localhost:8083/JavaWebService/Student?wsdl
// 这个端口号 8083 按自己 tomcat 的实际端口来设置,默认的是 8080
(就是服务器端的按个链接加上?wsdl), 回车,如果看到下面图说明服务已经发布成功。

 

根据 WSDL 文档来在客户端编写代码,访问发布的服务;

但是,WSDL 文档看不懂怎么办?代码该如何编写?

—— 你看不懂,JDK 看得懂,wsimport 是 JDK 自带的,可以根据 WSDL 文档生成客户端调用代码的工具。无论服务器端 WebService 使用什么语言编写的,豆浆在客户端生成 Java 代码。所以服务器用什么语言编写的并不重要。

wsimport.exe 命令参数熟知:

 

二。配置客户端和编写客户端程序。
1. 服务端已经配置好,服务已经发布,接下来客户端要调用发布的服务。
解析地址生成源码到本地磁盘。打开命令行窗口:

 

这里我先定位到 D 盘,然后输入 wsimport -s . http://localhost:8083/JavaWebService/Student?wsdl
// 这个端口号 8083 按自己 tomcat 的实际端口来设置,默认的是 8080
回车,如果出现的和图上一样,说明解析成功,如果报错:有几点可能忽略
1)-s 左右都有空格
2)-s 后面有个 ".",点左右都有空格。
3)?注意中英文。这里用的是英文 "?","?"

解析成功以后打开 E 盘,

 

注意文件夹名字,这里文件夹名字是和服务器端的包名对应的,文件夹下面有些文件,class, 和 java 文件,我们需要的是 java 文件。

2. 新建一个 java 项目(客户端)

 

 

如图所示建个包:com.test.webservice, 将步骤 1 中文件夹里面的 java 文件复制进来。这些类都是写客户端程序依赖的。
在建立一个包,里面存放测试类 ClientDemo

 

 

*** 类 ClientDemo

package com.test.client;

import com.test.webservice.CStudent;
import com.test.webservice.CStudentService;
import com.test.webservice.Student;

public class ClientDemo {
public static void main(String[] args) {
CStudentService cstudentservice=new CStudentService();
CStudent cstudent=cstudentservice.getCStudentPort();

// 下面是具体方法调用。
Student student=cstudent.getStudent ("同学一号");// 调用了服务端 getStudent 方法将名字传了进去。
// 输出看一下结果。
System.out.println ("姓名:"+student.getName ()+"年龄:"+student.getAge ());
}
}

直接运行这个 main 方法,会输出结果。

 

其中第 9 行代码就是创建了个服务对象,相当于创建了个和服务端的链接

第 10 行是获取端口,这个都是固定写的。自己服务端发布服务的那个类,解析完成以后都会生成 “类名 + Service” 的类。例:CStudent 和 CstudentService.

到此就实现了 websrvice 在 eclipse 上部署客户端和服务端。

三。遇到的问题
1. 一般用这个都是要和现有项目结合。上面只是个例子,在实际用的时候,我的是把服务端部分加到了现有的 spring 项目中,servlet 那个可以很好地和现有项目结合,直接打开 tomcat 就可以自动发布服务。
2. 如果服务端不需要用到 web 项目可以直接把 servlet 中发布服务的那俩句话写到 main 方法中手动发布。
3. 在和现有项目结合时候服务器端写的方法要用到原先的接口的方法,如图,我要用到 PersonServiceInter 中的方法,如果使用了 @Resource, 会报错,空指针异常,原因是 webservice 没有和 spring 结合起来,不能使用 spring 中的注入。所有后来使用了,BeanFactory.getBean 的方式获取到 personServiceImpl。

下面的是正确的,是实际使用成功的:

注:这个问题网上很多人遇到的,但是我按照他们的方法都没解决成功,现在发出来做个参考。


---------------------
原文:https://blog.csdn.net/qq_37698433/article/details/70631988

今天关于WebService获取服务端硬件信息和客户端IP,MAC,浏览器信息获取webservice数据的讲解已经结束,谢谢您的阅读,如果想了解更多关于axis 下的WebService 获取客户端IP代码、Axis1.4框架 实现webservice服务器和客户端、CXF 部署WebService 在服务端回去客户端IP的方法、eclipse 中搭建 webservice 的客户端和服务端的相关知识,请在本站搜索。

对于WebService Axis感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍webservice axis2,并为您提供关于Axis2 webservice 之使用java调用webservice、Axis2 webservice入门--写个简单的webservice、axis2 发布 webservice 和 java调用webservice、Axis2发布webservice(4)—WebService的session管理的有用信息。

本文目录一览:

WebService Axis(webservice axis2)

WebService Axis(webservice axis2)

@H_301_0@

Axis2 webservice 之使用java调用webservice

Axis2 webservice 之使用java调用webservice

在上一篇中写了一个简单了webservice,实现了一个sayHello功能。那么webservice写好之后我们如何使用Java程序来调用webservice呢?

一、java调用的webservice的第一种方式:RPC调用AXIS2 webservice
    下面这个方法是我抽象出来的一个方法,

import javax.xml.namespace.QName;

 org.apache.axis2.AxisFault;
 org.apache.axis2.addressing.EndpointReference;
 org.apache.axis2.client.Options;
 org.apache.axis2.rpc.client.RPCServiceClient;

public class Client {

    /**
     * @param args
     * @throws Exception
     */
    static void main(String[] args) throws Exception {
        // 调用PublishWebService
        String wsdlUrl = "http://localhost:8080/DigitalProduct/services/PublishWebService?wsdl";//webservice地址
        String method = "updatePublishSysParam"; //调用的那个方法
        Object[] param = new Object[] { "AASSDDFF" };//传递的参数值
        String namespaceUrl1 = "http://service.digitalproduct.tkbs.com";//命名空间
        Class[] opReturnType1 = new Class[] { String[]. };//返回值类型
        String result = axis2RPCInvoke(wsdlUrl,method,param,namespaceUrl1,opReturnType1);
        System.out.println(result);
    }

     * RPC调用AXIS2 webservice
     * 
     *  wsdlUrl
     *            服务地址 如:http://192.168.0.1:2597/aixs2/services/jqservice?wsdl
     *  methodName
     *            方法名 如<xs:element name="Receive">
     *  parameter
     *            方法参数 如Object[] opArgs = new Object[] { param };
     *  namespaceURI
     *            命名空间 如 :targetNamespace="http://server.test.com.cn">
     *  returnType
     *            返回类型 如字符串:Class[] opReturnType = new Class[] { String[].class
     *            };
     static String axis2RPCInvoke(String wsdlUrl,String methodName,Object[] parameter,String namespaceURI,Class[] returnType) {
        Object[] ret = null;
        RPCServiceClient serviceClient = ;
        try {
            /*
             * 此处RPCServiceClient 对象实例建议定义成类中的static变量 ,否则多次调用会出现连接超时的错误。
             */
            serviceClient = new RPCServiceClient();
            Options options = serviceClient.getoptions();
            EndpointReference targetEPR =  EndpointReference(wsdlUrl);
            options.setTo(targetEPR);
            QName opQName =  QName(namespaceURI,methodName);
            ret = serviceClient.invokeBlocking(opQName,parameter,returnType);
             System.out.println(((String[]) ret[0])[0]);
        } catch (AxisFault e) {
            e.printstacktrace();
        }
        return ((String[]) ret[0])[0];
    }
}

二、使用java调用webservice的第二种方式:使用myeclipse中的axis2插件生成客户端代码

new -->others到如下界面:

    点next 到如下界面:

现在我们想生成调用webservice的客户端代码,首先我们需要生成一个service.wsdl文件,选择第2个,点next,

在界面里边点击add folder 选择项目--》webroot--》webinf-->classes,输入好webservice那个类的全名后点击Test Class Loading ,这时候如果你选择的路径是对的,类全名是对的,就可以点next,否则next按钮式灰色的。如图:

然后点击next,这个界面中的内容基本不用修改,有一个service name,你可以改成你自己取。

继续点next 在界面中选择wsdl文件的输出路径,选择第一个,就是输出到当前的workspace,的某个项目下,选择第二个,就是输出到系统文件夹中,例如你可以选择桌面。

这里我选择第二个,然后点browse选择桌面,点finish,会看到桌面上有一个service.wsdl文件。

 

下面我们就可以根据这个wsdl文件生成客户端代码了。

首先建一个java项目,例如取名myclient

new -->others-->

选择第1个,点next.

在界面中点 browse找到你刚才生成service.wsdl文件。

点next,这个界面不用管,继续点next

这个时候需要选择代码生成的地方,选择当前工作的workspace,然后选择刚才新建的myclient如图:

点finsh,刷新myclient项目会看到src下多了两个java文件:TestServiceCallbackHandler   和 TestServiceStub

接下来就可以写java代码调用了,如下:

 myservice.service.TestServiceStub;

 Test {

     Exception 
      Todo Auto-generated method stub
        初始化Sub类
        TestServiceStub stub =  TestServiceStub();
        传递AxisServiceStub.ShowName对象,相关参数在这边赋值。
        TestServiceStub.SayHello command =  TestServiceStub.SayHello();
        command.setName("zhangsan");
        取得返回值
        String name = stub.sayHello(command).get_return();
        System.out.println(name);
    }

}

 

如此,第二种方式就写完了。

公司几个同事都喜欢第二种。但是,我个人喜欢用第一种。第二种方式如果插件使用熟练的话,很快就可以生产客户端代码,然后测试代码也可以很快写出来。

注:可能会出现错误,根据我的经历的错误经验,有以下情况:

    1.tomcat端口问题,你打开刚才插架自动生成的TestServiceStub 类 ctrl+f查找 http://localhost,查到后看他后面的端口是多少,是不是8080,?好像生成的就是8080,但是我们的tomcat可能被自己修改过,端口可能不是8080,所以这里你要改这个端口。

    2.spring的注入问题,如果你写的webservice是在spring整合的环境下,可能会报错误,一般是由 spring注入失败,导致xxxService类注入失败。关于这个我下一篇会详细解释。

    3.一切都正常,打断点调试看到方法执行成功了、执行完毕了,但是并没有成功的返回我们要的结果,而是报超时了,这时候,我们需要在TestServiceStub 中加入一行代码

        这行代码的作用是 规定超时时间 是多长,例如你可以设为10分钟。_operationClient.getoptions().setTimeOutInMilliSeconds(600000L);  //600*1000毫秒(10分钟

      我感觉这样设置不合理,但是可以解决这个错误,让你的程序运行成功,看到运行成功返回的结果。才有继续学习的劲头啊。

   

 

 

 

Axis2 webservice入门--写个简单的webservice

Axis2 webservice入门--写个简单的webservice

上一篇介绍了webservice开发前的准备。下面开始写webservice。如果不了解axis2请看上一篇,如果是新手:建议一边看一边写代码,自己动手完成这个过程。

一、新建一个web项目

二、新建一个类,类名随便取,并写一个最简单的方法。如下

package com.webservice.myservice
public class TestService{
//
问好 public String sayHello(String name){ return "Hello,"+name; }
}

三、打包,这个时候需要用到上次安装好的插件。这里我就不上图了,

  new--》others--》Axis2 Service Archiver-->next-->

   在class filelocation中选择你项目webroot下的classes如(E:\Workspace\myservice\Webroot\WEB-INF\classes)

---》点击next,勾选 Skip WSDL--》next-->继续next--》勾选Generate the service xml au..lly-->点next

界面中service name 你可以随便写(如MyService),具体这个名字代表什么,继续下去,发布之后你就知道了,

界面中Class Name 写你刚才那个webservice类的全名,一我这个为例,这里我需要写com.webservice.myservice.TestService

---》点击load按钮,会加载我们service类,下面的框框下面会显示我们写的webservice方法,这里需要勾选Search declared methods only

-->next --》选择输出的路径,如桌面,输入一个Output File Name 这个名字就是将要输出的aar文件的名字。--》next,桌面上就会出现一个xxx.aar文件。

四,发布webservice到tomcat。

  1.将上一步骤中生存的xxx.aar文件复制到Tomcat6.0.20\webapps\axis2\WEB-INF\services下

 注:这个路径上一篇文章有提到,如果你的tomcat下没有这个路径,就把你下载的axis2.war文件放到Tomcat6.0.20\webapps下,然后重启tomcat,就可以看到这个文件夹了。

2.在一完成之后,启动tomcat,在浏览器中输入  http://localhost:8080/axis2/ 点击Services  可以看到如下:

  

解释:此处的MyService便是我们发布的webservice名称,下面的sayHello便是我们写的webservice方法。

这是,我们在浏览器输入:  http://localhost:8080/axis2/services/MyService/sayHello?name=zhangsan   如图所示

 表示我们调用名为MyService的webservice,中的sayHello方法,传递了一个name参数,参数值为zhangsan.返回到结果是Hello,zhangsan,这个结果便是我们需要的数据。

webservice写好了,我们在程序中如何调用呢?下一篇介绍如何使用java程序调用axis2 webservice。

 

axis2 发布 webservice 和 java调用webservice

axis2 发布 webservice 和 java调用webservice

1.下载与安装axis2:
apache-tomcat-6.0.35.zip
axis2-1.6.1-war.zip
解压,然后将axis2.war复制到tomcat的webapp目录中,安装完毕!
启动tomcat测试axis2是否安装成功:
http://localhost:8080/axis2

2.首先简单介绍一下webapp/axis2/的目录结构如下:
axis2
  |-- axis2-web
  |      |-- xxx.jsp...
  |-- meta-inf
  |-- WEB-INF
  |      |-- classes
  |      |-- conf
  |      |-- lib
  |      |-- modules
  |      |-- services
  |      |      |-- version-1.6.1.aar
  |      |-- web.xml
其中,services目录就是用来发布webservice的目录,这里有一个自带的service:version-1.6.1.aar

3.开发service端:HelloService .java
package com.service;
public class HelloService {
	public String getName(String name) {
		return "hello: " + name;
	}
}

4.配置文件:service.xml
<service name="HelloService">
	<description>HelloWorld webservice</description>
	<parameter name="ServiceClass">
		com.service.HelloService
	</parameter>
	<messageReceivers>
		<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out"https://www.jb51.cc/tag/cme/" target="_blank">cmessageReceiver"/>
		<messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only"/>
	</messageReceivers>
</service>

5.建立如下的目录结构:
test
 |--  meta-inf
 |      |--services.xml
 |
 |--  com
 |      |--  service
 |              |--  HelloService.java
 |              |--  HelloService.class
这里test可以随便命名,然后要把test目录里面的所有文件打包成zip格式的,后缀必须是*.aar。
打包方法1,使用7-Zip压缩工具打包,格式选择zip,压缩之后,把文件的后缀改为aar,test.aar。
打包方法2,其实“con/...”这个部分是class文件,可以放入/webapps/WEB-INF/class目录下。也就是说打包的时候可以之打包“meta-inf/...”部分。而“con/...”部分可能会经常更改,在Eclipse开发过程中可以放入src目录中。
打包完成之后,然后将文件test.aar复制到services目录下面。重启tomcat,进行测试:
http://localhost:8080/axis2/services/listServices

6.开发客户端:RPcclient.java
package com.client;

import javax.xml.namespace.QName;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;

public class RPcclient {
	public static void main(String[] args) throws Exception {
		RPCServiceClient client = new RPCServiceClient();
		Options options = client.getoptions();
		// 指定调用WebService的URL
		options.setTo(new EndpointReference("http://localhost:8080/axis2/services/HelloService"));

		// 指定getName方法的参数值
		Object[] objects = new Object[] { "超人" };
		// 指定getName方法返回值的数据类型的Class
		Class<?>[] classes = new Class[] { String.class };
		// 指定要调用的方法名:getName 和 WSDL文件中的命名空间:http://service.com
		// 注意:命名空间(http://service.com)与类HelloService的包名(com.service)有一定关系。
		QName qname = new QName("http://service.com","getName");

		String result = (String) client.invokeBlocking(qname,objects,classes)[0];
		System.out.println(result);
	}
}

7.运行客户端,端测试结果: 你好 超人

Axis2发布webservice(4)—WebService的session管理

Axis2发布webservice(4)—WebService的session管理

通过这个可以处理一些回话缓存数据


http://www.cnblogs.com/hewenwu/p/3862917.html

一、WebService中添加session管理代码,用到了MessageContext类和ServiceContext类。代码如下:

复制代码

package com.hoo.service;

import org.apache.axis2.context.MessageContext;
import org.apache.axis2.context.ServiceContext;

public class LoginService {
    
    //登陆方法
    boolean login(String userName,String password){
        
        实例化一个MessageContext对象
        MessageContext context = MessageContext.getCurrentMessageContext();
        
        获取ServiceContext对象,该对象是用来管理单个webservice中session对象的
        ServiceContext ctx = context.getServiceContext();
        
        if("admin".equals(userName)&&"123456".equals(password)){
            
            在session中添加属性和值
            ctx.setProperty("username",userName);
            ctx.setProperty("password",password);
            ctx.setProperty("msg","登陆成功");
            return true;
        }else{
            ctx.setProperty("msg","登陆失败");
            false;
        }
    }
    
    public String getLoginMessage(){
        MessageContext context = MessageContext.getCurrentMessageContext();
        ServiceContext ctx = context.getServiceContext();
        
        获取session中的属性值
        String msg = ctx.getProperty("username")+","+ctx.getProperty("msg");
        return msg;
    }

}

复制代码

这里保存Session信息是通过MessageContext上下文来获取ServiceContext的上下文,然后通过setProperty来保存session的信息,通过getProperty来获取session信息。

Session的作用是可以在WebService登录的时候,保存用户的登录状态或是会话消息。

WebService的作用域默认是request,它还有另外三个值,分别是:application、soapsession、transportsession;我们可以选择使用transportsession和application分别实现同一个WebService类和跨WebService类的会话管理。

二、发布webservice,修改services.xml文件

利用eclipse的axis2插件发布webservice之后,需要用解压文件打开AAR文件,找到WEB-INF文件夹下的services.xml文件,

在<service name="LoginService" scope="transportsession">添加对作用域的说明。

 

三、 编写WebService客户端的请求代码

import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; class LoginWebServiceClient { static void main(String[] args) throws AxisFault { String target = "http://localhost:8080/axis2/services/LoginService"; RPCServiceClient client = new RPCServiceClient(); Options options = client.getoptions(); 打开对session的支持 options.setManageSession(true); EndpointReference epr = new EndpointReference(target); options.setTo(epr); 函数名 QName qname = new QName("http://service.hoo.com","login"); 指定调用的方法和传递参数数据,及设置返回值的类型 Object[] result = client.invokeBlocking(qname,new Object[] { "admin","123456" },255); line-height:1.5!important">new Class[] { boolean.class }); System.out.println(result[0]); qname = ); result = client.invokeBlocking(qname,255); line-height:1.5!important">new Object[] { null },255); line-height:1.5!important">new Class[] { String.class }); System.out.println(result[0]); }}

总结

以上是小编为你收集整理的Axis2发布webservice(4)—WebService的session管理全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

关于WebService Axiswebservice axis2的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Axis2 webservice 之使用java调用webservice、Axis2 webservice入门--写个简单的webservice、axis2 发布 webservice 和 java调用webservice、Axis2发布webservice(4)—WebService的session管理的相关信息,请在本站寻找。

本文标签: