锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 璁捐綰跨▼瀹夊叏鐨凷ervlet
銆銆鍏抽敭瀛楋細Servlet 綰跨▼瀹夊叏 鍚屾 Java鍐呭瓨妯″瀷 瀹炰緥鍙橀噺
銆銆Servlet/JSP鎶鏈拰ASP銆丳HP絳夌浉姣旓紝鐢變簬鍏跺綰跨▼榪愯鑰屽叿鏈夊緢楂樼殑鎵ц鏁堢巼銆傜敱浜嶴ervlet/JSP榛樿鏄互澶氱嚎紼嬫ā寮忔墽琛岀殑錛屾墍浠ワ紝鍦ㄧ紪鍐欎唬鐮佹椂闇瑕侀潪甯哥粏鑷村湴鑰冭檻澶氱嚎紼嬬殑瀹夊叏鎬ч棶棰樸傜劧鑰岋紝寰堝浜虹紪鍐橲ervlet/JSP紼嬪簭鏃跺茍娌℃湁娉ㄦ剰鍒板綰跨▼瀹夊叏鎬х殑闂錛岃繖寰寰閫犳垚緙栧啓鐨勭▼搴忓湪灝戦噺鐢ㄦ埛璁塊棶鏃舵病鏈変換浣曢棶棰橈紝鑰屽湪騫跺彂鐢ㄦ埛涓婂崌鍒頒竴瀹氬兼椂錛屽氨浼氱粡甯稿嚭鐜頒竴浜涜帿鏄庡叾濡欑殑闂銆?br />
銆銆Servlet鐨勫綰跨▼鏈哄埗
銆
銆銆Servlet浣撶郴緇撴瀯鏄緩绔嬪湪Java澶氱嚎紼嬫満鍒朵箣涓婄殑錛屽畠鐨勭敓鍛藉懆鏈熸槸鐢盬eb瀹瑰櫒璐熻矗鐨勩傚綋瀹㈡埛绔涓嬈¤姹傛煇涓猄ervlet鏃訛紝Servlet瀹瑰櫒灝嗕細鏍規嵁web.xml閰嶇疆鏂囦歡瀹炰緥鍖栬繖涓猄ervlet綾匯傚綋鏈夋柊鐨勫鎴風璇鋒眰璇ervlet鏃訛紝涓鑸笉浼氬啀瀹炰緥鍖栬Servlet綾伙紝涔熷氨鏄湁澶氫釜綰跨▼鍦ㄤ嬌鐢ㄨ繖涓疄渚嬨係ervlet瀹瑰櫒浼氳嚜鍔ㄤ嬌鐢ㄧ嚎紼嬫睜絳夋妧鏈潵鏀寔緋葷粺鐨勮繍琛岋紝濡傚浘1鎵紺恒?br />
鍥? Servlet綰跨▼姹?/td>
銆銆榪欐牱錛屽綋涓や釜鎴栧涓嚎紼嬪悓鏃惰闂悓涓涓猄ervlet鏃訛紝鍙兘浼氬彂鐢熷涓嚎紼嬪悓鏃惰闂悓涓璧勬簮鐨勬儏鍐碉紝鏁版嵁鍙兘浼氬彉寰椾笉涓鑷淬傛墍浠ュ湪鐢⊿ervlet鏋勫緩鐨刉eb搴旂敤鏃跺鏋滀笉娉ㄦ剰綰跨▼瀹夊叏鐨勯棶棰橈紝浼氫嬌鎵鍐欑殑Servlet紼嬪簭鏈夐毦浠ュ彂鐜扮殑閿欒銆?br />
銆銆Servlet鐨勭嚎紼嬪畨鍏ㄩ棶棰?br />
銆銆Servlet鐨勭嚎紼嬪畨鍏ㄩ棶棰樹富瑕佹槸鐢變簬瀹炰緥鍙橀噺浣跨敤涓嶅綋鑰屽紩璧風殑錛岃繖閲屼互涓涓幇瀹炵殑渚嬪瓙鏉ヨ鏄庛?br />
Import javax.servlet. *;
Import javax.servlet.http. *;
Import java.io. *;
Public class Concurrent Test extends HttpServlet {PrintWriter output;
Public void service (HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {String username;
Response.setContentType ("text/html; charset=gb2312");
Username = request.getParameter ("username");
Output = response.getWriter ();
Try {Thread. sleep (5000); //涓轟簡紿佸嚭騫跺彂闂錛屽湪榪欒緗竴涓歡鏃?br />} Catch (Interrupted Exception e){}
output.println("鐢ㄦ埛鍚?"+Username+"<BR>");
}
}
銆銆璇ervlet涓畾涔変簡涓涓疄渚嬪彉閲弌utput錛屽湪service鏂規硶灝嗗叾璧嬪間負鐢ㄦ埛鐨勮緭鍑恒傚綋涓涓敤鎴瘋闂Servlet鏃訛紝紼嬪簭浼氭甯哥殑榪愯錛屼絾褰撳涓敤鎴峰茍鍙戣闂椂錛屽氨鍙兘浼氬嚭鐜板叾瀹冪敤鎴風殑淇℃伅鏄劇ず鍦ㄥ彟澶栦竴浜涚敤鎴風殑嫻忚鍣ㄤ笂鐨勯棶棰樸傝繖鏄竴涓弗閲嶇殑闂銆備負浜嗙獊鍑哄茍鍙戦棶棰橈紝渚夸簬嫻嬭瘯銆佽瀵燂紝鎴戜滑鍦ㄥ洖鏄劇敤鎴蜂俊鎭椂鎵ц浜嗕竴涓歡鏃剁殑鎿嶄綔銆傚亣璁懼凡鍦╳eb.xml閰嶇疆鏂囦歡涓敞鍐屼簡璇ervlet錛岀幇鏈変袱涓敤鎴穉鍜宐鍚屾椂璁塊棶璇ervlet錛堝彲浠ュ惎鍔ㄤ袱涓狪E嫻忚鍣紝鎴栬呭湪涓ゅ彴鏈哄櫒涓婂悓鏃惰闂級,鍗沖悓鏃跺湪嫻忚鍣ㄤ腑杈撳叆錛?br />
銆銆a錛?http://localhost: 8080/servlet/ConcurrentTest? Username=a
銆銆b錛?http://localhost: 8080/servlet/ConcurrentTest? Username=b
銆銆濡傛灉鐢ㄦ埛b姣旂敤鎴穉鍥炶濺鐨勬椂闂寸◢鎱竴鐐癸紝灝嗗緱鍒板鍥?鎵紺虹殑杈撳嚭錛?br />
鍥? a鐢ㄦ埛鍜宐鐢ㄦ埛鐨勬祻瑙堝櫒杈撳嚭
銆銆浠庡浘2涓彲浠ョ湅鍒幫紝Web鏈嶅姟鍣ㄥ惎鍔ㄤ簡涓や釜綰跨▼鍒嗗埆澶勭悊鏉ヨ嚜鐢ㄦ埛a鍜岀敤鎴穊鐨勮姹傦紝浣嗘槸鍦ㄧ敤鎴穉鐨勬祻瑙堝櫒涓婂嵈寰楀埌涓涓┖鐧界殑灞忓箷錛岀敤鎴穉鐨勪俊鎭樉紺哄湪鐢ㄦ埛b鐨勬祻瑙堝櫒涓娿傝Servlet瀛樺湪綰跨▼涓嶅畨鍏ㄩ棶棰樸備笅闈㈡垜浠氨浠庡垎鏋愯瀹炰緥鐨勫唴瀛樻ā鍨嬪叆鎵?瑙傚療涓嶅悓鏃跺埢瀹炰緥鍙橀噺output鐨勫兼潵鍒嗘瀽浣胯Servlet綰跨▼涓嶅畨鍏ㄧ殑鍘熷洜銆?br />
銆銆Java鐨勫唴瀛樻ā鍨婮MM錛圝ava Memory Model錛塉MM涓昏鏄負浜嗚瀹氫簡綰跨▼鍜屽唴瀛樹箣闂寸殑涓浜涘叧緋匯傛牴鎹甁MM鐨勮璁★紝緋葷粺瀛樺湪涓涓富鍐呭瓨(Main Memory)錛孞ava涓墍鏈夊疄渚嬪彉閲忛兘鍌ㄥ瓨鍦ㄤ富瀛樹腑錛屽浜庢墍鏈夌嚎紼嬮兘鏄叡浜殑銆傛瘡鏉$嚎紼嬮兘鏈夎嚜宸辯殑宸ヤ綔鍐呭瓨(Working Memory)錛屽伐浣滃唴瀛樼敱緙撳瓨鍜屽爢鏍堜袱閮ㄥ垎緇勬垚錛岀紦瀛樹腑淇濆瓨鐨勬槸涓誨瓨涓彉閲忕殑鎷瘋礉錛岀紦瀛樺彲鑳藉茍涓嶆誨拰涓誨瓨鍚屾錛屼篃灝辨槸緙撳瓨涓彉閲忕殑淇敼鍙兘娌℃湁绔嬪埢鍐欏埌涓誨瓨涓紱鍫嗘爤涓繚瀛樼殑鏄嚎紼嬬殑灞閮ㄥ彉閲忥紝綰跨▼涔嬮棿鏃犳硶鐩鎬簰鐩存帴璁塊棶鍫嗘爤涓殑鍙橀噺銆傛牴鎹甁MM錛屾垜浠彲浠ュ皢璁烘枃涓墍璁ㄨ鐨凷ervlet瀹炰緥鐨勫唴瀛樻ā鍨嬫娊璞′負鍥?鎵紺虹殑妯″瀷銆?br />
鍥? Servlet瀹炰緥鐨凧MM妯″瀷
銆銆涓嬮潰鏍規嵁鍥?鎵紺虹殑鍐呭瓨妯″瀷錛屾潵鍒嗘瀽褰撶敤鎴穉鍜宐鐨勭嚎紼嬶紙綆縐頒負a綰跨▼銆乥綰跨▼錛夊茍鍙戞墽琛屾椂錛孲ervlet瀹炰緥涓墍娑夊強鍙橀噺鐨勫彉鍖栨儏鍐靛強綰跨▼鐨勬墽琛屾儏鍐碉紝濡傚浘4鎵紺恒?br />
銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆銆鍥? Servlet瀹炰緥鐨勭嚎紼嬭皟搴︽儏鍐?br />
璋冨害鏃跺埢
a綰跨▼
b綰跨▼
T1
璁塊棶Servlet欏甸潰
T2
璁塊棶Servlet欏甸潰
T3
output=a鐨勮緭鍑簎sername=a浼戠湢5000姣錛岃鍑篊PU
T4
output=b鐨勮緭鍑猴紙鍐欏洖涓誨瓨錛塽sername=b浼戠湢5000姣錛岃鍑篊PU
T5
鍦ㄧ敤鎴穊鐨勬祻瑙堝櫒涓婅緭鍑篴綰跨▼鐨剈sername鐨勫?a綰跨▼緇堟銆?/td>
T6
鍦ㄧ敤鎴穊鐨勬祻瑙堝櫒涓婅緭鍑篵綰跨▼鐨剈sername鐨勫?b綰跨▼緇堟銆?/td>
銆銆浠庡浘4涓彲浠ユ竻妤氱殑鐪嬪埌錛岀敱浜巄綰跨▼瀵瑰疄渚嬪彉閲弌utput鐨勪慨鏀硅鐩栦簡a綰跨▼瀵瑰疄渚嬪彉閲弌utput鐨勪慨鏀癸紝浠庤屽鑷翠簡鐢ㄦ埛a鐨勪俊鎭樉紺哄湪浜嗙敤鎴穊鐨勬祻瑙堝櫒涓娿傚鏋滃湪a綰跨▼鎵ц杈撳嚭璇彞鏃訛紝b綰跨▼瀵筼utput鐨勪慨鏀硅繕娌℃湁鍒鋒柊鍒頒富瀛橈紝閭d箞灝嗕笉浼氬嚭鐜板浘2鎵紺虹殑杈撳嚭緇撴灉錛屽洜姝よ繖鍙槸涓縐嶅伓鐒剁幇璞★紝浣嗚繖鏇村鍔犱簡紼嬪簭娼滃湪鐨勫嵄闄╂с?span>
銆銆閫氳繃涓婇潰鐨勫垎鏋愶紝鎴戜滑鐭ラ亾浜嗗疄渚嬪彉閲忎笉姝g‘鐨勪嬌鐢ㄦ槸閫犳垚Servlet綰跨▼涓嶅畨鍏ㄧ殑涓昏鍘熷洜銆備笅闈㈤拡瀵硅闂緇欏嚭浜嗕笁縐嶈В鍐蟲柟妗堝茍瀵規柟妗堢殑閫夊彇緇欏嚭浜嗕竴浜涘弬鑰冩х殑寤鴻銆?br />
銆銆1銆佸疄鐜?SingleThreadModel 鎺ュ彛
銆銆璇ユ帴鍙f寚瀹氫簡緋葷粺濡備綍澶勭悊瀵瑰悓涓涓猄ervlet鐨勮皟鐢ㄣ傚鏋滀竴涓猄ervlet琚繖涓帴鍙f寚瀹?閭d箞鍦ㄨ繖涓猄ervlet涓殑service鏂規硶灝嗕笉浼氭湁涓や釜綰跨▼琚悓鏃舵墽琛岋紝褰撶劧涔熷氨涓嶅瓨鍦ㄧ嚎紼嬪畨鍏ㄧ殑闂銆傝繖縐嶆柟娉曞彧瑕佸皢鍓嶉潰鐨凜oncurrent Test綾葷殑綾誨ご瀹氫箟鏇存敼涓猴細
Public class Concurrent Test extends HttpServlet implements SingleThreadModel {
…………
}
銆銆2銆佸悓姝ュ鍏變韓鏁版嵁鐨勬搷浣?br />
銆銆浣跨敤synchronized 鍏抽敭瀛楄兘淇濊瘉涓嬈″彧鏈変竴涓嚎紼嬪彲浠ヨ闂淇濇姢鐨勫尯孌碉紝鍦ㄦ湰璁烘枃涓殑Servlet鍙互閫氳繃鍚屾鍧楁搷浣滄潵淇濊瘉綰跨▼鐨勫畨鍏ㄣ傚悓姝ュ悗鐨勪唬鐮佸涓嬶細
………… Public class Concurrent Test extends HttpServlet { ………… Username = request.getParameter ("username"); Synchronized (this){ Output = response.getWriter (); Try { Thread. Sleep (5000); } Catch (Interrupted Exception e){} output.println("鐢ㄦ埛鍚?"+Username+"<BR>"); } } } |
銆銆3銆侀伩鍏嶄嬌鐢ㄥ疄渚嬪彉閲?br />
銆銆鏈疄渚嬩腑鐨勭嚎紼嬪畨鍏ㄩ棶棰樻槸鐢卞疄渚嬪彉閲忛犳垚鐨勶紝鍙鍦⊿ervlet閲岄潰鐨勪換浣曟柟娉曢噷闈㈤兘涓嶄嬌鐢ㄥ疄渚嬪彉閲忥紝閭d箞璇ervlet灝辨槸綰跨▼瀹夊叏鐨勩?br />
銆銆淇涓婇潰鐨凷ervlet浠g爜錛屽皢瀹炰緥鍙橀噺鏀逛負灞閮ㄥ彉閲忓疄鐜板悓鏍風殑鍔熻兘錛屼唬鐮佸涓嬶細
…… Public class Concurrent Test extends HttpServlet {public void service (HttpServletRequest request, HttpServletResponse Response) throws ServletException, IOException { Print Writer output; String username; Response.setContentType ("text/html; charset=gb2312"); …… } } |
銆銆瀵逛笂闈㈢殑涓夌鏂規硶榪涜嫻嬭瘯錛屽彲浠ヨ〃鏄庣敤瀹冧滑閮借兘璁捐鍑虹嚎紼嬪畨鍏ㄧ殑Servlet紼嬪簭銆備絾鏄紝濡傛灉涓涓猄ervlet瀹炵幇浜哠ingleThreadModel鎺ュ彛錛孲ervlet寮曟搸灝嗕負姣忎釜鏂扮殑璇鋒眰鍒涘緩涓涓崟鐙殑Servlet瀹炰緥錛岃繖灝嗗紩璧峰ぇ閲忕殑緋葷粺寮閿銆係ingleThreadModel鍦⊿ervlet2.4涓凡涓嶅啀鎻愬′嬌鐢紱鍚屾牱濡傛灉鍦ㄧ▼搴忎腑浣跨敤鍚屾鏉ヤ繚鎶よ浣跨敤鐨勫叡浜殑鏁版嵁錛屼篃浼氫嬌緋葷粺鐨勬ц兘澶уぇ涓嬮檷銆傝繖鏄洜涓鴻鍚屾鐨勪唬鐮佸潡鍦ㄥ悓涓鏃跺埢鍙兘鏈変竴涓嚎紼嬫墽琛屽畠錛屼嬌寰楀叾鍚屾椂澶勭悊瀹㈡埛璇鋒眰鐨勫悶鍚愰噺闄嶄綆錛岃屼笖寰堝瀹㈡埛澶勪簬闃誨鐘舵併傚彟澶栦負淇濊瘉涓誨瓨鍐呭鍜岀嚎紼嬬殑宸ヤ綔鍐呭瓨涓殑鏁版嵁鐨勪竴鑷存э紝瑕侀綣佸湴鍒鋒柊緙撳瓨,榪欎篃浼氬ぇ澶у湴褰卞搷緋葷粺鐨勬ц兘銆傛墍浠ュ湪瀹為檯鐨勫紑鍙戜腑涔熷簲閬垮厤鎴栨渶灝忓寲 Servlet 涓殑鍚屾浠g爜錛涘湪Serlet涓伩鍏嶄嬌鐢ㄥ疄渚嬪彉閲忔槸淇濊瘉Servlet綰跨▼瀹夊叏鐨勬渶浣抽夋嫨銆備粠Java 鍐呭瓨妯″瀷涔熷彲浠ョ煡閬擄紝鏂規硶涓殑涓存椂鍙橀噺鏄湪鏍堜笂鍒嗛厤絀洪棿錛岃屼笖姣忎釜綰跨▼閮芥湁鑷繁縐佹湁鐨勬爤絀洪棿錛屾墍浠ュ畠浠笉浼氬獎鍝嶇嚎紼嬬殑瀹夊叏銆?br />
銆銆灝忕粨
銆銆Servlet鐨勭嚎紼嬪畨鍏ㄩ棶棰樺彧鏈夊湪澶ч噺鐨勫茍鍙戣闂椂鎵嶄細鏄劇幇鍑烘潵錛屽茍涓斿緢闅懼彂鐜幫紝鍥犳鍦ㄧ紪鍐橲ervlet紼嬪簭鏃惰鐗瑰埆娉ㄦ剰銆傜嚎紼嬪畨鍏ㄩ棶棰樹富瑕佹槸鐢卞疄渚嬪彉閲忛犳垚鐨?鍥犳鍦⊿ervlet涓簲閬垮厤浣跨敤瀹炰緥鍙橀噺銆傚鏋滃簲鐢ㄧ▼搴忚璁℃棤娉曢伩鍏嶄嬌鐢ㄥ疄渚嬪彉閲忥紝閭d箞浣跨敤鍚屾鏉ヤ繚鎶よ浣跨敤鐨勫疄渚嬪彉閲忥紝浣嗕負淇濊瘉緋葷粺鐨勬渶浣蟲ц兘錛屽簲璇ュ悓姝ュ彲鐢ㄦф渶灝忕殑浠g爜璺緞銆?/p>