您的位置:首页 > 其它

Axis2快速上手指南2

2008-11-05 09:07 417 查看
创建服务

在这个部分,我们将看看根据StockQuoteService类创建服务的五种方式:部署Plain Old Java Objects(POJO),使用AXIOM的OMElement

构建服务,使用Axis2 Databinding Framework(ADB)生成服务,使用XMLBeans生成服务和使用JiBX生成服务。

部署POJOs

使用POJOs(Plain Old Java Objects)来部署服务,执行下面的步骤。

注意包含在<AXIS2_HOME>/samples/quickstart的目录结构(services.xml文件来自于该指南的第一个部分):

Java代码



- quickstart

- README.txt

- build.xml

- resources

- META-INF

- services.xml

- src

- samples

- quickstart

- service

- pojo

- StockQuoteService.java

- quickstart    - README.txt    - build.xml    - resources      - META-INF        - services.xml    - src      - samples        - quickstart          - service            - pojo              - StockQuoteService.java


注意你可以通过在quickstart目录键入ant generate.wsdl来生成WSDL。

尽管如此,创建StockQuoteService.wsdl是可选的。它可以是直接从Java类生成的版本,或者该文件的一个自定义版本,并且servi

ces.xml是本文档前面提到的同一文件。

现在通过在quickstart目录键入ant generate.service来构建工程,该目录创建了以下目录结构:

Java代码



- quickstart/build/classes

- META-INF

- services.xml

- samples

- quickstart

- service

- pojo

- StockQuoteService.class

- quickstart/build/classes    - META-INF      - services.xml    - samples      - quickstart        - service          - pojo            - StockQuoteService.class


如果你想以爆发形式部署服务,重命名classes目录为StockQuoteService,并复制它到你的servlet引擎的webapps/axis2/WEB-INF/s

ervices目录。否则,复制build/StockQuoteService.aar文件到你的servlet引擎的webapps/axis2/WEB-INF/services目录。然后通过

视察以下服务列表来确认服务被正确部署:

http://localhost:8080/axis2/services/listServices

你也可以检验以下WSDL:

http://localhost:8080/axis2/services/StockQuoteService?wsdl

以及以下结构:

http://localhost:8080/axis2/services/StockQuoteService?xsd

一旦这些urls工作,让我们快速测试一下服务。让你的浏览器访问以下URL试试:

http://localhost:8080/axis2/rest/StockQuoteService/getPrice?symbol=IBM

你将得到如下应答:

Java代码



<ns:getPriceResponse xmlns:ns="http://pojo.service.quickstart.samples/xsd"><ns:return>42</ns:return></ns:getPriceResponse>

<ns:getPriceResponse xmlns:ns="http://pojo.service.quickstart.samples/xsd"><ns:return>42</ns:return></ns:getPriceResponse>


如果你像这样调用update方法:

http://localhost:8080/axis2/rest/StockQuoteService/update?symbol=IBM&price=100

然后调用第一个getPrice url。你可以看到price被更新了。

使用AXIOM构建服务

为了使用AXIOM"从零开始"构建一个服务,执行以下步骤。

注意包含在/samples/quickstartaxiom的目录结构:

Java代码



- quickstartaxiom

- README.txt

- build.xml

- resources

- META-INF

- services.xml

- StockQuoteService.wsdl

- src

- samples

- quickstart

- service

- axiom

- StockQuoteService.java

- clients

- AXIOMClient.java

- quickstartaxiom    - README.txt    - build.xml    - resources      - META-INF        - services.xml        - StockQuoteService.wsdl    - src      - samples        - quickstart          - service            - axiom              - StockQuoteService.java          - clients            - AXIOMClient.java


由于AXIOM有一点不同,你将需要一个与POJO所用不同的services.xml文件,在Code Listing 4中显示了它的定义。

Code Listing 4: 服务定义文件

Java代码



<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 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文件中,而且MessageReceiver现在是RawXML。

现在,上面提到的简单的使用Axis2库的类的StockQuoteService.java类,在Code Listing 5中定义。

Code Listing 5:使用AXIOM的StockQuoteService类

Java代码



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));

}

}

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 Object Model,一个基于StAX API(Streaming API for XML)的DOM(Document Object Model)类似的结构

作为服务的方法必须使用OMElement作为它们的参数,OMElement表示一个XML元素,在这里它则为进来的SOAP消息的有效载荷。这里,

你提取有效载荷元素的第一个孩子,添加文本给它,并使用它作为返回的OMElement的内容。除非这是一个"只有in"的服务,这些方法

必须返回一个OMElement,因为它成为返回的SOAP消息的有效载荷。

现在通过在Axis2_HOME/samples/quickstartaxiom目录键入ant generate.service来构建工程。

把StockQuoteService.aar文件放在servlet引擎的webapps/axis2/WEB-INF/services目录,通过视察下面的服务列表来确 ...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: