二. 开发部署新的Web Service
如何开发一个新Web Service并把它部署到服务器上供其他项目调用呢?有两种方式。
1. 最简单的一种方式是Java Web Service,即JWS。Axis允许把普通Java类的源文件的扩展名改为.jws,然后把它简单的copy到AXIS_HOME下。这样,Axis会自动编译.jws文件,并把它加入到Java Web Servie。其实,在ASIX_HOME,下,已经部署了几个示例jws,如,http://localhost:8080/axis/EchoHeaders.jws?method=list 。用文本编辑器打开AXIS_HOME/EchoHeader.jws,可以看到这是一个标准的java类源文件。
下面,我们来自己编写并发布一个Web Service。
首先, 我们编写一个最简单的Java类 HelloWorld.java
public class HelloService ... {
public String sayHello(String username)...{
return "Hello, " + username;
}
}
然后, 把这个文件copy到AXIS_HOME,并更名为HelloWorld.jws
现在,访问http://localhost:8080/HelloWorld.jws?wsdl,页面显示AXIS为HelloWorld自动生成的WSDL。这说明这个Web Service已经部署成功,可以使用了!
看,开发部署一个Web Servce就是这么的简单!
2。使用wsdd(Web Service Deployment Descriptor,Web服务发布描述符)文件来发布Web Service。
Apache Axis使用Web 服务描述符文件(WSDD)来发布SOAP服务。要发布一个Web Service,就要为它编写一个wsdd文件。我们仍使用上面那个HelloWorld,为它编写一个wsdd文件——deploy.wsdd:
xmlns:java ="http://xml.apache.org/axis/wsdd/providers/java" >
< service name ="urn:helloworld" provider ="java:RPC" >
< parameter name ="className" value ="brookes.HelloWorld" />
< parameter name ="allowedMethods" value ="sayHello" />
</ service >
</ 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/brookes下,然后,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中去。
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. newweb已经开发部署Web Service了!将HelloWorld.jws copy到newweb/下,访问:http://localhost:8080/newweb/HelloWorld.jws?wsdl,一切OK!
需要注意的是,如果果使用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可用的所有参数列表。
4. 删除Web Service
删除Web Service的方法比较简单,jws方式发布的Web Service,删除.jws文件就可以了。
使用WSDD方式发布的Web Service,仍需要使用WSDD文件删除。不过和发布不同,这个文件的根元素换成了<undeployment>:
< undeployment name ="test" xmlns ="http://xml.apache.org/axis/wsdd/" >
< service name ="urn:helloworld" />
</ undeployment >
在命令行执行:
java org.apache.client.AdminClient undeployment.wsdd
Web Service 就被删除了!