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æœåС噍
æ— çŠ¶æ€æ€?/p>
¾~“å˜
B/S架构的优ç‚ÒŽ˜¯å…‰™ƒ¨¾|²éžå¸¸æ–¹ä¾¿ï¼Œä½†åœ¨ç”¨æˆ·ä½“验斚w¢å´ä¸æ˜¯å¾ˆç†æƒ³ã€‚äØ“äº†æ”¹å–„è¿™¿U情况,我们引入了RESTã€?/p>
RESTåœ¨åŽŸæœ‰çš„æž¶æž„ä¸Šå¢žåŠ äº†ä¸‰ä¸ªæ–°è§„èŒƒï¼š¾lŸä¸€æŽ¥å£åQŒåˆ†å±‚ç³»¾lŸå’ŒæŒ‰éœ€ä»£ç ã€?/p>
¾lŸä¸€æŽ¥å£
分层¾pÈ»Ÿ
按需代ç
REST的设计准�/strong>
REST架构是针对Web应用而设计的åQŒå…¶ç›®çš„æ˜¯äؓ了é™ä½Žå¼€å‘çš„å¤æ‚性,æé«˜¾pÈ»Ÿçš„å¯ä¼¸ç¾ƒæ€§ã€‚RESTæå‡ºäº†å¦‚下设计准则:
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Œè¿™¿UURI的设计被¿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¸Š
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 + "]";
}
}
图解----
å书下è²http://download.csdn.net/detail/l_ji_l/4116804
æºä»£ç 下载:http://download.csdn.net/detail/l_ji_l/4116788
æŠ¥é”™åŽŸå› å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)