社区
Java EE
帖子详情
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
打赏
收藏
axis中WEBSERVICE请教
我想用TOMCAT 4。03,AXIS搞个WEBSERVICE, 其中用。NET做客户端调用。。NET端输入一个SQL查询的语句, JAVA端的WEBSERVICE根据这个查询的语句返回结果集RESULTSET, 但我在JAVA的WEBSERVICE端,用ResultSet rs=..... 的形式返回,好象AXIS不接受ResultSet的串行化,那应该如何做呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
记一次在JAVA
中
客户端使用
axis
调用
webservice
服务端出现的异常:Unmarshalling Error: For input string: ""
在使
axis
调用
webservice
服务端,参照网上给的demo: Call call = (Call) service.createCall(); call.setTargetEndpointAddress(endpoint);//设置服务请求路径 QName qn = new QName(name); call.setOperationName(qn); call.addParamet
解决基于
axis
的
webservice
问题
我是个对
webservice
,
axis
原理一点都不了解的人,可没办法老大安排下来这样的任务,只有google先模模糊糊了解一下,再寻求同事们的帮助,生成相应的WSDD等文件,对里面的一些key,value值对都不懂,为什么key是它,对应的值又为什么是它,只有看着值去猜想。 服务器端生成了,接着就进行相应的客户端调用测试,事实并不那么如我想像简单,抛出了org.xml.sax.SA...
axis
2实现
WebService
之复合类型数据的传递
接着昨天的程序,今天又进了一步,学习了
webservice
的复合类型数据的传递,尤其是教程上没有的部分,我自己尝试着写,虽说耗费了一个下午的时间,但是还是非常值的,废话少说,看招! 在实际的应用
中
,不仅需要使用
WebService
来传递简单类型的数据,有时也需要传递更复杂的数据,这些数据可以被称为复合类型的数据。数组与类(接口)是比较常用的复合类型。在
Axis
2
中
可以直接使用将Web
java
axis
中
生成客户端发现多了一个header.java,但是没有办法调用
小弟我一直在用C#作web service调用,以前我们都是这样写的,通过header把用户名密码传过去 [code="java"] Interface face = new Interface(); Header head = new Header(); head.Account = "test"; h...
webservice
Connection timed out
webservice
Connection timed out,当发生
webservice
的链接超时错误时,我想原因无非就是webclient到
webservice
之间的链接通路发生了异常,那么该如何解决呢?
Java EE
67,513
社区成员
225,879
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章