我想把数据库取到得数据传到客户端去。soap中消息格式应该怎么定义好点?
我把它定义成:<record>
<name>Tim</name><age>18</age>
<record>
<record>
<name>Jan</name><age>20</age>
<record>但是客户端读取record只能读取到最后的那条记录。
请问这个该怎么操作好?数据量不大,一次就传输个几十条吧。
我把它定义成:<record>
<name>Tim</name><age>18</age>
<record>
<record>
<name>Jan</name><age>20</age>
<record>但是客户端读取record只能读取到最后的那条记录。
请问这个该怎么操作好?数据量不大,一次就传输个几十条吧。
解决方案 »
- Axis + Hibernate 一直会出现session close的情况
- 真正掌握一个项目应该从哪里入手呢
- 算新学SSH...
- 大家帮我看下这段运行在手机上的代码,提交按钮在电脑上可以正常显示,在手机上就不能显示.大家帮帮看看怎么怎么解决?
- spring配置问题 急!
- XML+XSL的网页如何实现交互
- 关于TOMCAT的问题,请各位帮忙帮忙,,,
- 高分求tomcat 5.19下面配置连接oracle 9数据的连接池!
- eclipse 中文版 突然失效。。。请教高手!
- 这个格式我不明白说明什么。请指教些个
- 初学工作流
- 新人学习struts1, 建个helloworld工程有点问题,请老手帮忙
先定义个Record类, 里面有name 和 age属性按照数组的形式传递就可以了吧
在我的例子中 Request和Response都是数组, 我的WSDL 的配置如下, 希望对你有用<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime"
xmlns:tns="urn:ttdev.com:ss"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="BizService"
targetNamespace="urn:ttdev.com:ss">
<wsdl:types>
<xsd:schema targetNamespace="urn:ttdev.com:ss" xmlns:tns="urn:ttdev.com:ss">
<xsd:complexType name="productQuery">
<xsd:sequence>
<xsd:element name="productId" type="xsd:string"></xsd:element>
<xsd:element name="qty" type="xsd:int"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="productQueryResult">
<xsd:sequence>
<xsd:element name="productId" type="xsd:string"></xsd:element>
<xsd:element name="price" type="xsd:int"></xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="productQuery">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="productQuery" minOccurs="0" maxOccurs="unbounded" type="tns:productQuery"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="productQueryResult">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="productQueryResult" minOccurs="0" maxOccurs="unbounded" type="tns:productQueryResult"></xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="invalidQuery">
<xsd:complexType>
<xsd:choice>
<xsd:element name="invalidProductId" type="xsd:string"></xsd:element>
<xsd:element name="invalidQty" type="xsd:int"></xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="queryRequest">
<wsdl:part element="tns:productQuery" name="queryRequest" />
</wsdl:message>
<wsdl:message name="queryResponse">
<wsdl:part element="tns:productQueryResult" name="queryResponse" />
</wsdl:message>
<wsdl:message name="queryInvalidQuery">
<wsdl:part name="queryInvalidQuery" element="tns:invalidQuery"></wsdl:part>
</wsdl:message>
<wsdl:portType name="BizService">
<wsdl:operation name="query">
<wsdl:input message="tns:queryRequest" />
<wsdl:output message="tns:queryResponse" />
<wsdl:fault name="invalidQuery" message="tns:queryInvalidQuery"></wsdl:fault>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="BizServiceSOAP" type="tns:BizService">
<soap:binding style="document"
transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="query">
<soap:operation
soapAction="http://ttdev.com/BizService/query" />
<wsdl:input>
<soap:body parts="queryRequest" use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body parts="queryResponse" use="literal" />
</wsdl:output>
<wsdl:fault name="invalidQuery">
<soap:fault name="invalidQuery" use="literal"/>
</wsdl:fault>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="BizService">
<wsdl:port binding="tns:BizServiceSOAP"
name="BizServiceSOAP">
<soap:address location="http://ttdev.com/ss" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
public Record{
private String name;
private int id;
/**
set和get方法省略
*/
}写个类如下:package aixs2listtest;
import java.util.*;import org.apache.axiom.om.OMNode;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.util.StreamWrapper;
import org.apache.axiom.om.impl.builder.StAXOMBuilder;
import org.apache.axiom.om.impl.llom.factory.OMXMLBuilderFactory;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axis2.databinding.utils.BeanUtil;
import javax.xml.namespace.QName;
public class HelloSource {
public OMElement echo(){
/××下面把你想要传的数据封装成record类*/
Record hbs=new Record("moon",1);
Record hbs2=new Record("mo",2);
Record hbs3=new Record("moon3",3);
List<Record > list = new ArrayList<Record >();
list.add(hbs);
list.add(hbs2);
list.add(hbs3);
OMElement omElement = BeanUtil.getOMElement(new QName("Records"), list.toArray(), new QName("Record"), false, null); return omElement;
}
}
写个services.xml文件如下:
<service name="Record" scope="application">
<description>
PassRecord
</description>
<messageReceivers>
<messageReceiver
mep="http://www.w3.org/2004/08/wsdl/in-only"
class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver"/>
<messageReceiver
mep="http://www.w3.org/2004/08/wsdl/in-out"
class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass">
aixs2listtest.HelloSource
</parameter>
</service>把上面的JAVA文件编译后打成一个具有如下文件的aar包(可以直接压缩,然后改扩展名):aixs2listtest/Record.class
/HelloSource.class
META-INF/services.xml
把这个aar包放到axis2下面,客户端可以通过如下代码调用获取你传来的信息:package aixs2listtest;
import java.util.*;
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.axiom.om.OMNode;
import org.apache.axis2.AxisFault;
import org.apache.axis2.Constants;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.databinding.utils.BeanUtil;
import org.apache.axis2.engine.DefaultObjectSupplier;public class StubTest { private static EndpointReference targetEPR =
new EndpointReference("http://localhost:8080/axis2/services/HelloSource"); public static OMElement getPricePayload() {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace omNs = fac.createOMNamespace("http://hello/xsd", "tns"); OMElement method = fac.createOMElement("echo", omNs);
return method;
}
public static void main(String[] args) {
try {
OMElement getPricePayload = getPricePayload();
Options options = new Options();
options.setTo(targetEPR);
options.setTransportInProtocol(Constants.TRANSPORT_HTTP); ServiceClient sender = new ServiceClient();
sender.setOptions(options);
//这个 result就是你想要的如下xml
//<record>
//<name>Tim </name> <age>18 </age>
//<record>
//<record>
//<name>Jan </name> <age>20 </age>
//<record> OMElement result = sender.sendReceive(getPricePayload);
//这个List就保存了你传过来的record对象
List<Record> list=getResults(result); } catch (Exception e) {
e.printStackTrace();
}
}
private static List<Record> getResults(OMElement element) throws AxisFault {
if (element == null) {
return null;
}
Iterator iterator = element.getChildElements();
List<Record> list = new ArrayList<HelloBean>();
while (iterator.hasNext()) {
OMNode omNode = (OMNode) iterator.next();
if (omNode.getType() == OMNode.ELEMENT_NODE) {
OMElement omElement = (OMElement) omNode;
if (omElement.getLocalName().toLowerCase().equals("return")) {
Record person = (Record) BeanUtil.processObject(omElement,
Record.class, null, true,
new DefaultObjectSupplier());
list.add(person);
}
}
}
return list;
}
}至于wsdl文件,打开http://localhost:8080/axis2/HelloSource?wsdl可以看到axis2帮你自动生成了。
http://blog.csdn.net/rommal7090/archive/2009/04/08/4057771.aspx