ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>国产乱码精品一区二区三,一区二区三区欧美日韩,91精品啪在线观看国产18http://www.aygfsteel.com/zhb8015/category/51178.htmlzh-cnTue, 05 Jun 2012 07:24:35 GMTTue, 05 Jun 2012 07:24:35 GMT60REST架构下的接口规范和ä‹É用准则( 转)http://www.aygfsteel.com/zhb8015/articles/379943.htmlzhb8015zhb8015Mon, 04 Jun 2012 08:38:00 GMThttp://www.aygfsteel.com/zhb8015/articles/379943.htmlhttp://www.aygfsteel.com/zhb8015/comments/379943.htmlhttp://www.aygfsteel.com/zhb8015/articles/379943.html#Feedback0http://www.aygfsteel.com/zhb8015/comments/commentRss/379943.htmlhttp://www.aygfsteel.com/zhb8015/services/trackbacks/379943.html来自: http://hi.baidu.com/yaobodi/blog/item/f655da333ff3974fac4b5f01.html
REST架构下的接口规范和ä‹É用准åˆ?/div>
2010-04-08 15:14

REST架构风格是全新的针对Web应用的开发风æ û|¼Œæ˜¯å½“今世界最成功的互联网­‘…媒体分布式¾pȝ»Ÿæž¶æž„åQŒå®ƒä½¿å¾—äºÞZ»¬çœŸæ­£ç†è§£äº†Http协议本来面貌。随着 RESTæž¶æž„æˆäØ“ä¸ÀLµæŠ€æœ¯ï¼Œä¸€¿Uå…¨æ–°çš„互联¾|‘网¾lœåº”用开发的思维方式开始流行ã€?/p>

目前åQ?1åQŒæ ¡å†…,‹¹·å†…åQŒé˜¿é‡ŒèÊY件等都通过REST架构来实现åã^台数据的开放,与第三方的数据交换。RESTå·²ç„¶æˆäØ“sns开攑Öã^å?/a>的首要开放标准。下面简单介¾lä¸€ä¸‹REST的原理和使用准则ã€?/p>

wiki介绍见此åQ?a >http://en.wikipedia.org/wiki/Representational_State_Transfer

REST是什�/strong>

REST是英文Representational State Transfer的羃写,中文¾˜»è¯‘ä¸?#8220;表述性状态è{¿U?#8221;åQŒä»–是由Roy Thomas Fielding博士在他的论æ–?《Architectural Styles and the Design of Network-based Software Architectures》中提出的一个术语。REST本èín只是为分布式­‘…媒体系¾lŸè®¾è®¡çš„一¿Uæž¶æž„风æ û|¼Œè€Œä¸æ˜¯æ ‡å‡†ã€?/p>

åŸÞZºŽWeb的架构,实际上就是各¿Uè§„范的集合åQŒè¿™äº›è§„范共同组成了Web架构。比如Http协议åQŒæ¯”如客æˆïL«¯æœåŠ¡å™¨æ¨¡ 式,˜q™äº›éƒ½æ˜¯è§„范。每当我们在原有è§? 范的基础上增加新的规范,ž®×ƒ¼šå½¢æˆæ–°çš„æž¶æž„。而REST正是˜q™æ ·ä¸€¿Uæž¶æž„,他结合了一¾pÕdˆ—的规范,而åŞ成了一¿Uæ–°çš„基于Web的架构风根{€?/p>

传统的Web应用大都是B/Sæž¶æž„åQŒå®ƒåŒ…括了如下一些规èŒ?ã€?/p>

客户åQæœåС噍

  • ˜q™ç§è§„范的提出,改善了用æˆähŽ¥å£è·¨å¤šä¸ªòq›_°çš„可¿UÀL¤æ€§ï¼Œòq¶ä¸”通过½Ž€åŒ–服务器¾l„äšgåQŒæ”¹å–„了¾pȝ»Ÿçš„可伸羃性。最为关键的是通过分离用户接口和数据存储这两个å…Ïx³¨ç‚¹ï¼Œä½¿å¾—不同用户¾lˆç«¯äº«å—ç›¸åŒæ•°æ®æˆäØ“äº†å¯èƒ½ã€?/div>

无状态�/p>

  • æ—? çŠ¶æ€æ€§æ˜¯åœ¨å®¢æˆøP¼æœåŠ¡å™¨çº¦æŸçš„åŸºç¡€ä¸Šæ·»åŠ çš„åˆä¸€å±‚è§„èŒƒã€‚ä»–è¦æ±‚é€šä¿¡å¿…é¡»åœ¨æœ¬è´¨ä¸Šæ˜¯æ— çŠ¶æ€çš„åQŒå³ä»Žå®¢æˆ·åˆ°æœåŠ¡å™¨çš„æ¯ä¸ªrequest都必™åÕdŒ…含理解该 request所必须的所有信息。这个规范改善了¾pȝ»Ÿçš„可见性(无状态性ä‹É得客æˆïL«¯å’ŒæœåŠ¡å™¨ç«¯ä¸å¿…ä¿å­˜å¯¹æ–¹çš„è¯¦ç»†ä¿¡æ¯åQŒæœåŠ¡å™¨åªéœ€è¦å¤„ç†å½“å‰? requeståQŒè€Œä¸å¿…了解所有的request历史åQ‰ï¼Œå¯é æ€§ï¼ˆæ— çŠ¶æ€æ€§å‡ž®‘了服务器从局部错误中恢复的ä“Q务量åQ‰ï¼Œå¯äŽ×¾~©æ€§ï¼ˆæ— çŠ¶æ€æ€§ä‹É得服务器端可ä»? 很容易的释放资源åQŒå› ä¸ºæœåŠ¡å™¨ç«¯ä¸å¿…åœ¨å¤šä¸ªrequest中保存状态)。同æ—Óž¼Œ˜q™ç§è§„范的缺点也是显而易见得åQŒç”±äºŽä¸èƒ½å°†çŠ¶æ€æ•°æ®ä¿å­˜åœ¨æœåŠ¡å™¨ä¸Šçš„å…±äº«ä¸Š 下文中,因此增加了在一¾pÕdˆ—request中发送重复数据的开销,严重的降低了效率ã€?/div>

¾~“å­˜

  • ä¸? 了改善无状态性带来的¾|‘络的低效性,我们填加了缓存约束。缓存约束允讔Ršå¼æˆ–昑ּåœ°æ ‡è®îC¸€ä¸ªresponse中的数据åQŒè¿™æ ·å°±èµ‹äºˆäº†å®¢æˆïL«¯¾~“å­˜ response数据的功能,˜q™æ ·ž®±å¯ä»¥äؓ以后的requestå…Þq”¨¾~“存的数据,部分或全部的消除一部分交互åQŒå¢žåŠ äº†¾|‘络的效率。但是用于客æˆïL«¯¾~“存了信 息,也就同时增加了客æˆïL«¯ä¸ŽæœåŠ¡å™¨æ•°æ®ä¸ä¸€è‡´çš„å¯èƒ½åQŒä»Žè€Œé™ä½Žäº†å¯é æ€§ã€?/div>

B/S架构的优ç‚ÒŽ˜¯å…‰™ƒ¨¾|²éžå¸¸æ–¹ä¾¿ï¼Œä½†åœ¨ç”¨æˆ·ä½“验斚w¢å´ä¸æ˜¯å¾ˆç†æƒ³ã€‚äØ“äº†æ”¹å–„è¿™¿Uæƒ…况,我们引入了RESTã€?/p>

REST在原有的架构上增加了三个新规范:¾lŸä¸€æŽ¥å£åQŒåˆ†å±‚ç³»¾lŸå’ŒæŒ‰éœ€ä»£ç ã€?/p>

¾lŸä¸€æŽ¥å£

  • REST 架构风格的核心特征就是强调组件之间有一个统一的接口,˜q™è¡¨çŽ°åœ¨REST世界里,¾|‘ç»œä¸Šæ‰€æœ‰çš„äº‹ç‰©éƒ½è¢«æŠ½è±¡ä¸ø™µ„源,而RESTž®±æ˜¯é€šè¿‡é€šç”¨çš„链接器接口å¯? 资源˜q›è¡Œæ“ä½œã€‚这栯‚®¾è®¡çš„好处是保证系¾lŸæä¾›çš„æœåŠ¡éƒ½æ˜¯è§£è€¦çš„åQŒæžå¤§çš„½Ž€åŒ–了¾pȝ»ŸåQŒä»Žè€Œæ”¹å–„了¾pȝ»Ÿçš„äº¤äº’æ€§å’Œå¯é‡ç”¨æ€§ã€‚åÆˆä¸”REST针对Web的常见情å†? 做了优化åQŒä‹Éå¾—RESTæŽ¥å£è¢«è®¾è®¡äØ“å¯ä»¥é«˜æ•ˆçš„è{¿UÕd¤§¾_’度的超媒体数据åQŒè¿™ä¹Ÿå°±å¯ÆD‡´äº†REST接口对其它的架构òq¶ä¸æ˜¯æœ€ä¼˜çš„ã€?/div>

分层¾pȝ»Ÿ

  • 分层¾pȝ»Ÿè§„则的加入提高了各种层次之间的独立性,为整个系¾lŸçš„复杂性设¾|®äº†è¾¹ç•ŒåQŒé€šè¿‡ž®è£…遗留的服务,使新的服务器免受遗留客户端的影响åQŒè¿™ä¹Ÿå°±æé«˜äº†ç³»¾lŸçš„可äŽ×¾~©æ€§ã€?/div>

按需代码

  • REST允许对客æˆïL«¯åŠŸèƒ½˜q›è¡Œæ‰©å±•。比如,通过下蝲òq¶æ‰§è¡Œapplet或脚本åŞ式的代码åQŒæ¥æ‰©å±•客户端功能。但˜q™åœ¨æ”¹å–„¾pȝ»Ÿå¯æ‰©å±•性的同时åQŒä¹Ÿé™ä½Žäº†å¯è§æ€§ã€‚所以它只是REST的一个可选的¾U¦æŸã€?/div>

REST的设计准�/strong>

REST架构是针对Web应用而设计的åQŒå…¶ç›®çš„æ˜¯äؓ了降低开发的复杂性,提高¾pȝ»Ÿçš„可伸羃性。REST提出了如下设计准则:

    1. ¾|‘ç»œä¸Šçš„æ‰€æœ‰äº‹ç‰©éƒ½è¢«æŠ½è±¡äØ“èµ„æºåQˆresourceåQ‰ï¼›
    2. 每个资源对应一个唯一的资源标识符åQˆresource identifieråQ‰ï¼›
    3. 通过通用的连接器接口åQˆgeneric connector interfaceåQ‰å¯¹èµ„源˜q›è¡Œæ“ä½œåQ?/div>
    4. 对资源的各种操作不会改变资源标识½W¦ï¼›
    5. 所有的操作都是无状态的åQˆstatelessåQ‰ã€?/div>

REST中的资源所指的不是数据åQŒè€Œæ˜¯æ•°æ®å’Œè¡¨çްåŞ式的¾l„合åQŒæ¯”å¦?#8220;最新访问的10位会å‘?#8221;å’?#8220;最‹z»è·ƒçš?0ä¸ÞZ¼šå‘?#8221;åœ?数据上可能有重叠或者完全相同,è€?ç”׃ºŽä»–们的表现åÅžå¼ä¸åŒï¼Œæ‰€ä»¥è¢«å½’äØ“ä¸åŒçš„èµ„æºï¼Œ˜q™ä¹Ÿž®±æ˜¯ä¸ÞZ»€ä¹ˆREST的全名是Representational State Transfer的原因。资源标识符ž®±æ˜¯URI(Uniform Resource Identifier)åQŒä¸½Ž¡æ˜¯å›„¡‰‡åQŒWord˜q˜æ˜¯è§†é¢‘æ–‡äšgåQŒç”šè‡›_ªæ˜¯ä¸€¿Uè™šæ‹Ÿçš„æœåŠ¡åQŒä¹Ÿä¸ç®¡ä½ æ˜¯xml格式,txtæ–‡äšg格式˜q˜æ˜¯å…¶å®ƒæ–‡äšg格式åQŒå…¨éƒ¨é€šè¿‡ URI对资源进行唯一的标识ã€?/p>

REST是基于Http协议的,ä»ÖM½•å¯¹èµ„æºçš„æ“ä½œè¡ŒäØ“éƒ½æ˜¯é€šè¿‡Http协议来实现。以往的Web开发大多数用的都是 Http协议中的GETå’ŒPOSTæ–? 法,对其他方法很ž®‘ä‹É用,˜q™å®žé™…上是因为对Http协议认识片面的理解造成的。Http不仅仅是一个简单的˜qè²æ•°æ®çš„协议,而是一个具有丰富内æ¶ëŠš„¾|‘络è½? 件的协议。他不仅仅能对互联网资源˜q›è¡Œå”¯ä¸€å®šä½åQŒè€Œä¸”˜q˜èƒ½å‘Šè¯‰æˆ‘们如何对该资源˜q›è¡Œæ“ä½œã€‚Http把对一个资源的操作限制åœ?个方法以内:GET, POST,PUTå’ŒDELETEåQŒè¿™æ­£æ˜¯å¯¹èµ„源CRUD操作的实现。由于资源和URI是一一对应的,执行˜q™äº›æ“ä½œçš„æ—¶å€™URI是没有变化的åQŒè¿™å’Œä»¥å¾€çš? Web开发有很大的区别。正ç”׃ºŽ˜q™ä¸€ç‚¹ï¼Œæžå¤§çš„简化了Web开发,也ä‹Éå¾—URIå¯ä»¥è¢«è®¾è®¡æˆæ›´äØ“ç›´è§‚çš„åæ˜ èµ„æºçš„¾l“æž„åQŒè¿™¿UURI的设计被¿UîC½œ RESTfulçš„URI。这位开发äh员引入了一¿Uæ–°çš„æ€ç»´æ–¹å¼åQšé€šè¿‡URL来设计系¾lŸç»“构。当然了åQŒè¿™¿Uè®¾è®¡æ–¹å¼å¯¹ä¸€äº›ç‰¹å®šæƒ…况也是不适用的,也就是说ä¸? 是所有的URI都可以RESTfulçš„ã€?/p>

REST 之所以可以提高系¾lŸçš„可äŽ×¾~©æ€§ï¼Œž®±æ˜¯å› äؓ它要求所有的操作都是无状态的。由于没有了上下æ–?Context)的约束,做分布式和集¾Ÿ¤çš„æ—¶å€™å°±æ›´äØ“½Ž€å•,ä¹? 可以让系¾lŸæ›´ä¸ºæœ‰æ•ˆçš„利用¾~“冲æ±?PoolåQ‰ã€‚åÆˆä¸”ç”±äºŽæœåŠ¡å™¨ç«¯ä¸éœ€è¦è®°å½•å®¢æˆïL«¯çš„一¾pÕdˆ—讉K—®åQŒä¹Ÿå‡å°‘了服务器端的性能ã€?/p>

使用REST架构

对于开发äh员来 è¯ß_¼Œå…›_¿ƒçš„æ˜¯å¦‚何使用RESTæž¶æž„åQŒè¿™é‡Œæˆ‘们来½Ž€å•谈谈这个问题。REST不仅仅是一¿Uå´­æ–°çš„æž¶æž„åQŒå®ƒå¸¦æ¥çš„æ›´æ˜¯ä¸€¿Uå…¨æ–°çš„Web开发过½E‹ä¸­çš„æ€ç»´æ–¹å¼åQ? 通过URL来设计系¾lŸç»“构。在REST中,所有的URL都对应着资源åQŒåªè¦URL的设计是良好的,那么其呈现的¾pȝ»Ÿ¾l“构也就是良好的。这点和TDD (Test Driven Development)很相ä¼û|¼Œä»–是通过‹¹‹è¯•用例来设计系¾lŸçš„æŽ¥å£åQŒæ¯ä¸€ä¸ªæµ‹è¯•用例都表示一¾pÕdˆ—用户的需求。开发äh员不需要一开始就¾~–写功能åQŒè€Œåªéœ€è¦? 把需要实现的功能通过‹¹‹è¯•用例的åŞ式表现出来即可。这个和REST中通过URL设计¾pȝ»Ÿ¾l“构的方式类ä¼û|¼Œæˆ‘们只需要根据需求设计出合理地URLåQŒè¿™äº? URL不一定非要链接到指定的页面或者完成一些行为,只要它们能够直观的表现出¾pȝ»Ÿçš„用æˆähŽ¥å£ã€‚æ ¹æ®è¿™äº›URLåQŒæˆ‘们就可以方便的设计系¾lŸç»“构。从 REST架构的概念上来看åQŒæ‰€æœ‰èƒ½å¤Ÿè¢«æŠ½è±¡æˆèµ„源的东西都可以被指定ä¸ÞZ¸€ä¸ªURLåQŒè€Œå¼€å‘ähå‘˜æ‰€éœ€è¦åšçš„å·¥ä½œå°±æ˜¯å¦‚ä½•èƒ½æŠŠç”¨æˆ·éœ€æ±‚æŠ½è±¡äØ“èµ„æºåQŒä»¥åŠå¦‚何抽 象的¾_„¡¡®ã€‚因为对资源抽象的越为精¼‹®ï¼Œå¯¹REST的应用来说就­‘Šå¥½ã€‚这个和传统MVC开发模式中åŸÞZºŽAction的思想差别ž®±éžå¸¸å¤§ã€‚设计良好的URLåQ? 不但对于开发äh员来说可以更明确的认识系¾lŸç»“构,对ä‹Éç”¨è€…æ¥è¯´ä¹Ÿæ–¹ä¾¿è®°å¿†å’Œè¯†åˆ«èµ„æºï¼Œå› äØ“URL­‘›_¤Ÿ½Ž€å•和有意义。按照以往的设计模式,很多URL后面éƒ? 是一堆参敎ͼŒå¯¹äºŽä½¿ç”¨è€…来说也是很不方便的ã€?/p>

既然REST˜q? 么好用,那么是不是所有的Web应用都能采取此种架构呢?½{”案是否定的。我们知道,直到现在为止åQŒMVC(Model-View-Controller) 模式依然是Web开发最普遍的模式,¾lå¤§å¤šæ•°çš„公司和开发äh员都采取此种架构来开发Web应用åQŒåƈ且其思维方式也停留于此。MVC模式由数据,视图和控åˆ? 器构成,通过事äšg(Event)触发Controller来改变Modelå’ŒView。加上Webwork,Struts½{‰å¼€æºæ¡†æž¶çš„加入åQŒMVC开发模 式已¾lç›¸å½“成熟,其思想æ ÒŽœ¬ž®±æ˜¯åŸÞZºŽAction来驱动。从开发äh员角度上来说åQŒèåN然接受一个新的架构会带来风险åQŒå…¶ä¸­çš„ä¸ç¡®å®šå› ç´ å¤ªå¤šã€‚åÆˆä¸”RESTæ–? çš„æ€ç»´æ–¹å¼æ˜¯æŠŠæ‰€æœ‰ç”¨æˆ·éœ€æ±‚æŠ½è±¡äØ“èµ„æºåQŒè¿™åœ¨å®žé™…å¼€å‘ä¸­æ˜¯æ¯”è¾ƒéš¾åšåˆ°çš„ï¼Œå› äØ“òq¶ä¸æ˜¯æ‰€æœ‰çš„ç”¨æˆ·éœ€æ±‚éƒ½èƒ½è¢«æŠ½è±¡ä¸ø™µ„源,˜q™æ ·ä¹Ÿå°±æ˜¯è¯´ä¸æ˜¯æ•´ä¸ª¾pȝ»Ÿçš„结构都èƒ? 通过REST的来表现。所以在开发中åQŒæˆ‘们需要根据以ä¸?ç‚ÒŽ¥åœ¨RESTå’ŒMVC中做出选择。我们认为比较好的办法是æ·ïL”¨RESTå’ŒMVCåQŒå› ä¸ø™¿™é€‚合¾l? 大多数的Web应用开发,开发äh员只需要对比较å®ÒŽ˜“èƒ½å¤ŸæŠ½è±¡ä¸ø™µ„源的用户需求采取REST的开发模式,而对其它需求采取MVC开发即可。这里需要提到的ž®? 是ROR(Ruby on Rails)框架åQŒè¿™æ˜¯ä¸€ä¸ªåŸºäºŽRuby语言的越来越‹¹è¡Œçš„Web开发框æžÓž¼Œå®ƒæžå¤§çš„æé«˜äº†Web开发的速度。更为重要的是,ROR(ä»?.2版本èµ?æ¡? 架是½W¬ä¸€ä¸ªå¼•å…¥RESTåšäØ“æ ¸å¿ƒæ€æƒ³çš„Web开发框æžÓž¼Œå®ƒæä¾›äº†å¯¹REST最好的支持åQŒä¹Ÿæ˜¯å½“今最成功的应用RESTçš„Web开发框架。实际上åQŒRORçš? REST实现ž®±æ˜¯RESTå’ŒMVCæ·ïL”¨åQŒå¼€å‘äh员采用ROR框架åQŒå¯ä»¥æ›´å¿«æ›´å¥½çš„æž„徏Web应用ã€?/p>

对开发äh员来è¯ß_¼ŒREST不仅仅在Web开发上贡献了自å·Þqš„力量åQŒåŒæ—¶ä¹Ÿè®©æˆ‘们学åˆîCº†å¦‚何把èÊYä»¶å·¥½E‹åŽŸåˆ™ç³»¾lŸåœ°åº”用于对一个真实èÊY件的设计和评ä¼îC¸Š



]]>xfire 与spring完整集成实例(�http://www.aygfsteel.com/zhb8015/articles/378208.htmlzhb8015zhb8015Tue, 15 May 2012 09:42:00 GMThttp://www.aygfsteel.com/zhb8015/articles/378208.htmlhttp://www.aygfsteel.com/zhb8015/comments/378208.htmlhttp://www.aygfsteel.com/zhb8015/articles/378208.html#Feedback0http://www.aygfsteel.com/zhb8015/comments/commentRss/378208.htmlhttp://www.aygfsteel.com/zhb8015/services/trackbacks/378208.html
首先打开Myeclipse8.x以上版本..å› äØ“æˆ‘è¿™é‡Œå…±äº«é‚£äº›xfire ™å¹ç›®æ‰€éœ€è¦çš„jar都是Myeclipse自带æ·ÕdŠ çš„ï¼Œæ‰€ä»¥è¦æ±‚å¤§å®¶ä¼™å‡†å¤‡å¥½myeclipse8.x或者更高版本的..˜q™é‡Œæ˜¯spring2.0与xfire1.2整合..废话ž®‘说..转正正传..

 

1.打开Myeclipse--->new project-->™å¹ç›®åéšä¾¿å§..最好是有意义的名称..看è“v来比较舒æœ?.


2--配置web.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">


  <context-param>

   <param-name>contextConfigLocation</param-name>

   <param-value>classpath:applicationContext.xml,classpath:org/codehaus/xfire/spring/xfire.xml</param-value>

  </context-param>


<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>


   <listener>

<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>

</listener>

  <servlet>

    <servlet-name>XFireServlet</servlet-name>

    <servlet-class>org.codehaus.xfire.transport.http.XFireConfigurableServlet</servlet-class>

    <load-on-startup>0</load-on-startup>

  </servlet>

  <servlet-mapping>

    <servlet-name>XFireServlet</servlet-name>

    <url-pattern>/services/*</url-pattern>

  </servlet-mapping>

  <welcome-file-list>

    <welcome-file>index.jsp</welcome-file>

  </welcome-file-list>

</web-app>

 


3.配置applicationContext.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<beans

xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:jee="http://www.springframework.org/schema/jee"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

 http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

 http://www.springframework.org/schema/aop

 http://www.springframework.org/schema/aop/spring-aop-2.0.xsd

 http://www.springframework.org/schema/tx

 http://www.springframework.org/schema/tx/spring-tx-2.0.xsd

 http://www.springframework.org/schema/jee

 http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"

 default-autowire="byName" default-lazy-init="true"

 >

 <import resource="classpath:org/codehaus/xfire/spring/xfire.xml"/>

 <import resource="xfire-servlet.xml"/>

</beans>

 

 

 

 

4.配置xfire-servlet.xml

 

ä¸ÞZº†ä¸ç»™å¤§å®¶ä¼™å›°æ‰?所以我˜q™é‡Œç”¨é‚£ä¸ªå°±æ‰“开那个配置..

 

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"

"http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>

<!-- 

<bean id="HellWorldSimple" class="org.codehaus.xfire.spring.ServiceBean">

<property name="name">

<value>HelloWorldSimple</value>

</property>

<property name="namespace">

<value>http://service.core.xfire.com</value>

</property>

<property name="serviceClass">

<value>com.xfire.core.service.IHelloWorld</value>

</property>

<property name="serviceBean">

<ref bean="HellWorldSimple"/>

</property>

</bean>

-->

<!-- 

  <bean id="MyHandle" class="org.codehaus.xfire.spring.ServiceBean">

<property name="name">

<value>MyHandle</value>

</property>

<property name="namespace">

<value>http://service.core.xfire.com</value>

</property>

<property name="serviceClass">

<value>com.xfire.core.handler.MyHandlerImpl</value>

</property>

<property name="serviceBean">

<ref bean="MyHandle"/>

</property>

</bean>

 -->



<bean id="UserInfoService" class="org.codehaus.xfire.spring.ServiceBean">

<property name="name">

<value>UserInfo</value>

</property>

<property name="namespace">

<value>http://service.core.xfire.com/UserInfoService</value>

</property>

<property name="serviceClass">

<value>com.xfire.core.service.IUserInfoService</value>

</property>

<property name="serviceBean">

<ref bean="UserInfoService"/>

</property>

</bean>

<!--  

   <bean id="ApplictionException" class="org.codehaus.xfire.spring.ServiceBean">

<property name="name">

<value>ApplictionException</value>

</property>


<property name="namespace">

<value>http://service.core.xfire.com/IMyExceptionSevice</value>

</property>

<property name="serviceClass">

<value>com.xfire.core.service.IMyExceptionSevice</value>

</property>

<property name="serviceBean">

<ref bean="ApplictionException"/>

</property>

</bean>

-->

 

 

 

 <!--  

   <bean id="IServiceMap" class="org.codehaus.xfire.spring.ServiceBean">

<property name="name">

<value>AddressService</value>

</property>


<property name="namespace">

<value>http://service.core.xfire.com/IServiceMap</value>

</property>

<property name="serviceClass">

<value>com.xfire.core.service.IServiceMap</value>

</property>

<property name="serviceBean">

<ref bean="IServiceMap"/>

</property>

</bean>

-->

 

</beans>


 

 

5.xfire-servlet.xml配置

 

 

<?xml version="1.0" encoding="UTF-8"?>

<beans>

<!--

    在没整合spring之前的xfire是这æ ïLš„配置

  当要整合spring之后的这句代码复制到service 节点

  xmlns="http://xfire.codehaus.org/config/1.0"

  <beans xmlns="http://xfire.codehaus.org/config/1.0">

 -->

<service xmlns="http://xfire.codehaus.org/config/1.0">


 

 <name>UserInfo</name>

 <namespace>http://service.core.xfire.com</namespace>

 <serviceClass>com.xfire.core.service.IUserInfoService</serviceClass>

 <implementationClass>com.xfire.core.service.impl.UserInfoServiceImpl

 </implementationClass>

 <scope>request</scope>

 

 

<!-- 

<name>HelloWorldSimple</name>

<namespace>http://service.core.xfire.com</namespace>

<serviceClass>com.xfire.core.service.IHelloWorld</serviceClass>

<implementationClass>com.xfire.core.service.impl.HelloWorldImpl</implementationClass>

<style>wrapped</style>

<use>literal</use>

<scope>request</scope>

-->

<!--  

<name>MyHandle</name>

<namespace>http://service.core.xfire.com</namespace>

<serviceClass>com.xfire.core.handler.IMyHandler</serviceClass>

<implementationClass>com.xfire.core.handler.MyHandlerImpl</implementationClass>

<scope>application</scope>

 -->

 <!-- 

<name>ServiceMap</name>

<namespace>http://service.core.xfire.com</namespace>

<serviceClass>com.xfire.core.service.IServiceMap</serviceClass>

<implementationClass>com.xfire.core.service.impl.ServiceMapImpl

</implementationClass>

<scope>request</scope>

 -->

 

 

<!-- 

<name>ApplictionException</name>

<namespace>http://service.core.xfire.com</namespace>

<serviceClass>com.xfire.core.service.IMyExceptionSevice</serviceClass>

<implementationClass>com.xfire.core.service.impl.MyExceptionSeviceImpl</implementationClass>

<scope>request</scope>

-->

 

</service>

</beans>

 

 


实现代码..

首先新徏一个实体类UseInfor

package com.xfire.core.entity;

 

import java.io.Serializable;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

 

/**

 *@author jilongliang

 *@Date 2012-2-29

 */

@SuppressWarnings("all")

public class UserInfo implements Serializable {

 

private Integer identifier;

 

private String address;

private String city;

private String proivice;

 

public Integer getIdentifier() {

return identifier;

}

 

public void setIdentifier(Integer identifier) {

this.identifier = identifier;

}

 

public String getAddress() {

return address;

}

 

public void setAddress(String address) {

this.address = address;

}

 

public String getCity() {

return city;

}

 

public void setCity(String city) {

this.city = city;

}

 

public String getProivice() {

return proivice;

}

 

public void setProivice(String proivice) {

this.proivice = proivice;

}

 

public String getCountry() {

return country;

}

 

public void setCountry(String country) {

this.country = country;

}

 

public String getPostCode() {

return postCode;

}

 

public void setPostCode(String postCode) {

this.postCode = postCode;

}

 

public String[] getArrary() {

return arrary;

}

 

public void setArrary(String[] arrary) {

this.arrary = arrary;

}

 

public List<Integer> getList() {

return list;

}

 

public void setList(List<Integer> list) {

this.list = list;

}

 

public Map<Integer, InnerClass> getMap() {

return map;

}

 

public void setMap(Map<Integer, InnerClass> map) {

this.map = map;

}

 

public boolean isExist() {

return isExist;

}

 

public void setExist(boolean isExist) {

this.isExist = isExist;

}

 

public InnerClass getInner() {

return inner;

}

 

public void setInner(InnerClass inner) {

this.inner = inner;

}

 

private String country;

private String postCode;

private String[] arrary;

private List<Integer> list;

 

private Map<Integer, InnerClass> map;

 

private boolean isExist;

private InnerClass inner;

 

public UserInfo() {

 

list = new ArrayList<Integer>();

list.add(1);

list.add(2);

list.add(3);

 

map = new HashMap<Integer, InnerClass>();

map.put(1, new InnerClass("a"));

map.put(2, new InnerClass("b"));

map.put(3, new InnerClass("c"));

 

inner = new InnerClass();

inner.setInnerName("服务器地址: Address InnerClass");

 

}

 

@Override

public String toString() {

return "Address [address=" + address + ", arrary="

+ Arrays.toString(arrary) + ", city=" + city + ", country="

+ country + ", identifier=" + identifier + ", inner=" + inner

+ ", isExist=" + isExist + ", list=" + list + ", map=" + map

+ ", postCode=" + postCode + ", proivice=" + proivice + "]";

}

 

}



----内置实体¾c?/span>
package com.xfire.core.entity;

import java.io.Serializable;

/**
 *@Project xfire
 *@author jilongliang
 *@Date 2012-2-29
 *@Class InnerClass.java
 */
@SuppressWarnings("all")
public class InnerClass implements Serializable {

private String innerName = "static InnerClass";

public String getInnerName() {
return innerName;
}

public void setInnerName(String innerName) {
this.innerName = innerName;
}

public InnerClass() {
}

public InnerClass(String innerName) {
super();
this.innerName = innerName;

}
}



其次一个接口类:
package com.xfire.core.service;

import java.util.List;

import com.xfire.core.entity.UserInfo;

/**
 *@author jilongliang
 *@Date 2012-2-29
 */
public interface IUserInfoService {
public List<UserInfo> getAddressList();

public List<UserInfo> setAddresses(List<UserInfo> list);
}



然后新徏一个实现类åŽÕd®žçŽ°æŽ¥å?/span>

package com.xfire.core.service.impl;

import java.util.ArrayList;
import java.util.List;

import com.xfire.core.entity.UserInfo;
import com.xfire.core.service.IUserInfoService;

/**
 *@author jilongliang
 *@Date 2012-2-29
 */
public class UserInfoServiceImpl implements IUserInfoService {

private int requestCount = 0;

public List<UserInfo> getAddressList() {
requestCount++;
System.out.println("requestCount" + requestCount);
List<UserInfo> listAdd = new ArrayList<UserInfo>();
UserInfo address = new UserInfo();
address.setIdentifier(1);
address.setCountry("中國");
address.setProivice("廣東�);
address.setCity("陽江");
address.setAddress("廣東陽春");
address.setPostCode("1111111");
address.setExist(false);
address.setArrary(new String[] { "22", "23", "24" });
listAdd.add(address);

address.setIdentifier(2);
address.setCountry("中國");
address.setProivice("廣東�);
address.setCity("陽江");
address.setAddress("廣東陽春");
address.setPostCode("1111111");
address.setExist(false);
address.setArrary(new String[] { "a", "b", "c" });
listAdd.add(address);

return listAdd;
}

/**
 * 
 * @param list
 * @return
 */
public List<UserInfo> setAddresses(List<UserInfo> list) {
requestCount++;
System.out.println("requestCount" + requestCount);
return list;
}

}



-----客户�/span>

package com.xfire.core.client;

import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;

import com.xfire.core.entity.UserInfo;
import com.xfire.core.service.IUserInfoService;

/**
 *@author jilongliang
 *@Date 2012-3-5
 * 
 */
public class UserInfoClient {

public static void main(String[] args) {
getServiceList();
setServiceList();
}

static String url = "http://localhost:8081/xfire/services/UserInfo";

/**
 * 
 */
public static void getServiceList() {
Service service = new ObjectServiceFactory()
.create(IUserInfoService.class);

try {
IUserInfoService iAddressService = (IUserInfoService) new XFireProxyFactory()
.create(service, url);
List<UserInfo> list = (ArrayList<UserInfo>) iAddressService
.getAddressList();

System.out.println("一共多ž®‘条数据åQ? + list.size());

for (Iterator<UserInfo> iter = list.iterator(); iter.hasNext();) {

UserInfo a = iter.next();

System.out.println(a);
}

} catch (MalformedURLException e) {
e.printStackTrace();
}
}

public static void setServiceList() {
Service service = new ObjectServiceFactory()
.create(IUserInfoService.class);

try {
IUserInfoService iAddressService = (IUserInfoService) new XFireProxyFactory()
.create(service, url);

List<UserInfo> listAdd = new ArrayList<UserInfo>();
UserInfo address = new UserInfo();
address.setIdentifier(1);
address.setCountry("中國");
address.setProivice("廣東�);
address.setCity("陽江");
address.setAddress("廣東陽春");
address.setPostCode("1111111");
address.setExist(false);
address.setArrary(new String[] { "22", "23", "24" });
listAdd.add(address);

address.setIdentifier(2);
address.setCountry("中國");
address.setProivice("廣東�);
address.setCity("陽江");
address.setAddress("廣東陽春");
address.setPostCode("1111111");
address.setExist(false);
address.setArrary(new String[] { "a", "b", "c" });
listAdd.add(address);

List<UserInfo> returnAdd = iAddressService.setAddresses(listAdd);

System.out.println("æ€ÀL•°:" + returnAdd);

for (Iterator<UserInfo> it = returnAdd.iterator(); it.hasNext();) {
UserInfo address2 = it.next();

System.out.println(address2);
}

} catch (MalformedURLException e) {
e.printStackTrace();
}

}
}


图解----

 




 

 

 

 

 

 

 

 

 

 

 

 

子书下蝲http://download.csdn.net/detail/l_ji_l/4116804

源代码下载:http://download.csdn.net/detail/l_ji_l/4116788



]]>
java.lang.IllegalStateException: Could not find valid implementation for: 2.0http://www.aygfsteel.com/zhb8015/articles/377905.htmlzhb8015zhb8015Fri, 11 May 2012 06:42:00 GMThttp://www.aygfsteel.com/zhb8015/articles/377905.htmlhttp://www.aygfsteel.com/zhb8015/comments/377905.htmlhttp://www.aygfsteel.com/zhb8015/articles/377905.html#Feedback0http://www.aygfsteel.com/zhb8015/comments/commentRss/377905.htmlhttp://www.aygfsteel.com/zhb8015/services/trackbacks/377905.htmlmyeclipse6.5,xfire1.2.6开发webservice报错åQ?/pre>
报错原因åQšxfire自带spring-1.2.6.jar 与spring.jar版本冲突åQŒåˆ é™¤ä¸€ä¸ªå³å?
 
 
java.lang.IllegalStateException: Could not find valid implementation for: 2.0
	org.apache.xbean.spring.context.impl.XBeanHelper.createBeanDefinitionReader(XBeanHelper.java:48)
	org.codehaus.xfire.spring.XFireConfigLoader.getXFireApplicationContext(XFireConfigLoader.java:74)
	org.codehaus.xfire.spring.XFireConfigLoader.loadContext(XFireConfigLoader.java:41)
	org.codehaus.xfire.transport.http.XFireConfigurableServlet.loadConfig(XFireConfigurableServlet.java:86)
	org.codehaus.xfire.transport.http.XFireConfigurableServlet.createXFire(XFireConfigurableServlet.java:54)
	org.codehaus.xfire.transport.http.XFireServlet.init(XFireServlet.java:45)
	javax.servlet.GenericServlet.init(GenericServlet.java:212)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:662)

 

root cause

java.lang.reflect.InvocationTargetException
	sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	org.apache.xbean.spring.context.impl.XBeanHelper.createBeanDefinitionReader(XBeanHelper.java:46)
	org.codehaus.xfire.spring.XFireConfigLoader.getXFireApplicationContext(XFireConfigLoader.java:74)
	org.codehaus.xfire.spring.XFireConfigLoader.loadContext(XFireConfigLoader.java:41)
	org.codehaus.xfire.transport.http.XFireConfigurableServlet.loadConfig(XFireConfigurableServlet.java:86)
	org.codehaus.xfire.transport.http.XFireConfigurableServlet.createXFire(XFireConfigurableServlet.java:54)
	org.codehaus.xfire.transport.http.XFireServlet.init(XFireServlet.java:45)
	javax.servlet.GenericServlet.init(GenericServlet.java:212)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:662)

 

root cause

java.lang.NoSuchMethodError: org.springframework.beans.factory.xml.XmlBeanDefinitionReader.setValidationMode(I)V
	org.apache.xbean.spring.context.v2.XBeanXmlBeanDefinitionReader.<init>(XBeanXmlBeanDefinitionReader.java:58)
	sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
	sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	org.apache.xbean.spring.context.impl.XBeanHelper.createBeanDefinitionReader(XBeanHelper.java:46)
	org.codehaus.xfire.spring.XFireConfigLoader.getXFireApplicationContext(XFireConfigLoader.java:74)
	org.codehaus.xfire.spring.XFireConfigLoader.loadContext(XFireConfigLoader.java:41)
	org.codehaus.xfire.transport.http.XFireConfigurableServlet.loadConfig(XFireConfigurableServlet.java:86)
	org.codehaus.xfire.transport.http.XFireConfigurableServlet.createXFire(XFireConfigurableServlet.java:54)
	org.codehaus.xfire.transport.http.XFireServlet.init(XFireServlet.java:45)
	javax.servlet.GenericServlet.init(GenericServlet.java:212)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	java.lang.Thread.run(Thread.java:662)


]]>
理解AXIOMhttp://www.aygfsteel.com/zhb8015/articles/377311.htmlzhb8015zhb8015Thu, 03 May 2012 10:16:00 GMThttp://www.aygfsteel.com/zhb8015/articles/377311.htmlhttp://www.aygfsteel.com/zhb8015/comments/377311.htmlhttp://www.aygfsteel.com/zhb8015/articles/377311.html#Feedback0http://www.aygfsteel.com/zhb8015/comments/commentRss/377311.htmlhttp://www.aygfsteel.com/zhb8015/services/trackbacks/377311.html
  AXIOM ˜q˜ä¸æ˜¯å¦ä¸€¿Uå¯¹è±¡æ¨¡åž‹ã€‚它有着明确的设计目标:大幅提升 Apache 下一ä»?SOAP 协议æ ?Axis 2 的性能。结果造就了不同于其他对象模型çš?AXIOMåQˆä¹Ÿ¿UîCØ“ OMåQ‰ï¼Œå› äؓ它突å‡ÞZº†æž„造的è½Õdž‹åQŒåƈä¸?仅当需要的时候才建立。由于是è½Õdž‹çš„,它尽可能地减è½Õd¯¹¾pȝ»Ÿèµ„源的压力,特别æ˜?CPU 和内存。同æ—Óž¼Œå»¶è¿Ÿæž„造又允许在其他部分还没有完成的时候ä‹É用树的一部分。AXIOM 强大的åšg˜qŸæž„廸™ƒ½åŠ›æºäºŽåº•å±‚çš„ Streaming API for XML (StAX) 解析器。AXIOM 提供了所有这些特性,同时òq•后的复杂性对用户是透明的ã€?
  使用 XMLBench Document Model Benchmark ‹¹‹è¯•的结果表明,AXIOM 的性能和现有的高性能对象模型相当。但æ˜?AXIOM 的内存占用要好于现有多数依靠 SAX å’?æˆ?DOM 输入输出的对象模型。因此对äº?Web 服务引擎或内存受限制讑֤‡˜q™æ ·çš?XML 处理器,AXIOM 是一¿Uç†æƒ³çš„选择åQŒå®ƒå¯ç”¨äº?
  一般的 XML 处理åQŒä½†æ˜¯æœ‰ä¸€ä¸ªå¯¹ SOAP 优化了的可选层ã€?

]]>
axis2教程åQˆè{åQ?/title><link>http://www.aygfsteel.com/zhb8015/articles/377301.html</link><dc:creator>zhb8015</dc:creator><author>zhb8015</author><pubDate>Thu, 03 May 2012 09:07:00 GMT</pubDate><guid>http://www.aygfsteel.com/zhb8015/articles/377301.html</guid><wfw:comment>http://www.aygfsteel.com/zhb8015/comments/377301.html</wfw:comment><comments>http://www.aygfsteel.com/zhb8015/articles/377301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zhb8015/comments/commentRss/377301.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zhb8015/services/trackbacks/377301.html</trackback:ping><description><![CDATA[<div id="wmqeeuq" class="blog_title"> <h3><a >Axis2 教程</a> </h3> <h3><em class="actions"></em>(<a >http://zxs19861202.iteye.com/blog/630359</a></h3> <h3><a >http://zxs19861202.iteye.com/blog/635903</a>   手工打包)</h3> <h3><a >WebService</a><a >Tomcat</a><a >Apache</a><a >‹¹è§ˆå™?/a><a >Web</a></h3></div> <div class="wmqeeuq" id="blog_content" class="blog_content"> <p>  Axis2<span>是一套崭新的</span>WebService<span>引擎åQŒè¯¥ç‰ˆæœ¬æ˜¯å¯¹</span>Axis1.x<span>重新设计的äñ”物ã€?/span>Axis2<span>不仅支持</span>SOAP1.1<span>å’?/span>SOAP1.2<span>åQŒè¿˜é›†æˆäº†éžå¸¸æµè¡Œçš„</span>REST WebService<span>åQŒåŒæ—¶è¿˜æ”¯æŒ</span>Spring<span>ã€?/span>JSON<span>½{‰æŠ€æœ¯ã€‚这些都ž®†åœ¨åŽé¢çš„系列教½E‹ä¸­è®²è§£ã€‚在本文中主要介¾läº†å¦‚何使用</span>Axis2<span>开发一个不需要ä“Q何配¾|®æ–‡ä»¶çš„</span>WebService<span>åQŒåƈ在客æˆïL«¯ä½¿ç”¨</span>Java<span>å’?/span>C#<span>调用˜q™ä¸ª</span>WebService<span>ã€?/span></p> <p><strong><span>一ã€?/span>Axis2</strong><strong><span>的下载和安装</span></strong></p> <p>    <span>读者可以从如下的网址下蝲</span>Axis2<span>的最新版本:</span></p> <p>    <a >http://ws.apache.org/axis2/</a></p> <p>    <span>在本文ä‹É用了目前</span>Axis2<span>的最新版æœ?/span>1.4.1<span>。读者可以下载如下两ä¸?/span>zip<span>包:</span></p> <p>    axis2-1.4.1-bin.zip</p> <p>    axis2-1.4.1-war.zip</p> <p>    <span>其中</span>axis2-1.4.1-bin.zip<span>æ–‡äšg中包含了</span>Axis2<span>中所有的</span>jar<span>æ–‡äšg</span>, axis2-1.4.1-war.zip<span>æ–‡äšg用于ž®?/span>WebService<span>发布åˆ?/span>Web<span>容器中ã€?/span></p> <p>    <span>ž®?/span>axis2-1.4.1-war.zip<span>æ–‡äšg解压到相应的目录åQŒå°†ç›®å½•中的</span>axis2.war<span>æ–‡äšg攑ֈ°</span><Tomcat<span>安装目录</span>>\webapps<span>目录中(本文使用çš?/span>Tomcat<span>的版本是</span>6.x<span>åQ‰ï¼Œòq¶å¯åŠ?/span>Tomcat<span>ã€?/span></p> <p>    <span>在浏览器地址栏中输入如下çš?/span>URL<span>åQ?/span></p> <p>    <a href="http://localhost:8080/axis2/">http://localhost:8080/axis2/</a></p> <p>    <span>如果在浏览器中显½Cºå‡ºå¦‚图</span>1<span>所½Cºçš„™åµé¢åQŒåˆ™è¡¨ç¤º</span>Axis2<span>安装成功ã€?br /></span></p> <div><br /><br />å›?</div> <div><br /><img class="magplus" title="点击查看原始大小囄¡‰‡" alt="" src="http://dl.iteye.com/upload/attachment/228189/8361c97d-ea79-3b16-aaed-f6dba647ddf9.jpg" width="700" height="405" /><br /> <br /></div> <p><strong><span>二、编写和发布WebService</span></strong></p> <p>  <span>对于ç”?/span>Java<span>实现的服务程序给人的印象ž®±æ˜¯éœ€è¦è¿›è¡Œå¤§é‡çš„配置åQŒä¸˜q‡è¿™ä¸€ç‚¹åœ¨</span>Axis2<span>中将被终¾l“。在</span>Axis2<span>中不需要进行ä“Q何的配置åQŒå°±å¯ä»¥ç›´æŽ¥ž®†ä¸€ä¸ªç®€å•çš„</span>POJO<span>发布æˆ?/span>WebService<span>。其ä¸?/span>POJO<span>中所有的</span>public<span>æ–ÒŽ³•ž®†è¢«å‘布æˆ?/span>WebService<span>æ–ÒŽ³•ã€?/span></p> <p>    <span>下面我们来实çŽîC¸€ä¸ªç®€å•çš„</span>POJO<span>åQŒä»£ç å¦‚下:</span></p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> SimpleService<br />{<br />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> String getGreeting(String name)<br />    {<br />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">你好 </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> name;<br />    }    <br />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> getPrice()<br />    {<br />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> java.util.Random().nextInt(</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />    }    <br />}<br /></span></div> <p> </p> <p>    <span>åœ?/span>SimpleService<span>¾cÖM¸­æœ‰ä¸¤ä¸ªæ–¹æ³•,ç”׃ºŽ˜q™ä¸¤ä¸ªæ–¹æ³•都æ˜?/span>public<span>æ–ÒŽ³•åQŒå› æ­¤ï¼Œå®ƒä»¬éƒ½å°†ä½œäØ“</span>WebService<span>æ–ÒŽ³•被发布ã€?/span></p> <p>    <span>¾~–译</span>SimpleService<span>¾cÕdŽåQŒå°†</span>SimpleService.class<span>æ–‡äšg攑ֈ°</span><Tomcat<span>安装目录</span>>\webapps\axis2\WEB-INF\pojo<span>目录中(如果没有</span>pojo<span>目录åQŒåˆ™å»ºç«‹è¯¥ç›®å½•)。现在我们已¾læˆåŠŸå°†</span>SimpleService<span>¾cÕd‘布成äº?/span>WebService<span>。在‹¹è§ˆå™¨åœ°å€æ ä¸­è¾“入如下çš?/span>URL<span>åQ?/span></p> <p><a href="http://localhost:8080/axis2/services/listServices">http://localhost:8080/axis2/services/listServices</a></p> <p>    <span>˜q™æ—¶å½“前™åµé¢ž®†æ˜¾½Cºæ‰€æœ‰åœ¨</span>Axis2<span>中发布的</span>WebService<span>åQŒå¦‚å›?/span>2<span>所½Cºã€?br /></span></p> <p> </p> <p>    <span>在浏览器地址栏中输入如下的两ä¸?/span>URL<span>来分别测è¯?/span>getGreeting<span>å’?/span>getPrice<span>æ–ÒŽ³•åQ?/span></p> <p><a href="http://localhost:8080/axis2/services/SimpleService/getGreeting?name=bill">http://localhost:8080/axis2/services/SimpleService/getGreeting?name=bill</a></p> <p><a href="http://localhost:8080/axis2/services/SimpleService/getPrice">http://localhost:8080/axis2/services/SimpleService/getPrice</a><br /><br />    <span>å›?/span>3<span>和图</span>4<span>分别昄¡¤ºäº?/span>getGreeting<span>å’?/span>getPrice<span>æ–ÒŽ³•的测试结果ã€?br /></span></p> <p> </p> <p><span>å›?  getGreetingæ–ÒŽ³•的测试结æž?/span></p> <p><span><br /><img alt="" src="http://dl.iteye.com/upload/attachment/228193/d266b21e-4f1b-3413-997d-f1192eb0b5b5.jpg" /><br /> </span></p> <p> </p> <p> </p> <p><span>å›?  getPriceæ–ÒŽ³•的测试结æž?/span></p> <p><span><br /><img alt="" src="http://dl.iteye.com/upload/attachment/228195/f462cbcc-efa0-3cfa-a9de-9a13614c8c2f.jpg" /><br /> </span></p> <p> </p> <p>    <span>在编写、发布和‹¹‹è¯•</span>0<span>配置çš?/span>WebService<span>时应注意如下几点åQ?/span></p> <p><span>    </span>1. POJO<span>¾cÖM¸èƒ½ä‹Éç”?/span>package<span>关键字声明包ã€?/span></p> <p><span>    </span>2. Axis2<span>在默认情况下可以热发å¸?/span>WebService<span>åQŒä¹Ÿž®±æ˜¯è¯ß_¼Œž®?/span>WebService<span>çš?/span>.class<span>æ–‡äšg复制åˆ?/span>pojo<span>目录中时åQ?/span>Tomcat<span>不需要重新启动就可以自动发布</span>WebService<span>。如果想取消</span>Axis2<span>的热发布功能åQŒå¯ä»¥æ‰“å¼€</span><Tomcat<span>安装目录</span>>\webapps\axis2\WEB-INF\conf\axis2.xml<span>åQŒæ‰¾åˆ°å¦‚下的配置代码åQ?/span></p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff"><</span><span style="color: #800000">parameter </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="hotdeployment"</span><span style="color: #0000ff">></span><span style="color: #000000">true</span><span style="color: #0000ff"></</span><span style="color: #800000">parameter</span><span style="color: #0000ff">></span> </div> <p> </p> <p> </p> <p> </p> <p>    <span>ž®?/span>true<span>æ”¹äØ“</span>false<span>卛_¯ã€‚要注意的是åQ?/span>Axis2<span>在默认情况下虽然是热发布åQŒä½†òq¶ä¸æ˜¯çƒ­æ›´æ–°åQŒä¹Ÿž®±æ˜¯è¯ß_¼Œä¸€æ—¦æˆåŠŸå‘å¸ƒäº†</span>WebService<span>åQŒå†æƒÏx›´æ–°è¯¥</span>WebService<span>åQŒå°±å¿…须重启</span>Tomcat<span>。这对于开发äh员调è¯?/span>WebService<span>非常不方便,因此åQŒåœ¨å¼€å?/span>WebService<span>æ—Óž¼Œå¯ä»¥ž®?/span>Axis2<span>è®¾äØ“çƒ­æ›´æ–°ã€‚åœ¨</span>axis2.xml<span>æ–‡äšg中找åˆ?/span><span><parameter name="hotupdate">false</parameter></span><span>åQŒå°†</span>false<span>æ”¹äØ“</span>true<span>卛_¯ã€?/span></p> <p><span>    </span>3. <span>在浏览器中测è¯?/span>WebService<span>æ—Óž¼Œå¦‚æžœ</span>WebService<span>æ–ÒŽ³•有参敎ͼŒéœ€è¦ä‹Éç”?/span>URL<span>的请求参数来指定è¯?/span>WebService<span>æ–ÒŽ³•参数的å€û|¼Œè¯äh±‚参数名与æ–ÒŽ³•参数名要一è‡ß_¼Œä¾‹å¦‚åQŒè¦‹¹‹è¯•</span>getGreeting<span>æ–ÒŽ³•åQŒè¯·æ±‚å‚æ•°ååº”äØ“</span>name<span>åQŒå¦‚上面çš?/span>URL<span>所½Cºã€?/span></p> <p><span>    </span>4. <span>发布</span>WebService<span>çš?/span>pojo<span>目录只是默认的,如果读者想在其他的目录发布</span>WebService<span>åQŒå¯ä»¥æ‰“å¼€</span>axis2.xml<span>æ–‡äšgåQŒåƈåœ?/span><axisconfig><span>元素中添加如下的子元素:</span></p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000"> </span><span style="color: #0000ff"><</span><span style="color: #800000">deployer </span><span style="color: #ff0000">extension</span><span style="color: #0000ff">=".class"</span><span style="color: #ff0000"> directory</span><span style="color: #0000ff">="my"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="org.apache.axis2.deployment.POJODeployer"</span><span style="color: #0000ff">/></span> </div> <p> </p> <p> </p> <p> </p> <p>    <span>上面的配¾|®å…è®¸åœ¨</span><Tomcat<span>安装目录</span>>\webapps\axis2\WEB-INF\my<span>目录中发å¸?/span>WebService<span>。例如,ž®†æœ¬ä¾‹ä¸­çš?/span>SimpleService.class<span>复制åˆ?/span>my<span>目录中也可以成功发布åQˆä½†è¦åˆ é™?/span>pojo<span>目录中的</span>SimpleService.class<span>åQŒå¦åˆ?/span>WebService<span>会重名)ã€?/span></p> <p> </p> <p><strong><span>三ã€?/span> </strong><strong><span>ç”?/span>Java</strong><strong><span>实现调用</span>WebService</strong><strong><span>的客æˆïL«¯½E‹åº</span></strong></p> <p>    WebService<span>æ˜¯äØ“½E‹åºæœåŠ¡çš„ï¼Œåªåœ¨‹¹è§ˆå™¨ä¸­è®‰K—®</span>WebService<span>是没有意义的。因此,在本节ä‹Éç”?/span>Java<span>实现了一个控制台½E‹åºæ¥è°ƒç”¨ä¸Šä¸€èŠ‚å‘å¸ƒçš„</span>WebService<span>。调ç”?/span>WebService<span>的客æˆïL«¯ä»£ç å¦‚下åQ?/span></p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">package</span><span style="color: #000000"> client;<br /><br /></span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.xml.namespace.QName;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.axis2.addressing.EndpointReference;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.axis2.client.Options;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.axis2.rpc.client.RPCServiceClient;<br /><br /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> RPCClient<br />{<br />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception  <br />    {<br />        </span><span style="color: #008000">//</span><span style="color: #008000">  ä½¿ç”¨RPC方式调用WebService        </span><span style="color: #008000"><br /></span><span style="color: #000000">        RPCServiceClient serviceClient </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> RPCServiceClient();<br />        Options options </span><span style="color: #000000">=</span><span style="color: #000000"> serviceClient.getOptions();<br />        </span><span style="color: #008000">//</span><span style="color: #008000">  æŒ‡å®šè°ƒç”¨WebServiceçš„URL</span><span style="color: #008000"><br /></span><span style="color: #000000">        EndpointReference targetEPR </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> EndpointReference(<br />                </span><span style="color: #000000">"</span><span style="color: #000000">http://localhost:8080/axis2/services/SimpleService</span><span style="color: #000000">"</span><span style="color: #000000">);<br />        options.setTo(targetEPR);<br />        </span><span style="color: #008000">//</span><span style="color: #008000">  æŒ‡å®šgetGreetingæ–ÒŽ³•的参数å€?/span><span style="color: #008000"><br /></span><span style="color: #000000">        Object[] opAddEntryArgs </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Object[] {</span><span style="color: #000000">"</span><span style="color: #000000">­‘…äh</span><span style="color: #000000">"</span><span style="color: #000000">};<br />        </span><span style="color: #008000">//</span><span style="color: #008000">  æŒ‡å®šgetGreetingæ–ÒŽ³•˜q”回值的数据¾cÕdž‹çš„Class对象</span><span style="color: #008000"><br /></span><span style="color: #000000">        Class[] classes </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Class[] {String.</span><span style="color: #0000ff">class</span><span style="color: #000000">};<br />        </span><span style="color: #008000">//</span><span style="color: #008000">  æŒ‡å®šè¦è°ƒç”¨çš„getGreetingæ–ÒŽ³•及WSDLæ–‡äšg的命名空é—?/span><span style="color: #008000"><br /></span><span style="color: #000000">        QName opAddEntry </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> QName(</span><span style="color: #000000">"</span><span style="color: #000000">http://ws.apache.org/axis2</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">getGreeting</span><span style="color: #000000">"</span><span style="color: #000000">);<br />        </span><span style="color: #008000">//</span><span style="color: #008000">  è°ƒç”¨getGreetingæ–ÒŽ³•òq¶è¾“凸™¯¥æ–ÒŽ³•的返回å€?/span><span style="color: #008000"><br /></span><span style="color: #000000">        System.out.println(serviceClient.invokeBlocking(opAddEntry, opAddEntryArgs, classes)[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br />        </span><span style="color: #008000">//</span><span style="color: #008000">  ä¸‹é¢æ˜¯è°ƒç”¨getPriceæ–ÒŽ³•的代码,˜q™äº›ä»£ç ä¸Žè°ƒç”¨getGreetingæ–ÒŽ³•的代码类ä¼?/span><span style="color: #008000"><br /></span><span style="color: #000000">        classes </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Class[] {</span><span style="color: #0000ff">int</span><span style="color: #000000">.</span><span style="color: #0000ff">class</span><span style="color: #000000">};<br />        opAddEntry </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> QName(</span><span style="color: #000000">"</span><span style="color: #000000">http://ws.apache.org/axis2</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #000000">"</span><span style="color: #000000">getPrice</span><span style="color: #000000">"</span><span style="color: #000000">);<br />        System.out.println(serviceClient.invokeBlocking(opAddEntry, </span><span style="color: #0000ff">new</span><span style="color: #000000"> Object[]{}, classes)[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br />    } <br />}<br /></span></div> <p> </p> <p> </p> <p> </p> <p> </p> <p><span>˜qè¡Œä¸Šé¢çš„程序后åQŒå°†åœ¨æŽ§åˆ¶å°è¾“出如下的信息:</span></p> <p> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">你好 ­‘…äh<br />443</span> </div> <p>    <span>在编写客æˆïL«¯ä»£ç æ—¶åº”注意如下几点åQ?/span></p> <p><span>    </span>1. <span>客户端代码需要引用很å¤?/span>Axis2<span>çš?/span>jar<span>包,如果读者不太清楚要引用哪个</span>jar<span>包,可以åœ?/span>Eclipse<span>的工½E‹ä¸­å¼•用</span>Axis2<span>发行包的</span>lib<span>目录中的所æœ?/span>jar<span>包ã€?/span></p> <p><span>    </span>2. <span>在本例中使用äº?/span>RPCServiceClient<span>¾cȝš„</span>invokeBlocking<span>æ–ÒŽ³•调用äº?/span>WebService<span>中的æ–ÒŽ³•ã€?/span>invokeBlocking<span>æ–ÒŽ³•有三个参敎ͼŒå…¶ä¸­½W¬ä¸€ä¸ªå‚æ•°çš„¾cÕdž‹æ˜?/span>QName<span>对象åQŒè¡¨½Cø™¦è°ƒç”¨çš„æ–¹æ³•名åQ›ç¬¬äºŒä¸ªå‚数表示要调用的</span>WebService<span>æ–ÒŽ³•的参数å€û|¼Œå‚æ•°¾cÕdž‹ä¸?/span>Object[]<span>åQ›ç¬¬ä¸‰ä¸ªå‚数表示</span>WebService<span>æ–ÒŽ³•的返回值类型的</span>Class<span>对象åQŒå‚æ•°ç±»åž‹äØ“</span>Class[]<span>。当æ–ÒŽ³•没有参数æ—Óž¼Œ</span>invokeBlocking<span>æ–ÒŽ³•的第二个参数å€ég¸èƒ½æ˜¯</span>null<span>åQŒè€Œè¦ä½¿ç”¨</span>new Object[]{}<span>ã€?/span></p> <p><span>    </span>3. <span>如果被调用的</span>WebService<span>æ–ÒŽ³•没有˜q”回å€û|¼Œåº”ä‹Éç”?/span>RPCServiceClient<span>¾cȝš„</span>invokeRobust<span>æ–ÒŽ³•åQŒè¯¥æ–ÒŽ³•只有两个参数åQŒå®ƒä»¬çš„含义ä¸?/span>invokeBlocking<span>æ–ÒŽ³•的前两个参数的含义相同ã€?/span></p> <p><span>    </span>4. <span>在创å»?/span>QName<span>对象æ—Óž¼Œ</span>QName<span>¾cÈš„æž„造方法的½W¬ä¸€ä¸ªå‚数表½C?/span>WSDL<span>æ–‡äšg的命名空间名åQŒä¹Ÿž®±æ˜¯</span><wsdl:definitions><span>元素çš?/span>targetNamespace<span>属性å€û|¼Œä¸‹é¢æ˜?/span>SimpleService<span>¾cȝ”Ÿæˆçš„</span>WSDL<span>æ–‡äšg的代码片ŒDµï¼š<br /><br /></span></p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff"><?</span><span style="color: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="color: #0000ff">?></span><span style="color: #000000"><br /></span><span style="color: #0000ff"><</span><span style="color: #800000">wsdl:definitions </span><span style="color: #ff0000">xmlns:wsdl</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/"</span><span style="color: #ff0000"> xmlns:ns1</span><span style="color: #0000ff">="http://org.apache.axis2/xsd"</span><span style="color: #ff0000"> <br />xmlns:ns</span><span style="color: #0000ff">="http://ws.apache.org/axis2"</span><span style="color: #ff0000"> xmlns:wsaw</span><span style="color: #0000ff">="http://www.w3.org/2006/05/addressing/wsdl"</span><span style="color: #ff0000"> <br />xmlns:http</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/http/"</span><span style="color: #ff0000"> xmlns:xs</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema"</span><span style="color: #ff0000"> <br />xmlns:mime</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/mime/"</span><span style="color: #ff0000"> xmlns:soap</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/soap/"</span><span style="color: #ff0000"> <br />xmlns:soap12</span><span style="color: #0000ff">="http://schemas.xmlsoap.org/wsdl/soap12/"</span><strong><span style="color: #ff0000"> <br />targetNamespace</span><span style="color: #0000ff">="http://ws.apache.org/axis2"</span></strong><span style="color: #0000ff">></span><span style="color: #000000"><br />    </span><span style="color: #0000ff"><</span><span style="color: #800000">wsdl:types</span><span style="color: #0000ff">></span><span style="color: #000000"><br />        <img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /> <img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /><br />    </span><span style="color: #0000ff"></</span><span style="color: #800000">wsdl:types</span><span style="color: #0000ff">></span><span style="color: #000000"><br />    <img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /> <img alt="" src="http://www.aygfsteel.com/Images/dot.gif" /><br /></span><span style="color: #0000ff"></</span><span style="color: #800000">wsdl:definitions</span><span style="color: #0000ff">></span><span style="color: #000000"><br /></span></div> <p> </p> <p><strong><span>四、用</span>wsdl2java</strong><strong><span>½Ž€åŒ–客æˆïL«¯çš„ç¼–å†?/span></strong></p> <p>    <span>也许有很多读者会è¯?#8220;有没有搞错啊åQŒåªè°ƒç”¨ä¸¤ä¸ª</span>WebService<span>æ–ÒŽ³•用要写这么多代码åQŒå¤ªéºÈƒ¦äº?#8221;ã€?/span></p> <p>    <span>不过òq¸å¥½</span>Axis2<span>提供了一ä¸?/span>wsdl2java.bat<span>命ä×o可以æ ÒŽ®</span>WSDL<span>æ–‡äšg自动产生调用</span>WebService<span>的代码ã€?/span>wsdl2java.bat<span>命ä×o可以åœ?/span><Axis2<span>安装目录</span>>"bin<span>目录中找到。在使用</span>wsdl2java.bat<span>命ä×o之前需要设¾|?/span>AXIS2_HOME<span>环境变量åQŒè¯¥å˜é‡å€¼æ˜¯</span><Axis2<span>安装目录</span>><span>ã€?/span></p> <p>    <span>åœ?/span>Windows<span>控制台输出如下的命ä×o行来生成调用</span>WebService<span>的代码:</span></p> <p><span>%AXIS2_HOME%\bin\wsdl2java -uri http://localhost:8080/axis2/services/SimpleService?wsdl -p client -s -o stub</span></p> <p>    <span>其中</span>-url<span>参数指定äº?/span>wsdl<span>æ–‡äšgçš„èµ\径,可以是本地èµ\径,也可以是¾|‘络路径ã€?/span>-p<span>参数指定了生成的</span>Java<span>¾cȝš„包名åQ?/span>-o<span>参数指定了生成的一¾pÕdˆ—æ–‡äšg保存的根目录。在执行完上面的命ä×o后,读者就会发现在当前目录下多了个</span>stub<span>目录åQŒåœ¨</span>."stub"src"client<span>目录可以扑ֈ°ä¸€ä¸?/span>SimpleServiceStub.java<span>æ–‡äšgåQŒè¯¥æ–‡äšg复杂调用</span>WebService<span>åQŒè¯»è€…可以在½E‹åºä¸­ç›´æŽ¥ä‹É用这个类åQŒä»£ç å¦‚下:<br /></span></p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">package</span><span style="color: #000000"> client;<br /><br /></span><span style="color: #0000ff">import</span><span style="color: #000000"> javax.xml.namespace.QName;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.axis2.addressing.EndpointReference;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.axis2.client.Options;<br /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.axis2.rpc.client.RPCServiceClient;<br /><br /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> StubClient<br />{<br />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) </span><span style="color: #0000ff">throws</span><span style="color: #000000"> Exception  <br />    {<br />        SimpleServiceStub stub </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> SimpleServiceStub();<br />        SimpleServiceStub.GetGreeting gg </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> SimpleServiceStub.GetGreeting();<br />        gg.setName(</span><span style="color: #000000">"</span><span style="color: #000000">比尔</span><span style="color: #000000">"</span><span style="color: #000000">);<br />        System.out.println( stub.getGreeting(gg).get_return());<br />        System.out.println(stub.getPrice().get_return());<br />    } <br />}<br /></span></div> <p> </p> <p> </p> <p>    <span>上面的代码大大简化了调用</span>WebService<span>的步骤,òq¶ä‹É代码更加½Ž€‹zã€‚但要注意的是,</span>wsdl2java.bat<span>命ä×o生成çš?/span>Stub<span>¾cÕd°†</span>WebService<span>æ–ÒŽ³•的参数都ž®è£…在了相应的类中,¾cÕdä¸ºæ–¹æ³•名åQŒä¾‹å¦‚,</span>getGreeting<span>æ–ÒŽ³•的参数都ž®è£…在了</span>GetGreeting<span>¾cÖM¸­åQŒè¦æƒŒ™°ƒç”?/span>getGreeting<span>æ–ÒŽ³•åQŒå¿…™åÕd…ˆåˆ›å¾</span>GetGreeting<span>¾cȝš„对象实例ã€?/span></p> <p><strong><span>五、ä‹Éç”?/span>C#</strong><strong><span>调用</span>WebService</strong></p> <p>    <span>从理è®ÞZ¸Šè¯ß_¼Œ</span>WebService<span>可以被ä“Q何支æŒ?/span>SOAP<span>协议的语­a€è°ƒç”¨ã€‚在</span>Visual Studio<span>中ä‹Éç”?/span>C#<span>调用</span>WebService<span>是在所有语­a€ä¸­æœ€å®ÒŽ˜“实现的(</span>VB.net<span>的调用方法类ä¼û|¼Œä¹ŸåŒæ ·å¾ˆ½Ž€å•)ã€?/span></p> <p>    <span>新徏一ä¸?/span>Visual Studio<span>工程åQŒåƈ在引ç”?/span>Web<span>服务的对话框中输入如下的</span>URL<span>åQŒåƈ输入</span>Web<span>å¼•ç”¨åäØ““</span>WebService<span>”åQ?/span></p> <p>    <a href="http://localhost:8080/axis2/services/SimpleService?wsdl">http://localhost:8080/axis2/services/SimpleService?wsdl</a></p> <p>    <span>然后引用</span>Web<span>服务的对话框ž®×ƒ¼šæ˜„¡¤ºè¯?/span>WebService<span>中的所有的æ–ÒŽ³•åQŒå¦‚å›?/span>5<span>所½Cºã€?br /></span></p> <p> </p> <p> </p> <p>    <span>在完成上面的工作后,只需要如下三è¡?/span>C#<span>代码ž®±å¯ä»¥è°ƒç”?/span>getGreeting<span>å’?/span>getPrice<span>æ–ÒŽ³•åQŒåƈ昄¡¤º˜q™ä¸¤ä¸ªæ–¹æ³•çš„˜q”回å€û|¼š</span></p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #000000">WebService.SimpleService simpleService </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> WSC.WebService.SimpleService();<br />MessageBox.Show( simpleService.getGreeting(</span><span style="color: #000000">"</span><span style="color: #000000">比尔</span><span style="color: #000000">"</span><span style="color: #000000">));<br />MessageBox.Show(simpleService.getPrice().@return.ToString());</span> </div> <p> </p> <p> </p> <p> </p> <p>    <span>åœ?/span>.net<span>解析</span>WSDL<span>æ–‡äšg时直接将</span>getGreeting<span>æ–ÒŽ³•的参数映ž®„䨓</span>String<span>¾cÕdž‹åQŒå› æ­¤ï¼Œå¯ä»¥ç›´æŽ¥˜q›è¡Œä¼ å€¹{€?/span><br />    <span>从上面的调用˜q‡ç¨‹å¯ä»¥çœ‹å‡ºåQŒæ·»åŠ?/span>Web<span>引用的过½E‹å°±ç›¸å½“于在</span>Java<span>中调ç”?/span>wsdl2java.bat<span>自动生成</span>stub<span>¾cȝš„˜q‡ç¨‹ã€‚只是在调用</span>stub<span>¾cÀL—¶ä¸?/span>C#<span>有一定的区别åQŒä½†ä»Žæ€ÖM½“上来è¯ß_¼Œéƒ½å¤§å¤§ç®€åŒ–了调用</span>WebService<span>的过½E‹ã€?/span></p> <div><br /><br />å›?</div> <div><br /><img class="magplus" title="点击查看原始大小囄¡‰‡" alt="" src="http://dl.iteye.com/upload/attachment/228197/b684beb5-3e6f-3494-a479-d9ff4d1ca3f1.jpg" width="700" height="434" /><br /> <br /></div> <div><br /><span><br />å›?</span> </div> <div><br /><img class="magplus" title="点击查看原始大小囄¡‰‡" alt="" src="http://dl.iteye.com/upload/attachment/228191/b28de9a2-c8e0-341d-93e0-75c7e852930f.jpg" width="700" height="405" /><br /> <br /></div></div><img src ="http://www.aygfsteel.com/zhb8015/aggbug/377301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zhb8015/" target="_blank">zhb8015</a> 2012-05-03 17:07 <a href="http://www.aygfsteel.com/zhb8015/articles/377301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>axis2插äšg安装http://www.aygfsteel.com/zhb8015/articles/377280.htmlzhb8015zhb8015Thu, 03 May 2012 07:25:00 GMThttp://www.aygfsteel.com/zhb8015/articles/377280.htmlhttp://www.aygfsteel.com/zhb8015/comments/377280.htmlhttp://www.aygfsteel.com/zhb8015/articles/377280.html#Feedback0http://www.aygfsteel.com/zhb8015/comments/commentRss/377280.htmlhttp://www.aygfsteel.com/zhb8015/services/trackbacks/377280.html
Axis2_Codegen_Wizard_1.3.0
Axis2_Service_Archiver_1.3.0

]]>
XFire 学习http://www.aygfsteel.com/zhb8015/articles/373409.htmlzhb8015zhb8015Thu, 05 Apr 2012 14:10:00 GMThttp://www.aygfsteel.com/zhb8015/articles/373409.htmlhttp://www.aygfsteel.com/zhb8015/comments/373409.htmlhttp://www.aygfsteel.com/zhb8015/articles/373409.html#Feedback0http://www.aygfsteel.com/zhb8015/comments/commentRss/373409.htmlhttp://www.aygfsteel.com/zhb8015/services/trackbacks/373409.html
http://www.aygfsteel.com/fastzch/archive/2008/08/28/225439.html
http://www.aygfsteel.com/waterye/archive/2005/12/05/22643.html
http://xfire.codehaus.org/JSR+181+Annotations
http://blog.csdn.net/hlf48641715/article/details/3220542
http://www.ibm.com/developerworks/cn/java/j-ws/#JAVAZA45

http://blog.csdn.net/shazhenhua/article/details/3186726
<interface_name>.aegis.xml-->
<mappings>
    
<mapping>
        
<method name="test">
            
<parameter index="0" componentType="java.lang.String" />
            
<return-type componentType="org.vivianj.xfire.pojo.Course" />
        
</method>
    
</mapping>
</mappings>

problem:
http://yuyuqian521.iteye.com/blog/939047

PSåQ?br />1、IHelloService.aegis.xml 应与interface攑֜¨åŒä¸€åŒ…下åQŒå¦åˆ™æŠ¥é”™ï¼š
1 Cannot create mapping for java.util.List, unspecified component type for parameter 0 of method test in interface org.vivianj.xfire.service.IHelloService
2     org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:370)
2、services.xml应放在classes 中,目录¾l“æž„META-INF-xfire-services.xml

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ¹ð¶«ÏØ| ºôͼ±ÚÏØ| ÔæÑôÊÐ| ÓéÀÖ| ¹ã²ýÏØ| »ÆæèÊÐ| Î÷ÁÖÏØ| ÐÃÖÝÊÐ| ºâÑôÏØ| »ÆÆÖÇø| ÕÅÒ´ÊÐ| ÐË»¯ÊÐ| ¶÷Ê©ÊÐ| À´°²ÏØ| ½ðÃÅÏØ| ¶«Ì¨ÊÐ| ¼¦¶«ÏØ| Õòãä| ¹Ê³ÇÏØ| ´ï¶û| ƽÎäÏØ| »ÆÆÖÇø| ·ïɽÊÐ| ÎߺþÊÐ| ²ýÀèÏØ| ÆÑ³ÇÏØ| ÁÙò£ÏØ| ³ÉÎäÏØ| ɯ³µÏØ| Ì©ºÍÏØ| ´íÄÇÏØ| ÕÁÊ÷ÊÐ| ¼ÎÀèÏØ| ÄÏÆ½ÊÐ| À´±öÊÐ| ¶«¹âÏØ| Ì©À´ÏØ| ÂåÂ¡ÏØ| ¼ÎÒåÏØ| ÄÏ¿ªÇø| Ì«ºÍÏØ|