• java axis发布web service(二) 发布web service


    二. 开发部署新的Web Service

         如何开发一个新Web Service并把它部署到服务器上供其他项目调用呢?有两种方式。

          1. 最简单的一种方式是Java Web Service,即JWS。(方式简单,但不推荐)

          Axis允许把普通Java类的源文件的扩展名改为.jws,然后把它简单的copy到AXIS_HOME下。这样,Axis会自动编译.jws文件,并把它加入到Java Web Servie。其实,在AXIS_HOME,下,已经部署了几个示例jws,如,http://localhost:8080/axis/EchoHeaders.jws?method=list 。用文本编辑器打开AXIS_HOME\EchoHeader.jws,可以看到这是一个标准的java类源文件。

         下面,我们来自己编写并发布一个Web Service。

         首先, 我们编写一个最简单的Java类 HelloWorldjava

    package mypack;
    public class HelloWorld
    {
        
    public String sayHello(String username)
        {
            
    return "Hello, " + username;
        }
    }

          然后, 把这个文件copy到AXIS_HOME,并更名为HelloWorld.jws

          现在,访问http://localhost:8080/axis/HelloWorld.jws?wsdl,页面显示AXIS为HelloWorld自动生成的WSDL。这说明这个Web Service已经部署成功,可以使用了!

         看,开发部署一个Web Service就是这么的简单!

         2.使用wsdd(Web Service Deployment Descriptor,Web服务发布描述符)文件来发布Web Service。(推荐~~~)

         Apache Axis使用Web 服务描述符文件(WSDD)来发布SOAP服务。要发布一个Web Service,就要为它编写一个wsdd文件。我们仍使用上面那个HelloWorld,为它编写一个wsdd文件——deploy.wsdd:

    <deployment name="test" xmlns='http://xml.apache.org/axis/wsdd/' xmlns:java='http://xml.apache.org/axis/wsdd/providers/java'>
       
    <service name='HelloWorld' provider='java:RPC'>
            
    <parameter name='className' value='mypack.HelloWorld'/>
            
    <parameter name='allowedMethods' value='sayHello'/>
       
    </service>
    </deployment>

        </deployment>可以看到,这个wsdd文件是一个标准的XML文件,包含三个元素:

        <deployment>元素制定了wsdd所用的XML命名空间,是这个文件的根。

        <service>元素制定了一项SOAP服务。它有两个属性。name指定了这个服务的唯一标志符,provider指定了实现的语言及服务方式。一个wsdd文件可能有多个<service>元素。

        <parameter>指定了服务详细信息,是一组name/value对应的值。其中,clcssName指定了实现这个服务的类的名字,allowedMethods指定了这个服务暴露的方法列表。

         有了这个wsdd文件,我们就可以发布Web Service了。首先,编译HelloWorld.java, 把生成的HelloWorld.class文件copy到AXIS_HOME\WEB-INF\classes\mypack下,然后,deploy.wsdd所在目录,执行命名行命令:

         java org.apache.axis.client.AdminClient deploy.wsdd

         得到如下输出:

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

         这样,这个Web Service 就发布成功了。在http://localhost:8080/axis,通过点击view,就可以看到这个新发布的Web服务。

    这种发布方式比jws要复杂的,但是,wsdd方式可以通过WSDD描述文件,精确控制Web Service的很多特性,比如可访问的方法,因此wsdd是Web Service发布的首选方法。

         实际上,axis是通过ASIX_HOME\WEB-INF\server-config.wsdd文件来管理应用程序下所有Web Service。java org.apache.axis.client.AdminClient deploy.wsdd执行的结果,就是把deploy.wsdd中的内容合并到server-config.wsdd中去。

    备注:

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

    在运行java org.apache.axis.client.AdminClient deploy.wsdd时,可能出现错误:

           java org.apache.axis.client.AdminClient deploy.wsdd

           Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/Axis/client/AdminClient

           could not find the main class: org.apache.Axis.client.AdminClient

    解决办法1:

    1)在系统环境变量里新添变量

    AXIS_HOME=D:\Tomcat\webapps\axis\WEB-INF
    AXISCLASSPATH=
    .;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;

    2)这个环境变量里的值,对应着AXIS_HOME\WEB-INF\lib下的所有jar文件,注意一定要一一对应,错一不可。

    3)确保tomcat开启

    4)在cmd中运行 java -cp %AXISCLASSPATH% ora.apache.axis.client.AdminClient deploy.wsdd

    解决办法2:

    1)在系统环境变量里新添变量

    AXIS_HOME=D:\Tomcat\webapps\axis\WEB-INF

    2)在系统环境变量的classpath后添加.;%AXIS_HOME%\lib\axis.jar;%AXIS_HOME%\lib\axis-ant.jar;%AXIS_HOME%\lib\commons-discovery-0.2.jar;%AXIS_HOME%\lib\commons-logging-1.0.4.jar;%AXIS_HOME%\lib\jaxrpc.jar;%AXIS_HOME%\lib\saaj.jar;%AXIS_HOME%\lib\wsdl4j-1.5.1.jar;%AXIS_HOME%\lib\log4j-1.2.8.jar;

    3)在cmd中运行 java ora.apache.axis.client.AdminClient deploy.wsdd

    最终得到如下输出:

          Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart

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

    虽然提示有一个警告 Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart,可以无视这个警告。

         生成成功

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

         3. 在其他应用程序中发布Web Service(强烈推荐~~~)

         上面都是把HelloWorld发布到http://localhost:8080/的应用程序中。如果想发布到其他应用程序,或者在一个已有的应用中加入Web Service?

    Apache Axis的实现方式是一系列servlet,在AXIS_HOME\WEB-INF\web.xml中,可以看到这些Servlet的配置声明:

    View Code
    <?xml version="1.0" encoding="ISO-8859-1"?>

    <!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
        "http://java.sun.com/j2ee/dtds/web-app_2.2.dtd"
    >

    <web-app>
      
    <display-name>Apache-Axis</display-name>
      
    <servlet>
        
    <servlet-name>AxisServlet</servlet-name>
        
    <display-name>Apache-Axis Servlet</display-name>
        
    <servlet-class>
            org.apache.axis.transport.http.AxisServlet
        
    </servlet-class>
      
    </servlet>

      
    <servlet>
        
    <servlet-name>AdminServlet</servlet-name>
        
    <display-name>Axis Admin Servlet</display-name>
        
    <servlet-class>
            org.apache.axis.transport.http.AdminServlet
        
    </servlet-class>
        
    <load-on-startup>100</load-on-startup>
      
    </servlet>

      
    <servlet>
        
    <servlet-name>SOAPMonitorService</servlet-name>
        
    <display-name>SOAPMonitorService</display-name>
        
    <servlet-class>
            org.apache.axis.monitor.SOAPMonitorService
        
    </servlet-class>
        
    <init-param>
          
    <param-name>SOAPMonitorPort</param-name>
          
    <param-value>5001</param-value>
        
    </init-param>
        
    <load-on-startup>100</load-on-startup>
      
    </servlet>

      
    <servlet-mapping>
        
    <servlet-name>AxisServlet</servlet-name>
        
    <url-pattern>/servlet/AxisServlet</url-pattern>
      
    </servlet-mapping>

      
    <servlet-mapping>
        
    <servlet-name>AxisServlet</servlet-name>
        
    <url-pattern>*.jws</url-pattern>
      
    </servlet-mapping>

      
    <servlet-mapping>
        
    <servlet-name>AxisServlet</servlet-name>
        
    <url-pattern>/services/*</url-pattern>
      
    </servlet-mapping>

      
    <servlet-mapping>
        
    <servlet-name>SOAPMonitorService</servlet-name>
        
    <url-pattern>/SOAPMonitor</url-pattern>
      
    </servlet-mapping>

     
    <!-- uncomment this if you want the admin servlet -->
     
      
    <servlet-mapping>
        
    <servlet-name>AdminServlet</servlet-name>
        
    <url-pattern>/servlet/AdminServlet</url-pattern>
      
    </servlet-mapping>
     

        
    <!-- currently the W3C havent settled on a media type for WSDL;
        http://www.w3.org/TR/2003/WD-wsdl12-20030303/#ietf-draft
        for now we go with the basic 'it's XML' response 
    -->
      
    <mime-mapping>
        
    <extension>wsdl</extension>
         
    <mime-type>text/xml</mime-type>
      
    </mime-mapping>
      

      
    <mime-mapping>
        
    <extension>xsd</extension>
        
    <mime-type>text/xml</mime-type>
      
    </mime-mapping>

      
    <welcome-file-list id="WelcomeFileList">
        
    <welcome-file>index.html</welcome-file>
        
    <welcome-file>index.jsp</welcome-file>
        
    <welcome-file>index.jws</welcome-file>
      
    </welcome-file-list>

    </web-app>

      

    可以看到,.jws和/services/*所有访问都被AxisServlet接管。这就是Axis实现Web Service 的方式。因此,在其他应用中添加Axis就变得很简单,假设要添加Axis的应用为http://localhost:8080/newweb

        1.把这里所有的servlet定义都copy到newweb\WEB-INF\web.xml配置文件中。

        2. 将axis.jar, wsdl.jar, saaj.jar, jaxrpc.jar和其他相关类库(可以简单copy AXIS_HOME\WEB-INF\lib下所有jar)copy到newweb\WEB-INF\lib目录。

        3.1 newweb发布jws服务:

        将HelloWorld.jws  copy到newweb\下,访问:http://localhost:8080/newweb/HelloWorld.jws?wsdl,一切OK!

        3.2 newweb发布wsdd服务

         1)直接在项目newweb的src目录中建立一个java类,命名为HelloService.java

         修改代码如下:    

    View Code
    package mypack;
    public class HelloService{
        
    public String sayHello(String username)
        {
            
    return "Hello, " + username;
        }
    }

          2)将axis目录下的server-config.wsdd文件考到newweb\WEB-INF目录下,并修改其中的service属性,修改完的内容如下:

    View Code
    <?xml version="1.0" encoding="UTF-8"?>
    <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
     
    <globalConfiguration>
      
    <parameter name="sendMultiRefs" value="true"/>
      
    <parameter name="disablePrettyXML" value="true"/>
      
    <parameter name="adminPassword" value="admin"/>
      
    <parameter name="attachments.Directory" value="D:\Program Files\Tomcat 6.0\webapps\axis\WEB-INF\attachments"/>
      
    <parameter name="dotNetSoapEncFix" value="true"/>
      
    <parameter name="enableNamespacePrefixOptimization" value="false"/>
      
    <parameter name="sendXMLDeclaration" value="true"/>
      
    <parameter name="sendXsiTypes" value="true"/>
      
    <parameter name="attachments.implementation" value="org.apache.axis.attachments.AttachmentsImpl"/>
      
    <requestFlow>
       
    <handler type="java:org.apache.axis.handlers.JWSHandler">
        
    <parameter name="scope" value="session"/>
       
    </handler>
       
    <handler type="java:org.apache.axis.handlers.JWSHandler">
        
    <parameter name="scope" value="request"/>
        
    <parameter name="extension" value=".jwr"/>
       
    </handler>
      
    </requestFlow>
     
    </globalConfiguration>
     
    <handler name="LocalResponder" type="java:org.apache.axis.transport.local.LocalResponder"/>
     
    <handler name="URLMapper" type="java:org.apache.axis.handlers.http.URLMapper"/>
     
    <handler name="Authenticate" type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
     
    <service name="HelloService" provider="java:RPC">
      
    <parameter name="allowedMethods" value="sayHello"/>
      
    <parameter name="className" value="mypack.HelloService"/>
     
    </service>
     
    <transport name="http">
      
    <requestFlow>
       
    <handler type="URLMapper"/>
       
    <handler type="java:org.apache.axis.handlers.http.HTTPAuthHandler"/>
      
    </requestFlow>
      
    <parameter name="qs:list" value="org.apache.axis.transport.http.QSListHandler"/>
      
    <parameter name="qs:wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
      
    <parameter name="qs.list" value="org.apache.axis.transport.http.QSListHandler"/>
      
    <parameter name="qs.method" value="org.apache.axis.transport.http.QSMethodHandler"/>
      
    <parameter name="qs:method" value="org.apache.axis.transport.http.QSMethodHandler"/>
      
    <parameter name="qs.wsdl" value="org.apache.axis.transport.http.QSWSDLHandler"/>
     
    </transport>
     
    <transport name="local">
      
    <responseFlow>
       
    <handler type="LocalResponder"/>
      
    </responseFlow>
     
    </transport>
    </deployment>

        主要就是修改

         <service name="HelloService" provider="java:RPC">                    服务名称:HelloService
          
    <parameter name="allowedMethods" value="sayHello"/>            服务函数:sayHello
          
    <parameter name="className" value="mypack.HelloService"/>   类的位置:mypack.HelloService
        
    </service>

       3)访问 http://localhost:8080/newweb/services,就可以看见newweb下面发布的服务名称

           单击:http://localhost:8080/newweb/HelloService?method=sayHello&username=111,就可以访问这个服务。

    备注:(这一部分可不看。。。)

        需要注意的是,如果果使用wsdd文件方式发布Web Service,由于org.apache.clieng.AdminclClient工具默认的是将Web Service发布到http://localhost:8080/axis

         AdminClient提供了一系列参数来处理这种问题,要发布到newweb,只需执行:

         java org.apache.axis.client.AdminClient -s /newweb/servlet/AxisServlet deploy.wsdd

    其中,-s参数指定了AxisServlet所在的应用程序路径。

    同样,如果要将Web Service发布到http://localhost/newweb,而不是默认的8080端口,需要使用 -p参数指定端口

         java org.apache.axis.client.AdminClient -p 80 -s /newweb/servlet/AxisServlet deploy.wsdd

    当然,有一个最简单的方式,就是使用-l参数指定目标应用的URL:

         java org.apache.axis.client.AdminClient -lhttp://localhost:8000/newweb/servlet/AxisServlet deploy.wsdd

    在命令行,可以通过java.org.apache.axis.client.AdminClient来查看AdminCient可用的所有参数列表。

         这一部分可参考http://www.cnblogs.com/bjzhanghao/archive/2004/10/09/50216.html

         4. 删除Web Service

         删除Web Service的方法比较简单,jws方式发布的Web Service,删除.jws文件就可以了。

        使用WSDD方式发布的Web Service,仍需要使用WSDD文件删除。不过和发布不同,这个文件的根元素换成了<undeployment>:

    undeployment.wsdd

    <undeployment name="test" xmlns="http://xml.apache.org/axis/wsdd/">
      
    <service name="urn:helloworld"/>
    </undeployment>

    在命令行执行:

         java org.apache.client.AdminClient undeployment.wsdd

    Web Service 就被删除了!

    本文借鉴CSDN博客http://blog.csdn.net/Brookes/archive/2007/03/23/1538349.aspx

  • 相关阅读:
    jmeter元件的执行顺序
    jmeter json path espressions学习
    性能测试常见瓶颈分析及调优方法
    jmeter 聚合报告参数解释
    Jmeter 使用正则表达式提取响应结果中的值
    前端所需要了解的东西
    webpack4导入jQuery的新方案
    react服务端渲染SSR实战
    使用await写异步优化代码
    Provider
  • 原文地址:https://www.cnblogs.com/king1302217/p/2043621.html
Copyright © 2020-2023  润新知