二. 开发部署新的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
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:
<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的配置声明:
<!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
修改代码如下:
public String sayHello(String username)
{
return "Hello, " + username;
}
}
2)将axis目录下的server-config.wsdd文件考到newweb\WEB-INF目录下,并修改其中的service属性,修改完的内容如下:
<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
<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