axis中WEBSERVICE请教

mdot 2003-04-03 09:17:58
我想用TOMCAT 4。03,AXIS搞个WEBSERVICE,
其中用。NET做客户端调用。。NET端输入一个SQL查询的语句,
JAVA端的WEBSERVICE根据这个查询的语句返回结果集RESULTSET,
但我在JAVA的WEBSERVICE端,用ResultSet rs=.....
的形式返回,好象AXIS不接受ResultSet的串行化,那应该如何做呢?
...全文
467 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
tianlinyi 2003-08-21
  • 打赏
  • 举报
回复
up
allmywant 2003-08-21
  • 打赏
  • 举报
回复
MARK
yobyalp 2003-04-10
  • 打赏
  • 举报
回复
呵呵、这么多例子就有够看!
加紧学习!
pstone2002 2003-04-09
  • 打赏
  • 举报
回复
再给你一个DEMO吧,这个web service虽然是从EJB里取的数据,但原理和结果集是一样的,最后用DOM把这些数据转换成XML走SOAP过去,可以参考一下。
---------------------------------------------------------------------------------
import org.w3c.dom.Element ;
import org.apache.axis.MessageContext ;
import org.apache.axis.Message ;
import org.apache.axis.SOAPPart;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;

import tradesources.emp.bannersystem.*;
import java.util.Vector;
import java.util.Collection;
import java.util.Iterator;

public class MessageService {

public Element[] echoElements(MessageContext msgC, Vector elems) {
try
{
Message m = msgC.getCurrentMessage();
SOAPPart sp = m.getSOAPPart();
sp.writeTo(System.out);
}catch(Exception e){
System.out.println(e);
}

Element[] result = new Element[1];
result[0] = getEjbData();
return( result );

/*
Element[] result = new Element[elems.size()];

for ( int i = 0 ; i < elems.size() ; i++ )
result[i] = (Element) elems.get(i);

return( result );
*/
}

public Element getEjbData()
{
try
{
java.util.Properties h = new java.util.Properties();
h.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"jrun.naming.JRunContextFactory");
h.put(javax.naming.Context.PROVIDER_URL, "localhost:2909");
javax.naming.InitialContext ctx = new javax.naming.InitialContext(h);
Object obj = ctx.lookup("BannerSystemSession");
BannerSystemSessionHome home = (BannerSystemSessionHome)javax.rmi.PortableRemoteObject.narrow(obj, BannerSystemSessionHome.class);
BannerSystemSession bannerSystemSession = home.create();

//find Collection

String keyword = "1";
int num = bannerSystemSession.findBannerInfo("STATUS='1'", "KEYWORD", keyword, null, null, null);
System.out.println(num);

String s = bannerSystemSession.getConditionStr(1, "STATUS='1'", "KEYWORD", keyword, null, null, null, 0, num, "ID");
System.out.println(s);
Collection c= bannerSystemSession.findBannerInfo("STATUS='1'", "KEYWORD", keyword, null, null, null, 0, num, "ID");
System.out.println("isNull?"+c.isEmpty());

Iterator iterator = c.iterator();
BannerSystemValue bv = null;

//XML root element "ejbdata"
DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.newDocument();
Element ejbdata = doc.createElement("ejbdata");

while(iterator.hasNext())
{
//每个bannerInfo用来组装每个BannerSystemValue
Element bannerInfo = doc.createElement("bannerInfo");

bv = (BannerSystemValue)iterator.next();

Element id = doc.createElement("id");
id.appendChild(doc.createTextNode(bv.id));
bannerInfo.appendChild(id);//添加id

Element impressions = doc.createElement("impressions");
impressions.appendChild(doc.createTextNode(bv.impressions));
bannerInfo.appendChild(impressions);//添加impressions

Element name = doc.createElement("name");
name.appendChild(doc.createTextNode(bv.name));
bannerInfo.appendChild(name);//添加name

Element linkedUrl = doc.createElement("linkedUrl");
linkedUrl.appendChild(doc.createTextNode(bv.linkedUrl));
bannerInfo.appendChild(linkedUrl);//添加linkedUrl

Element uri = doc.createElement("uri");
uri.appendChild(doc.createTextNode(bv.uri));
bannerInfo.appendChild(uri);//添加uri

Element altText = doc.createElement("altText");
altText.appendChild(doc.createTextNode(bv.altText));
bannerInfo.appendChild(altText);//添加altText

Element dimension = doc.createElement("dimension");
dimension.appendChild(doc.createTextNode(bv.dimension));
bannerInfo.appendChild(dimension);//添加dimension

Element fileFormat = doc.createElement("fileFormat");
fileFormat.appendChild(doc.createTextNode(bv.fileFormat));
bannerInfo.appendChild(fileFormat);//添加fileFormat

Element ekeyword = doc.createElement("keyword");
ekeyword.appendChild(doc.createTextNode(bv.keyword));
bannerInfo.appendChild(ekeyword);//添加keyword

Element dateStart = doc.createElement("dateStart");
dateStart.appendChild(doc.createTextNode(bv.dateStart));
bannerInfo.appendChild(dateStart);//添加dateStart

Element dateEnd = doc.createElement("dateEnd");
dateEnd.appendChild(doc.createTextNode(bv.dateEnd));
bannerInfo.appendChild(dateEnd);//添加dateEnd

Element dataCreate = doc.createElement("dataCreate");
dataCreate.appendChild(doc.createTextNode(bv.dataCreate));
bannerInfo.appendChild(dataCreate);//添加dataCreate

Element dateUpdate = doc.createElement("dateUpdate");
dateUpdate.appendChild(doc.createTextNode(bv.dateUpdate));
bannerInfo.appendChild(dateUpdate);//添加dateUpdate

Element updateBy = doc.createElement("updateBy");
updateBy.appendChild(doc.createTextNode(bv.updateBy));
bannerInfo.appendChild(updateBy);//添加updateBy

Element status = doc.createElement("status");
status.appendChild(doc.createTextNode(bv.status));
bannerInfo.appendChild(status);//添加status

ejbdata.appendChild(bannerInfo);
}
return ejbdata;


}catch(Exception e){
System.out.println(e);
return null;
}
}

/*
public Message echoElements(MessageContext msgC,Vector elems)
{
Message m = msgC.getCurrentMessage();
return m;
}
*/
}
pstone2002 2003-04-09
  • 打赏
  • 举报
回复
什么序列化的工作都不要做,AXIS都帮你做了。
Norwaywoods 2003-04-08
  • 打赏
  • 举报
回复
其实,方法肯定有的,上面说的都可以。问题是程序员要做多少工作。axis对于这种复杂类型根本无能为力,它只能提供一个优良框架,你还是必须用大量的代码来自己写序列化和反序列化的方法。(当然,这里没有反序列化,因为.NET Client传过来的String)。我觉得这种情况下就不适合使用WebService,显而易见,速度肯定慢,传输量也超大。我觉得CORBA跟加合适。不要太迷信WebService,它目前还处在一个初级阶段,只能支持一些简单类型。
careless 2003-04-08
  • 打赏
  • 举报
回复
这里面有两个问题:
1、ResultSet本身是不支持序列化的,这是因为ResultSet往往是与数据源绑定的。为了便于分布应用和ResultSet的存储,SUN发布了rowset包,其中的CachedRowSet就是对ResultSet的序列化实现类。使用起来极其方便和简单,rowset现在版本是rowset1.0ea4,发布包带有示例。
2、你的应用跨跃了两种语言,虽然都是web services,但两种语言是不能互通对象的。我所能想到的最好办法是用xml来描述你的对象特征,幸运的是你要传递的对象恰恰是二维结果集对象,把结果集转化成xml这个技术已经有好多成熟技术在用了。如Oracle的XML SQL Utility等。
Norwaywoods 2003-04-08
  • 打赏
  • 举报
回复
可是好像跟搂主的问题没关系呀!
pstone2002 2003-04-08
  • 打赏
  • 举报
回复
下面是一个WEB SERVICE的JAVA客户端的例子,各位只要把它拷备后编译(要用AXIS包)后运行,就应该可以看到从远程服务器上返回的结果,你会惊讶分布式计算的简单,这里是一个加法函数,会返回3。如果要查看WSDL,请访问:http://218.97.169.38/services/MyService?wsdl
import java.util.Vector;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.rpc.namespace.QName;
import org.apache.axis.encoding.XMLType;

public class TestClient {
public static void main(String [] args)
{
try
{
String endpoint = "http://218.97.169.38/services/MyService";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
Float i = new Float(1);
Float j = new Float(2);
call.setOperationName( "add" );
call.addParameter("i",org.apache.axis.encoding.XMLType.XSD_FLOAT,javax.xml.rpc.ParameterMode.PARAM_MODE_IN);
call.addParameter("j",org.apache.axis.encoding.XMLType.XSD_FLOAT,javax.xml.rpc.ParameterMode.PARAM_MODE_IN);
call.setReturnType( XMLType.XSD_FLOAT);
Float ret = (Float)call.invoke( new Object[] {i,j} );
System.out.println("Got result : " + ret);
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
请试一试吧!
Norwaywoods 2003-04-07
  • 打赏
  • 举报
回复
呵呵!只要的内存够大,String就不会超界。
mdot 2003-04-07
  • 打赏
  • 举报
回复
是不是这样

public ResultSet aa(String sql)
{
.....查询数据库
return rs(rs为RESULTSET)

}

public String bb(ResultSet rs)
whilr (rs.next())
String bb="";
bb=.....将rs中字段组成字符串

之后返回bb给。NET?

那String 如果很长的话,会不会超界呢?
Norwaywoods 2003-04-06
  • 打赏
  • 举报
回复
例子就没有了,我可以给你说说我的思路:你在服务端写一个方法输入参数是ResultSet的对象,在这个函数里利用java.sql.*包里面的强大功能将结果一条一条取出,并且format为一个个的字符串,最后组成字符串数组,输出。你提供WebService的那个方法,就收来自.NET客户端的SQL参数,然后组成SQL语句,并且运行得到ResultSet作为参数传入上前面的方法,返回字符给.NET的客户端。
mdot 2003-04-06
  • 打赏
  • 举报
回复
转为数组?可以的吗?能否讲个例子?
Norwaywoods 2003-04-05
  • 打赏
  • 举报
回复
Wsdl Engine就是分析Wsdl文件的程序。有点类似Wsdl4j,但是我这里说的是动态的,不是Wsdl4j这样的静态的。
x_worms 2003-04-05
  • 打赏
  • 举报
回复
不知道楼上所指的WSDL引擎是指怎么样的?
解析还是需要生成Web Service Proxy?
还是自动生成WSDL?
Norwaywoods 2003-04-05
  • 打赏
  • 举报
回复
To mdot() :
如果你要直接序列化ResultSet,难度比较大,我建议你把ResultSet转化成HashMap或者数组试试!
mdot 2003-04-05
  • 打赏
  • 举报
回复
是哪一个呢?可不可以大概实现我说的功能?
Norwaywoods 2003-04-05
  • 打赏
  • 举报
回复
有呀!Axis自带的例子,都很不错!
mdot 2003-04-05
  • 打赏
  • 举报
回复
那问题是到底现在有无比较科学合理的例子可以供我参考呢?
Norwaywoods 2003-04-05
  • 打赏
  • 举报
回复
唉~~~~~~
我感觉大家目前对WebService的了解都仅限于基本概念和使用老外的工具这个层面上呀!
不知道,有没有人写过Soap引擎或者Wsdl引擎呀!
加载更多回复(13)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧