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] 举报,一经查实,本站将立刻删除。