portTypename="SayHello">
operationname="SayHello">
inputmessage="tns:
SayHelloRequest"/>
outputmessage="tns:
SayHelloResponse"/>
operation>
portType>
bindingname="SayHelloSOAP"type="tns:
SayHello">
bindingstyle="document"transport="http:
//schemas.xmlsoap.org/soap/http"/>
operationname="SayHello">
operationsoapAction="http:
//ws.tonyzhangcn.org/SayHello/NewOperation"/>
input>
bodyuse="literal"/>
input>
output>
bodyuse="literal"/>
output>
operation>
binding>
servicename="SayHello">
portbinding="tns:
SayHelloSOAP"name="SayHelloSOAP">
addresslocation="http:
//www.example.org/"/>
port>
service>
definitions>
至此WSDL的编写已经完成。
2.2从WSDL生成Java代码
A.选择菜单“File->New->Other”,从对话框中选取“Axis2Wizards”下面的“Axis2CodeGenerator”.点击“Next”进入下一个页面,保持“GeneratejavasourcecodefromWSDLfile”被选中,点击“Next”进入下一步。
B.点击“Browse”来选取存放在src目录下的SayHello.wsdl文件,“Next”进入下一步。
设置如下:
C.点击“next”进入下一个页面,设置“Outputpath”为本Project的src目录。
点击“finish”后代在SayHello项目上按F5刷新就可以看到有代码生成好了。
但是能看到一堆红“x”,这是由于没有将Axis2的jar包放入classpath中以及源代码的package不为org.tonyzhangcn.ws.sayhello引起的。
下面解决这个问题,首先选择“SayHello”项目,并右击选择“Buildpath->AddExternalArchives..”,选择上面部署在tomcat中的axis2web应用WEB-INF/lib目录中的所有jar包。
之后右击“src.org.tonyzhangcn.ws.sayhello”项目,选择“Refactor->rename”,做如下修改,并选择OK完成。
这个时候发现test.org.tonyzhangcn.ws.sayhello下面的SayHelloTest.java仍然存在问题。
点击此文件中package关键子前面的红“x”,会提示有两个选项,我们选择下面的那个。
选择publicclassSayHelloTest前的红“x”,选择第一项。
进行完这几个改动之后,生成的代码就没有问题了。
其中
SayHelloRequest,SayHelloResponse是输入输出参数对象。
SayHelloSkeleton是服务端对象,用来编写业务逻辑调用。
SayHelloStub是客户端用来定位endpoint(就是发布的WebServices的地址)的类,客户端根据其提供的方法定位Web服务并发起调用
SayHelloMessageReceiverInOut是一个实现同步调用的web服务信息转换处理类。
Resources目录下的services.xml文件是webservices的描述文件。
SayHelloTest是一个客户端的TestCase示例,用户可以根据这个示例来编写自己的客户端调用类。
2.3编写业务代码
打开SayHelloSKeleton.java文件将其中的实现方法
publicorg.tonyzhangcn.ws.sayhello.SayHelloResponseSayHello(org.tonyzhangcn.ws.sayhello.SayHelloRequestparam0)
{
//Todofillthiswiththenecessarybusinesslogic
thrownewjava.lang.UnsupportedOperationException();
}
改为
publicorg.tonyzhangcn.ws.sayhello.SayHelloResponseSayHello(org.tonyzhangcn.ws.sayhello.SayHelloRequestrequest)
{
//Todofillthiswiththenecessarybusinesslogic
try
{
SayHelloResponseresponse=newSayHelloResponse();
response.setSayHelloResponse("Hi,"+request.getSayHelloRequest()+".Howareyou?
");
returnresponse;
}catch(UnsupportedOperationExceptione)
{
throwe;
}
}
2.4打包
A.选择菜单“File->New->Other”,从对话框中选取“Axis2Wizards”下面的“Axis2ServicesArchive”.点击“Next”进入下一个页面。
B.选择编译好的class文件所在目录(本项目应该是WebRoot下面WEB-INF/classes),“Next”进入下一步。
C.选择WSDL文件所在目录,此处为src目录下的SayHello.wsdl文件。
“Next”,再“Next”。
选择services.xm文件,本文应该是生成再src/resources下面的services.xml文件。
之后选取“Generatetheservices.xmlautomatically”,然后再点击一下使其变为非选中状态,之后点击“Back”按钮,再点击一次“Next”。
(注意:
这里本应该不是这么来回折腾的,但是我的机器上只有这样操作finish按钮才能生效。
怀疑这是一个bug,如果读到此文的用户没有这种情况,忽略此提示)
D.点击“Next”,将记入最后一个页面,此处有两个选项,一个是输出目录一个是处处文件名称。
我这里的输出文件名称给的是SayHello。
点击“Finish”完成。
2.5部署
A.将打包好的文件SayHello.jar(或者可以改名为SayHello.aar),拷贝到Tomcat中已经部署的Axis2应用的WEB-INF/services目录下面。
B.启动Tomcat(即点击Tomcat安装目录下的startup.bat,linux或unix下执行startup.sh)。
C.打开浏览器,输入http:
//ipaddress:
port/axis2(一般为http:
//localhost:
8080/axis2),并点击其中的“services”链接
可以看到SayHello已经被部署。
点击SayHello提供的连接可以看到与之对应的WSDL。
2.6调用测试
A.修改SayHelloTest.java文件中的方法testSayHello的内容为:
publicvoidtestSayHello()throwsjava.lang.Exception
{
Stringurl="http:
//localhost:
8080/axis2/services/SayHello";
org.tonyzhangcn.ws.sayhello.SayHelloStubstub=neworg.tonyzhangcn.ws.sayhello.SayHelloStub(url);//the
org.tonyzhangcn.ws.sayhello.SayHelloRequestrequest=(org.tonyzhangcn.ws.sayhello.SayHelloRequest)getTestObject(org.tonyzhangcn.ws.sayhello.SayHelloRequest.class);
request.setSayHelloRequest("tonyzhangcn");
System.out.println(stub.SayHello(request).getSayHelloResponse());
//todoFillintheparam14here
assertNotNull(stub.SayHello(request));
}
B.从菜单中选择“Run->Runas->JUnitTest”。
可以看到web服务已经正确的返回了结果。
那么,不用TestCase类可以调用WebServices吗?
答案是肯定的,我们可以随便些一个带有main方法的类,并仿照SayHelloTest.java中的testSayHello()方法就可以达到调用WebServices的目的了。
在我实际操作工程中,还遇到了两个问题:
一个是缺少xalan包中的jar文件,
解决办法:
从官网下载,添加进lib中就好了
一个是在自动产生的JUnitTest类中有两个方法,都要实现,
解决办法:
可以去掉一个方法。