posts - 32, comments - 153, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

     摘要: 根据Ajax in Action书进行调整,修改了原书上的错误,调试通过。
可重用的Ajax输入提示类,功能类似Google的输入提示  阅读全文

posted @ 2007-02-01 22:39 Zou Ang 阅读(3908) | 评论 (7)编辑 收藏

     摘要: JSP与Tomcat乱码解决方法  阅读全文

posted @ 2007-01-23 21:12 Zou Ang 阅读(4348) | 评论 (6)编辑 收藏

经常开各种各样的会议,要达成共识很不容易,尤其技术会议更是容易吵架。旧年最后一天,写点关于“开会”的想法。

首先,要注意听别人发言。尽量不要打断别人的发言,抓住对方的主要思想和依据。不要带着偏见听,有时候可能觉得对方不如你,但是不代表他现在说的就不对。把口头禅从“不,……”改成“对,……”,即使有时候你不同意他的观点,但是先肯定一下,可以缓和很多气氛。

然后,尽量先把自己的理论基础表达清楚,有时候争了半天,发现两个人想法是一样的,不过是换了种表达方式……

最后,不要长篇大论,给别人一个插口的机会。有些人讲话,喜欢停顿一下,然后在别人马上要开口讲话的时候接着讲。我很反感这种人,耍猴呢啊?给别人一个提出意见和疑问的机会。尽量把自己放到讨论的主导地位上来,就是说,要慢慢地让大家围绕着你的观点提问题,然后你再来进行解答。但是千万不要不让别人说话,有时候给别人机会说话对自己理清思路也非常有好处。

最近看一本叫《人件集-人性化的软件开发》的书,里面第一篇文章就讲如何作出决策和达成一致意见。一致意见应该做到综合各方的优点,而不应该是各方意见的“折衷”。书里有一个稍显极端的例子:假如你的团队正在开发一个图形用户界面的项目,一部分人强烈建议直接将控制按钮放在屏幕底部,而另一部分人建议在屏幕左侧放置一个控制窗口。两种意见中,一个是水平放置,一个是垂直放置,形成了两个极端。那么一个最具代表意义的折衷方案就是,将控制按钮沿着对角线放置在屏幕的中央。在很多时候,由折衷所产生的解决方案比任何一个原始方案都差劲,但是“技术性一致意见”就恰恰相反,它所产生的解决方案要比任何一个原有的方案都好。书上给的“一致意见”解决方法是给控制按钮窗体加上选项,让用户来决定是水平放置还是垂直放置。

在团队中的表现是很重要的,通过一个团队来改变团队中的个体,要比单独改变一个个体容易得多。所以在团队中发挥影响,比单独对每一个人发挥影响要有用得多。

有人说软件工程更像是“社会学”,而不是“工程学”,我也越来越有这种感觉了。

posted @ 2006-12-31 15:22 Zou Ang 阅读(1438) | 评论 (3)编辑 收藏

圣诞到了,祝所有的朋友圣诞快乐!!

posted @ 2006-12-24 14:05 Zou Ang 阅读(288) | 评论 (0)编辑 收藏

原贴地址:
http://news.csdn.net/n/20061221/99748.html

从根本上说,面向服务的架构能够使企业内部动态数据服务的创建变得更加方便,同时,还能够使企业开发人员创建影响这些服务的复合应用程序。Web2.0提供了一个丰富的Web体验,用户能够以高效的、充满希望的、有益的方式参与合作。

  如果我们把这两个现象结合起来,那么,通过企业社团成员之间的互相交流,以及成员与不断变化的企业数据之间的交互,我们就能够实现这一关键的提高效率的新方法。

  协作型企业相互融合,下一代的Web应用程序也已露端倪,但是,开发团体的推测是,为了实现明显的利益,企业所采用的各种技术之间存在着根本性 的差异。标准必须朝哪个方向发展才能够满足SOA与Web2.0概念的结合,为了更好的理解这个问题,我们将致力于检验Java表示技术的状态。

  Ajax化JavaServer Faces

  标准奠定了SOA的基本结构,但是,在Web2.0的世界中却不存在着标准。为了支持Web2.0的功能,市场上出现了太多的方法,其中大多数 在JavaScript的实现(影响Ajax的技术)上却非常繁杂。在Java EE的规范中,JavaServer Faces提供了表示层,但是,相比起Ajax技术和Web2.0概念的流行,它目前的修订版出现的更早。

  事实证明,在组件层,JSF中的可扩展组件架构非常适合与Ajax技术协同使用,但是,组件层Ajax技术存在的问题是,它们是存在于狭小的规 避JSF生命周期的交互空间内。解决这一问题所需要的是,一种更加全面的方式,以实现在JSF生命周期内的Ajax交互。具体来说,有以下两点需要着重阐 述。

  1.改进的用户交互模型: 在JSF中,目前的用户交互模型是基于表格的,它过于粗略而无法传输丰富的Web2.0特性。组件层的Ajax交互粒度,以及JSF目前依赖的基于表格的子任务模型,这两者之间存在着显著的差异。交互类型应当包含以下几种形式:

  •   纯粹的本地客户端JavaScript交互,没有服务器通信、不需要执行JSF生命周期。这种类型的例子可以是,在日期选择组件中通过日历来进行导航。目前,通过组件层JavaScript实现能够支持这个模型。
  •   组件层的Ajax交互,不需要执行JSF生命周期。这种类型的例子可以是,基于当前用户在文本框中的输入,从而形成一个列表。这里的关键是,用户与组件的交互仅仅影响到该组件的表示。同样,目前,通过组件层JavaScript实现能够支持这个模型。
  •   组件层的提交,引发JSF生命周期的执行。生命周期的执行结果将成为新的表示,该表示可能会影响到页面中的多种组件。这这种类型的例子可以是,在日期选择组件中完成日期的选择,结果是引发显示不同的日期安排信息。目前在JSF中,还无法支持这种形式的交互。

  2. 增量表示更新: 为了使用Ajaxian 方式(不是页面刷新)实现第三种交互模型,JSF需要一个增量更新机制,仅仅是把页面中应用到的表示层所做的必要修改从一个表现处理传向下一个表现处理。 下面这个图示表明了这个概念。它需要一个Ajax桥,在服务器端把表示的改变组合起来,在客户端的DOM把那些变化重组。

JSF Push模式

  Ajaxified JSF实现和多数其它的Ajax方式从遗留的Web应用程序模型中继承了一个共同的特征,该模型是一个客户端发起的交互模型。这意味着,客户端的表示层只需要针对用户与表示层的交互进行相应变化。

  与使用遗留应用程序相比,使用Ajax技术,这个交互是细粒度的,但是,它仍然是客户发起的。现在,当你检验支持应用程序的SOA数据模型的动 态特性、了解众多同步用户采用这一动态数据所进行的协调互操作时,你就能够意识到,在客户端推动动态表示变化的机制是非常重要的,这一点越来越清晰。它是 达到Web2.0模型所需要的真正的动态特性的唯一途径。

在产业中已经证明,对于JSF规范与一个表示push模型的协作来说,Ajax push技术,也指Comet,是十分必要的。前文已经描述的这个增量更新特性,提供了在实现JSF Push模式时所需要的基于Ajax的更新机制。除此之外,当应用程序逻辑发现出现了一些将会影响客户端表示层状态的变化时,延长JSF的生命周期来允许 一个强制的表现处理是很有必要的。

虽然,JSF push模型相对而言实现起来更加容易,但是,生产经验表明,为使得开发人员能够有效继承,仅仅暴露JSF API中底层强制的表示机制是远远不够的。关于基本的push机制,JSF规范很有必要对表现API进行介绍,从而呈现给开发人员一个清晰有效的机制,用 于请求强制表示。API尤其需要提供以下几个方面:

  1.触发的表现:应用程序开发人员应当能够在发出表示处理请求的业务逻辑中定义触发点。

  2. 群组表现: 一个触发点能够影响一个单一客户端、多个客户端,或者是所有连接到该应用程序上的客户端。因此,为触发表现提供群组管理结构,这是很有必要的。

  3. 预定的表现:有许多合适的计划机制应当被支持,包括,按需表现、推迟表现,以及内部表现。预定的表现架构应当具备可扩展性,以支持其他用户预先设定的需 求。很重要的一点是,触发表现机制应当能够更加有效的传输。由于存在着大量的触发,它们潜在地以各种方式影响着客户端,因此,管理表现的处理这一任务不能 仅仅落在开发人员身上。触发表现的实现,必须有效地合并表现处理请求、处理必要的同步,而且,这些操作都是以一种线程有效的方式。

  多视图支持

  现存的为JSF定义的阶段和需求范围,根本不足以支持满足Ajax的JSF应用程序——用户能够在同一应用程序上获得多个活动视图。阶段范围能 够维护所有视图共同的状态,但是,它不足以处理视图之间不同的状态。由于多个同步请求都必须是活动状态,所以,需求范围也不充分。因此,需要一个新的范 围,来管理满足Ajax 的JSF应用程序的会话方面。JBoss的Seam 方案提出了会话范围,它主要提供JSF中所需要的额外范围。除了支持多视图之外,会话范围还能够带来其他优势,例如,在应用程序中,通过会话中对一系列用 户交互的明确描述,就能够有效地支持书签和返回按钮特性。

  长期存在的HTTP请求

  回到前面所提到的push模型,你可能注意到,机制需要一个特殊的HTTP请求,它能够异步地响应从应用程序中发出的触发表现出理请求。依据更 新的频率,这个特殊HTTP请求能够长期存在。由于在响应之前,每一个请求都占用其线程,所以,在处理这个长期存在的请求时,现存的Servlet模型无 法很好的响应。因此,为了支持push模型,必须对Servlet模型进行改变,使它能够以线程有效的方式来处理长期存在的请求。再强调一次,有很多生产 方案与异步Servlets和HTTP服务器相关,Java EE规范能够在此基础上定义一个解决方案。

  结论

  人们仍然有些质疑:SOA与Web2.0世界将会发生抵触,新一代的协作型企业应用程序已露端倪。也存在着这样的质疑,现存的Java EE规范无法完全处理Web2.0提出的请求,以及JSR处理必须开始在直接项中考虑这些请求。然而,产业中的重大进步,已经能够处理出现的请求,并且能 够实现扩展现存Java EE基础结构的商业化的可行方案。即将使用JSR 172来生成JSF2.0规范,非常重要的是,包含Ajax特性,以及产业参与者贡献相关技术,来确保能够及时做出基于标准的解决方案。

posted @ 2006-12-23 17:39 Zou Ang 阅读(578) | 评论 (0)编辑 收藏

原帖地址:
http://www.blogjava.net/errorfun/archive/2006/12/09/86584.html
乱码问题好像跟我们中国程序员特别有缘,一直困扰着我们,从开始的JSP乱码问题,STRUTS乱码问题,到现在的AJAX乱码问题,无一不是搞得许多程序员焦头烂额的,整天骂XXX产品对中文支持不了,UTF-8无法使用中文啊什么的,其实这里面被骂的产品中其实99%以上是对中文支持非常好的,而出现乱码的原因只是因为自身对国际化支持以及文件编码等信息的认识不知造成的。要知道一个产品那么流行,怎么可能对中文支持不了呢,下面就开始一一帮大家解决这些问题。


1
、编码
      --
想要解决好中文问题,对编码肯定是不能一概不懂了,编码是解决中文乱码问题的根本。
      
编码比较常用的有: UTF-8 GBK GB2312 ISO-8859-1 ,除了 iso-8859-1 之外的其它三个编码都能很好的支持中文,但它们都兼容 ISO-8859-1 的编码(就是说无论编码怎么改变,只要是 ISO-8859-1 中的字符,永远不会出现乱码)。
     
这四种编码中, GB2312 是中国规定的汉字编码,也可以说是简体中文的字符集编码 ; GBK GB2312 的扩展 , 除了兼容 GB2312 外,它还能显示繁体中文,还有日文的假名 ; UTF-8 虽然也支持中文,但却 GB 码不兼容(编码值不同) UTF-8 使用的是可变长的 UNICODE 编码,编码可能是 1 16 进制(即 ISO-8859-1 中的字符,其编码也是相同的)也有可能是 2 位或 3 位的 16 进制。 UTF-8 的优点是: 1 CPU 字节顺序无关 , 可以在不同平台之间交流。 2 、容错能力高 , 任何一个字节损坏后 , 最多只会导致一个编码码位损失 , 不会链锁错误 ( GB 码错一个字节就会整行乱码 ) ,所以在国际化处理中基本都是建议使用 UTF-8 作为编码。

2、文件的编码
      --虽然说只要设置了正确的编码就可以使字符正确显示了,但如果忽略了文件保存时的编码的话,那可是会让你走进迷雾中的。
      文件编码最常使用的有两种:ANSI和UTF-8,光看名字估计你都可以猜到了,ANSI就是我们保存文件时使用的默认编码,而UTF-8则需自己设置。对于编码的改变,我使用的工具是NOTEPAD和ECLIPSE,NOTEPAD使用最简单,只要打开文件后在另存为中选择相应的编码就行了,而且它对编码的支持非常好;而在ECLIPSE中,只要稍微设置一下就行了,打开首选项,然后选择:常规->内容类型(ContentType),在右边选中你想改变保存编码的文件类型,然后在下方的缺省编码中改变其值,最后点击更新(UPDATE)按钮即可。



而在其它的编辑器中,默认保存的内容都是GB2312或者GBK(NOTEPAD中对应ANSI).而根据前面所说的UTF-8和GBK,GB2312等的编码值是不同的这一点,可以知道,如果文件使用了UTF-8,那么字符编码就必须使用UTF-8,否则编码值的不同就可能造成乱码。而这也就是为什么那么多的人使用了UTF-8编码后还会产生乱码的根本原因。(JS和JSP都是这个道理)

3、JSP,STRUTS等的中文乱码解决方案
     其实解决的方法只有一个:

 request.setCharacterEncoding(encoding);

   方法只有一种,但处理方式就多种多样了,初学者会在JSP页面上直接使用,而有经验的程序员会使用过滤器。而现在所要说的方法也是过滤器。这里以统一使用UTF-8作为编码作为例子说明。具体过程就不多说了,网上有很多教程。偷懒一点的,到TOMCAT中复制就行了。在TOMCAT的目录下的\webapps\jsp-examples\WEB-INF\classes\filters\找到SetCharacterEncodingFilter.java 这个类,放到你的程序中并配置好映射路径。配置好后基本上你的乱码问题就解决了。但要映射路径中需要注意的就是不能使用 '*'

   < filter-mapping >
    
< filter-name > Set Character Encoding </ filter-name >
    
< servlet-name > * </ servlet-name >
  
</ filter-mapping >

像上面这样配置的话(可能也是网上大多教程的做法,想当年也是害苦了我),可能你只有JSP的乱码解决了,要解决STRUTS的乱码需要映射 *.do 或者 servletActionName。然后在初始化参数中设置encoding的值就行了。

< init-param >
      
< param-name > encoding </ param-name >
      
< param-value > UTF-8 </ param-value >
</ init-param >

当然,最重要的是要记得根据前面所说的方法,改变你所使用的编辑器保存文件的编码要与使用的字符编码一致。
而在JSP内容中,还是使用如网上教程所说的那种技俩,在所有页面的页首加入:

<% @ page language = "java" contentType = " text / html; charset = UTF - 8 "
    pageEncoding
= "UTF - 8 " %>

至此,相信JSP,ACTION都不太可能出现乱码了。

4、资源文件的乱码解决方案
      资源文件谁都知道是国际化支持不可或缺的一部分,如果资源文件都出现乱码了那还了得?其实资源文件的乱码是很好解决的,其原因也是因为使用了UTF-8做为JSP编码后,没有相应地改变资源文件的文件编码造成的,所以只要对资源文件保存的编码进行更正后,乱码问题也就解决了。当然,你的中文要使用 native2ascii 命令进行正确的转换。

5、调用JS时,JS内容乱码的解决方案。
     其实JS的乱码还是跟文件的编码有关系的,如果JS中有中文的话,那JS文件保存的编码就必须跟调用此JS的页面编码相同,否则,你的所有中文都要从JSP页面传给JS才会显示正常。可以看出对于调用JS出现的乱码是最容易解决的(也是建立在前面的辛苦之下的)。

6、AJAX提交数据乱码,返回数据乱码的解决方案
     随着AJAX的流行,乱码问题也开始困扰着许多刚开始使用它的程序员,幸好我之前对JSP乱码有过一点研究,在遇到AJAX后,并没有给我带来多大的困扰,在此将我的一些心得共享给大家。
     万变不离其宗,AJAX的乱码问题自然跟编码有关了,其实很多人跟我一样想到了对文件编码进行设置,并且在接数据时设置了requet的编码,在返回的数据时设置了response的编码一切都以为会很顺利,可是这一切都是徒劳无功的,讨厌的乱码再一次出现在你眼前。在你试了N多种方法,包括JS自身的escape,unescape方法后,你发现乱码仍然猖狂地出现在屏幕上。
    其实在试过这N多方法后,很多人都没发现,解决的方法其实很简单,而且其答案就在我们之前处理的JSP乱码之中。让我们先看一下AJAX的经典请求代码

xmlhttp.open( "post", url, async );
xmlhttp.setRequestHeader( 
"Content-Type""text/html"
 );
xmlhttp.send( params );

通过前面的说明,不知道你现在看出端倪了没有。不知道是受了网上教程的影响还是其它方面影响,setRequestHeader并是万年不变的,也没人想过去改它,而问题就正好出在这个地方。回想一个JSP页面内容的编码设置,其中有这么一节:
contentType="text/html; charset=UTF-8"

现在知道问题了吧,所以我们要把第二句代码改为:
xmlhttp.setRequestHeader( "Content-Type""text/html;charset=UTF-8" );

最后别忘了在返回数据时也设置上:
response.setContentType( "text/xml" );
response.setCharacterEncoding( 
"UTF-8" );

是不是很简单,一点都不麻烦呢?
如果要问为什么的话,其实我们可以把xmlhttp看成是一个临时页面,它由浏览器动态生成,主要作用是在后台获得请求的数据(可以看成是一个高级的iframe)。所以对于普通页面设置的编码,对它也要同样设置。而在servlet中返回数据为什么要设置contentType和encoding其道理也是一样的。众所周知,jsp的最后形态就是servlet,而jsp页首设置的那个内容其实也就是让生成的servlet中生成这么两句话:
response.setContentType( "text/html" );
response.setCharacterEncoding( 
"UTF-8" );

而pageEncoding则是跟jvm说明了这个页面的内容要使用什么编码保存(这跟之后生成的CLASS有关系)。所以在servlet设置response的编码也是理所当然的了。

一口气把自己一年以来遇到的乱码问题和解决的方案写出来了,希望对你有所帮助。

posted @ 2006-12-11 11:04 Zou Ang 阅读(3274) | 评论 (11)编辑 收藏

好象转眼间,大三也要过去一半了..毕业的日子也隐隐可见了,到底要怎么走呢..本来一心打算出国,但是考虑到需要6个月左右的时间来准备GRE,就觉得不太值得了.用6个月学习英语,而且还不是说GRE考好了就能去好学校,那有必要么?头脑中一团乱麻...

posted @ 2006-12-09 09:27 Zou Ang 阅读(325) | 评论 (1)编辑 收藏

今天去聼了MS的軟件過程技術的課,講的是軟件設計。其實這兩天聼下來的感覺,就是以客戶為中心,已滿足客戶作爲第一要求,永遠要優先考慮“Money and Time"。然後到了工程的方面,也就是面向“技術”的方面,那就是做設計不要只做一個,至少要有一個alternative的design。先盡量將問題“量化”,盡可能細緻地描述要做的東西,也就是要把requirement變成specification,這種規格的粒度需要自己控制,最好能做到設計做完以後,拿給SDE的時候,他會有一種強烈的開始寫代碼的衝動。

其實,工科,我覺得永遠都要考慮到實際的環境。畢竟現實世界不是理想囯,我們能做到的,就是在有限的條件下,綜合考慮所有的因素,然後給出性價比最高的方案。

ps.今天沒拿到U盤,很遺憾

posted @ 2006-12-06 22:42 Zou Ang 阅读(269) | 评论 (0)编辑 收藏

今天在学习Web Service的时候得知Amazon提供了一个搜索的Web Service,于是考虑写一个方法访问一下看看..
Amazon Web Service 的WSDL: http://soap.amazon.com/schemas2/AmazonWebServices.wsdl
得到了WSDL以后,在命令行执行:
java org.apache.axis.wsdl.WSDL2Java http://soap.amazon.com/schemas2/AmazonWebServices.wsdl
就会在%AXIS_HOME%目录下生成一个包结构:com.amazon.soap.*;里面有很多包,不过如果看了上面那个wsdl的话应该知道主要的类是
AmazonSearchService和AmazonSearchPort,前面是服务,后面是调用方法的对象..

AmazonSearchService:
public interface AmazonSearchService extends javax.xml.rpc.Service {
    
public java.lang.String getAmazonSearchPortAddress();

    
public com.amazon.soap.AmazonSearchPort getAmazonSearchPort() throws javax.xml.rpc.ServiceException;

    
public com.amazon.soap.AmazonSearchPort getAmazonSearchPort(java.net.URL portAddress) throws javax.xml.rpc.ServiceException;
}

AmazonSearchPort:
package com.amazon.soap;

public interface AmazonSearchPort extends java.rmi.Remote {
    
public com.amazon.soap.ProductInfo keywordSearchRequest(com.amazon.soap.KeywordRequest keywordSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo powerSearchRequest(com.amazon.soap.PowerRequest powerSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo browseNodeSearchRequest(com.amazon.soap.BrowseNodeRequest browseNodeSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo asinSearchRequest(com.amazon.soap.AsinRequest asinSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductLine[] blendedSearchRequest(com.amazon.soap.BlendedRequest blendedSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo upcSearchRequest(com.amazon.soap.UpcRequest upcSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo authorSearchRequest(com.amazon.soap.AuthorRequest authorSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo artistSearchRequest(com.amazon.soap.ArtistRequest artistSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo actorSearchRequest(com.amazon.soap.ActorRequest actorSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo manufacturerSearchRequest(com.amazon.soap.ManufacturerRequest manufacturerSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo directorSearchRequest(com.amazon.soap.DirectorRequest directorSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo listManiaSearchRequest(com.amazon.soap.ListManiaRequest listManiaSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo wishlistSearchRequest(com.amazon.soap.WishlistRequest wishlistSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ListingProductDetails exchangeSearchRequest(com.amazon.soap.ExchangeRequest exchangeSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.MarketplaceSearch marketplaceSearchRequest(com.amazon.soap.MarketplaceRequest marketplaceSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.SellerProfile sellerProfileSearchRequest(com.amazon.soap.SellerProfileRequest sellerProfileSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.SellerSearch sellerSearchRequest(com.amazon.soap.SellerRequest sellerSearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ProductInfo similaritySearchRequest(com.amazon.soap.SimilarityRequest similaritySearchRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ShoppingCart getShoppingCartRequest(com.amazon.soap.GetShoppingCartRequest getShoppingCartRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ShoppingCart clearShoppingCartRequest(com.amazon.soap.ClearShoppingCartRequest clearShoppingCartRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ShoppingCart addShoppingCartItemsRequest(com.amazon.soap.AddShoppingCartItemsRequest addShoppingCartItemsRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ShoppingCart removeShoppingCartItemsRequest(com.amazon.soap.RemoveShoppingCartItemsRequest removeShoppingCartItemsRequest) throws java.rmi.RemoteException;
    
public com.amazon.soap.ShoppingCart modifyShoppingCartItemsRequest(com.amazon.soap.ModifyShoppingCartItemsRequest modifyShoppingCartItemsRequest) throws java.rmi.RemoteException;
}


我打算调用keywordSearchRequest这个方法,这个方法有一个keywordRequest参数,返回一个ProductInfo对象
public com.amazon.soap.ProductInfo keywordSearchRequest(com.amazon.soap.KeywordRequest keywordSearchRequest) throws java.rmi.RemoteException;
下面是调用Web Service的类:
/**
 * org.zsu.zouang
 * 2006-11-30
 
*/

package org.zsu.zouang;

import java.rmi.RemoteException;

import javax.xml.rpc.ServiceException;

import com.amazon.soap.AmazonSearchPort;
import com.amazon.soap.AmazonSearchServiceLocator;
import com.amazon.soap.Details;
import com.amazon.soap.KeywordRequest;
import com.amazon.soap.ProductInfo;

/**
 * 2006-11-30
 * 
@author Zou Ang
 * Contact <a href ="mailto:richardeee@gmail.com">Zou Ang</a>
 
*/

public class MyAmazonClient {

    
/**
     * 
@param args
     
*/

    
public static void main(String[] args) {
        KeywordRequest keyword 
= new KeywordRequest();
        keyword.setKeyword(
"Java");
        keyword.setMode(
"books");
        keyword.setTag(
"D3HW0PG66IPLAM");
        keyword.setDevtag(
"D3HW0PG66IPLAM");
        keyword.setPage(
"1");
        keyword.setType(
"heavy");
        keyword.setSort(
null);
        keyword.setVariations(
null);
        keyword.setLocale(
null);
        
// TODO Auto-generated method stub
        try {
            AmazonSearchPort port 
= new AmazonSearchServiceLocator().getAmazonSearchPort();
            ProductInfo info 
= port.keywordSearchRequest(keyword);
            System.out.println(
"Number of Results :" + info.getTotalResults());
            Details[] details 
= info.getDetails();
            
for(Details d : details){
                System.out.println(
"ISBN :" + d.getIsbn() + " Name:" + d.getProductName());
            }

        }
 catch (RemoteException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (ServiceException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}
返回的结果:
- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
Number of Results :
5161
ISBN :
0072253606 Name:SCJP Sun Certified Programmer for Java 5 Study Guide (Exam 310-055) (Certification Press Study Guides)
ISBN :
0596007124 Name:Head First Design Patterns (Head First)
ISBN :
0553803905 Name:Ship of Ghosts: The Story of the USS Houston, FDR's Legendary Lost Cruiser, and the Epic Saga of Her Survivors
ISBN :0596009410 Name:Mac OS X Tiger: Missing Manual
ISBN :
0596101996 Name:JavaScript: The Definitive Guide
ISBN :
0131483986 Name:Java How to Program (6th Edition) (How to Program (Deitel))
ISBN :
0596009208 Name:Head First Java, 2nd Edition
ISBN :
1591968097 Name:What is WebSphere? Java, J2EE, Portal and Beyond! (Demystifying IBM's Middle Tier Technology, Vol. 1)
ISBN :0596005407 Name:Head First Servlets and JSP: Passing the Sun Certified Web Component Developer Exam (SCWCD)
ISBN :
1932394613 Name:Ajax in Action

下一步可能打算写个GUI的Amazon搜索客户端

posted @ 2006-11-30 23:32 Zou Ang 阅读(753) | 评论 (1)编辑 收藏

昨天把Web服务架好了,那今天自然要想怎么来远程调用了.
于是写了如下代码:
/**
 * org.zsu.zouang
 * 2006-11-29
 
*/

package org.zsu.zouang;

import java.net.MalformedURLException;
import java.net.URL;
import java.rmi.RemoteException;

import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

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

/**
 * 2006-11-29
 * 
@author Zou Ang
 * Contact <a href ="mailto:richardeee@gmail.com">Zou Ang</a>
 
*/

public class MyBookServiceClient {
    
private static final String endPoint = "http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws?wsdl";
    
public static void main(String args[]){
        Service service 
= new Service();
        
try {
            Call call 
= (Call)service.createCall();
            call.setTargetEndpointAddress(
new URL(endPoint));
            call.setOperationName(
new QName("getBookTitle"));
            String result 
= (String)call.invoke(new Object[]{"0130895601"});
            System.out.println(result);
        }
 catch (ServiceException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
 catch (MalformedURLException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }
catch(RemoteException e){
            e.printStackTrace();
        }

    }

}

控制台输出:
- Unable to find required classes (javax.activation.DataHandler and javax.mail.internet.MimeMultipart). Attachment support is disabled.
Advanced Java 
2 Platform How to Program
成功啦!
在代码中加上这一句:
System.out.println(call.getResponseMessage().getSOAPPartAsString());
会看到控制台输出:
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    
<soapenv:Body>
    
<getBookTitleResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
        
<getBookTitleReturn xsi:type="xsd:string">
            Advanced Java 2 Platform How to Program
        
</getBookTitleReturn>
    
</getBookTitleResponse>
    
</soapenv:Body>
</soapenv:Envelope>

改进了一下,使用Swing建立一个图形化界面:
/**
 * 2006-11-29
 * 
@author Zou Ang
 * Contact <a href ="mailto:richardeee@gmail.com">Zou Ang</a>
 
*/

public class MyBookClient extends JFrame {

    
private final static int FRAME_WIDTH = 500;
    
private final static int FRAME_HEIGHT = 100;
    
    
public MyBookClient(String title) {
        
super(title);
        getContentPane().setLayout(
new GridLayout(2 , 2));
        
final String endPoint = "http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws?wsdl";
        
final JLabel resultLabel = new JLabel();
        
final JComboBox bookISDNBox = new JComboBox();
        bookISDNBox.addItem(
"0130895601");
        bookISDNBox.addItem(
"0430895717");
        bookISDNBox.addItem(
"0430293636");
        bookISDNBox.addItem(
"0130923613");
        
        
this.setSize(FRAME_WIDTH, FRAME_HEIGHT);
        JButton serviceButton 
= new JButton("Get Book Title");
        serviceButton.addActionListener(
new ActionListener(){

            
public void actionPerformed(ActionEvent e) {
                
// TODO Auto-generated method stub
                try {
                    Service service 
= new Service();
                    Call call 
= (Call)service.createCall();
                    call.setTargetEndpointAddress(
new URL(endPoint));
                    call.setOperationName(
new QName("getBookTitle"));
                    String result 
= (String)call.invoke(bookISDNBox.getSelectedObjects());
                    resultLabel.setText(result);
                }
 catch (AxisFault e1) {
                    
// TODO Auto-generated catch block
                    e1.printStackTrace();
                }
 catch (MalformedURLException e1) {
                    
// TODO Auto-generated catch block
                    e1.printStackTrace();
                }
 catch (RemoteException e1) {
                    
// TODO Auto-generated catch block
                    e1.printStackTrace();
                }
 catch (ServiceException e1) {
                    
// TODO Auto-generated catch block
                    e1.printStackTrace();
                }

            }

        }
);
        
        getContentPane().add(
new JLabel("Please ISDN number"));
        getContentPane().add(bookISDNBox);
        getContentPane().add(resultLabel);
        getContentPane().add(serviceButton);
    }

    
    
public static void main(String args[]){
        MyBookClient client 
= new MyBookClient("Book Title Service");
        client.setDefaultCloseOperation(EXIT_ON_CLOSE);
        client.setVisible(
true);
    }

}

posted @ 2006-11-29 22:15 Zou Ang 阅读(799) | 评论 (4)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4 下一页