我打算全面将我的文章都集中到51CTO来,虽然看以前的文章有点傻,但毕竟是这么一路走过来的,呵呵,另外有些图我找不到了,大家将就看吧,言归正传吧。
 
首先我本人是个Web Service方面的新手,因为我的毕设题目写的是基于OntologyWeb Service研究,花了大量时间研究Ontology相关理论和技术,现在还是什么都不知道,转而投向更偏于实际的Web Service研究,发现Web Service要比Ontology好多了,至少不会给人什么也没学会的感觉,在网上看到一篇关于Axis+TomcatHelloWord WebService实现,出处我无从考究,但按照作者的步骤,完全可以实现,只不过在实现过程中遇到一些问题,我对此作了一些改进,希望和大家分享一下,最后,因为完全是手工实现的,所以原理也比较清晰,就我的理解简单阐述一下axisweb service的实现原理。
一、  测试平台<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Win32环境(WinXP) / Sun JDK / TomCat / Apache Axis / Apache Xerces
. 软件安裝介紹

JDKTomcat的安装不用介绍了吧,安装目录哪都可以。

 1Axis的安装

下载最新版本axis-bin-1_4.tar.gzaxis-bin-1_4.zip也可以),哪下得我也不记得了(自己找吧)。

 2. 解压axis-bin-1_4.tar.gz默认为axis-1_4,将目录axis-1_4\webapps\axis拷贝到tomcatwebapps下,axis本身是它自带的一个程序。

3Xerces 的安裝 ([url]http://xml.apache.org[/url])

先至 [url]http://xml.apache.org/dist/xerces-j/[/url] Xerces-J-bin.2.5.0 下载目前最新的版本 (目前是2.50)

解压到你想要的文件夾,然后将他目录下的xercesImpl.jar等三個Jar的档案拷贝到

tomcat\webapps\axis\WEB-INF\lib 下面(xercesSamples.jar就不必了)。

. 环境设定

    JDKTomcat的设定就不用说了,关键是axisCLASSPATH设定,JDK要编译wsdl2java必须用到的类,你可以采取两种方法,第一种,把C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\axis\WEB-INF\libaxis.jarsaaj.jarcommons-logging.jarcommons-discovery.jarwsdl4j.jarjaxrpc.jar的这六个jar复制到JAVA_HOMElib下(JDK要编译wsdl这六个jar缺一不可),在环境变量中直接将设CLASSPATH=.;%JAVA_HOME%\lib\axis.jar;(那六个jar都弄进来)

第二种方法新建一个setclasspath.bak,修改 SET CLASSPATH=.;C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\axis\WEB-INF\lib\axis.jar

只要CLASSPATH配置好了,基本就不会有什么问题了。

. 环境测试

    JDKTomcat的测试也不用说。

1.测试AXIS

public class HelloWorldService {
private final static String sGreeting
= "Hello World!" ;
public String getMessage() {
return(sGreeting) ;
}
}
编写一个 HelloWorldService.jws。Jws就是java推出的web service编写格式,类似于.netasmx,其实就是一个java类。上面的getMessage方法就是提供给客户的方法。再将其拷贝到tomcat\webapps\axis下面 , 接下来我们就要利用它来生成wsdl了;再浏览器中输入如下:

如果出现这样的画面就表示这部分也正常运作 <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

具体的wsdl语法及含义在我的博克上也有,这里就不介绍了,你可以把wsdl理解为一种web service定义语言,按照Understanding SOA with Web Service的作者Eric Newscomer的说法就是一种服务契约,大家都遵循好这一契约,我就可以根据你的契约来执行我的服务端的访问了,它跟具体的实现类即HelloWorldService没有关系,我们只要知道它是干什么的,如何使用它既可以了。

. 开始使用WebService并制作Client

如果到第四步骤结束你都能正常执行,就表示你已经能夠提供最基本的WebService

现在则是开始解析WSDL档案并作Client端,具体的说就是你要编写的应用程序的服务端。

1Wsdl2JAVA

请先在你的F: \下建一个文件夹叫做 project 或是任何名称也可以

然后打开你的MS-DOS模式 ,输入 java org.apache.axis.wsdl.WSDL2Java --verbose [url]http://localhost:8080/axis/HelloWorldService.jws?wsdl[/url]

如果你看到下面的画面就表示你已经成功了
 
如果出现CLASS NOT FOUND说明你的CLASSPATH配置有问题,仔细观察错误信息,看看到底少哪个类(刚才说过那六个jar缺一不可),在执行过程中可能出现如下错误:

 
问题:Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled

错误原因:
需要mail.jaractivation.jar

这个是可以忽略的。不过以后构建web services都要用到的,还是添加上的好。

备注:
一篇很好的jars下载指南: Web Services Required Jars Download Instructions
Axis指南: Guide to building Axis

这样,你就可以在F/project下看到有一个localhost的文件夹,目录结构是这样的axis\HelloWorldService_jws\

HelloWorldService.java

HelloWorldServiceService.java

HelloWorldServiceServiceLocator.java

HelloWorldServiceSoapBindingStub.java

2.最后一步,写Client

axis\HelloWorldService_jws\目录下新建一个client.java,内容如下,它就是用来读取web service

package localhost.axis.HelloWorldService_jws;
import java.lang.*;
public class client{
public static void main(String[] args) throws Exception{
localhost.axis.HelloWorldService_jws.HelloWorldServiceServiceLocator Service= new localhost.axis.HelloWorldService_jws.HelloWorldServiceServiceLocator();
localhost.axis.HelloWorldService_jws.HelloWorldService port= Service.getHelloWorldService();
String response=port.getMessage();
System.out.println(response);
}
}
我们看到client调用web service原理是这样的,通过远程访问一个HelloWordServer.jws?wsdl在本地生成四个java类,如果我们把一个web service记为ws,那么这四个java类应该是这样的

Ws.java;ws+Service.java;ws+ServiceLocator.java;ws+SoapBindingStub.

我们真正实际用到的就ServiceLocatorws类,ServiceLocator是获得webservice的定位,我们看生成的有这样一个方法
// Use to get a proxy class for HelloWorldService
     private java.lang.String HelloWorldService_address = "http://localhost:8080/axis/HelloWorldService.jws";
    public java.lang.String getHelloWorldServiceAddress() {
        return HelloWorldService_address;
    }

HelloWorldService_address就是用来定位访问HelloWorldService.jws地址的,当然你也可以定位远程访问地址,远程访问我还没有试过,估计用专门的IDE可以实现,当然你也可以在cmd中输入java org.apache.axis.wsdl.WSDL2Java --verbose [url]http://IPAddress:port/axis/WebService.jws?wsdl[/url]来完成,所有生成的java类都会默认的存放在localhost目录下。接着说我们的client.java,有了ServiceLocator,直接调用ServiceLocator.get+ws方法来完成一个ws实例,到这就完全搞定了axis+tomcat的实现,

具体怎么编译javac HelloWorldService.java等,以及javac Client.java,执行java Client.java就不用我说了吧,运行结果如下:

六、最后总结一下:

Web service其核心实现还是基于xml的,我们看wsdl也是一个xml文件,我曾经编写过一个java远程访问xml的实例,实际上这就已经实现了远程数据通讯及平台异构的问题,但我们如何去远程实例化一个类,并调用它的方法呢,这就是web service要解决的问题,其实web Service开发并没有什么复杂,.net平台的开发更加简单,但如果你想研究SOA,尤其是SSOASemantic SOA),那就不是那么简单的事了。