译: 3. Axis2快速入门指南
本指南的目的是让您尽快使用Axis2开始创建服务和客户端。我们将采用一个简单的StockQuote服务,向您展示可以创建和部署它的一些不同方式,以及快速查看Axis2附带的一个或两个实用程序。然后,我们将介绍如何创建客户端以访问这些服务。
内容
- 介绍
- 做好准备
- Axis2服务
- 创造服务
- 部署POJO
- 使用AXIOM构建服务
- 使用ADB生成服务
- 使用XMLBeans生成服务
- 使用JiBX生成服务
- 生成客户端
- 使用AXIOM创建客户端
- 使用ADB生成客户端
- 使用XML Bean生成客户端
- 使用JiBX生成客户端
- 摘要
- 进一步研究
快速安装说明:
该文档的代码可以在提取的标准二进制分发中找到,更具体地说,可以在目录中的Axis2_HOME / samples /中找到 - quickstart,quickstartadb,quickstartaxiom,quickstartjibx和quickstartxmlbeans。(考虑现在获取它,因为它将帮助您继续。)它包括Ant构建文件(build.xml),我们将在整个示例中引用它们以使编译更容易。
介绍
让我们从服务本身开始。我们将简化,以便您可以看到构建和部署服务时发生的事情。在这样的实例中,StockQuoteService示例似乎是必需的,所以让我们使用以下代码(参见代码清单1)。
代码清单1:StockQuoteService类
package samples.quickstart.service.pojo; import java.util.HashMap; public class StockQuoteService {
private HashMap map = new HashMap(); public double getPrice(String symbol) {
Double price = (Double) map.get(symbol);
if(price != null){
return price.doubleValue();
}
return 42.00;
} public void update(String symbol, double price) {
map.put(symbol, new Double(price));
}
}
这将是一个简单的服务,有两个可能的调用。其中一个是输入/输出消息,另一个是only-in 的服务。最终,我们将打包服务并以四种不同的方式部署它。
首先,让我们看看这个简单的Java类如何与服务相对应。
做好准备
在我们使用Axis2构建任何东西之前,我们必须处理一些内务管理。首先,您需要准备好使用Axis2的环境。幸运的是,它只涉及几个简单的步骤:
- 下载并安装Java(最低版本为JDK1.5)。将JAVA_HOME环境变量设置为安装JDK版本的目录的路径名。
- 下载Axis2并将其解压缩到目标目录。
- 将axis2.war文件复制到servlet引擎的webapps目录。
- 将AXIS2_HOME环境变量设置为指向步骤中的目标目录。请注意,Axis2生成的所有脚本和构建文件都取决于此值,因此请勿跳过此步骤!Linux用户也可以在AXIS2_HOME / bin目录中运行setenv.sh文件,将AXIS2_HOME环境变量设置为解压缩的Axis2目录的路径名。
在大多数情况下,我们还需要一个WSDL文件来提供服务。Axis2的Java2WSDL可用于引导WSDL。要从Java类生成WSDL文件,请执行以下步骤:
- 创建并编译Java类。
(Windows)
%AXIS2_HOME%\bin\java2wsdl.bat -cp . -cn samples.quickstart.service.pojo.StockQuoteService -of StockQuoteService.wsdl (Linux)
$AXIS2_HOME/bin/java2wsdl.sh -cp . -cn samples.quickstart.service.pojo.StockQuoteService -of StockQuoteService.wsdl
- 使用以下命令生成WSDL:
生成WSDL文件后,您可以进行所需的更改。例如,您可以添加自定义错误或更改生成的元素的名称。例如,此StockQuoteService.wsdl位于AXIS2_HOME / samples / quickstartadb / resources / META-INF文件夹中,我们将在本指南的其余部分中使用该文件夹,替换生成过程创建的通用参数。
Axis2服务
在我们构建任何东西之前,了解成品的外观是有帮助的。
Axis2的服务器端可以部署在任何Servlet引擎上,并具有以下结构。如代码清单2所示。
代码清单2:axis2.war的目录结构
axis2-web
META-INF
WEB-INF
classes
conf
axis2.xml
lib
activation.jar
...
xmlSchema.jar
modules
modules.list
addressing.mar
...
soapmonitor.mar
services
services.list
aservice.aar
...
version.aar
web.xml
从顶部开始,axis2-web是构成Axis2管理应用程序的JSP集合,通过它您可以执行任何操作,例如添加服务以及参与和取消模块。WEB-INF目录包含实际的java类和其他支持文件,用于运行部署到services目录的任何服务。
所有这些中的主要文件是axis2.xml,它控制应用程序如何处理收到的消息,确定Axis2是否需要应用modules目录中定义的任何模块。
如您所见,服务可以部署为* .aar文件,但其内容必须以特定方式排列。例如,该服务的结构如下:
- StockQuoteService
- META-INF
- services.xml
- lib
- samples
- quickstart
- service
- pojo
- StockQuoteService.class
这里,服务的名称是StockQuoteService,它在services.xml文件中指定,并对应于此服务的顶级文件夹。编译的Java类根据包名称放置在适当的位置。lib目录包含服务运行所需的任何特定于服务的JAR文件(在本例中为none),除了那些已经与Axis2 WAR文件和servlet容器的公共JAR目录一起存储的文件。最后,META-INF目录包含有关Axis2正确执行它所需服务的任何其他信息。services.xml文件定义服务本身并将Java类链接到它(参见代码清单3)。
代码3:服务定义文件
<service name="StockQuoteService" scope="application">
<description>
Stock Quote Sample Service
</description>
<messageReceivers>
<messageReceiver
mep="http://www.w3.org/ns/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver
mep="http://www.w3.org/ns/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass">
samples.quickstart.service.pojo.StockQuoteService
</parameter>
</service>
这里定义了服务,以及不同消息交换模式的相关messageReceiver类型。
META-INF目录也是您打算为此应用程序包含的任何自定义WSDL文件的位置。
您可以通过简单地获取此文件层次结构并将其复制到servlet引擎的webapps / axis2 / WEB-INF / services目录来部署服务。(注意,必须首先在servlet引擎中安装Axis2 WAR文件。)这称为“爆炸”格式。您还可以将文档压缩为* .aar文件,类似于* .jar文件,并将* .aar文件直接放在servlet引擎的webapps / axis2 / WEB-INF / services目录中。
现在您了解了我们正在努力实现的目标,我们已经准备好开始构建。
首先,下载 并解压缩适当版本的Axis2标准二进制分发版。确保将AXIS2_HOME变量的值设置为与解压缩此版本内容的位置相匹配。
让我们看一下创建客户端和服务的一些不同方法。
创建服务
在本节中,我们将介绍基于StockQuoteService类创建服务的五种方法:部署普通旧Java对象(POJO),使用AXIOM的OMElement构建服务,使用Axis2数据绑定框架(ADB)生成服务,生成使用XMLBeans进行服务,并使用JiBX生成服务。
部署POJO
要使用POJO(Plain Old Java Objects)部署服务,请执行以下步骤。
请注意AXIS2_HOME / samples / quickstart中包含的目录结构(services.xml文件来自本指南的第一部分):
- quickstart
- README.txt
- build.xml
- resources
- META-INF
- services.xml
- src
- samples
- quickstart
- service
- pojo
- StockQuoteService.java
请注意,您可以通过键入以下内容从quickstart目录生成WSDL:
ant generate.wsdl
但是,创建StockQuoteService.wsdl是可选的。它可以是直接从Java类生成的版本,也可以是该文件的自定义版本,而services.xml与本文档前面引用的文件相同。
现在通过在quickstart目录中键入ant generate.service来构建项目,该目录创建以下目录结构:
- quickstart/build/classes
- META-INF
- services.xml
- samples
- quickstart
- service
- pojo
- StockQuoteService.class
如果要以展开的目录格式部署服务,请将classes目录重命名为StockQuoteService,并将其复制到servlet引擎中的webapps / axis2 / WEB-INF / services目录。否则,将build / StockQuoteService.aar文件复制到servlet引擎中的webapps / axis2 / WEB-INF / services目录。然后通过查看以下服务列表来检查以确保服务已正确部署:
http://localhost:8080/axis2/services/listServices
您还可以在以下位置查看WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
the schema 在
http://localhost:8080/axis2/services/StockQuoteService?xsd
URL正常工作后,快速测试服务。尝试将浏览器指向以下URL:
http://localhost:8080/axis2/services/StockQuoteService/getPrice?symbol=IBM
您将收到以下响应:
<ns:getPriceResponse xmlns:ns="http://pojo.service.quickstart.samples/xsd"><ns:return>42</ns:return></ns:getPriceResponse>
如果您调用更新方法,
http://localhost:8080/axis2/services/StockQuoteService/update?symbol=IBM&price=100
然后执行第一个getPrice URL,您将看到价格已更新。
使用AXIOM构建服务
要使用AXIOM“从头开始”构建服务,请执行以下步骤。
请注意/ samples / quickstartaxiom中包含的目录结构:
- quickstartaxiom
- README.txt
- build.xml
- resources
- META-INF
- services.xml
- StockQuoteService.wsdl
- src
- samples
- quickstart
- service
- axiom
- StockQuoteService.java
- clients
- AXIOMClient.java
由于AXIOM略有不同,因此您需要一个与POJO不同的service.xml文件。定义它,如代码清单4所示。
代码4:服务定义文件。
<service name="StockQuoteService" scope="application">
<description>
Stock Quote Service
</description>
<operation name="getPrice">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/>
</operation>
<operation name="update">
<messageReceiver class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/>
</operation>
<parameter name="ServiceClass">samples.quickstart.service.axiom.StockQuoteService</parameter>
</service>
请注意,它几乎相同,只是在service.xml文件中显式定义了操作,MessageReceivers现在是RawXML。
现在,上面引用的StockQuoteService.java类是一个使用Axis2库中的类的普通Java类,其定义如代码清单5所示。
代码5:使用AXIOM的StockQuoteService类
package samples.quickstart.service.axiom; import javax.xml.stream.XMLStreamException;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace; import java.util.HashMap;
public class StockQuoteService {
private HashMap map = new HashMap(); public OMElement getPrice(OMElement element) throws XMLStreamException {
element.build();
element.detach(); OMElement symbolElement = element.getFirstElement();
String symbol = symbolElement.getText(); String returnText = "42";
Double price = (Double) map.get(symbol);
if(price != null){
returnText = "" + price.doubleValue();
}
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs =
fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns");
OMElement method = fac.createOMElement("getPriceResponse", omNs);
OMElement value = fac.createOMElement("price", omNs);
value.addChild(fac.createOMText(value, returnText));
method.addChild(value);
return method;
} public void update(OMElement element) throws XMLStreamException {
element.build();
element.detach(); OMElement symbolElement = element.getFirstElement();
String symbol = symbolElement.getText(); OMElement priceElement = (OMElement)symbolElement.getNextOMSibling();
String price = priceElement.getText(); map.put(symbol, new Double(price));
}
}
Axis2使用AXIOM,或AXIs对象模型,类似于DOM(文档对象模型)的结构,它基于StAX API(用于XML的Streaming API)。充当服务的方法必须将OMElement作为其参数,OMElement表示在这种情况下发生的XML元素是传入SOAP消息的有效负载。例如,方法getPrice(OMElement)提取有效负载元素的第一个子元素的内容,该元素对应于股票代码,并使用它来查找股票的当前价格。除非这是“仅在”服务,否则这些方法必须返回OMElement,因为它成为返回SOAP消息的有效负载。
现在通过在Axis2_HOME / samples / quickstartaxiom目录中键入ant generate.service来构建项目。
将StockQuoteService.aar文件放在servlet引擎的webapps / axis2 / WEB-INF / services目录中,并通过查看服务列表来检查是否已正确部署该服务,
http://localhost:8080/axis2/services/listServices
您还可以在以下位置检查自定义WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
the schema
http://localhost:8080/axis2/services/StockQuoteService?xsd
使用ADB生成服务
要使用Axis2数据绑定框架(ADB)生成和部署服务,请执行以下步骤。
通过在Axis2_HOME / samples / quickstartadb目录中键入以下内容,使用WSDL2Java实用程序生成框架:
(Windows)
%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.service.adb -d adb -s -ss -sd -ssi -o build\service (Linux)
$AXIS2_HOME/bin/wsdl2java.sh -uri resources/META-INF/StockQuoteService.wsdl -p samples.quickstart.service.adb -d adb -s -ss -sd -ssi -o build/service
否则,只需在Axis2_HOME / samples / quickstartadb目录中键入ant generate.service即可。
选项-d adb指定轴数据绑定(ADB)。-s开关仅指定同步或阻塞调用。-ss开关创建服务器端代码(框架和相关文件)。-sd开关创建服务描述符(services.xml文件)。-ssi开关为服务框架创建一个接口。现在,服务文件应位于构建/服务中。
如果您直接使用WSDL2Java生成代码,接下来您必须修改生成的框架以实现服务(如果您使用“ant generate.service”,则完成的框架将自动复制到生成的框架上)。
打开build / service / src / samples / quickstart / adb / service / StockQuoteServiceSkeleton.java文件并对其进行修改,以将服务的功能添加到生成的方法中; 如代码清单6所示。
代码6:定义服务骨架文件
package samples.quickstart.service.adb; import samples.quickstart.service.adb.xsd.GetPriceResponse;
import samples.quickstart.service.adb.xsd.Update;
import samples.quickstart.service.adb.xsd.GetPrice; import java.util.HashMap; public class StockQuoteServiceSkeleton implements StockQuoteServiceSkeletonInterface { private static HashMap map; static{ map = new HashMap(); } public void update(Update param0) {
map.put(param0.getSymbol(), new Double(param0.getPrice()));
} public GetPriceResponse getPrice(GetPrice param1) {
Double price = (Double) map.get(param1.getSymbol());
double ret = 42;
if(price != null){
ret = price.doubleValue();
}
GetPriceResponse res =
new GetPriceResponse();
res.set_return(ret);
return res;
}
}
现在,您可以通过在build / service目录中键入以下命令来构建项目:
ant jar.server
如果一切顺利,您应该在窗口中看到BUILD SUCCESSFUL消息,并在build / service / build / lib目录中看到StockQuoteService.aar文件。将此文件复制到servlet引擎的webapps / axis2 / WEB-INF / services目录。
您可以通过查看服务列表来检查以确保服务已正确部署,
http://localhost:8080/axis2/services/listServices
您还可以在以下位置检查自定义WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
the schema
http://localhost:8080/axis2/services/StockQuoteService?xsd
使用XMLBeans生成服务
要使用XMLBeans生成服务,请执行以下步骤。
通过在Axis2_HOME / samples / quickstartxmlbeans目录中键入以下内容,使用WSDL2Java实用程序生成框架
%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.service.xmlbeans -d xmlbeans -s -ss -sd -ssi -o build\service
否则,只需在Axis2_HOME / samples / quickstartxmlbeans目录中键入ant generate.service。
选项-d xmlbeans指定XML Bean数据绑定。-s开关仅指定同步或阻塞调用。-ss开关创建服务器端代码(框架和相关文件)。-sd开关创建服务描述符(services.xml文件)。-ssi开关为服务框架创建一个接口。现在,服务文件应位于构建/服务中。
如果您直接使用WSDL2Java生成代码,接下来您必须修改生成的框架以实现服务(如果您使用“ant generate.service”,则完成的框架将自动复制到生成的框架上)。
接下来打开build / service / src / samples / quickstart / service / xmlbeans / StockQuoteServiceSkeleton.java文件并修改它以将服务的功能添加到生成的方法中(参见代码清单7)。
代码7:定义服务框架
package samples.quickstart.service.xmlbeans; import samples.quickstart.service.xmlbeans.xsd.GetPriceDocument;
import samples.quickstart.service.xmlbeans.xsd.GetPriceResponseDocument;
import samples.quickstart.service.xmlbeans.xsd.UpdateDocument; import java.util.HashMap; public class StockQuoteServiceSkeleton implements StockQuoteServiceSkeletonInterface { private static HashMap map; static{ map = new HashMap(); } public void update(UpdateDocument param0) {
map.put(param0.getUpdate().getSymbol(), new Double(param0.getUpdate().getPrice()));
} public GetPriceResponseDocument getPrice(GetPriceDocument param1) {
Double price = (Double) map.get(param1.getGetPrice().getSymbol());
double ret = 42;
if(price != null){
ret = price.doubleValue();
}
System.err.println();
GetPriceResponseDocument resDoc =
GetPriceResponseDocument.Factory.newInstance();
GetPriceResponseDocument.GetPriceResponse res =
resDoc.addNewGetPriceResponse();
res.setReturn(ret);
return resDoc;
}
}
通过在build / service目录中键入以下命令来构建项目,该目录包含build.xml文件:
ant jar.server
如果一切顺利,您应该在窗口中看到BUILD SUCCESSFUL消息,并在新创建的build / service / build / lib目录中看到StockQuoteService.aar文件。将此文件复制到servlet引擎的webapps / axis2 / WEB-INF / services目录。
您可以通过查看服务列表来检查以确保服务已正确部署,
http://localhost:8080/axis2/services/listServices
您还可以在以下位置检查自定义WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
schema
http://localhost:8080/axis2/services/StockQuoteService?xsd
使用JiBX生成服务
要使用JiBX数据绑定生成和部署服务,请执行以下步骤。
通过在Axis2_HOME / samples / quickstartjibx目录中的控制台上键入以下内容,使用WSDL2Java实用程序生成框架
%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.service.jibx -d jibx -s -ss -sd -ssi -uw -o build\service
否则,只需在Axis2_HOME / samples / quickstartjibx目录中键入“ant generate.service”即可。
选项-d jibx指定JiBX数据绑定。-s开关仅指定同步或阻塞调用。-ss开关创建服务器端代码(框架和相关文件)。-sd开关创建服务描述符(services.xml文件)。-ssi开关为服务框架创建一个接口。-uw开关打开传入和传出服务操作的参数,以创建更自然的编程接口。
运行WSDL2Java后,服务文件应位于build / service。如果直接使用WSDL2Java生成代码,则需要修改生成的框架以实现服务(如果使用“ant generate.service”,则完成的框架将自动复制到生成的框架上)。打开build / service / src / samples / quickstart / service / jibx / StockQuoteServiceSkeleton.java文件并对其进行修改,以将服务的功能添加到生成的方法中,如代码清单8所示。
代码8:定义服务框架文件
package samples.quickstart.service.jibx; import java.util.HashMap; public class StockQuoteServiceSkeleton implements StockQuoteServiceSkeletonInterface {
private HashMap map = new HashMap(); public void update(String symbol, Double price) {
map.put(symbol, price);
} public Double getPrice(String symbol) {
Double ret = (Double) map.get(symbol);
if (ret == null) {
ret = new Double(42.0);
}
return ret;
}
}
现在,您可以通过在build / service目录中键入以下命令来构建项目:
ant jar.server
如果一切顺利,您应该在窗口中看到BUILD SUCCESSFUL消息,并在build / service / build / lib目录中看到StockQuoteService.aar文件。将此文件复制到servlet引擎的webapps / axis2 / WEB-INF / services目录。
您可以通过查看服务列表来检查以确保服务已正确部署,
http://localhost:8080/axis2/services/listServices
您还可以在以下位置检查自定义WSDL:
http://localhost:8080/axis2/services/StockQuoteService?wsdl
schema
http://localhost:8080/axis2/services/StockQuoteService?xsd
更多学习信息:JiBX code generation integration
创建客户端
在本节中,我们将介绍基于StockQuoteService类创建客户端的四种方法:构建基于AXIOM的客户端,使用Axis2数据绑定框架(ADB)生成客户端,使用XMLBeans生成客户端,以及使用JiBX生成客户端。
使用AXIOM创建客户端
要使用AXIOM构建客户端,请执行以下步骤。
另请注意“使用AXIOM创建服务”部分中显示的目录结构,下面重复完整性。
- quickstartaxiom
- README.txt
- build.xml
- resources
- META-INF
- services.xml
- StockQuoteService.wsdl
- src
- samples
- quickstart
- service
- axiom
- StockQuoteService.java
- clients
- AXIOMClient.java
上面引用的AXIOMClient.java类定义如下,如代码清单9所示。
代码9:使用AXIOM的AXIOMClient类
package samples.quickstart.clients; import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient; public class AXIOMClient { private static EndpointReference targetEPR =
new EndpointReference("http://localhost:8080/axis2/services/StockQuoteService"); public static OMElement getPricePayload(String symbol) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns"); OMElement method = fac.createOMElement("getPrice", omNs);
OMElement value = fac.createOMElement("symbol", omNs);
value.addChild(fac.createOMText(value, symbol));
method.addChild(value);
return method;
} public static OMElement updatePayload(String symbol, double price) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace("http://axiom.service.quickstart.samples/xsd", "tns"); OMElement method = fac.createOMElement("update", omNs); OMElement value1 = fac.createOMElement("symbol", omNs);
value1.addChild(fac.createOMText(value1, symbol));
method.addChild(value1); OMElement value2 = fac.createOMElement("price", omNs);
value2.addChild(fac.createOMText(value2,
Double.toString(price)));
method.addChild(value2);
return method;
} public static void main(String[] args) {
try {
OMElement getPricePayload = getPricePayload("WSO");
OMElement updatePayload = updatePayload("WSO", 123.42);
Options options = new Options();
options.setTo(targetEPR);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP); ServiceClient sender = new ServiceClient();
sender.setOptions(options); sender.fireAndForget(updatePayload);
System.err.println("price updated");
OMElement result = sender.sendReceive(getPricePayload); String response = result.getFirstElement().getText();
System.err.println("Current price of WSO: " + response); } catch (Exception e) {
e.printStackTrace();
}
} }
Axis2使用AXIOM,或AXIs对象模型,类似于DOM(文档对象模型)的结构,它基于StAX API(用于XML的Streaming API)。在这里,您可以为服务的更新和getPrice方法设置有效负载。创建有效负载的方式类似于为AXIOM服务创建getPriceResponse有效负载的方式。然后设置Options类,并创建一个ServiceClient,用于与服务进行通信。首先调用update方法,这是一个不返回任何内容的fireAndForget方法。最后,您调用getPrice方法,并从服务中检索当前价格并显示它。
现在,您可以通过在Axis2_HOME / samples / quickstartaxiom目录中键入ant run.client来构建和运行AXIOM客户端。
您应该获得以下输出:
done
Current price of WSO: 123.42
使用ADB生成客户端
要使用Axis Data Binding(ADB)构建客户端,请执行以下步骤。
通过在Axis2_HOME / samples / quickstartadb目录中键入以下内容来生成客户端数据绑定:
%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.clients -d adb -s -o build\client
另外,只需在Axis2_HOME / samples / quickstartadb目录中输入ant generate.client即可。
接下来看一下quickstartadb / src / samples / quickstart / clients / ADBClient.java,看看它是如何在代码清单10中定义的。
代码10:ADBClient类
package samples.quickstart.clients; import samples.quickstart.service.adb.StockQuoteServiceStub; public class ADBClient{
public static void main(java.lang.String args[]){
try{
StockQuoteServiceStub stub =
new StockQuoteServiceStub
("http://localhost:8080/axis2/services/StockQuoteService"); getPrice(stub);
update(stub);
getPrice(stub); } catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
} /* fire and forget */
public static void update(StockQuoteServiceStub stub){
try{
StockQuoteServiceStub.Update req = new StockQuoteServiceStub.Update();
req.setSymbol ("ABC");
req.setPrice (42.35); stub.update(req);
System.err.println("price updated");
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
} /* two way call/receive */
public static void getPrice(StockQuoteServiceStub stub){
try{
StockQuoteServiceStub.GetPrice req = new StockQuoteServiceStub.GetPrice(); req.setSymbol("ABC"); StockQuoteServiceStub.GetPriceResponse res =
stub.getPrice(req); System.err.println(res.get_return());
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
} }
此类使用您创建的Axis Data Bindings创建客户端存根。然后它调用Web服务上的getPrice和更新操作。getPrice方法操作创建GetPrice有效内容并将符号设置为ABC。然后它发送请求并显示当前价格。update方法创建Update有效负载,将符号设置为ABC,价格设置为42.35。
现在通过在Axis2_HOME / samples / quickstartadb目录中键入ant run.client来构建和运行客户端。
您应该获得以下输出:
42
price updated
42.35
使用XMLBeans生成客户端
要使用XML Bean数据绑定构建客户端,请执行以下步骤。
通过在xmlbeansClient目录中键入以下内容来生成数据库。
%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.service.xmlbeans -d xmlbeans -s -o build\client
另外,只需在Axis2_HOME / samples / quickstartxmlbeans目录中键入ant generate.client即可。
请注意,这会创建客户端存根代码而不会创建服务器端代码。
接下来看一下quickstartxmlbeans / src / samples / quickstart / clients / XMLBEANSClient.java,看看它是如何在代码清单11中定义的。
代码11:XMLBEANSClient类
package samples.quickstart.clients; import samples.quickstart.service.xmlbeans.StockQuoteServiceStub;
import samples.quickstart.service.xmlbeans.xsd.GetPriceDocument;
import samples.quickstart.service.xmlbeans.xsd.GetPriceResponseDocument;
import samples.quickstart.service.xmlbeans.xsd.UpdateDocument; public class XMLBEANSClient{ public static void main(java.lang.String args[]){
try{
StockQuoteServiceStub stub =
new StockQuoteServiceStub
("http://localhost:8080/axis2/services/StockQuoteService"); getPrice(stub);
update(stub);
getPrice(stub); } catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
} /* fire and forget */
public static void update(StockQuoteServiceStub stub){
try{
UpdateDocument reqDoc = UpdateDocument.Factory.newInstance();
UpdateDocument.Update req = reqDoc.addNewUpdate();
req.setSymbol ("BCD");
req.setPrice (42.32); stub.update(reqDoc);
System.err.println("price updated");
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
} /* two way call/receive */
public static void getPrice(StockQuoteServiceStub stub){
try{
GetPriceDocument reqDoc = GetPriceDocument.Factory.newInstance();
GetPriceDocument.GetPrice req = reqDoc.addNewGetPrice();
req.setSymbol("BCD"); GetPriceResponseDocument res =
stub.getPrice(reqDoc); System.err.println(res.getGetPriceResponse().getReturn());
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
}
}
此类使用您创建的XML Beans数据绑定创建客户端存根。然后它调用Web服务上的getPrice和更新操作。getPrice方法操作创建GetPriceDocument,其内部GetPrice类并将符号设置为ABC。然后它发送请求并检索GetPriceResponseDocument并显示当前价格。update方法创建一个UpdateDocument,更新并将符号设置为ABC并将价格设置为42.32,完成后显示“done”。
现在通过在Axis2_HOME / samples / quickstartxmlbeans目录中键入ant run.client来构建和运行项目。
您应该获得以下输出:
42
price updated
42.32
使用JiBX生成客户端
要使用JiBX构建客户端,请执行以下步骤。
通过在Axis2_HOME / samples / quickstartjibx目录中的控制台上键入以下内容来生成客户端存根。
%AXIS2_HOME%\bin\wsdl2java.bat -uri resources\META-INF\StockQuoteService.wsdl -p samples.quickstart.clients -d jibx -s -uw -o build\client
否则,只需输入“ant generate.client”即可。
接下来看一下quickstartjibx / src / samples / quickstart / clients / JiBXClient.java,如下面的代码清单12所示。
代码12:JiBXClient类
package samples.quickstart.clients; import samples.quickstart.service.jibx.StockQuoteServiceStub; public class JiBXClient{
public static void main(java.lang.String args[]){
try{
StockQuoteServiceStub stub =
new StockQuoteServiceStub
("http://localhost:8080/axis2/services/StockQuoteService"); getPrice(stub);
update(stub);
getPrice(stub); } catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
} /* fire and forget */
public static void update(StockQuoteServiceStub stub){
try{
stub.update("CDE", new Double(42.35));
System.err.println("price updated");
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
} /* two way call/receive */
public static void getPrice(StockQuoteServiceStub stub){
try{
System.err.println(stub.getPrice("CDE"));
} catch(Exception e){
e.printStackTrace();
System.err.println("\n\n\n");
}
} }
此类使用创建的JiBX客户端存根来访问Web服务上的getPrice和更新操作。getPrice方法发送股票“ABC”的请求并显示当前价格。更新方法将库存“ABC”的价格设置为42.35。
现在通过在Axis2_HOME / samples / quickstartjibx目录中的控制台键入“ant run.client”来构建和运行客户端。
您应该获得以下输出:
42
price updated
42.35
更多信息,JiBX code generation integration
摘要
Axis2提供了一种灵活而强大的方式,可以立即启动和运行Web服务。本指南介绍了创建可在Axis2上部署的服务的五种方法,以及创建与服务进行通信的客户端的四种方法。您现在可以使用各种不同的技术灵活地创建Web服务。
进一步研究
Apache Axis2简介 - http://www.redhat.com/magazine/021jul06/features/apache_axis2/
译: 3. Axis2快速入门指南的更多相关文章
- AngularJS快速入门指南20:快速参考
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- AngularJS快速入门指南19:示例代码
本文给出的大部分示例都可以直接运行,通过点击运行按钮来查看结果,同时支持在线编辑代码. <div ng-app=""> <p>Name: <input ...
- AngularJS快速入门指南18:Application
是时候创建一个真正的AngularJS单页面应用程序了(SPA). 一个AngularJS应用程序示例 你已经了解了足够多的内容来创建第一个AngularJS应用程序: My Note Save Cl ...
- AngularJS快速入门指南17:Includes
使用AngularJS,你可以在HTML中包含其它的HTML文件. 在HTML中包含其它HTML文件? 当前的HTML文档还不支持该功能.不过W3C建议在后续的HTML版本中增加HTML import ...
- AngularJS快速入门指南16:Bootstrap
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- AngularJS快速入门指南15:API
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- AngularJS快速入门指南14:数据验证
thead>tr>th, table.reference>tbody>tr>th, table.reference>tfoot>tr>th, table ...
- AngularJS快速入门指南13:表单
一个AngularJS表单是一组输入型控件的集合. HTML控件 HTML输入型标签标包括: input标签 select标签 button标签 textarea标签 HTML表单 HTML表单将各种 ...
- AngularJS快速入门指南12:模块
AngularJS模块定义了一个application. 模块是一个application中不同部分的容器. application中的所有控制器都应该属于一个模块. 带有一个控制器的模块 下面这个a ...
随机推荐
- Android中怎样做到自己定义的广播仅仅能有指定的app接收
今天没吊事.又去面试了,详细哪家公司就不说了,由于我在之前的blog中注明了那些家公司的名字,结果人家给我私信说我泄露他们的题目.好吧,我错了... 事实上当我们已经在工作的时候.我们能够在空暇的时间 ...
- V-rep学习笔记:机器人逆运动学解算
IK groups and IK elements VREP中使用IK groups和IK elements来进行正/逆运动学计算,一个IK group可以包含一个或者多个IK elements: I ...
- django之创建第7-5-第二种传值方式(time/1232/xiaodneg)
1.修改views文件 def foo(request,myID,myName): t = loader.get_template("foo.html") user = {&quo ...
- RHEL7-openldap安装配置三(客户端自动挂载配置)
前两篇文章我们配置好了LDAP服务端和LDAP客户端.这篇文章将讲述从LDAP客户机服务器上挂载NFS服务器上共享的目录. 1.LDAP服务器上NFS共享配置 1.1 NFS服务也可以单独搭建在另外一 ...
- Linux特殊的文件控制权限FACL
对文件设置特殊的权限,FACL(File Access Control List) ACL简介 基本ACL操作 getfacl 查看文件权限 setfacl 设定acl权限 设置file ...
- 利用组策略API 编辑GPO(Group Policy Object)
用windows自带的GPO Editor编辑修改,然后利用注册表监控器regFromApp监视注册表的改动,就知道某个策略修改了注册表的哪个字段了. 下面是禁止U盘访问的例子: #include ...
- 一颗可靠的时间胶囊:苹果AirPort Time Capsule测评
http://sspai.com/24181/ 如何从 Time Machine 备份恢复数据? AirPort Time Capsule能轻松完成备份,自然也少不了方便地恢复备份.一般常见的恢复备份 ...
- [转载]virtualbox安装64bit客户机
原文地址:virtualbox安装64bit客户机作者:kunth 1.虚拟64bit客户机 (1)安装virualbox (2)bios设置 supports virtualization为able ...
- 听听各位对Ubuntu的UI的看法
2012-7-15 15:46 最近升级到Ubuntu 12.4 .发现其界面效果真的时越来越炫啦.我就在想,你Ubuntu你图什么啊, 你是以个Linux系统,你的重点在于让系统运行更稳定,更 ...
- mysqlsla快速入门
小强软件测试,因为不是天生丽质,所以必须天生励志. 性能.python自动化班长期招生,咨询QQ:2083503238 官网:http://xqtesting.sxl.cn QQ群:229390571 ...