MyEclipse7.0创建基于
Axis的Web service
目 录
1. 实验目的
通过该实验学生将掌握配置MyEclipse7.0的axis Web Service的开发环境,通过Top-Down方式创建、发布基于axis Web Service的基本步骤,进一步加深学生对XML、WSDL、SOAP等Web Service概念的理解。
2. 实验环境
使用Axis来开发Web services 需要准备web 服务器,Axis API,该实验使用的版本分别是。
2.1. Axis2 1.4.1
2.2. Tomcat5.5
2.3. MyEclipse7.0
3. 环境准备
3.1. 下载所需资源
i. Axis2 1.4.1 下载地址
http://ws.apache.org/axis2/download/1_4_1/download.cgi
下载的文件包括:axis2-1.4.1-bin.zip、axis2-1.4.1-src.zip、axis2-1.4.1-war.zip、axis2-1.4.1-docs.zip
ii. Axis Eclipse plug-in,是Axis 生成web Services代码工具和打包工具,需要下载axis2-eclipse-codegen-wizard.zip和axis2-eclipse-service-archiver-wizard.zip二个plug-in文件.
http://apache.justdn.org/ws/axis2/tools/1_4_1/
iii. Tomcat下载地址
http://tomcat.apache.org/download-55.cgi
iv. MyEclipse下载地址
3.2. 安装环境
i. 安装下载的Tomcat5.5,Myclipse7.0 过程略(Myclipse7.0的破解参考 MyEclipse7.0 注册码 序列号 Java版注册机源代码.doc)。
ii. 将下载到的Axis 的两个plug-in解压缩到MyEclipse安装目录下的plugins子目录。
目录一般如:C:\Program Files\MyEclipse 7.0M1\eclipse\plugins
iii. 重启MyEclipse,并选择“File->New->Other”可以找到下面的这些Wizards,这些将是本文中用到的很重要的工具。
iv. 解压axis2-1.4.1-war.zip文件并将axis2.war包拷贝到tomcat安装目录下的webapps目录中。
v. 启动Tomca,打开浏览器输入并访问:http://ip:port/axis2来查看。如果能看到下面的页面则说明已经安装完成。
4. Web Service创建、发布及测试
到这里环境准备完成,接下来我们抓紧创建一个简单的demo。以便对使用Axis来开发Web services的大致流程有个了解。这个例子就是SayHello,请求端输入一个名字字符串,返回的将是一个问候语。
例如:输入了Tom,那么返回的事Hi,Tom.How are you?
4.1. 编写WSDL
启动MyEclipse,新建立一个WebApps(File->New->Project->Web Project),给Project Name 为SayHello,其他保持不改变。
i. 选择File->New-Other菜单,进入后找到MyEclipse->Web Services并选择WSDL。
选择“src”目录作为“Enter or select the parent folder”的值,“File name”值给定为SayHello.wsdl。点击“Next”进入下一步。
ii. 将目标命名空间设置为“http://ws.easefulfil.org/SayHello/”.在生成代码的时候一般以这个命名空间为package的名字,例如:org.easefulfil.ws.sayhello。这些值可以按需要设置。
iii. 点击“Finish”按钮就可以看到MyEclipse提供的WSDL 设计器的界面了。可以看到设计器为WSDL默认的添加了一个现操作。
即图中的“NewOperation”。现在将其改名为SayHello,如下图:
之后点击设计界面中的“Source”Tab来查看其代码。如下:可以看到我们定义了一个SayHello的Web Services,她提供了一个SayHello的方法,她能够接受一个String(事实上是tns:SayHelloRequest对象,她对String进行了封装)类型的输入参数SayHelloRequest并返回一个String(事实上是tns:SayHelloResponse对象,她对String进行了封装)类型的SayHelloResponse结果。更多关于WSDL的信息,请参考W3C的规范文档。
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://ws.easefulfil.org/SayHello/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SayHello" targetNamespace="http://ws.easefulfil.org/SayHello/">
<wsdl:types>
<xsd:schema targetNamespace="http://ws.easefulfil.org/SayHello/">
<xsd:element name="SayHelloRequest">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="in" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="SayHelloResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="out" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="SayHelloRequest">
<wsdl:part element="tns:SayHelloRequest" name="sayHelloRequest" />
</wsdl:message>
<wsdl:message name="SayHelloResponse">
<wsdl:part element="tns:SayHelloResponse" name="sayHelloResponse"/>
</wsdl:message>
<wsdl:portType name="SayHello">
<wsdl:operation name="SayHello">
<wsdl:input message="tns:SayHelloRequest"/>
<wsdl:output message="tns:SayHelloResponse"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="SayHelloSOAP" type="tns:SayHello">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="SayHello">
<soap:operation soapAction="http://ws.easefulfil.org/SayHello/SayHello"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="SayHello">
<wsdl:port binding="tns:SayHelloSOAP" name="SayHelloSOAP">
<soap:address location="http://www.example.org/"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
至此WSDL的编写已经完成。
4.2. 从WSDL生成Java代码
i. 选择菜单“File->New->Other”,从对话框中选取“Axis2 Wizards”下面的“Axis2 Code Generator”.点击“Next”进入下一个页面,保持“Generate java source code from WSDL file”被选中,点击“Next”进入下一步。
ii. 点击“Browse”来选取存放在src目录下的SayHello.wsdl文件,“Next”进入下一步。设置如下:
iii. 点击“next”进入下一个页面,设置“Output path”为本Project的src目录。点击“finish”后代在SayHello项目上按F5刷新就可以看到有代码生成好了。但是能看到一堆红“x”,这是由于没有将Axis2的jar包放入class path 中以及源代码的package不为org.easefulfil.ws.sayhello引起的。
Exception: java.lang.reflect.InvocationTargetException 异常处理:
见附件一:Exception: java.lang.reflect.InvocationTargetException 异常处理
iv. 在MyEclispse 中添加一个用户库(User Library)命名为 axis2 ,将 axis2-1.4.1-bin\axis2-1.4.1\lib 下的包均添加进来。这一步操作的操作将解决如下问题。
添加一个用户库,解决上面的问题,首先选择“SayHello”项目,并右击选择“Build path->Add Libraries..”,
在下面的窗口中新建名为axis2的Libaray,并将部署在tomcat中的axis2 web应用WEB-INF/lib目录中的所有jar包添加到该Lirary中。之后右击“src.org.easefulfil.ws.sayhello”项目,选择“Refactor->rename”,将包名修改为“org.easefulfil.ws.sayhello”即可。
4.3. 编写业务代码
打开SayHelloSKeleton.java文件将其中的实现方法
/**
*Autogeneratedmethodsignature
*
*@paramsayHelloRequest
*/
public org.easefulfil.ws.sayhello.SayHelloResponse SayHello
(
org.easefulfil.ws.sayhello.SayHelloRequest sayHelloRequest )
{
//TODO : fill this with the necessary business logic
thrownew java.lang.UnsupportedOperationException("Please implement " + this.getClass().getName() + "#SayHello");
}
}
改为
public org.easefulfil.ws.sayhello.SayHelloResponse SayHello
(
org.easefulfil.ws.sayhello.SayHelloRequest sayHelloRequest )
{
//TODO : fill this with the necessary business logic
try
{
SayHelloResponse response = new SayHelloResponse();
response.setOut("Hi," + sayHelloRequests.getIn()
+ ".How are you?");
return response;
} catch (UnsupportedOperationException e)
{
throw e;
}
}
4.4. 生成测试的客户端程序
i. 代码生成的步骤同4.2,选择生成客户测试用例,并将包名修改为org.easefulfil.ws.sayhello.client,如下图
ii. 通过重构将src.org.easefulfil.ws.sayhello包名改为org.easefulfil.ws.sayhello.client 并将SayHelloTest.java类移到org.easefulfil.ws.sayhello.client包中,便可以解决下面的问题.
iii. 这个时候发现org.easefulfil.ws.sayhello.client下面的SayHelloTest.java仍然存在问题。选择public class SayHelloTest前的红“x”,选择第e二项。
iv. 进行完这几个改动之后,生成的代码就没有问题了。其中:
SayHelloRequest,SayHelloResponse是输入输出参数对象。
SayHelloSkeleton是服务端对象,用来编写业务逻辑调用。
SayHelloStub是客户端用来定位endpoint(就是发布的Web Services的地址)的类,客户端根据其提供的方法定位Web服务并发起调用
SayHelloMessageReceiverInOut是一个实现同步调用的web服务信息转换处理类。
Resources目录下的services.xml文件是webservices的描述文件。
SayHelloTest是一个客户端的TestCase示例,用户可以根据这个示例来编写自己的客户端调用类。
4.5. 打包
i. 选择菜单“File->New->Other”,从对话框中选取“Axis2 Wizards”下面的“Axis2 Services Archive”.点击“Next”进入下一个页面。
ii. 选择编译好的class文件所在目录(本项目应该是WebRoot下面WEB-INF/classes),“Next”进入下一步。
iii. 选择WSDL文件所在目录,此处为src目录下的SayHello.wsdl文件。“Next”,再“Next”, 选择services.xm文件,本文应该是生成在src/resources下面的services.xml文件。
iv. 点击“Next”,将记入最后一个页面,此处有两个选项,一个是输出目录一个是处处文件名称。我这里的输出文件名称给的是SayHello。点击“Finish”完成。
4.6. 部署
i. 将打包好的文件SayHello.aar,拷贝到Tomcat中已经部署的Axis2应用的WEB-INF/services目录下面。
ii. 启动Tomcat,如果已启动,重启Tomcat。
iii. 打开浏览器,输入http://ipaddress:port/axis2(一般为http://localhost:8080/axis2),并点击其中的“services”链接,如果出现下面的错误,修改src/resources/services.xml的
<parameter name="useOriginalwsdl">true</parameter>为
<parameter name="useOriginalwsdl">false</parameter>即可。
iv. 重新执行4.5打包和4.6部署(A、B)过程,打开浏览器,输入http://ipaddress:port/axis2(一般为http://localhost:8080/axis2),并点击其中的“services”链接,可以看到SayHello已经被部署。点击SayHello提供的连接可以看到与之对应的WSDL。
。
4.7. 测试
i. 修改SayHelloTest.java文件中的方法testSayHello的内容为:
public void testSayHello() throws java.lang.Exception{
String url="http://localhost:8080/axis2/services/SayHello";
org.easefulfil.ws.sayhello.client.SayHelloStub stub =
new org.easefulfil.ws.sayhello.client.SayHelloStub(url);//the default implementation should point to the right endpoint
org.easefulfil.ws.sayhello.client.SayHelloStub.SayHelloRequest sayHelloRequest4=
(org.easefulfil.ws.sayhello.client.SayHelloStub.SayHelloRequest)getTestObject(org.easefulfil.ws.sayhello.client.SayHelloStub.SayHelloRequest.class);
// TODO : Fill in the sayHelloRequest4 here
sayHelloRequest4.setIn("easefulfil");
System.out.println(stub.SayHello(sayHelloRequest4).getOut());
assertNotNull(stub.SayHello(
sayHelloRequest4));
}
附件一:代码生成时的异常处理
Exception: java.lang.reflect.InvocationTargetException 异常处理
开发axis2中,我在用到axis2的eclipse 插件是所遇到:Code Generator 在Finish 时产生Exception: java.lang.reflect.InvocationTargetException 这个问题,看到有很多人像我一样遇到这个问题,查了很多资料终于解决,我的开发环境是 Myeclipse7.0 +axis1.4.
狂晕:
必须先将这两个jar文件及plugins.xml修改好后放入plugins文件夹,否则还是会报异常。
解决方法:
1、将\webapps\axis2\WEB-INF\lib 目录下的backport-util-concurrent-3.1.jar、geronimo-stax-api_1.0_spec-1.0.1.jar 二个文件拷贝到eclipse\plugins\Axis2_Codegen_Wizard_1.3.0\lib 文件夹中.
2、修改eclipse\plugins\Axis2_Codegen_Wizard_1.3.0\plugins.xml,添加如下内容。
<runtime>
...
<library name="lib/geronimo-stax-api_1.0_spec-1.0.1.jar">
<export name="*"/>
</library>
<library name="lib/backport-util-concurrent-3.1.jar">
<export name="*"/>
</library>
...
</runtime>
3、启动Myeclipse 即可
参考网站:
http://www.diybl.com/course/3_program/java/javashl/2008414/110188.html
http://blog.csdn.net/bonbonstella/archive/2007/05/17/1613401.aspx
http://panpan.blog.51cto.com/489034/119204