分享
 
 
 

用Web Services开发一个决策支持系统

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

我在网上看到有人这样评论Web Services:Web Services将使整个Internet变成桌面的后台服务。我对这样的说法深表赞同,本文就以一个虚构的出版社决策支持系统作为例子,向大家展示一下Web Services的魅力。

本文的例子,是一个出版社决策支持系统中的一项功能:此功能的目标是为外文翻译出版提供优秀外文图书的推荐,系统推荐的图书都是Amazon(或者其他网上书店)的畅销书,用户可以设定一个时间段(比如过去的两个月),系统会将这个时间段中,排名一直较高的图书推荐给用户,这样出版社可以方便的从中优选出适合国内翻译出版的书。同时图书被适当分类,每一类中又有优先级排名。

本例代码采用Java/J2EE开发,系统每经过一定的时间间隔(比如一个小时)会自动通过Web Services调用来获取Amazon当前的畅销书排名,可以取其每个分类前20位的图书信息。当然,关于获取这些信息后,如何进行整理和显示,采用何种决策支持算法获得推荐表,本文就不讨论了,我们把注意力放在如何使用Java调用Amazon的Web Services服务,以及如何获取畅销书信息上。

在开始正题之前,先介绍一下我的开发环境和工具:

操作系统:Windows 2000 Server

JDK:J2sdk 1.4.2

J2EE服务器:Apusic 3.0

Web Services开发平台:Apusic 3.0

编辑器:UltraEdit l Amazon工具包:从Amazon网站下载,还要注册一下,以获得一个” developer's token”。

首先,介绍一下系统的架构,

上图中,决策支持系统运行在J2EE应用服务器上,按照指定的时间间隔访问Amazon的Web Services服务,并把结果保存在数据库中。在这里,决策支持系统的角色就是一个Web Services的客户端。

现在,我们就直奔关键点:如何创建Web Services客户端访问程序。这里,我用的是Apusic 3.0的一个Web Services客户端程序生成工具,wsdlc,这个工具在apusic的bin目录中,它可以为我们生成所需要的客户端Stub等类。使用方法如下: wsdlc –client -keep http://soap.amazon.com/schemas3/AmazonWebServices.wsdl code 其中-client参数是要求生成客户端代码样例。参数-keep是要求保留中间生成类的源代码文件。参数中的.wsdl文档是Amazon的web services的服务描述文件地址。参数code是目标目录,用来保存生成的Stub、Client和其他数据结构类。来看看code目录里面生成的文件吧,哇,真的很多呀,居然有61个类,还有一个ServiceClient.java客户端代码模板文件。

其实,这些类大多数都是Amazon web services设计的调用参数和返回值的数据类型,大家马上要用到的是AmazonSearchPort.java和AmazonSearchService_Service_Impl.java这两个。如何使用呢?请大家打开ServiceClient.java,可以看到其中已经写了一个结构简单的main方法,

public static void main(String["> args) {

AmazonSearchService_Service service = new AmazonSearchService_Service_Impl();

AmazonSearchPort port0 = null;

try {

port0 = service.getAmazonSearchPort();

} catch (Exception ex) {

ex.printStackTrace();

}

……

从上面的代码看,AmazonSearchService_Service类用来创建一个AmazonSearchPort类型的对象,也就是客户端调用Amazon服务的代理,我们的调用都是通过这个AmazonSearchPort类的port0对象完成的。

继续向下,在main方法的剩下的部分,有很多对port0对象的方法调用,这些方法也是AmazonSearchPort类的所有方法,也就是Amazon web services提供的所有可用的方法。这里自动生成的代码仅仅是用来演示调用过程,我们还必须加入自己的代码,例如:

try {

ProductInfo ret = port0.KeywordSearchRequest(/*to complete the parameter*/);

System.out.println("The return value of KeywordSearchRequest is "+ ret);

} catch (Exception ex) {

ex.printStackTrace();

}

上面的代码使用KeywordSearchRequest方法进行关键字查询的样例,这里没有给出参数列表,需要自己添加,我们必须在AmazonSearchPort.java中去找,经过检查,这个方法的参数只有一个,是KeywordRequest类型的。于是我们可以增加适当的代码去构建一个参数,完成这个调用过程。下面是完成KeywordSearchRequest调用的例子,虽然我们的畅销书推荐功能中还用不到这个KeywordSearchRequest方法,这里仍然也展示一下,如果需要的话,大家可以参考。

try {

KeywordRequest reqs= new KeywordRequest();

reqs.setKeyword("Java");

reqs.setPage("1");

reqs.setMode("books, Computers/Internet");

reqs.setTag("webservices-20");

reqs.setType("heavy");

reqs.setDevtag("D2XX5XXXXXXX60");

ProductInfo ret = port0.KeywordSearchRequest(reqs);

System.out.println("The TotalResults is "+ ret.getTotalResults());

} catch (Exception ex) {

ex.printStackTrace();

}

上面代码中的” D2XX5XXXXXXX60”就是我们在Amazon网站上注册后获得的” developer's token”(这里的X当然不是真的了);在setTag中设置了Amazon web services的服务ID。这段代码的作用是从"books, Computers/Internet"类的图书中查找具有’Java’关键字的书,如果有超过10本的话,分成每10条一页,返回第’1’页的结果。如果要看更多的介绍,可以在Amazon工具包的API Guide中找。

好了,前面讲了KeywordSearchRequest的例子,算是讲解了Amazon服务调用的基本写法,下面我们回到主题,如何获得当前Amazon每一类图书的畅销排名呢?这就需要用到另一个方法BrowseNodeSearchRequest。先看一个例子:

BrowseNodeRequest req = new BrowseNodeRequest();

req.setBrowse_node("5"); // books, Computers/Internet

req.setPage("1");

req.setMode("books");

req.setTag("webservices-20");

req.setType("heavy");

//req.setKeywords("java");

req.setSort("+salesrank");

req.setDevtag("D2XX5XXXXXXX60");

ProductInfo ret = port0.BrowseNodeSearchRequest(req);

Details["> res = ret.getDetails();

for(int i=0; i<5; i++)

{

System.out.println((i+1)+": "+res.getProductName());

System.out.println("\t"+res.getOurPrice()+":"+res.getListPrice());

}

这个例子演示的是:搜索” books, Computers/Internet”分类中的图书(分类节点的编码是’5’),并进行’ salesrank’排序,这样就得到按照销售量从到到低排序的信息。不过上面获得的只是前十名的书,需要更多的话,就要再进行一次调用,并把req.setPage("2")。另外,如果需要的话,也可以在这个调用中添加关键字条件,如上面的setKeywords("java")。

注:Amazon API Guide参考资料中有所有常用分类节点的编码表 l

注:Amazon API Guide参考资料中有所有排序类型的表

好,到现在为止,我们的系统的主要Web services技术问题就基本讲完了,但是需要说明的是,如果调用过程发生意外,Amazon将返回一个RemoteException,这里我们用起来不是很方便,因为,无论Amazon服务器端发生了何种错误,返回的都是这个RemoteException类型,无法区分错误的原因。

所以,如果以后我们去开发一个web services服务的话,如果有可能,最好定义一些意义明确的Exception类,便于客户端的例外处理。当然,这种自定义的Web services Exception并不是每一种J2EE服务器都提供支持,Apusic 3.0是可以的。

最后,我们的畅销书推荐功能在底层Web Services调用的支持下,获得了所需要的Amazon数据,如果有其他的书店也开通这样的服务的话,我们可以采用同样的方式将他们的数据取回来,那么这个功能就更实用了。总之还是那句话,使用Web Services将使整个Internet变成桌面的后台服务。

}

这个例子演示的是:搜索” books, Computers/Internet”分类中的图书(分类节点的编码是’5’),并进行’ salesrank’排序,这样就得到按照销售量从到到低排序的信息。不过上面获得的只是前十名的书,需要更多的话,就要再进行一次调用,并把req.setPage("2")。另外,如果需要的话,也可以在这个调用中添加关键字条件,如上面的setKeywords("java")。

注:Amazon API Guide参考资料中有所有常用分类节点的编码表 l

注:Amazon API Guide参考资料中有所有排序类型的表

好,到现在为止,我们的系统的主要Web services技术问题就基本讲完了,但是需要说明的是,如果调用过程发生意外,Amazon将返回一个RemoteException,这里我们用起来不是很方便,因为,无论Amazon服务器端发生了何种错误,返回的都是这个RemoteException类型,无法区分错误的原因。

所以,如果以后我们去开发一个web services服务的话,如果有可能,最好定义一些意义明确的Exception类,便于客户端的例外处理。当然,这种自定义的Web services Exception并不是每一种J2EE服务器都提供支持,Apusic 3.0是可以的。

最后,我们的畅销书推荐功能在底层Web Services调用的支持下,获得了所需要的Amazon数据,如果有其他的书店也开通这样的服务的话,我们可以采用同样的方式将他们的数据取回来,那么这个功能就更实用了。总之还是那句话,使用Web Services将使整个Internet变成桌面的后台服务。

System.out.println("\t"+res.getOurPrice()+":"+res.getListPrice());

}

这个例子演示的是:搜索” books, Computers/Internet”分类中的图书(分类节点的编码是’5’),并进行’ salesrank’排序,这样就得到按照销售量从到到低排序的信息。不过上面获得的只是前十名的书,需要更多的话,就要再进行一次调用,并把req.setPage("2")。另外,如果需要的话,也可以在这个调用中添加关键字条件,如上面的setKeywords("java")。

注:Amazon API Guide参考资料中有所有常用分类节点的编码表 l

注:Amazon API Guide参考资料中有所有排序类型的表

好,到现在为止,我们的系统的主要Web services技术问题就基本讲完了,但是需要说明的是,如果调用过程发生意外,Amazon将返回一个RemoteException,这里我们用起来不是很方便,因为,无论Amazon服务器端发生了何种错误,返回的都是这个RemoteException类型,无法区分错误的原因。

所以,如果以后我们去开发一个web services服务的话,如果有可能,最好定义一些意义明确的Exception类,便于客户端的例外处理。当然,这种自定义的Web services Exception并不是每一种J2EE服务器都提供支持,Apusic 3.0是可以的。

最后,我们的畅销书推荐功能在底层Web Services调用的支持下,获得了所需要的Amazon数据,如果有其他的书店也开通这样的服务的话,我们可以采用同样的方式将他们的数据取回来,那么这个功能就更实用了。总之还是那句话,使用Web Services将使整个Internet变成桌面的后台服务。

}

这个例子演示的是:搜索” books, Computers/Internet”分类中的图书(分类节点的编码是’5’),并进行’ salesrank’排序,这样就得到按照销售量从到到低排序的信息。不过上面获得的只是前十名的书,需要更多的话,就要再进行一次调用,并把req.setPage("2")。另外,如果需要的话,也可以在这个调用中添加关键字条件,如上面的setKeywords("java")。

注:Amazon API Guide参考资料中有所有常用分类节点的编码表 l

注:Amazon API Guide参考资料中有所有排序类型的表

好,到现在为止,我们的系统的主要Web services技术问题就基本讲完了,但是需要说明的是,如果调用过程发生意外,Amazon将返回一个RemoteException,这里我们用起来不是很方便,因为,无论Amazon服务器端发生了何种错误,返回的都是这个RemoteException类型,无法区分错误的原因。

所以,如果以后我们去开发一个web services服务的话,如果有可能,最好定义一些意义明确的Exception类,便于客户端的例外处理。当然,这种自定义的Web services Exception并不是每一种J2EE服务器都提供支持,Apusic 3.0是可以的。

最后,我们的畅销书推荐功能在底层Web Services调用的支持下,获得了所需要的Amazon数据,如果有其他的书店也开通这样的服务的话,我们可以采用同样的方式将他们的数据取回来,那么这个功能就更实用了。总之还是那句话,使用Web Services将使整个Internet变成桌面的后台服务。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有