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

原文地址:https://www.cnblogs.com/king1302217/p/2043621.html