天天看点

Struts 2 开发 RESTful 服务

绠€浠嬶細 聽浠?V2.1 寮€濮嬶紝Struts 2 寮€濮嬫彁渚?Convention 鎻掍欢锛屽畠鍏佽鏍规嵁鈥滅害瀹氣€濇潵鎼滅储 Action锛屼互鍙婄鐞?Action 鍜?Result 鐨勬槧灏勩€傚彟澶栵紝Struts 2.1 杩樻彁渚涗簡 REST 鎻掍欢锛屼娇 Struts 2 鍙互鏀寔 Rails 椋庢牸鐨?URL锛屼互瀵瑰鎻愪緵 REST 椋庢牸鐨勮祫婧愭湇鍔°€傛湰鏂囦綔鑰呴€氳繃浠g爜绀轰緥婕旂ず浜嗚繖浜涚壒鎬с€?

REST 绠€浠?

REST 鏄嫳鏂?Representational State Transfer 鐨勭缉鍐欙紝杩欎釜鏈鐢?Roy Thomas Fielding 鍗氬+鍦ㄤ粬鐨勮鏂囥€夾rchitectural Styles and the Design of Network-based Software Architectures銆嬩腑鎻愬嚭銆備粠杩欑瘒璁烘枃鐨勬爣棰樺彲浠ョ湅鍑猴細REST 鏄竴绉嶅熀浜庣綉缁滅殑杞欢鏋舵瀯椋庢牸銆?

鎻愮ず锛氬浗鍐呭緢澶氱綉缁滆祫鏂欏皢 REST 缈昏瘧涓衡€滆〃杩版€х姸鎬佽浆绉烩€濓紝涓嶈繃绗旇€呭杩欎釜缈昏瘧涓嶅お璁ゅ悓銆傚洜涓鸿繖涓笓涓氭湳璇棤娉曚紶杈?REST 鐨勫惈涔夛紝璇昏€呭彲浠ュ厛涓嶈鐞嗕細 REST 鍒板簳璇ュ浣曠炕璇戯紝灏介噺鍏堝幓鐞嗚В REST 鏄粈涔堬紵鏈変粈涔堢敤锛熺劧鍚庡啀鏉ョ湅杩欎釜鏈鐨勭炕璇戙€傚叧浜?Roy Thomas Fielding 鍗氬+鐨勫師鏂囧弬瑙佸涓嬪湴鍧€锛歨ttp://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm銆?

REST 鏋舵瀯鏄拡瀵逛紶缁?Web 搴旂敤鎻愬嚭鐨勪竴绉嶆敼杩涳紝鏄竴绉嶆柊鍨嬬殑鍒嗗竷寮忚蒋浠惰璁℃灦鏋勩€傚浜庡紓鏋勭郴缁熷浣曡繘琛屾暣鍚堢殑闂锛岀洰鍓嶄富娴佸仛娉曢兘闆嗕腑鍦ㄤ娇鐢?SOAP銆乄SDL 鍜?WS-* 瑙勮寖鐨?Web Services銆傝€?REST 鏋舵瀯瀹為檯涓婁篃鏄В鍐冲紓鏋勭郴缁熸暣鍚堥棶棰樼殑涓€绉嶆柊鎬濊矾銆?

濡傛灉寮€鍙戣€呭湪寮€鍙戣繃绋嬩腑鑳藉潥鎸?REST 鍘熷垯锛屽皢鍙互寰楀埌涓€涓娇鐢ㄤ簡浼樿川 Web 鏋舵瀯鐨勭郴缁燂紝浠庤€屼负绯荤粺鎻愪緵鏇村ソ鐨勫彲浼哥缉鎬э紝骞堕檷浣庡紑鍙戦毦搴︺€傚叧浜?REST 鏋舵瀯鐨勪富瑕佸師鍒欏涓嬶細

  • 缃戠粶涓婄殑鎵€鏈変簨鐗╅兘鍙鎶借薄涓鸿祫婧愶紙Resource锛夈€?/li>
  • 姣忎釜璧勬簮閮芥湁涓€涓敮涓€鐨勮祫婧愭爣璇嗙锛圧esource Identifier锛夈€?/li>
  • 鍚屼竴璧勬簮鍏锋湁澶氱琛ㄧ幇褰㈠紡銆?/li>
  • 浣跨敤鏍囧噯鏂规硶鎿嶄綔璧勬簮銆?/li>
  • 閫氳繃缂撳瓨鏉ユ彁楂樻€ц兘銆?/li>
  • 瀵硅祫婧愮殑鍚勭鎿嶄綔涓嶄細鏀瑰彉璧勬簮鏍囪瘑绗︺€?/li>
  • 鎵€鏈夌殑鎿嶄綔閮芥槸鏃犵姸鎬佺殑锛圫tateless锛夈€?/li>

浠呬粠涓婇潰鍑犳潯鍘熷垯鏉ョ湅 REST 鏋舵瀯锛屽叾瀹炰緷鐒舵瘮杈冮毦浠ョ悊瑙o紝涓嬮潰绗旇€呭皢浠庡涓嬩簩涓柟闈㈡潵浠嬬粛 REST銆?

璧勬簮鍜屾爣璇嗙

鐜板湪鐨?Web 搴旂敤涓婂寘鍚簡澶ч噺淇℃伅锛屼絾杩欎簺淇℃伅閮借闅愯棌鍦?HTML銆丆SS 鍜?JavaScript 浠g爜涓紝瀵逛簬鏅€氭祻瑙堣€呰€岃█锛屼粬浠繘鍏ヨ繖涓郴缁熸椂鏃犳硶鐭ラ亾璇ョ郴缁熷寘鍚摢浜涢〉闈紱瀵逛簬涓€涓渶瑕佽闂绯荤粺璧勬簮鐨勭涓夋柟绯荤粺鑰岃█锛屽悓鏍锋棤娉曟槑鐧借繖涓郴缁熷寘鍚 灏戝姛鑳藉拰淇℃伅銆?

URI 鍜?URL

涓?URI 鐩稿叧鐨勬蹇佃繕鏈?URL锛孶RL 鏄?Uniform Resource Locator锛屼篃灏辨槸缁熶竴璧勬簮瀹氫綅绗︾殑鎰忔€濄€傚叾涓?http://www.crazyit.org 灏辨槸涓€涓粺涓€璧勬簮瀹氫綅绗︼紝URL 鏄?URI 鐨勫瓙闆嗐€傜畝鑰岃█涔嬶細姣忎釜 URL 閮芥槸 URI锛屼絾涓嶆槸姣忎釜 URI 閮芥槸 URL銆?

浠?REST 鏋舵瀯鐨勮搴︽潵鐪嬶紝璇ョ郴缁熼噷鍖呭惈鐨勬墍鏈夊姛鑳藉拰淇℃伅锛岄兘鍙绉颁负璧勬簮锛圧esource锛夛紝REST 鏋舵瀯涓殑璧勬簮鍖呭惈闈欐€侀〉闈€丣SP 鍜?Servlet 绛夛紝璇ュ簲鐢ㄦ毚闇插湪缃戠粶涓婄殑鎵€鏈夊姛鑳藉拰淇℃伅閮藉彲琚О涓鸿祫婧愩€?

闄ゆ涔嬪锛孯EST 鏋舵瀯瑙勮寖浜嗗簲鐢ㄨ祫婧愮殑鍛藉悕鏂瑰紡锛孯EST 瑙勫畾瀵瑰簲鐢ㄨ祫婧愪娇鐢ㄧ粺涓€鐨勫懡鍚嶆柟寮忥細REST 绯荤粺涓殑璧勬簮蹇呴』缁熶竴鍛藉悕鍜岃鍒掞紝REST 绯荤粺鐢变娇鐢?URI锛圲niform Resource Identifier锛屽嵆缁熶竴璧勬簮鏍囪瘑绗︼級鍛藉悕鐨勮祫婧愮粍鎴愩€傜敱浜?REST 瀵硅祫婧愪娇鐢ㄤ簡鍩轰簬 URI 鐨勭粺涓€鍛藉悕锛屽洜姝よ繖浜涗俊鎭氨鑷劧鍦版毚闇插嚭鏉ヤ簡锛屼粠鑰岄伩鍏?鈥滀俊鎭湴绐栤€濈殑涓嶈壇鍚庢灉銆?

瀵逛簬褰撲粖鏈€甯歌鐨勭綉缁滃簲鐢ㄦ潵璇达紝璧勬簮鏍囪瘑绗﹀氨鏄?URI锛岃祫婧愮殑浣跨敤鑰呭垯鏍规嵁 URI 鏉ユ搷浣滃簲鐢ㄨ祫婧愩€傚綋 URI 鍙戠敓鏀瑰彉鏃讹紝琛ㄦ槑瀹㈡埛鏈烘墍浣跨敤鐨勮祫婧愬彂鐢熶簡鏀瑰彉銆?

浠庤祫婧愮殑瑙掑害鏉ョ湅锛屽綋瀹㈡埛鏈烘搷浣滀笉鍚岀殑璧勬簮鏃讹紝璧勬簮鎵€鍦ㄧ殑 Web 椤碉紙灏?Web 椤靛綋鎴愯櫄鎷熺殑鐘舵€佹満鏉ョ湅锛夌殑鐘舵€佸氨浼氬彂鐢熸敼鍙樸€佽縼绉伙紙Transfer锛夛紝杩欏氨鏄?REST 鏈涓?ST锛圫tate Tranfer锛夌殑鐢辨潵浜嗐€?

瀹㈡埛鏈轰负浜嗘搷浣滀笉鍚岀姸鎬佺殑璧勬簮锛屽垯闇€瑕佸彂閫佷竴浜?Representational 鐨勬暟鎹紝杩欎簺鏁版嵁鍖呭惈蹇呰鐨勪氦浜掓暟鎹紝浠ュ強鎻忚堪杩欎簺鏁版嵁鐨勫厓鏁版嵁銆傝繖灏辨槸 REST 鏈涓?RE锛圧epresentational锛夌殑鐢辨潵浜嗐€傜悊瑙d簡杩欎釜灞傛涔嬪悗锛岃嚦浜?REST 濡備綍缈昏瘧銆佹垨鏄惁鐪熸缁欏畠涓€涓腑鏂囨湳璇紝璇昏€呭彲鑷鍐冲畾銆?

鎿嶄綔璧勬簮鐨勬柟寮?

瀵逛簬 REST 鏋舵瀯鐨勬湇鍔″櫒绔€岃█锛屽畠鎻愪緵鐨勬槸璧勬簮锛屼絾鍚屼竴璧勬簮鍏锋湁澶氱琛ㄧ幇褰㈠紡锛堝彲閫氳繃鍦?HTTP Content-type 澶翠腑鍖呭惈鍏充簬鏁版嵁绫诲瀷鐨勫厓鏁版嵁锛夈€傚鏋滃鎴风▼搴忓畬鍏ㄦ敮鎸?HTTP 搴旂敤鍗忚锛屽苟鑳芥纭鐞?REST 鏋舵瀯鐨勬爣鍑嗘暟鎹牸寮忥紝閭d箞瀹冨氨鍙互涓庝笘鐣屼笂浠绘剰涓€涓?REST 椋庢牸鐨勭敤鎴蜂氦浜掋€傝繖绉嶆儏鍐典笉浠呴€傜敤浜庝粠鏈嶅姟鍣ㄧ鍒板鎴风鐨勬暟鎹紝鍙嶄箣浜︾劧鈥斺€斿€樿嫢浠庡鎴风浼犳潵鐨勬暟鎹鍚?REST 鏋舵瀯鐨勬爣鍑嗘暟鎹牸寮忥紝閭d箞鏈嶅姟鍣ㄧ涔熷彲浠ユ纭鐞嗘暟鎹紝鑰屼笉鍘诲叧蹇冨鎴风鐨勭被鍨嬨€?

鍏稿瀷鎯呭喌涓嬶紝REST 椋庢牸鐨勮祫婧愯兘浠?XHTML銆乆ML 鍜?JSON 涓夌褰㈠紡瀛樺湪锛屽叾涓?XML 鏍煎紡鐨勬暟鎹槸 WebServices 鎶€鏈殑鏁版嵁浜ゆ崲鏍煎紡锛岃€?JSON 鍒欐槸鍙︿竴绉嶈交閲忕骇鐨勬暟鎹氦鎹㈡牸寮忥紱鑷充簬 XHTML 鏍煎紡鍒欎富瑕佺敱娴忚鍣ㄨ礋璐e憟鐜般€傚綋鏈嶅姟鍣ㄤ负鎵€鏈夎祫婧愭彁渚涘绉嶈〃鐜板舰寮忎箣鍚庯紝杩欎簺璧勬簮涓嶄粎鍙互琚爣鍑?Web 娴忚鍣ㄦ墍浣跨敤锛岃繕鍙互鐢?JavaScript 閫氳繃 Ajax 鎶€鏈皟鐢紝鎴栬€呬互 RPC锛圧emote Procedure Call锛夐鏍艰皟鐢紝浠庤€屽彉鎴?REST 椋庢牸鐨?WebServices銆?

REST 鏋舵瀯闄や簡瑙勫畾鏈嶅姟鍣ㄦ彁渚涜祫婧愮殑鏂瑰紡涔嬪锛岃繕鎺ㄨ崘瀹㈡埛绔娇鐢?HTTP 浣滀负 Generic Connector Interface锛堜篃灏辨槸閫氱敤杩炴帴鍣ㄦ帴鍙o級锛岃€?HTTP 鍒欐妸瀵逛竴涓?URI 鐨勬搷浣滈檺鍒跺湪浜?4 涓箣鍐咃細GET銆丳OST銆丳UT 鍜?DELETE銆傞€氳繃浣跨敤閫氱敤杩炴帴鍣ㄦ帴鍙e璧勬簮杩涜鎿嶄綔鐨勫ソ澶勬槸淇濊瘉绯荤粺鎻愪緵鐨勬湇鍔¢兘鏄珮搴﹁В鑰︾殑锛屼粠鑰岀畝鍖栦簡绯荤粺寮€鍙戯紝鏀瑰杽浜嗙郴缁熺殑浜や簰鎬у拰鍙噸鐢ㄦ€с€?

REST 鏋舵瀯瑕佹眰瀹㈡埛绔殑鎵€鏈夌殑鎿嶄綔鍦ㄦ湰璐ㄤ笂鏄棤鐘舵€佺殑锛屽嵆浠庡鎴峰埌鏈嶅姟鍣ㄧ殑姣忎釜 Request 閮藉繀椤诲寘鍚悊瑙h Request 鐨勬墍鏈夊繀闇€淇℃伅銆傝繖绉嶆棤鐘舵€佹€х殑瑙勮寖鎻愪緵浜嗗涓嬪嚑鐐瑰ソ澶勶細

  • 鏃犵姸鎬佹€т娇寰楀鎴风鍜屾湇鍔″櫒绔笉蹇呬繚瀛樺鏂圭殑璇︾粏淇℃伅锛屾湇鍔″櫒鍙渶瑕佸鐞嗗綋鍓?Request锛岃€屼笉蹇呬簡瑙e墠闈?Request 鐨勫巻鍙层€?/li>
  • 鏃犵姸鎬佹€у噺灏戜簡鏈嶅姟鍣ㄤ粠灞€閮ㄩ敊璇腑鎭㈠鐨勪换鍔¢噺锛屽彲浠ラ潪甯告柟渚垮湴瀹炵幇 Fail Over 鎶€鏈紝浠庤€屽緢瀹规槗鍦板皢鏈嶅姟鍣ㄧ粍浠堕儴缃插湪闆嗙兢鍐呫€?/li>
  • 鏃犵姸鎬佹€т娇寰楁湇鍔″櫒绔笉蹇呭湪澶氫釜 Request 涓繚瀛樼姸鎬侊紝浠庤€屽彲浠ユ洿瀹规槗鍦伴噴鏀捐祫婧愩€?/li>
  • 鏃犵姸鎬佹€ф棤闇€鏈嶅姟缁勪欢淇濆瓨 Request 鐘舵€侊紝鍥犳鍙鏈嶅姟鍣ㄥ厖鍒嗗埄鐢?Pool 鎶€鏈潵鎻愰珮绋冲畾鎬у拰鎬ц兘銆?/li>

褰撶劧锛屾棤鐘舵€佹€т細浣垮緱鏈嶅姟鍣ㄤ笉鍐嶄繚瀛?Request 鐨勭姸鎬佹暟鎹紝鍥犳闇€瑕佸湪涓€绯诲垪 Request 涓彂閫侀噸澶嶆暟鎹紝浠庤€屾彁楂樹簡绯荤粺鐨勯€氫俊鎴愭湰銆備负浜嗘敼鍠勬棤鐘舵€佹€у甫鏉ョ殑鎬ц兘涓嬮檷锛孯EST 鏋舵瀯濉姞浜嗙紦瀛樼害鏉熴€傜紦瀛樼害鏉熷厑璁搁殣寮忔垨鏄惧紡鍦版爣璁颁竴涓?Response 涓殑鏁版嵁锛岃繖鏍峰氨璧嬩簣浜嗗鎴风缂撳瓨 Response 鏁版嵁鐨勫姛鑳斤紝杩欐牱灏卞彲浠ヤ负浠ュ悗鐨?Request 鍏辩敤缂撳瓨鐨勬暟鎹紝閮ㄥ垎鎴栧叏閮ㄧ殑娑堥櫎涓€浜涗氦浜掞紝澧炲姞浜嗙綉缁滅殑鏁堢巼銆備絾鏄敤浜庡鎴风缂撳瓨浜嗕俊鎭紝涔熷氨鍚屾椂澧炲姞浜嗗鎴风涓庢湇鍔″櫒鏁版嵁涓嶄竴鑷寸殑鍙兘锛屼粠鑰岄檷浣庝簡鍙?闈犳€с€?

Struts 2 鐨?REST 鏀寔

绾﹀畾浼樹簬閰嶇疆

Convention 杩欎釜鍗曡瘝鐨勭炕璇戣繃鏉ュ氨鏄€滅害瀹氣€濈殑鎰忔€濄€傛湁 Ruby On Rails 寮€鍙戠粡楠岀殑璇昏€呯煡閬?Rails 鏈変竴鏉¢噸瑕佸師鍒欙細绾﹀畾浼樹簬閰嶇疆銆俁ails 寮€鍙戣€呭彧闇€瑕佹寜绾﹀畾寮€鍙?ActiveRecord銆丄ctiveController 鍗冲彲锛屾棤闇€杩涜閰嶇疆銆傚緢鏄庢樉锛孲truts 2 鐨?Convention 鎻掍欢鍊熼壌浜?Rails 鐨勫垱鎰忥紝鐢氳嚦杩炴彃浠剁殑鍚嶇О閮藉€熼壌浜嗏€滅害瀹氫紭浜庨厤缃€濆師鍒欍€?

浠?Struts 2.1 寮€濮嬶紝Struts 2 鏀逛负浣跨敤 Convention 鎻掍欢鏉ユ敮鎸侀浂閰嶇疆銆侰onvention 鎻掍欢褰诲簳鍦版姏寮冧簡閰嶇疆淇℃伅锛屼笉浠呬笉闇€瑕佷娇鐢?struts.xml 鏂囦欢杩涜閰嶇疆锛岀敋鑷充笉闇€瑕佷娇鐢?Annotation 杩涜閰嶇疆銆傝€屾槸鐢?Struts 2 鏍规嵁绾﹀畾鏉ヨ嚜鍔ㄩ厤缃€?

Convention 杩欎釜鍗曡瘝鐨勭炕璇戣繃鏉ュ氨鏄€滅害瀹氣€濈殑鎰忔€濄€傛湁 Ruby On Rails 寮€鍙戠粡楠岀殑璇昏€呯煡閬?Rails 鏈変竴鏉¢噸瑕佸師鍒欙細绾﹀畾浼樹簬閰嶇疆銆俁ails 寮€鍙戣€呭彧闇€瑕佹寜绾﹀畾寮€鍙?ActiveRecord銆丄ctiveController 鍗冲彲锛屾棤闇€杩涜閰嶇疆銆傚緢鏄庢樉锛孲truts 2 鐨?Convention 鎻掍欢鍊熼壌浜?Rails 鐨勫垱鎰忥紝鐢氳嚦杩炴彃浠剁殑鍚嶇О閮藉€熼壌浜嗏€滅害瀹氫紭浜庨厤缃€濆師鍒欍€?

鐢变簬 Struts 2 鐨?Convention 鎻掍欢鐨勪富瑕佺壒鐐规槸鈥滅害瀹氫紭浜庨厤缃€濓紝褰撴垜浠凡缁忎範鎯簡 Struts 2 鐨勫熀鏈紑鍙戞柟娉曚箣鍚庯紝濡傛灉甯屾湜鏀逛负浣跨敤 Convention 鎻掍欢涔熼潪甯稿鏄擄紝鎴戜滑鍙鏀惧純 Stuts 2.1 搴旂敤鍘熸湁鐨勯厤缃枃浠讹紝鏀逛负鎸?Convention 鎻掍欢鐨勭害瀹氭潵瀹氫箟 Action 鍗冲彲銆?

浠?Convention 鎻掍欢涓哄熀纭€锛孲truts 2.1 鍙堟柊澧炰簡 REST 鎻掍欢锛屽厑璁?Struts 2 搴旂敤瀵瑰鎻愪緵 REST 鏈嶅姟銆俁EST 鎻掍欢涔熸棤闇€浣跨敤 XML 杩涜閰嶇疆绠$悊銆係truts 2.1 閫氳繃 REST 鎻掍欢瀹屽叏鍙互鎻愪緵璁╀汉鍜屾満鍣ㄥ鎴风鍏卞悓浣跨敤鐨勮祫婧愶紝骞舵敮鎸?Ruby On Rails 椋庢牸鐨?URL銆?

RestActionMapper 绠€浠?

浠庢湰璐ㄤ笂鏉ョ湅锛孲truts 2 渚濈劧鏄竴涓?MVC 妗嗘灦锛屾渶鍒濊璁?Struts 2 鏃跺苟娌℃湁鎸?REST 鏋舵瀯杩涜璁捐锛屽洜姝?Struts 2 鏈川涓婂苟涓嶆槸涓€涓?REST 妗嗘灦銆傜敱浜?Struts 2 鎻愪緵浜嗚壇濂界殑鍙墿灞曟€э紝鍥犳鍏佽閫氳繃 REST 鎻掍欢灏嗗叾鎵╁睍鎴愭敮鎸?REST 鐨勬鏋躲€俁EST 鎻掍欢鐨勬牳蹇冩槸 RestActionMapper锛屽畠璐熻矗灏?Rails 椋庢牸鐨?URL 杞崲涓轰紶缁熻姹傜殑 URL銆?

鐢?WinRAR 鎵撳紑 struts2-rest-plugin-2.1.6 鏂囦欢锛岀湅鍒拌鏂囦欢閲屽寘鍚竴涓?struts-plugin.xml 鏂囦欢锛岃鏂囦欢涓寘鍚涓嬩竴琛岋細

<!-- 瀹氫箟鏀寔 REST 鐨?ActionMapper -->

<bean type="org.apache.struts2.dispatcher.mapper.ActionMapper"

  name="rest" class="org.apache.struts2.rest.RestActionMapper" />

			      

閫氳繃鏌ョ湅 RestActionMapper 鐨?API 璇存槑锛屾垜浠彂鐜板畠鍙帴鍙楀涓嬪嚑涓弬鏁帮細

  • struts.mapper.idParameterName锛氱敤浜庤缃?ID 璇锋眰鍙傛暟鐨勫弬鏁板悕锛岃灞炴€у€奸粯璁ゆ槸 id銆?/li>
  • struts.mapper.indexMethodName锛氳缃笉甯?id 璇锋眰鍙傛暟鐨?GET 璇锋眰璋冪敤 Action 鐨勫摢涓柟娉曘€傝灞炴€у€奸粯璁ゆ槸 index銆?/li>
  • struts.mapper.getMethodName锛氳缃甫 id 璇锋眰鍙傛暟鐨?GET 璇锋眰璋冪敤 Action 鐨勫摢涓柟娉曘€傝灞炴€у€奸粯璁ゆ槸 show銆?/li>
  • struts.mapper.postMethodName锛氳缃笉甯?id 璇锋眰鍙傛暟鐨?POST 璇锋眰璋冪敤 Action 鐨勫摢涓柟娉曘€傝灞炴€у€奸粯璁ゆ槸 create銆?/li>
  • struts.mapper.putMethodName锛氳缃甫 id 璇锋眰鍙傛暟鐨?PUT 璇锋眰璋冪敤 Action 鐨勫摢涓柟娉曘€傝灞炴€у€奸粯璁ゆ槸 update銆?/li>
  • struts.mapper.deleteMethodName锛氳缃甫 id 璇锋眰鍙傛暟鐨?DELETE 璇锋眰璋冪敤 Action 鐨勫摢涓柟娉曘€傝灞炴€у€奸粯璁ゆ槸 destroy銆?/li>
  • struts.mapper.editMethodName锛氳缃甫 id 璇锋眰鍙傛暟銆佷笖鎸囧畾鎿嶄綔 edit 璧勬簮鐨?GET 璇锋眰璋冪敤 Action 鐨勫摢涓柟娉曘€傝灞炴€у€奸粯璁ゆ槸 edit銆?/li>
  • struts.mapper.newMethodName锛氳缃笉甯?id 璇锋眰鍙傛暟銆佷笖鎸囧畾鎿嶄綔 edit 璧勬簮鐨?GET 璇锋眰璋冪敤 Action 鐨勫摢涓柟娉曘€傝灞炴€у€奸粯璁ゆ槸 editNew銆?/li>

鍦?RestActionMapper 鐨勬柟娉曞垪琛ㄤ腑锛屾垜浠湅鍒?setIdParameterName銆乻etIndexMethodName銆乻etGetMethodName銆?setPostMethodName銆乻etPutMethodName銆乻etDeleteMethodName銆?setEditMethodName銆乻etNewMethodName 绛夋柟娉曪紝杩欎簺鏂规硶瀵瑰簲涓轰笂闈㈠垪鍑虹殑鏂规硶鎻愪緵 setter 鏀寔銆?

閫氬父鎯呭喌涓嬶紝鎴戜滑娌℃湁蹇呰鏀瑰彉 RestActionMapper 鐨勫弬鏁帮紝鐩存帴浣跨敤杩欎簺鍙傛暟鐨勯粯璁ゅ€煎氨鍙敮鎸?Rails 椋庢牸鐨?REST銆傛牴鎹墠闈粙缁嶅彲浠ョ湅鍑猴細鏀寔 REST 椋庢牸鐨?Action 鑷冲皯鍖呭惈濡備笅 7 涓柟娉曪細

  • index锛氬鐞嗕笉甯?id 璇锋眰鍙傛暟鐨?GET 璇锋眰銆?/li>
  • show锛氬鐞嗗甫 id 璇锋眰鍙傛暟鐨?GET 璇锋眰銆?/li>
  • create锛氬鐞嗕笉甯?id 璇锋眰鍙傛暟鐨?POST 璇锋眰銆?/li>
  • update锛氬鐞嗗甫 id 璇锋眰鍙傛暟鐨?PUT 璇锋眰銆?/li>
  • destroy锛氬鐞嗗甫 id 璇锋眰鍙傛暟鐨?DELETE 璇锋眰銆?/li>
  • edit锛氬鐞嗗甫 id 璇锋眰鍙傛暟锛屼笖鎸囧畾鎿嶄綔 edit 璧勬簮鐨?GET 璇锋眰銆?/li>
  • editNew锛氬鐞嗕笉甯?id 璇锋眰鍙傛暟锛屼笖鎸囧畾鎿嶄綔 edit 璧勬簮鐨?GET 璇锋眰銆?/li>

濡傛灉璇锋眰闇€瑕佸悜鏈嶅姟鍣ㄥ彂閫?id 璇锋眰鍙傛暟锛岀洿鎺ュ皢璇锋眰鍙傛暟鐨勫€奸檮鍔犲湪 URL 涓嵆鍙€傝〃 1 鏄剧ず浜?RestActionMapper 瀵逛笉鍚?HTTP 璇锋眰鐨勫鐞嗙粨鏋溿€?

琛?1. RestActionMapper 瀵?HTTP 璇锋眰鐨勫鐞?

HTTP 鏂规硶 URI 璋冪敤 Action 鐨勬柟娉? 璇锋眰鍙傛暟
GET /book index
POST /book create
PUT /book/2 update id=2
DELETE /book/2 destroy id=2
GET /book/2 show id=2
GET /book/2/edit edit id=2
GET /book/new editNew

涓嶅垢鍦版槸锛屾爣鍑?HTML 璇█鐩墠鏍规湰涓嶆敮鎸?PUT 鍜?DELETE 涓や釜鎿嶄綔锛屼负浜嗗讥琛ヨ繖绉嶄笉瓒筹紝REST 鎻掍欢鍏佽寮€鍙戣€呮彁浜よ姹傛椂棰濆澧炲姞涓€涓?_method 璇锋眰鍙傛暟锛岃鍙傛暟鍊煎彲浠ヤ负 PUT 鎴?DELETE锛岀敤浜庢ā鎷?HTTP 鍗忚鐨?PUT 鍜?DELETE 鎿嶄綔銆?

鍥為〉棣?

涓?Struts 2 搴旂敤瀹夎 REST 鎻掍欢

瀹夎 REST 鎻掍欢闈炲父绠€鍗曪紝鍙渶鎸夊涓嬫楠よ繘琛屽嵆鍙細

  1. 灏?Struts 2 椤圭洰涓?struts2-convention-plugin-2.1.6.jar銆乻truts2-rest-plugin-2.1.6.jar 涓や釜 JAR 鍖呭鍒跺埌 Web 搴旂敤鐨?WEB-INF/lib 璺緞涓嬨€?/li>
  2. 鐢变簬 Struts 2 鐨?REST 鎻掍欢杩橀渶瑕佸皢鎻愪緵 XML銆丣SON 鏍煎紡鐨勬暟鎹紝鍥犳杩橀渶瑕佸皢 xstream-1.2.2.jar銆乯son-lib-2.1.jar銆乪zmorph-1.0.3.jar 浠ュ強 Jakarta-Common 鐩稿叧 JAR 鍖呭鍒跺埌 Web 搴旂敤鐨?WEB-INF/lib 璺緞涓嬨€?/li>
  3. 閫氳繃 struts.xml銆乻truts.properties 鎴?web.xml 鏀瑰彉 struts.convention.default.parent.package 甯搁噺鐨勫€硷紝璁╂敮鎸?REST 椋庢牸鐨?Action 鎵€鍦ㄧ殑鍖呴粯璁ょ户鎵?rest-default锛岃€屼笉鏄户鎵块粯璁ょ殑 convention-default 鐖跺寘銆?/li>

瀵逛簬绗笁涓楠よ€岃█锛屽紑鍙戣€呭畬鍏ㄥ彲浠ヤ笉璁剧疆璇ュ父閲忥紝濡傛灉寮€鍙戣€呬笉璁剧疆璇ュ父閲忥紝鍒欐剰鍛崇潃寮€鍙戣€呭繀椤婚€氳繃 Annotation 涓烘瘡涓?Action 绫昏缃埗鍖呫€?

鍥為〉棣?

瀹炵幇鏀寔 REST 鐨?Action 绫?

鍦ㄥ疄鐜版敮鎸?REST 鐨?Action 涔嬪墠锛屾垜浠厛涓虹郴缁熸彁渚涗竴涓?Model 绫伙細Book锛岃 Book 绫婚潪甯哥畝鍗曪紝浠g爜濡備笅锛?

public class Book 

{ 

    private Integer id; 

    private String name; 

    private double price; 

    // 鏃犲弬鏁扮殑鏋勯€犲櫒

    public Book(){} 

    //id 灞炴€х殑 setter 鍜?getter 鏂规硶

    public void setId(Integer id) 

    { 

        this.id = id; 

    } 

    public Integer getId() 

    { 

        return this.id; 

    } 

    // 鐪佺暐 name 鍜?price 鐨?setter 鍜?getter 鏂规硶

    ... 

} 

      

闄や簡鎻愪緵涓婇潰鐨?Book 绫讳箣澶栵紝鎴戜滑杩樹负璇?Book 绫绘彁渚涗竴涓笟鍔¢€昏緫缁勪欢锛欱ookService銆備负浜嗙畝鍗曡捣瑙侊紝BookService 绫讳笉鍐嶄緷璧?DAO 缁勪欢璁块棶鏁版嵁搴擄紝鑰屾槸鐩存帴鎿嶄綔鍐呭瓨涓殑 Book 鏁扮粍鈥斺€旂畝鍗曞湴璇达紝鏈郴缁熶腑鐘舵€佹槸鐬€佺殑锛屾病鏈夋寔涔呭寲淇濆瓨锛屽簲鐢ㄨ繍琛岃繃绋嬩腑杩欎簺鐘舵€佷竴鐩村瓨鍦紝浣嗕竴鏃﹂噸鍚搴旂敤锛屽垯绯荤粺鐘舵€佷涪澶便€備笅闈㈡槸 BookService 绫荤殑浠g爜锛?

public class BookService 

{ 

    private static Map<Integer , Book> books 

        = new HashMap<Integer , Book>(); 

    // 淇濈暀涓嬫湰鍥句功鐨?ID 

    private static int nextId = 5; 

    // 浠ュ唴瀛樹腑鐨勬暟鎹ā鎷熸暟鎹簱鐨勬寔涔呭瓨鍌?
    static { 

        books.put(1 , new Book(1 

            , "鐤媯 Java 璁蹭箟" , 99)); 

        books.put(2 , new Book(2 

            , "杞婚噺绾?Java EE 浼佷笟搴旂敤瀹炴垬" , 89)); 

        books.put(3 , new Book(3 

            , "鐤媯 Ajax 璁蹭箟", 78)); 

        books.put(4 , new Book(4 

            , "Struts 2 鏉冨▉鎸囧崡" , 79)); 

    } 

    

    // 鏍规嵁 ID 鑾峰彇

    public Book get(int id)

    { 

        return books.get(id); 

    } 

    

    // 鑾峰彇绯荤粺涓叏閮ㄥ浘涔?
    public List<Book> getAll() 

    { 

        return new ArrayList<Book>(books.values()); 

    } 

    

    // 鏇存柊宸叉湁鐨勫浘涔︽垨淇濆瓨鏂板浘涔?
    public void saveOrUpdate(Book book)

    { 

        // 濡傛灉璇曞浘淇濆瓨鐨勫浘涔︾殑 ID 涓?null锛岃〃鏄庢槸淇濆瓨鏂扮殑鍥句功

        if (book.getId() == null) 

        { 

            // 涓烘柊鐨勫浘涔﹀垎閰?ID銆?
            book.setId(nextId++); 

        } 

        // 灏嗕繚瀛?book 

        books.put(book.getId() , book); 

    } 

    

    // 鍒犻櫎鍥句功

    public void remove(int id)

    { 

        books.remove(id); 

    } 

} 

      

浠庝笂闈㈢矖浣撳瓧浠g爜鍙互鐪嬪嚭锛孊ookService 鎻愪緵浜?4 涓柟娉曪紝鐢ㄤ簬瀹炵幇瀵?Book 瀵硅薄鐨?CRUD 鎿嶄綔銆?

涓嬮潰寮€濮嬪畾涔夋敮鎸?REST 鐨?Action 绫讳簡锛岃繖涓?Action 绫讳笌鍓嶉潰浠嬬粛 Struts 2 鐨勬櫘閫?Action 瀛樺湪涓€浜涘樊寮傗€斺€斿洜涓鸿 Action 涓嶅啀鐢?execute() 鏂规硶鏉ュ鐞嗙敤鎴疯姹傦紝鑰屾槸浣跨敤鍓嶉潰浠嬬粛鐨?7 涓爣鍑嗘柟娉曟潵澶勭悊鐢ㄦ埛璇锋眰銆傞櫎姝や箣澶栵紝璇?Action 鎬绘槸闇€瑕佸鐞?id 璇锋眰鍙傛暟锛屽洜姝ゅ繀椤绘彁渚?id 璇锋眰鍙傛暟锛屽苟涓轰箣鎻愪緵瀵瑰簲鐨?setter 鍜?getter 鏂规硶銆?

鍥犱负鏈郴缁熷凡缁忔彁渚涗簡 Book Model 绫伙紝骞朵笖涓轰簡鏇村ソ鐨勬ā鎷?Rails 涓?ActiveController锛圕ontroller锛夌洿鎺ヨ闂?ActiveRecord锛圡odel锛夌殑鏂瑰紡锛屾湰绯荤粺閲囩敤浜?ModelDriven 鐨勫紑鍙戞柟寮忥紝涓嬮潰鏄湰绯荤粺涓敮鎸?REST 鐨?Action 绫荤殑浠g爜銆?

// 瀹氫箟杩斿洖 success 鏃堕噸瀹氬悜鍒?book Action 

 @Results(@Result(name="success"

    , type="redirectAction"

    , params = {"actionName" , "book"})) 

 public class BookController extends ActionSupport 

    implements ModelDriven<Object> 

 { 

    // 灏佽 id 璇锋眰鍙傛暟鐨勫睘鎬?
    private int id; 

    private Book model = new Book(); 

    private List<Book> list; 

    // 瀹氫箟涓氬姟閫昏緫缁勪欢

    private BookService bookService = new BookService(); 

    // 鑾峰彇 id 璇锋眰鍙傛暟鐨勬柟娉?
    public void setId(int id) 

    { 

        this.id = id; 

        // 鍙栧緱鏂规硶鏃堕『甯﹀垵濮嬪寲 model 瀵硅薄

        if (id > 0) 

        { 

            this.model = bookService.get(id); 

        } 

    } 

    public int getId() 

    { 

        return this.id; 

    } 

    // 澶勭悊涓嶅甫 id 鍙傛暟鐨?GET 璇锋眰

    // 杩涘叆棣栭〉

    public HttpHeaders index() 

    { 

        list = bookService.getAll(); 

        return new DefaultHttpHeaders("index") 

            .disableCaching(); 

    } 

    // 澶勭悊涓嶅甫 id 鍙傛暟鐨?GET 璇锋眰

    // 杩涘叆娣诲姞鏂板浘涔︺€?
    public String editNew() 

    { 

        // 鍒涘缓涓€涓柊鍥句功

        model = new Book(); 

        return "editNew"; 

    } 

    // 澶勭悊涓嶅甫 id 鍙傛暟鐨?POST 璇锋眰

    // 淇濆瓨鏂板浘涔?
    public HttpHeaders create() 

    { 

        // 淇濆瓨鍥句功

        bookService.saveOrUpdate(model); 

        addActionMessage("娣诲姞鍥句功鎴愬姛"); 

        return new DefaultHttpHeaders("success") 

            .setLocationId(model.getId()); 

    } 

    // 澶勭悊甯?id 鍙傛暟鐨?GET 璇锋眰

    // 鏄剧ず鎸囧畾鍥句功

    public HttpHeaders show() 

    { 

        return new DefaultHttpHeaders("show"); 

    } 

    // 澶勭悊甯?id 鍙傛暟銆佷笖鎸囧畾鎿嶄綔 edit 璧勬簮鐨?GET 璇锋眰

    // 杩涘叆缂栬緫椤甸潰 (book-edit.jsp) 

    public String edit() 

    { 

        return "edit"; 

    } 

    // 澶勭悊甯?id 鍙傛暟鐨?PUT 璇锋眰

    // 淇敼鍥句功

    public String update() 

    { 

        bookService.saveOrUpdate(model); 

        addActionMessage("鍥句功缂栬緫鎴愬姛锛?); 

        return "success"; 

    } 

    // 澶勭悊甯?id 鍙傛暟锛屼笖鎸囧畾鎿嶄綔 deleteConfirm 璧勬簮鐨勬柟娉?
    // 杩涘叆鍒犻櫎椤甸潰 (book-deleteConfirm.jsp) 

    public String deleteConfirm() 

    { 

        return "deleteConfirm"; 

    } 

    // 澶勭悊甯?id 鍙傛暟鐨?DELETE 璇锋眰

    // 鍒犻櫎鍥句功

    public String destroy() 

    { 

        bookService.remove(id); 

        addActionMessage("鎴愬姛鍒犻櫎 ID 涓? + id + "鐨勫浘涔︼紒"); 

        return "success"; 

    } 

    // 瀹炵幇 ModelDriven 鎺ュ彛蹇呴』瀹炵幇鐨?getModel 鏂规硶

    public Object getModel() 

    { 

        return (list != null ? list : model); 

    } 

 } 

      

涓婇潰 Action 浠g爜涓矖浣撳瓧浠g爜瀹氫箟浜?7 涓柟娉曪紝杩?7 涓柟娉曟鏄墠闈㈡彁鍒扮殑鏍囧噯鏂规硶銆傞櫎姝や箣澶栵紝璇?Action 閲岃繕鍖呭惈涓€涓澶栫殑 deleteConfirm() 鏂规硶锛岃繖涓柟娉曠敤浜庡鐞嗗甫 id 鍙傛暟銆佷笖鎸囧畾鎿嶄綔 deleteConfirm 璧勬簮鐨?GET 璇锋眰銆備篃灏辨槸璇达紝褰撶敤鎴疯姹?/book/1/deleteConfirm 鏃讹紝璇ヨ姹傚皢鐢辫鏂规硶璐熻矗澶勭悊銆傚疄闄呬笂锛孯estActionMapper 涓嶄粎鍙互灏嗗 /book/1/edit 鐨勮姹傛槧灏勫埌 Book 鎺у埗鍣ㄧ殑 edit() 鏂规硶锛岃€?1 灏嗕綔涓?id 璇锋眰鍙傛暟銆傚疄闄呬笂锛屽畠鍙互灏嗕换鎰?/book/1/xxx 鐨勮姹傛槧灏勫埌 Book 鎺у埗鍣ㄧ殑 xxx() 鏂规硶锛岃€?1 鏄姹傚弬鏁般€備笂闈?Action 绫讳娇鐢ㄤ簡 @Results 杩涜淇グ锛岃繖琛ㄦ槑褰?Action 鐨勪换浣曟柟娉曡繑鍥炩€渟uccess鈥濋€昏緫瑙嗗浘鏃讹紝绯荤粺灏嗛噸瀹氬悜鍒?book.action銆?

鍙兘鏈夎鑰呬細瀵?index()銆乧reate()銆乻how() 涓変釜鏂规硶鐨勮繑鍥炲€兼劅鍒扮枒鎯戯細瀹冧滑涓嶅啀鐩存帴杩斿洖鏅€氬瓧绗︿覆浣滀负閫昏緫瑙嗗浘鍚嶅瓧锛岃€屾槸杩斿洖涓€涓互瀛楃涓蹭负鍙傛暟鐨?DefaultHttpHeaders 瀵硅薄锛熷叾瀹炶鑰呬笉蹇呭 DefaultHttpHeaders 鎰熷埌鐤戞儜锛屽叾瀹?DefaultHttpHeaders 鍙槸鏅€氬瓧绗︿覆鐨勫姞寮哄舰寮忥紝鐢ㄤ簬 REST 瀵瑰鐞嗙粨鏋滆繘琛屾洿澶氶澶栫殑鎺у埗銆傚綋 Action 绫荤殑澶勭悊鏂规硶杩斿洖瀛楃涓蹭綔涓洪€昏緫瑙嗗浘鏃讹紝Struts 2 鍙兘灏嗗叾褰撴垚涓€涓畝鍗曠殑瑙嗗浘鍚嶏紝浠呰兘鏍规嵁璇ヨ鍥惧悕鏄犲皠鍒板疄闄呰鍥捐祫婧愶紝浠呮鑰屽凡銆傚鏋滀娇鐢?DefaultHttpHeaders 浣滀负閫昏緫瑙嗗浘锛孌efaultHttpHeaders 闄や簡鍙互鍖呭惈鏅€氬瓧绗︿覆浣滀负閫昏緫瑙嗗浘鍚嶄箣澶栵紝杩樺彲浠ラ澶栧鍔犳洿澶氱殑鎺у埗鏁版嵁锛屼粠鑰屽彲浠ュ寮哄 Response 鐨勬帶鍒躲€傚叧浜?HttpHeaders 鍜?DefaultHttpHeaders 鐨勪粙缁嶈鍙傝€?REST 鎻掍欢鐨?API銆?

杩樻湁涓€鐐归渶瑕佹寚鍑猴紝涓婇潰鐨?BookController 鎺у埗鍣ㄥ疄鐜扮被鐨勭被鍚嶅苟涓嶄互 Action 缁撳熬锛岃€屾槸浠?Controller 缁撳熬锛屽洜姝ゆ垜浠彲浠ュ湪 struts.xml 鏂囦欢涓厤缃涓嬪父閲忥細

<!--  鎸囧畾鎺у埗鍣ㄧ被鐨勫悗缂€涓?Controller --> 

 <constant name="struts.convention.action.suffix"

    value="Controller"/> 

鏈簲鐢ㄩ噷鐨?struts.xml 鏂囦欢濡備笅锛?
绋嬪簭娓呭崟锛歝odes/12/12.6/BookShow/WEB-INF/src/struts.xml 

 <?xml version="1.0" encoding="GBK" ?> 

 <!-- 鎸囧畾 Struts 2 閰嶇疆鏂囦欢鐨?DTD 淇℃伅 --> 

 <!DOCTYPE struts PUBLIC 

    "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"

    "http://struts.apache.org/dtds/struts-2.1.dtd"> 

 <!-- 鎸囧畾 Struts 2 閰嶇疆鏂囦欢鐨勬牴鍏冪礌 --> 

 <struts> 

    <constant name="struts.i18n.encoding" value="GBK"/> 

    <!--  鎸囧畾鎺у埗鍣ㄧ被鐨勫悗缂€涓?Controller --> 

    <constant name="struts.convention.action.suffix"

        value="Controller"/> 

    <constant name="struts.convention.action.mapAllMatches"

        value="true"/> 

    <!-- 鎸囧畾 Action 鎵€鍦ㄥ寘缁ф壙鐨勭埗鍖?--> 

    <constant name="struts.convention.default.parent.package"

        value="rest-default"/> 

 </struts> 

      

鍥為〉棣?

瀹炵幇瑙嗗浘灞?

瀹氫箟浜嗕笂闈?Action 涔嬪悗锛屾帴涓嬫潵搴旇涓鸿繖浜?Action 鎻愪緵瑙嗗浘椤甸潰浜嗭紝鏍规嵁 Convention 鎻掍欢鐨勭害瀹氾紝鎵€鏈夎鍥鹃〉闈㈤兘搴旇鏀惧湪 WEB-INF/content 鐩綍涓嬶紝渚嬪褰撶敤鎴峰悜 /book.action 鍙戦€佽姹傛椂锛岃璇锋眰灏嗙敱 BookController 鐨?index() 鏂规硶杩涜澶勭悊锛岃鏂规硶澶勭悊缁撴潫鍚庤繑鍥炩€渋ndex鈥濆瓧绗︿覆锛屼篃灏辨槸灏嗕細浣跨敤 WEIN-INF/content/book-index.jsp 椤甸潰浣滀负瑙嗗浘璧勬簮銆備笅闈㈡槸 book-index.jsp 椤甸潰鐨勪唬鐮侊細

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> 

 <%@taglib prefix="s" uri="/struts-tags" %> 

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

 <html xmlns="http://www.w3.org/1999/xhtml"> 

 <head> 

    <title> 鍥句功灞曠ず绯荤粺 </title> 

    <link href="<%=request.getContextPath() %>/css/demo.css" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" 

        rel="stylesheet" type="text/css" /> 

 </head> 

 <body> 

 <s:actionmessage /> 

 <table> 

    <tr> 

        <th> 鍥句功 ID</th> 

        <th> 涔﹀悕 </th> 

        <th> 浠锋牸 </th> 

        <th> 鎿嶄綔 </th> 

    </tr> 

    <s:iterator value="model"> 

    <tr> 

        <td><s:property value="id"/></td> 

        <td>${name}</td> 

        <td>${price}</td> 

        <td><a href="book/${id}" target="_blank" rel="external nofollow" > 鏌ョ湅 </a> | 

        <a href="book/${id}/edit" target="_blank" rel="external nofollow" > 缂栬緫 </a> | 

        <a href="book/${id}/deleteConfirm" target="_blank" rel="external nofollow" > 鍒犻櫎 </a></td> 

    </tr> 

    </s:iterator> 

 </table> 

 <a href="<%=request.getContextPath() %>/book/new" target="_blank" rel="external nofollow" > 鍒涘缓鏂板浘涔?</a> 

 </body> 

 </html> 

      

涓婇潰 JSP 椤甸潰闈炲父绠€鍗曪紝瀹冭礋璐h凯浠h緭鍑?Action 閲屽寘鍚殑闆嗗悎鏁版嵁锛屽悜璇ュ簲鐢?book.action 鍙戦€佽姹傚皢鐪嬪埌濡傚浘 1 鎵€绀洪〉闈€?

鍥?1 浣跨敤 Struts 2 寮€鍙戠殑 REST 鏈嶅姟

Struts 2 开发 RESTful 服务

Struts 2 鐨?REST 鎻掍欢鏀寔涓€绉嶈祫婧愬叿鏈夊灏戣〃绀哄舰寮忥紝褰撴祻瑙堣€呭悜 book.xml 鍙戦€佽姹傚皢鍙互鐪嬪埌濡傚浘 2 鎵€绀洪〉闈€?

鍥?2 REST 鏈嶅姟鐨?XML 褰㈠紡

Struts 2 开发 RESTful 服务

浠庡浘 2 鍙互鐪嬪嚭锛岃椤甸潰姝f槸 Action 鎵€鍖呭惈鐨勫叏閮ㄦ暟鎹紝褰撲娇鐢?XML 鏄剧ず鏃?REST 鎻掍欢灏嗕細璐熻矗鎶婅繖浜涙暟鎹浆鎹㈡垚 XML 鏂囨。銆?

闄ゆ涔嬪锛孯EST 鎻掍欢杩樻彁渚涗簡 JSON 鏍煎紡鐨勬樉绀烘柟寮忥紝褰撳紑鍙戣€呭悜 book.json 鍙戦€佽姹傚皢鐪嬪埌濡傚浘 3 鎵€绀洪〉闈€?

鍥?3 REST 鏈嶅姟鐨?JSON 褰㈠紡

Struts 2 开发 RESTful 服务

Struts 2 鐨?REST 鎻掍欢榛樿鏀寔 XHTML銆乆ML 鍜?JSON 涓夌褰㈠紡鐨勬暟鎹€?

褰撴祻瑙堣€呭崟鍑婚〉闈㈠彸杈圭殑鈥滅紪杈戔€濋摼鎺ワ紝灏嗕細鍚?book/idVal/edit 鍙戦€佽姹傦紝杩欐槸涓€涓寘鍚?ID 璇锋眰鍙傛暟銆佷笖鎸囧畾鎿嶄綔 edit 璧勬簮鐨勮姹傦紝鍥犳灏嗙敱 BookController 鐨?edit() 鏂规硶璐熻矗澶勭悊锛屽鐞嗙粨鏉熷悗杩涘叆 book-edit.jsp 椤甸潰銆傛祻瑙堝櫒閲屽皢鐪嬪埌濡傚浘 4 鎵€绀洪〉闈€?

鍥?4 缂栬緫鎸囧畾鍥句功

Struts 2 开发 RESTful 服务

璇ラ〉闈㈠崟鍑烩€滀慨鏀光€濇寜閽椂闇€瑕佷慨鏀瑰浘涔︿俊鎭紝涔熷氨鏄渶瑕佷娇鐢?PUT 鎿嶄綔锛屼絾鐢变簬 HTML 涓嶆敮鎸?PUT 鎿嶄綔锛屽洜姝ら渶瑕佷负璇ヨ〃鍗曢〉澧炲姞涓€涓澶栫殑璇锋眰鍙傛暟锛歘method锛岃璇锋眰鍙傛暟鐨勫€间负 put銆傝琛ㄥ崟椤电殑浠g爜濡備笅锛?

<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %> 

 <%@taglib prefix="s" uri="/struts-tags" %> 

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

 <html xmlns="http://www.w3.org/1999/xhtml"> 

 <head> 

    <title> 缂栬緫 ID 涓?<s:property value="id"/> 鐨勫浘涔?</title> 

    <link href="<%=request.getContextPath() %>/css/demo.css" target="_blank" rel="external nofollow"  target="_blank" rel="external nofollow" 

        rel="stylesheet" type="text/css" /> 

 </head> 

 <body> 

 <s:form method="post" 

    action="%{#request.contextPath}/book/%{id}"> 

 <!-- 澧炲姞 _method 璇锋眰鍙傛暟锛屽弬鏁板€间负 put 鐢ㄤ簬妯℃嫙 PUT 鎿嶄綔 --> 

 <s:hidden name="_method" value="put" /> 

 <table> 

    <s:textfield name="id" label="鍥句功 ID" disabled="true"/> 

    <s:textfield name="name" label="涔﹀悕"/> 

    <s:textfield name="price" label="浠锋牸" /> 

    <tr> 

        <td colspan="2"> 

            <s:submit value="淇敼"/> 

        </td> 

 </table> 

 </s:form> 

 <a href="<%=request.getContextPath() %>/book" target="_blank" rel="external nofollow" > 杩斿洖棣栭〉 </a> 

 </body> 

 </html> 

      

璇ヨ〃鍗曞皢鎻愪氦缁?BookController 鐨?update() 鏂规硶澶勭悊锛寀pdate() 鏂规硶灏嗚礋璐d慨鏀圭郴缁熼噷鎸囧畾 ID 瀵瑰簲鐨勫浘涔︿俊鎭€?

涓庝箣绫讳技鐨勬槸锛屽綋璇锋眰闇€瑕佹墽琛?DELETE 鎿嶄綔鏃讹紝涓€鏍烽渶瑕佸鍔犲悕涓?_method 鐨勮姹傚弬鏁帮紝骞跺皢璇ヨ姹傚弬鏁板€艰缃负 delete銆?

鍙傝€冭祫鏂?

  • 鈥滅紪鍐?REST 鏈嶅姟 鈥濓紙developerWorks锛?007 骞?11 鏈堬級锛氭湰鏁欑▼璁ㄨ浜?REST 鍜?Atom 鍙戝竷鍗忚锛圓tom Publishing Protocol锛孉PP锛夌殑姒傚康锛屽苟灞曠ず濡備綍鍦ㄦ湇鍔′腑杩涜搴旂敤銆?
  • 鈥滄瀯寤?RESTful Web 鏈嶅姟 鈥濓紙developerWorks锛?008 骞?8 鏈堬級锛氭湰鏁欑▼浠?REST 鐨勫熀鏈蹇靛紑濮嬶紝閫愭鎸囧鎮ㄤ娇鐢?Restlet 妗嗘灦鏋勫缓搴旂敤绋嬪簭銆?
  • 鈥滃熀浜?REST 鐨?Web 鏈嶅姟锛氬熀纭€ 鈥濓紙developerWorks锛?008 骞?12 鏈堬級锛?鍦ㄦ湰鏂囦腑锛孉lex Rodriguez 灏嗗悜鎮ㄤ粙缁?REST 鐨勫熀鏈師鐞嗐€?
  • 鈥滆繘涓€姝ユ彁鍗?Struts 2 瀵?Velocity 鐨勬敮鎸佸姏搴?鈥濓紙developerWorks锛?007 骞?7 鏈堬級锛氭湰鏂囦富瑕佷粙缁嶅浣曡В鍐?Struts 2 鍜屾渶鏂扮増鏈殑 Velocity 缁撳悎鐨勯棶棰樹互鍙婅繘涓€姝ユ彁鍗?Struts 2 瀵?Velocity 鐨勬敮鎸佸姏搴︺€?
  • 鈥滃熀浜?Struts 2 鏋勫缓 WebSphere Portal 涓婄殑 Portlet 搴旂敤 鈥?锛坉eveloperWorks锛?008 骞?2 鏈堬級锛氭湰鏂囩殑鐩殑灏辨槸閫氳繃鍦?IBM 鐨?WebSphere Portal Server 涓婂紑鍙戝拰閮ㄧ讲涓€涓熀浜?Struts 2 鐨?Porlet 搴旂敤锛屽悜璇昏€呬粙缁嶅埄鐢?Struts 2 杩涜 Portlet 搴旂敤寮€鍙戠殑浼樺娍鍜屽叧閿祦绋嬨€?
  • 鈥滃熀浜?Struts 2 鎷︽埅鍣ㄥ疄鐜扮粏绮掑害鐨勫熀浜庤鑹茬殑瀛樺彇鎺у埗 鈥濓紙developerWorks锛?008 骞?9 鏈堬級锛氭湰鏂囦粙缁嶅浣曞埄鐢?Struts 2 鎷︽埅鍣ㄦ潵涓?Java Web 搴旂敤娣诲姞搴旂敤绠$悊鐨勫熀浜庤鑹茬殑瀛樺彇鎺у埗鐨勮璁″拰瀹炵幇鏂规硶銆?
  • 鍙傝€冩湰鏂囦綔鑰呮潕鍒氱紪钁楃殑鍥句功锛氥€?Struts 2.1 鏉冨▉鎸囧崡鈥斺€斿熀浜?WebWork 鏍稿績鐨?MVC 寮€鍙戙€?銆?
  • 鍙傝€冿細Struts 2 瀹樻柟绔欑偣 銆?
  • 闃呰鎶€鏈枃绔狅細Go Light with Apache Struts 2 and REST 銆?
  • Java 鎶€鏈笓鍖?锛氬鎵?Java 缂栫▼鍚勬柟闈㈢殑鎶€鏈枃绔犮€?

鍏充簬浣滆€?

鏉?鍒氾紝浠庝簨 Java EE 搴旂敤寮€鍙戣繎 10 骞淬€傛浘浠?LITEON 鍏徃鐨?J2EE 鎶€鏈富绠★紝璐熻矗璇ュ叕鍙哥殑浼佷笟淇℃伅鍖栧钩鍙扮殑鏋舵瀯璁捐銆傛浘浠诲箍宸炵數淇°€佸箍涓滈緳娉夌鎶€绛夊叕鍙哥殑鎶€鏈煿璁暀甯堛€?鐤媯 Java 鑱旂洘锛坔ttp://www.crazyit.org锛夌珯闀裤€傜柉鐙?Java 瀹炶钀ュ垱濮嬩汉锛岀柉鐙?Java 浣撶郴鍥句功浣滆€咃紝鏇句换涓滄柟鏍囧噯骞垮窞涓績杞欢鏁欏鎬荤洃锛屾浘鍏间换骞夸笢鎶€鏈笀鑼冨闄㈣绠楁満绉戝绯荤殑鍏艰亴鍓暀鎺堛€傚浗鍐呯煡鍚岻T鎶€鏈綔瀹讹紝宸插嚭鐗堛€婄柉鐙?Java 璁蹭箟銆嬨€併€婅交閲忕骇 Java EE 浼佷笟搴旂敤瀹炴垬銆嬨€併€婄柉鐙?Ajax 璁蹭箟銆嬨€併€奡truts 2.1 鏉冨▉鎸囧崡銆嬨€併€奟uby On Rails 鏁忔嵎寮€鍙戞渶浣冲疄璺点€嬬瓑钁椾綔銆?

继续阅读