WebService更多是一种标准,而不是一种具体的技术。不同的平台,不同的语言大都提供WebService的开发实现。在Java领域,WebService的一个成熟实现是Axis。

q      Axis是Apache的一个开源WebService引擎,它是目前最为成熟的开源WebService引擎之一。

q      Apache Axis是符合W3C的SOAP协议的实现。

q      该项目是属于Apache SOAP协议的子项目。

14.6.1.1 Axis的下载

登陆http://www.apache.org/dyn/closer.cgi/ws/axis/1_4站点,Axis的最新版本是1.4,笔者的示例程序都是基于该版本完成。下载到axis-bin-1_4.zip文件,解压缩该文件,发现如下的文件结构:

q      docs:存放Axis的说明文档。

q      lib:存放Axis的二进制发布包。

q      samples:存放利用Axis发布WebService的示例代码。

q      webapps:存放安装Axis的基础应用。

q      xmls:存放相关配置文档。

q      还有LICENSE等相关说明文档。

14.6.1.2 Axis的安装

安装Axis,首先必须保证系统已经正确安装了Web服务器,笔者使用Tomcat5.0.28。也可使用其他应用服务器,例如WebLogic。webapps下的axis路径全部复制到Tomcat的webapps路径下。然后打开浏览器,输入:http://localhost:8888/axis/。

如果出现如图14.3所示界面表示Axis的基本类库已经安装成功,地址中的8888是笔者的Tomcat的端口。单击如图14.3所示页面的左上方“Validation”链接,出现如图14.4所示界面:

图14.3 Axis安装成功界面              图14.4 Axis校验界面

该页面显示Axis的必需组件还缺少一个没有安装,两个可选组件也没有安装,单击上面的提示链接,分别登陆:

q      http://java.sun.com/products/javabeans/glasgow/jaf.html

q      http://java.sun.com/products/javamail/

q      http://xml.apache.org/security/

依次下载如下三个压缩文件:

q      jaf-1_1-fr.zip   下载: https://sdlc1a.sun.com/ECom/EComActionServlet;jsessionid=A45E3E2265BF823B4399BB95F59DD152

q      javamail-1_4.zip 下载:

https://sdlc1a.sun.com/ECom/EComActionServlet;jsessionid=503F19F1D96612179D16E4CC7436893F

q      xml-security-bin-1_2_1.zip    下载: http://xml.apache.org/security/dist/java-library/

将这三个压缩文件解压缩。

将jaf-1_1-fr.zip压缩包中的activation.jar文件,复制到axis应用的WEB-INF"lib下;

将javamail-1_4.zip压缩包中的mail.jar文件,复制到axis应用的WEB-INF/lib下;

再将xml-security-bin-1_2_1.zip的lib下xmlsec-1.2.1.jar和xalan.jar文件,复制到WEB-INF/lib下。再次校验Axis,看到页面提示全部安装成功。

 

 

Axis支持三种web service的部署和开发,分别为:
  1、Dynamic Invocation Interface ( DII)
  2、Dynamic Proxy方式
  3、Stubs方式
Dynamic Invocation Interface ( DII)开发方式

对于前两种Web Service的发布基本一样,客户端的访问也很类似,第一种发布就是直接将.java后缀改为.jws,并将生成的.class文件拷贝到WEB- INF/jwsclasses下面,非常简单,但它也有缺陷,就是不适合程序部署和大型项目开发,而且不支持包(package)的形式.
1. 在Eclipse里新建一个Tomcat Project取名为AxisTest ,将axis-1_4"webapps"axis中几个必须的文件拷贝到你的AxisTest工程文件下,一个是WEB-INF"lib下的所有文件及 mail.jar,activation.jar,xmlsec-1.4.1.jar,xalan.jar,一个是WEB-INF下面的web.xml文件,我们来简单看一下web.xml这个文件
<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-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/AxisServlet、*.jws、/services/*这几种映射会引起调用AxisServlet这个类,我们要用的就这几行,其他的可以直接删掉。
         
2.在WEB-INF/src下面新建一个myService.java文件,如下

public class myService {
       public String getusername(String name){
        return "Hello "+name+",this is an Axis DII Web Service";
    }
}
注意这个java文件是不属于任何package的,如果你要将其放入某个package那么Axis会提示你找不到它生成的class文件从而不能将其转换为wsdl文件。
将myService.java拷贝到AxisTest根目录下,将其后缀改为jws。
启动Tomcat输入http://localhost:8080/AxisTest/myService.jws,
3.点击Click to see the WSDL,这时候你会在WEB-INF下面看到Axis会自动生成一个jwsClasses文件夹,jwsClasses下面会有一个myService.class文件
4.客户端
com.axistest包下新建一个myServiceTestorByjws.java,选中public static void main(),
代码如下:

package com.client;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import javax.xml.rpc.ParameterMode;
import javax.xml.rpc.ServiceException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
public class MyServiceClient {

public static void main(String[] args) throws ServiceException, MalformedURLException, RemoteException {
  
   String endpoint="http://localhost:8080/AxisTest/MyService.jws";
        String name=" 张三";
        Service service = new Service();
        Call call = (Call) service.createCall();
        
        call.setTargetEndpointAddress(new java.net.URL(endpoint));                      
        call.addParameter("param1",XMLType.XSD_STRING,ParameterMode.IN);
        call.setOperationName( "sayHello" );
        call.setReturnType( XMLType.XSD_STRING );
        String ret = (String) call.invoke( new Object[] { name } );
        System.out.println("返回结果:" + ret);   
}
}