微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

webservice传递ResultSet结果

webservice只能够传递一些简单的数据,如果传递一些复杂的数据就很麻烦。这时候可以自己写bean来传递

但是像ResultSet这样的数据结构是不断变化的,写bean的话就很麻烦了,不可能每次查询都专门写一个bean

还有一种方法就是把resultset算换成XML然后再变成byte[]传递。



下面这个类是把ResultSet转换成Document:

package com.web.Beans;


import java.io.FileOutputStream;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.sqlException;


import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.Text;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;


public class XMLManager {                          //XML文件相关的处理
public  Document sql2DOC(ResultSet rs)    //把ResultSet转换成Document
{
Document doc = new Document();      //创建一个新文档
Element root=new Element("ResultSet");     //创建根节点
doc.setRootElement(root);            //设置根节点
ResultSetMetaData rsmd;
int numberOfColumns=0,i=0;
Element em=null,emn=null;
String value=null;          //存储每一列的值
//System.out.println("sql->DOC初步成功!");
try {
rsmd = rs.getMetaData();           //获取字段
numberOfColumns= rsmd.getColumnCount(); //获取字段
//System.out.println("sql->DOC,列数:"+numberOfColumns);
String[] names =new String[numberOfColumns];    //names存储列名
for(i=1;i<=numberOfColumns;i++)
names[i-1]=rsmd.getColumnName(i);              //获取每列的名称
//System.out.println("获取列名成功");
while(rs.next())
{
//System.out.println("查询结果不为空");
                 em=new Element("row");       //创建一个以每行为单位的节点
                 for(i=1;i<=numberOfColumns;i++)
                 {
                value=rs.getString(i).toString();     //获得每列的值 
                emn=new Element(names[i-1]);           //创建每列为单元的节点
                emn.addContent(value);                  //把值赋给节点
                em.addContent(emn);                     //把节点赋给每行单位的节点
                 }
                 root.addContent(em);                        //把每行赋给根节点
}
} catch (sqlException e) {
// Todo Auto-generated catch block
e.printstacktrace();

return doc;
}

public  XMLOutputter sql2XML(ResultSet rs)    //把ResultSet转换成XMLOutputter
{
Document doc = new Document();      //创建一个新文档
Element root=new Element("ResultSet");     //创建根节点
doc.setRootElement(root);            //设置根节点
ResultSetMetaData rsmd;
int numberOfColumns=0,emn=null;
String value=null;          //存储每一列的值
try {
rsmd = rs.getMetaData();           //获取字段
numberOfColumns= rsmd.getColumnCount(); //获取字段
String[] names = null;    //names存储列名
for(i=1;i<=numberOfColumns;i++)
names[i-1]=rsmd.getColumnName(i);              //获取每列的名称
while(rs.next())
{
                 em=new Element("row");       //创建一个以每行为单位的节点
                 for(i=1;i<=numberOfColumns;i++)
                 {
                value=rs.getString(i).toString();     //获得每列的值 
                emn=new Element(names[i-1]);           //创建每列为单元的节点
                emn.addContent(value);                  //把值赋给节点
                em.addContent(emn);                     //把节点赋给每行单位的节点
                 }
                 root.addContent(em);                        //把每行赋给根节点
}
} catch (sqlException e) {
// Todo Auto-generated catch block
e.printstacktrace();



XMLOutputter outputter = null; 
   Format format = Format.getCompactFormat(); 
   format.setEncoding("GB2312"); 
   format.setIndent("    "); 
   outputter = new XMLOutputter(format); 
return outputter;

}
public static void XMLtest(){  //测试创建XML文件
   try{ 
     Document doc = new Document(); 
       
     Namespace ns = Namespace.getNamespace("http://www.bromon.org"); 
     Namespace ns2 = Namespace.getNamespace("other","http://www.w3c.org"); 
       
     Element root = new Element("根元素",ns); 
     root.addNamespaceDeclaration(ns2); 
     doc.setRootElement(root); 
       
     Element el1 = new Element("元素一"); 
     el1.setAttribute("属性","属性一"); 
     Text text1 = new Text("元素值"); 
       
     Element em = new Element("元素二").addContent("第二个元素"); 
     el1.addContent(text1); 
     el1.addContent(em); 
       
     Element el2 = new Element("元素三").addContent("第三个元素"); 
       
     root.addContent(el1); 
     root.addContent(el2); 
       
     XMLOutputter outputter = null; 
     Format format = Format.getCompactFormat(); 
     format.setEncoding("GB2312"); 
     format.setIndent("    "); 
     outputter = new XMLOutputter(format); 
       
     outputter.output(doc,new FileOutputStream("C:\\a.xml")); 
   }catch(Exception e){ 
     e.printstacktrace(); 
   } 
 } 
}


下面这个类就是把Document转换成ByteArrayOutputStream:

package com.web.Beans;


import java.io.bufferedoutputstream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;


import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.jdom.xpath.XPath;


/**
*JDOM解析XML
*@FileName:JDomXML.java
*@DATE 2008-02-03
*
*/


public class JDomXML
{
 /**
 * 定义xml编码方式
 */
 public static final String ENCODING_GBK="GBK";
 public static final String ENCODING_UTF8="UTF-8";
 public static final String ENCODING_UTF16="UTF-16";
 public static final String ENCODING_GB2312="gb2312";
 public static final String ENCODING_ISO8859="ISO8859-1";
 
 private static Format format=Format.getCompactFormat();       
 
 static{
format.setEncoding(ENCODING_GB2312);        //该句可以解决汉字乱码问题
 }
 
 /**
 * 通过给定的xml文件名来读取并且解析它
 *@param filepath要解析的xml文件路径
 *@return the JDOM document parsed from thd file.
 *@throws IOException
 * 
 */
 
 public static Document readDocument(String filePath)throws IOException
 {
  try{
   SAXBuilder builder=new SAXBuilder(false);
   Document doc=builder.build(new File(filePath));
   return doc;
  }catch(Exception ex){
   ex.printstacktrace();
   throw new IOException(ex.getMessage());
  }
 }
 
  
 /**
 * 通过InputStream来读取并且解析它
 *@param input  输入流
 *@return the JDOM document parsed from thd file.
 *@throws IOException
 * 
 */
 public static Document readDocument(InputStream inputStream)throws IOException
 {
  try{
   SAXBuilder builder=new SAXBuilder(false);
   Document doc=builder.build(inputStream);
   return doc;
  }catch(Exception ex){
   ex.printstacktrace();
   throw new IOException(ex.getMessage());
  }
 }
 
 /**
 *读取xml文件
 *@param srcFile 目标文件
 *@return the JDOM document parsed from thd file.
 *@throws IOException
 * 
 */
 
 public static Document readDocument(File srcFile)throws IOException
 {
  try{
   SAXBuilder builder=new SAXBuilder(false);
   Document doc=builder.build(srcFile);
   return doc;
  }catch(Exception ex){
   ex.printstacktrace();
   throw new IOException(ex.getMessage());
  }
 }
 


 /**
 * 将xml文档模型输出到标准输出设备(流)
 * @param document 指定的xml文档模型
 */
 public ByteArrayOutputStream outputDocumentbyte (Document document) {
System.out.println("进入outputDocument");
format.setIndent(" ");
format.setExpandEmptyElements(false);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
XMLOutputter outputter = new XMLOutputter(format);
try {
outputter.output(document,bout);
//outputter.output(document,new FileOutputStream("c:/testxml.xml"));
} catch (Exception e) {
    e.printstacktrace();
}
return bout;
 }
 
 /**
  * 将xml文档模型输出到标准输出设备(流)
  * @param document 指定的xml文档模型
  */
  public OutputStream outputDocument (Document document) {
 ByteArrayOutputStream bout= outputDocumentbyte (document);
  return (OutputStream)bout;
  }
 
 /**
 * 将xml文档模型输出到指定文件
 * @param document 指定的xml文档模型
 * @param outputFilePath 输出文件路径
 */
 public static void outputDocumentToFile(Document document,String outputFilePath) {
 outputDocumentToFile(document,outputFilePath,ENCODING_GB2312);
 }
 

 /**
 * 将将xml文档模型输出到指定字符串
 * @param document 指定的xml文档模型
 * @return 返回document的内容
 */
 public static String outputDocumentString(Document document){
 
 return outputDocumentString(document,ENCODING_GBK);
 }
 
 /**
 * 将将xml文档模型输出到指定字符串
 * @param document 指定的xml文档模型
 * @param encodingMode 编码格式
 * @return 返回document的内容
 */
 public static String outputDocumentString(Document document,String encodingMode){
 format.setEncoding(encodingMode);
 format.setIndent(" ");
 format.setExpandEmptyElements(false);
 XMLOutputter outputter = new XMLOutputter(format);
 return outputter.outputString(document);
 }

 }


然后webservice调用上面的2个类:

package com.web.services;


import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.sql.ResultSet;


import org.jdom.Document;


import com.web.Beans.JDomXML;
import com.web.Beans.XMLManager;
import com.web.manager.ColumnManager;


public class ColumnService {             //栏目相关的services
ColumnManager colm=new ColumnManager();                //这个类是栏目处理的类,替换成为自己的就OK了
XMLManager xmlm=new XMLManager();
JDomXML jx=new JDomXML();
public byte[] getInforById(String columnid,  //通过栏目Id来获得栏目的相关信息
    String lev1id)
{
//System.out.println("连接webservice成功!");
ResultSet rs=colm.getInforById(columnid,lev1id);
//System.out.println("查询数据库成功!");
Document doc=xmlm.sql2DOC(rs);
//System.out.println("sql->DOC成功!");
ByteArrayOutputStream boutput=jx.outputDocumentbyte(doc); 
System.out.println("数据库结果:"+boutput.toString());
//System.out.println("DOC->output成功!");
byte[] bt=boutput.toByteArray();
//System.out.println("ByteArrayOutputStream->byte[]成功!");
return bt;
}
}
 



然后客户端接受byte[]:

package com.web.test.stubs;


import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.net.URL;


import org.apache.axis.client.Call;
import org.apache.axis.client.Service;


public class DatabaseClient {    //数据库测试
public static void main(String argss[]) throws Exception
{
Service s = new Service();    
   Call call = (Call)s.createCall();
   call.setTargetEndpointAddress(new URL("http://localhost:8080/axis/services/columnservice?wsdl"));
   call.setoperationName("getInforById");
   byte[] result = (byte[])call.invoke(new Object[]{"1","0"});
   InputStream in=new ByteArrayInputStream(result);              //byte[]转换成InputStream,有待于解析XML 文件使用    String Sresult = result.toString();           //System.out.println(result);    System.out.println(Sresult); } }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐