用axis方式调用WebService,返回类型为字符串数组(包括把数据库数据导出存为xml,xml转化成字符串)
来源:互联网 发布:极客学院java 编辑:程序博客网 时间:2024/05/14 00:20
import java.io.File;import java.rmi.RemoteException;import javax.xml.namespace.QName;import javax.xml.rpc.ServiceException;import org.apache.axis.client.Call;import org.apache.axis.client.Service;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.io.SAXReader;public class WeatherWebService {//这个方法返回所有工单记录public static String[] selectAllCargoInfor() {// webservice路径// 这里后面加不加 "?wsdl" 效果都一样的String endpoint = "http://180.76.147.120:8989/Service1.asmx?wsdl";String[] res = null; //webService 命名空间String nameSpace = "http://dengsss.org/"; // 查询所有数据的接口方法名String operationName = "selectAllOrder_Record";String soapAction = "http://dengsss.org/selectAllOrder_Record";// 定义service对象Service service = new Service();// 创建一个call对象Call call;try {call = (Call) service.createCall();// 设置目标地址,即webservice路径call.setTargetEndpointAddress(endpoint);// 设置操作名称,即方法名称call.setOperationName(new QName(nameSpace,operationName));// // 此处需要配置传入参数类型与参数名称,如果未设置jax-ws则无法接受参数,会认为传入的参数为null// call.addParameter(new QName(nameSpace, "TransNo"),// org.apache.axis.encoding.XMLType.XSD_STRING,// javax.xml.rpc.ParameterMode.IN);// 设置返回值类型// 对于返回是字符串数组的返回类型只有这两种可行call.setReturnClass(java.lang.String[].class);call.setUseSOAPAction(true);call.setSOAPActionURI(soapAction);try {res = (String[]) call.invoke(new Object[] {});} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}// 如果返回类型是org.apache.axis.encoding.XMLType.SOAP_VECTOR时用下面的转型接收// Vector v=(Vector) call.invoke(new Object[]{cityCode,userId}); } catch (ServiceException e) {// TODO Auto-generated catch blocke.printStackTrace();}return res;}
WebService端的接口方法已经存在,这里用axis方式调用需要的方法。
这里的方法返回的是字符串数组。
如果需要传入参数,那么就配置传入参数类型与参数名称,
因为我是需要把本地数据库的数据传到websevice的数据库并存起来,传输的方式为把本地数据库的数据导出存为一个XML格式文件,然后再把这个XML文件转化成字符串,并把它作为传递的参数,在这个过程中主要有两歩:
1.把数据库表中数据导出存为xml格式文件,代码如下:
<pre name="code" class="java">import java.io.File;import java.io.FileOutputStream;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;/** * 导出数据库的数据并存为xml格式文件 * @author Administrator * */public class TestDB2Xml { public static void main(String[] args) { String str_query;PreparedStatement pstmt;ResultSet rs; List<String[]> result = new ArrayList<String[]>(); String line[]= null; String JDRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";String connectDB="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=iODH_DataBase";try {Class.forName(JDRIVER);}catch (ClassNotFoundException e) {//e.printStackTrace();System.out.println("加载数据库引擎失败fff");System.exit(0);} try { Connection con = DriverManager.getConnection(connectDB, "sa", "666666");// 连接数据库对象 str_query = "SELECT * FROM Order_Record"; pstmt = con.prepareStatement(str_query); rs = pstmt.executeQuery(); while(rs.next()) { //定义一个String数组,这个数组中存取每条工单记录的每个数据 line = new String[10]; line[0] = rs.getString(1); line[1] = rs.getString(2); line[2] = rs.getString(3); line[3] = rs.getString(4); line[4] = rs.getString(5); line[5] = rs.getString(6); line[6] = rs.getString(7); line[7] = rs.getString(8); line[8] = rs.getString(9); line[9] = rs.getString(10); result.add(line); //把每一条工单数据存到result容器中 } DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); DocumentBuilder builder=factory.newDocumentBuilder(); //新建一个document对象 Document document=builder.newDocument();//Creat xml document document.setXmlVersion("1.0"); Element root=document.createElement("orderList");//rootname of xml document document.appendChild(root);//creat root of xml document for(int k=1; k<=result.size(); k++) { root.appendChild(document.createElement("DOrder_Record"));//elementname of xml document } NodeList nodeList=document.getElementsByTagName("DOrder_Record"); int size=nodeList.getLength(); for(int k=0; k<size; k++) { Node node=nodeList.item(k); if(node.getNodeType()==Node.ELEMENT_NODE) { String[] temp = (String[])result.get(k); Element elementNode=(Element)node; //把前面result容器中的数据对应加入到节点当中,注意!!目前如果数据库中某列有null值,那边这边就会报错,需要进行判定 for (int i = 0; i < temp.length; i++) { if (temp[i] == null) { temp[i] = ""; //变为""值后,WebServer端接收到数据后不能存入数据库 } } //为每个工单增加具体属性节点,并给每个节点赋值 elementNode.appendChild(document.createElement("Order_ID")).appendChild(document.createTextNode(temp[0])); elementNode.appendChild(document.createElement("Order_Type")).appendChild(document.createTextNode(temp[1])); elementNode.appendChild(document.createElement("Site_Addr")).appendChild(document.createTextNode(temp[2])); elementNode.appendChild(document.createElement("East_Longitude")).appendChild(document.createTextNode(temp[3])); elementNode.appendChild(document.createElement("North_Latitude")).appendChild(document.createTextNode(temp[4])); elementNode.appendChild(document.createElement("Worker_Name")).appendChild(document.createTextNode(temp[5])); elementNode.appendChild(document.createElement("Finshin_Staut")).appendChild(document.createTextNode(temp[6])); elementNode.appendChild(document.createElement("Finshin_Date")).appendChild(document.createTextNode(temp[7])); elementNode.appendChild(document.createElement("Device_ID")).appendChild(document.createTextNode(temp[8])); elementNode.appendChild(document.createElement("Work_DateLine")).appendChild(document.createTextNode(temp[9])); } } TransformerFactory transFactory=TransformerFactory.newInstance(); Transformer transformer=transFactory.newTransformer(); DOMSource domSource=new DOMSource(document); File file=new File("OederRecord.xml");//save xml document as url FileOutputStream out=new FileOutputStream(file); StreamResult xmlResult=new StreamResult(out); transformer.transform(domSource,xmlResult); }catch(Exception e) { System.out.println(e); }}}
到这里,数据库取出的数据就被存为一个xml文件,
</pre><pre name="code" class="java">2.XML文件转化成字符串,代码如下
<pre name="code" class="java"> SAXReader reader = new SAXReader(); //读取XML文件,然后 转换成Document Document document = reader.read(new File("OederRecord.xml")); //document转换为String字符串 String documentStr = document.asXML(); System.out.println("document 字符串:" + documentStr);
用dom4j的方式解析xml。
webserver端接受到字符串之后再进行处理。
当前这种方式中,出现一个错误,
AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server faultSubcode: faultString: 服务器无法处理请求。 ---> 未将对象引用设置到对象的实例。 faultActor: faultNode: faultDetail: <span style="white-space:pre"></span>{http://xml.apache.org/axis/}stackTrace:服务器无法处理请求。 ---> 未将对象引用设置到对象的实例。<span style="white-space:pre"></span>at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)<span style="white-space:pre"></span>at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)<span style="white-space:pre"></span>at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1781)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2957)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649)<span style="white-space:pre"></span>at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:333)<span style="white-space:pre"></span>at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)<span style="white-space:pre"></span>at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)<span style="white-space:pre"></span>at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)<span style="white-space:pre"></span>at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)<span style="white-space:pre"></span>at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)<span style="white-space:pre"></span>at org.apache.axis.client.Call.invokeEngine(Call.java:2784)<span style="white-space:pre"></span>at org.apache.axis.client.Call.invoke(Call.java:2767)<span style="white-space:pre"></span>at org.apache.axis.client.Call.invoke(Call.java:2443)<span style="white-space:pre"></span>at org.apache.axis.client.Call.invoke(Call.java:2366)<span style="white-space:pre"></span>at org.apache.axis.client.Call.invoke(Call.java:1812)<span style="white-space:pre"></span>at ss.xml.WeatherWebService.uploadOrder_Record(WeatherWebService.java:143)<span style="white-space:pre"></span>at ss.xml.WeatherWebService.main(WeatherWebService.java:167)webserver端接受到字符串之后再进行处理。当前这种方式中,出现一个错误,
这个错误不影响数据的传到webserver,但还没有具体的解决办法<span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space: normal;"></span></span>
0 0
- 用axis方式调用WebService,返回类型为字符串数组(包括把数据库数据导出存为xml,xml转化成字符串)
- C# WebService中将集合数据转化为字符串(json,xml )的方式
- 调用webservice,解析返回数据为xml格式的字符串,进行数据绑定
- 把数组转化为字符串
- js字符串转化为xml
- php xml字符串转化为 array数组的代码
- 如何把字符串转化为ENUM类型?
- 把字符串转化为结合的方式
- 把字符串转化为字符数组
- js把字符串转化为对象、数组
- Java 把字符串转换为字符串数组以及把字符串数组转化为字符串
- c#将xml字符串转化为 DataTable
- java实现对象转换为map、xml字符串转化为map、map转化为xml字符串
- axis调用webservice 返回xml解析
- JS解析json数据(怎么把json字符串转化为数组)
- 将数组转化为XML数据
- 字符串转化为数组
- 把Collection转化为XML
- 多线程第四篇 经典线程同步之互斥量Mutex
- input 日期控件
- 在Ubuntu中安装Redis
- 窗口最大化、最小化以及全屏显示
- mysql悲观锁总结和实践
- 用axis方式调用WebService,返回类型为字符串数组(包括把数据库数据导出存为xml,xml转化成字符串)
- ELF Header 分析
- 向量知识点总结备忘(一)
- MFC PictureCtrl
- 99乘法表 打印
- 微信、陌陌等著名IM软件设计架构
- POJ 2255 Tree Recovery(递归)
- Ubuntu 安装 Redis(转的配置)
- AD和dns