我打算全面将我的文章都集中到51CTO来,虽然看以前的文章有点傻,但毕竟是这么一路走过来的,呵呵,另外有些图我找不到了,大家将就看吧,言归正传吧。
首先我本人是个Web Service方面的新手,因为我的毕设题目写的是基于Ontology的Web Service研究,花了大量时间研究Ontology相关理论和技术,现在还是什么都不知道,转而投向更偏于实际的Web Service研究,发现Web Service要比Ontology好多了,至少不会给人什么也没学会的感觉,在网上看到一篇关于Axis+Tomcat的HelloWord WebService实现,出处我无从考究,但按照作者的步骤,完全可以实现,只不过在实现过程中遇到一些问题,我对此作了一些改进,希望和大家分享一下,最后,因为完全是手工实现的,所以原理也比较清晰,就我的理解简单阐述一下axis对web service的实现原理。
一、 测试平台
Win32环境(WinXP) / Sun JDK / TomCat / Apache Axis / Apache Xerces
二. 软件安裝介紹
JDK和Tomcat的安装不用介绍了吧,安装目录哪都可以。
1.Axis的安装
下载最新版本axis-bin-1_4.tar.gz(axis-bin-1_4.zip也可以),哪下得我也不记得了(自己找吧)。
2. 解压axis-bin-1_4.tar.gz默认为axis-1_4,将目录axis-1_4\webapps\axis拷贝到tomcat的webapps下,axis本身是它自带的一个程序。
3.Xerces 的安裝 ([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就不必了)。
三. 环境设定
JDK和Tomcat的设定就不用说了,关键是axis的CLASSPATH设定,JDK要编译wsdl2java必须用到的类,你可以采取两种方法,第一种,把C:\Program Files\Apache Software Foundation\Tomcat 5.0\webapps\axis\WEB-INF\lib下axis.jar、saaj.jar、commons-logging.jar、commons-discovery.jar、wsdl4j.jar、jaxrpc.jar的这六个jar复制到JAVA_HOME的lib下(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配置好了,基本就不会有什么问题了。
四. 环境测试
JDK和Tomcat的测试也不用说。
1.测试AXIS
public class HelloWorldService {
private final static String sGreeting
= "Hello World!" ;
public String getMessage() {
return(sGreeting) ;
}
}
private final static String sGreeting
= "Hello World!" ;
public String getMessage() {
return(sGreeting) ;
}
}
编写一个
HelloWorldService.jws。Jws就是java推出的web service编写格式,类似于.net的asmx,其实就是一个java类。上面的getMessage方法就是提供给客户的方法。再将其拷贝到tomcat\webapps\axis下面 , 接下来我们就要利用它来生成wsdl了;再浏览器中输入如下:
[url]http://localhost:8080/axis/HelloWorldService.jws?wsdl[/url]
如果出现这样的画面就表示这部分也正常运作
具体的wsdl语法及含义在我的博克上也有,这里就不介绍了,你可以把wsdl理解为一种web service定义语言,按照Understanding SOA with Web Service的作者Eric Newscomer的说法就是一种服务契约,大家都遵循好这一契约,我就可以根据你的契约来执行我的服务端的访问了,它跟具体的实现类即HelloWorldService没有关系,我们只要知道它是干什么的,如何使用它既可以了。
五. 开始使用WebService并制作Client端
如果到第四步骤结束你都能正常执行,就表示你已经能夠提供最基本的WebService了
现在则是开始解析WSDL档案并作Client端,具体的说就是你要编写的应用程序的服务端。
1.Wsdl2JAVA
请先在你的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.jar和activation.jar。
需要mail.jar和activation.jar。
解决办法:
1) 下载javamail和jaf,解压出mail.jar和activation.jar
[url]http://java.sun.com/products/javamail/downloads/index.html[/url]
[url]http://java.sun.com/products/javabeans/glasgow/jaf.html#download[/url]
1) 下载javamail和jaf,解压出mail.jar和activation.jar
[url]http://java.sun.com/products/javamail/downloads/index.html[/url]
[url]http://java.sun.com/products/javabeans/glasgow/jaf.html#download[/url]
这个是可以忽略的。不过以后构建web services都要用到的,还是添加上的好。
备注:
一篇很好的jars下载指南: Web Services Required Jars Download Instructions
Axis指南: Guide to building Axis
一篇很好的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);
}
}
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.
我们真正实际用到的就ServiceLocator和ws类,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;
}
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,尤其是SSOA(Semantic SOA),那就不是那么简单的事了。