锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 銆銆鏈嬌鐢ˋJAX涔嬪墠 銆銆鐩墠澶у鏁扮殑Struts搴旂敤閮芥槸鏍囧噯鐨?#8220;濡傚悓涓涓鉤闈㈡枃妗g殑web欏甸潰”鐨勭粨鏋勩傚鏋滀綘鎯蟲ā浠夸竴浜涙闈㈠簲鐢ㄧ▼搴?姣斿閭d簺浣跨敤Java Swing錛孷isual Basic錛屾垨鑰匘elphi寤虹珛鐨勫簲鐢ㄧ▼搴?錛岄偅涔堜綘鏈変袱涓夋嫨:浣犲彲浠ュ彂閫佹墍鏈夌殑鍙兘浣滀負欏甸潰鐨勪竴閮ㄥ垎琚姹傜殑淇℃伅錛屼嬌鐢ㄥぇ閲忕殑JavaScript鏉ユ搷浣滃叾鍔ㄦ佺殑鏄劇ず(涓涓緢鎱㈠茍涓旈潪浼佷笟綰ava鐨勬柟娉?;鎴栬呬綘鍙互涓嶆敼鍙樺艦寮忓湴鎻愪氦鍒板悗鍙版湇鍔″櫒(涓縐嶆湁鏁堢殑鏂規硶) 銆侫JAX鎻愰珮緇欎綘浜嗚瀺鍚堝墠闈㈢殑鏈浣寵В鍐蟲柟妗?鍔ㄦ佺殑欏甸潰錛屼絾鏄ぇ澶氭暟鐨勫簲鐢ㄦ槸鍦ㄤ綘鐨剋eb鏈嶅姟鍣ㄧ殑Java紼嬪簭鏉ュ鐞嗙殑銆?/p>
銆銆AJAX 101 銆銆AJAX鍜岀幇鏈夌殑鍔ㄦ丠TML鎶鏈潪甯哥浉浼鹼紝騫跺湪鍏朵笂澧炲姞浜嗕竴涓彂閫佸埌“鍚庡彴”鏈嶅姟鍣ㄧ殑璇鋒眰鏉ヨ幏鍙栭渶瑕佺殑鏂扮殑鎴栬呮洿鏂扮殑淇℃伅銆侫JAX鐨勬満鍒跺湪鍏朵粬鍦版柟宸茬粡鏈夎緇嗙殑璇存槑鈥曗曡鏌ョ湅鏈枃鍚庣殑Resources鏉ヨ幏鍙栨洿澶氥備絾鏄綘鑷沖皯闇瑕佺煡閬? 銆銆鍦ㄤ綘鐨凷truts搴旂敤涓嬌鐢ˋJAX 銆銆浣犻槄璇諱簡鏈枃錛岀劧鍚庝綘浼氬浣跨敤AJAX鏉ュ垱寤哄姩鎬佺殑web欏甸潰鎰熷叴瓚o紝騫朵笖鎯崇煡閬撳浣曞皢瀹冨姞鍏ュ埌浣犵殑Struts搴旂敤涓傝繖鍙槸閫夋嫨涔嬩竴銆傞偅涔堜綘浼氬浣曢夋嫨鍛? 銆銆鎴戜滑閫夋嫨鍦⊿truts搴旂敤涓鍔燗JAX鐨勪紭鍔挎槸: 銆銆瀹炵幇鏂規 銆銆鎴戜滑濡備綍鐪熸鐨勮瘡褰繪垜浠殑閫夋嫨鍛?鎴戜滑棣栧厛搴旇娉ㄦ剰涓涓?#8220;鏍囧噯鐨?#8221;(娌℃湁AJAX)Struts搴旂敤鏄浣曞伐浣滅殑銆傚湪姝ゅ簲鐢ㄤ腑錛屼竴涓竴鑸殑浜嬩歡嫻佺▼濡備笅: 銆銆鐜版湁鐨凷truts搴旂敤 銆銆涓涓紨紺轟簨浠舵祦紼嬬殑綆鍗昐truts搴旂敤鍙互鍦ㄤ互涓嬪湴鍧涓嬭澆: struts-non-ajax.zip銆傛鍩轟簬Struts鐨勫簲鐢紝鏄熀浜庣敤鎴風殑杈撳叆鏄劇ず鎴栬呴殣钘忚摑鑹插拰緇胯壊鐨勮〃鏍箋傚浘1鏄劇ず浜嗚澆鍏ュ垵濮嬮〉闈㈢殑鐢婚潰銆傚浘2鏄劇ず浜嗙敤鎴瘋緭鍏ュ煎茍鐐瑰嚮浜嗘彁浜ゅ悗鐨勭敾闈€傝櫧鐒剁畝鍗曪紝浣嗗畠宸茬粡瓚充互琛ㄧず涓涓猄truts鐨勫伐浣滄祦紼嬨?/p>
銆銆鍥?1. 娌℃湁AJAX鐨勪緥瀛?鍒濆灞忓箷 銆銆鍥?2. 娌℃湁AJAX鐨勪緥瀛?杈撳叆鍊煎茍鐐瑰嚮浜嗘彁浜?/p>
鏈嶅姟鍣ㄧ鐨勪唬鐮佹槸:涓涓猄truts Action浣跨敤struts-config.xml 涓畾涔夌殑鍊艱漿鍙戝埌(鐩稿悓鐨?JSP銆傝繖涓緥瀛愪唬鐮佷腑涓浜涢渶瑕佹敞鎰忕殑鍦版柟鏄?
銆銆璇ュ簲鐢ㄥ茍娌℃湁浠諱綍“閿欒”銆傜被浼肩殑Struts欏圭洰濂藉騫撮兘鏄繖鏍峰仛鐨勩備絾鏄紝鎴戜滑濡備綍鍦ㄤ笉娣誨姞澶嶆潅鐨凧avaScript鎴栬呴綣佺殑琛ㄥ崟鎻愪氦鐨勫墠鎻愪笅錛屼負姝ゅ簲鐢ㄥ鍔犲姩鎬佺殑鍏冪礌鍛? 銆銆鎴戜滑鐨勭涓涓猄truts AJAX搴旂敤 銆銆瑙傚療涓嬩笅闈㈢殑鍥?鍜屽浘4銆傜涓鐪肩湅涓婂幓錛屽畠浠拰鍓嶉潰鐨勪緥瀛愭病鏈夎鏄庡尯鍒傚畠浠殑涓嶅悓涔嬪鍦ㄤ簬錛岄〉闈㈣澆鍏ュ悗(鍥?)鐒跺悗鏂囨湰妗嗕腑鐨勫兼敼鍙樹簡錛岀獥浣撹嚜鍔ㄦ彁浜よ屼笉鏄劇ず絀虹櫧鐨勶紝鐒跺悗鍦ㄥ浘4涓樉紺虹粨鏋溿傛櫘閫氱殑鎻愪氦鎸夐挳浠嶇劧鍦紝浣犱篃鍙互閫夋嫨浣跨敤瀹冦?/p>
銆銆鍥?3. 欏甸潰杞藉叆鍚庣殑AJAX渚嬪瓙 銆銆鍥?4. AJAX璋冪敤鍚庣殑AJAX渚嬪瓙 銆銆娣誨姞AJAX鏄嚭濂囩殑瀹規槗銆傛湇鍔″櫒绔殑浠g爜鍜屽墠闈㈢殑渚嬪瓙鏄竴鏍風殑: 涓涓猄truts鐨凙ctionForm鏉ュ悗鍘繪暟鎹紝涓涓猄truts鐨凙ction鏉ユ墽琛岄渶瑕佺殑浠誨姟(渚嬪錛屽瓨鍌ㄦ暟鎹簱)鐒跺悗杞彂鍒伴傚綋鐨凧SP欏甸潰鏉ユ樉紺虹粨鏋溿?/p>
銆銆緇х畫 銆銆濡傛灉浣犲笇鏈涘氨姝ゅ仠姝㈤槄璇?璺寵繃榪欎釜渚嬪瓙鐨勫伐浣滆鏄?錛屼絾鏄繖閲岀殑鏄拰浣犻渶瑕佽漿鎹綘鐨凷truts搴旂敤鍒頒竴涓猄truts-AJAX搴旂敤鍚屾牱鐨勯鏍? 銆銆JavaScript鏂規硶retrieveURL()璋冪敤鏈嶅姟鍣ㄧ殑Struts(閫氳繃URL)錛岃幏鍙朖SP鍝嶅簲錛岀劧鍚庢洿鏂版樉紺洪〉闈腑鐨?鏍囩涓殑閮ㄥ垎銆傚氨鏄繖涔堢畝鍗? 銆銆AJAX瑙e喅鏂規鐨勭粏鑺?/p>
銆銆鎴戜滑灝嗕緥瀛愬彉涓篈JAX-Struts搴旂敤鐨勬椂鍊欙紝闇瑕佷笁涓彉鍖? 銆銆鎴戜滑灝嗚緇嗙殑璇存槑涓婇潰鐨勬瘡涓姝ャ?/p>
鍙戦丄JAX璇鋒眰鍒版湇鍔″櫒
銆銆鏈変袱涓柟娉?鍦ㄤ笅闈㈠垪鍑?鐢ㄤ簬鍙戦佽姹傚埌鏈嶅姟鍣ㄣ?/p>
銆銆· retrieveURL()鏂規硶鑾峰緱鏈嶅姟鍣ㄧ殑URL鍜孲truts form銆俇RL鐢ㄤ簬浣跨敤AJAX錛宖orm鐨勫肩敤浜庝紶閫掑埌鏈嶅姟鍣ㄣ?/p>
銆銆· getFormAsString()鏂規硶鐢ㄤ簬灝唕etrieveURL()涓璮orm鍛藉悕鐨勫肩粍瑁呮垚鏌ヨ瀛楃涓詫紝騫跺彂閫佸埌鏈嶅姟鍣ㄣ?/p>
銆銆浣跨敤鏂規硶寰堢畝鍗曪紝浣跨敤onclick()/onChange()浜嬩歡鏉ヨЕ鍙憆etrieveURL()鏇存柊鏄劇ず銆?/p>
銆銆鍦ㄨ繖涓や釜鏂規硶涓湁涓浜涙湁瓚g殑涓滆タ銆?/p>
銆銆鍦╮etrieveURL()鏂規硶涓紝req.onreadystatechange = processStateChange (娉ㄦ剰錛屾病鏈夋嫭鍙?榪欎竴琛屾潵鍛婅瘔嫻忚鍣ㄥ湪鏈嶅姟鍣ㄥ搷搴斿埌杈劇殑鏃跺欒皟鐢╬rocessStateChange()鏂規硶(璇ユ柟娉曞皢鍦ㄥ悗闈粙緇?銆俽etrieveURL()鏂規硶涓?鐜板湪宸茬粡鏄疉JAX鐨勬爣鍑嗕簡)鍚屾牱鍐沖畾鏄嬌鐢↖E嫻忚鍣?ActiveX)榪樻槸浣跨敤Netscape/Mozilla (XmlHttpRequest) 鏉ュ疄鐜拌法嫻忚鍣ㄥ吋瀹廣?/p>
銆銆getFormAsString()鏂規硶灝咹TML form杞崲鎴愬瓧絎︿覆榪炴帴鍦║RL鍚庨潰(榪欐牱灝卞厑璁告垜浠彂閫丠TTP GET璇鋒眰)銆傝繖涓瓧絎︿覆鏄粡榪囪漿鎹㈢殑(姣斿錛岀┖鏍艱漿鎹㈡垚%20絳?錛屽茍涓旀槸涓涓猄truts鑳藉皢鍏剁粍瑁呮垚ActionForm鐨勬牸寮?騫朵笉闇瑕丼truts娓呮鐨勬槑鐧借繖涓槸鏉ヤ箣AJAX鐨勮姹?銆傛敞鎰忥紝鍦ㄦ湰渚嬩腑鎴戜滑浣跨敤HTTP GET錛屼嬌鐢℉TTP POST鐨勬柟娉曚篃鏄被浼肩殑銆?/p>
function retrieveURL(url,nameOfFormToPost) { //灝唘rl杞崲鎴愬瓧絎︿覆 //璋冪敤AJAX // 闈濱E嫻忚鍣?br>req = new XMLHttpRequest(); req = new ActiveXObject("Microsoft.XMLHTTP"); getFormAsString() 鏄竴涓?#8220;縐佹湁” 鏂規硶錛屽湪retrieveURL()涓嬌鐢ㄣ?/p>
function getFormAsString(formName){ //璁劇疆榪斿洖瀛楃涓?br>returnString =""; //鍙栧緱琛ㄥ崟鐨勫?br>formElements=document.forms[formName].elements; //寰幆鏁扮粍錛岀粍瑁卽rl for(var i=formElements.length-1;i>=0; --i ){ //榪斿洖瀛楃涓?br>return returnString; 銆銆鍒扮幇鍦ㄤ負姝紝鎴戜滑瀛︿範榪囦簡浣跨敤JavaScript鏉ュ畬鎴怉JAX璋冪敤(鍓嶉潰鍒楀嚭)錛孲truts Action錛孉ctionForm浠ュ強JSP(鍩烘湰娌℃湁鍙樺寲錛屽彧鏄鍔犱簡鏍囩)銆備負浜嗗畬鍠勬垜浠Struts-AJAX欏圭洰鐨勪簡瑙o紝鎴戜滑闇瑕佷簡瑙d笁涓敤浜庢牴鎹湇鍔″櫒榪斿洖鐨勭粨鏋滆屾洿鏂伴〉闈㈢殑JavaScript鏂規硶銆?/p>
function processStateChange() { if (req.readyState == 4) { // 瀹屾垚 //灝嗗搷搴旂殑鏂囨湰鍒嗗壊鎴怱pan鍏冪礌 //浣跨敤榪欎簺Span鍏冪礌鏇存柊欏甸潰 } else { function replaceExistingWithNewHtml //寰幆newTextElements //鍒ゆ柇鏄惁浠?if(newTextElements[i]. //鑾峰緱span鐨勫悕瀛? 璁劇疆鍦ㄧ涓鍜岀浜屼釜寮曞彿涔嬮棿 //鑾峰緱鍐呭錛嶅湪絎竴涓?gt;鏍囪鍚庣殑鎵鏈夊唴瀹?br>startContentPos=newTextElements[i]. //鐜板湪鏇存柊鐜版湁鐨凞ocument涓殑鍏冪礌錛? //鍒嗗壊鏂囨。 //澶勭悊姣忎釜鍏冪礌 //鍒犻櫎鎺夌涓涓猻pan鍚庨潰鐨勫厓绱?br>spanPos = returnElements[i]. //濡傛灉鎵懼埌鍖歸厤鐨勶紝鑾峰緱span鍓嶇殑鍐呭 銆銆鏂扮殑鎺у埗嫻?/p>
銆銆娣誨姞浠ヤ笅鐨凧avaScript浠g爜鍒版垜浠殑搴旂敤涓紝浠ヤ笅鐨勬楠ゅ皢鍦ㄦ湇鍔″櫒鍜屾祻瑙堝櫒涓墽琛屻?/p>
銆銆鍦ㄤ綘鐨勫簲鐢ㄤ腑璁捐AJAX 銆銆浠ヤ笂鎻忚堪鐨凧avaScript鏂規硶鑳藉湪澶у鏁扮殑搴旂敤涓嬌鐢紝鍖呮嫭姣旀垜浠殑渚嬪瓙澶嶆潅寰楀鐨勩備絾鏄紝鍦ㄤ嬌鐢ㄤ箣鍓嶏紝浣犻渶瑕佹敞鎰忎互涓嬪嚑鐐? 銆銆· 閬垮厤澶嶅埗浠g爜錛屾渶濂藉湪鍒濆鍖栬姹?濡傦紝鏄劇ず瀹屾暣鐨勯〉闈?鍜孉JAX(鏇存柊閮ㄥ垎欏甸潰)璇鋒眰涓嬌鐢ㄧ浉鍚岀殑Struts Action鍜孞SP銆?/p>
銆銆·鍦ㄥ叕鍏辯殑Action(鎺у埗鍣?涓紝鍐沖畾JSP欏甸潰(鎵鏈夌殑JSP欏甸潰鎴栬呭叾涓殑涓閮ㄥ垎)涓殑涓涓尯鍩熼渶瑕佷紶閫佸埌嫻忚鍣ㄣ傞氳繃鍦╳eb鏈嶅姟鍣ㄧ殑session鎴栬匒ctionForm涓瀹氭爣璁版潵璁㎎SP欏甸潰鐭ラ亾鍝簺閮ㄥ垎闇瑕佹彁浜ゃ?/p>
銆銆· 鍦↗SP涓紝浣跨敤Struts 鎴栬匤STL鏍囩鏉ュ喅瀹氭彁浜ょ殑HTML鍖哄煙銆?/p>
銆銆浣跨敤AJAX鐨勬湰渚嬪瓙錛屽彲浠ュ湪浠ヤ笅涓嬭澆: struts-Ajax.zip 銆銆緇撹 銆銆AJAX鎶鏈厑璁告垜浠湪鍒涘緩鍜屼嬌鐢╳eb搴旂敤鐨勬椂鍊欏畬鍏ㄧ殑鏀瑰彉銆傛湰鏂囦粙緇嶄簡涓涓畝鍗曠殑鎶鏈紝鍦ㄧ幇鏈夌殑Struts搴旂敤涓鍔燬truts鐨勫鐞嗐傚畠鍏佽鎴戜滑鍒╃敤鎴戜滑宸叉湁鐨勪笢瑗匡紝涓嶄粎浠呮槸浠g爜錛岃繕鍖呮嫭浜嗗紑鍙戠殑鎶鑳姐備綔涓轟竴涓ソ鐨勪駭鍝侊紝瀹冨悓鏍峰厑璁告垜浠啓鍑烘洿娓呮櫚錛屾洿鍏風Щ妞嶆х殑Java Struts搴旂敤銆?/p>
鐗堟潈澹版槑錛歍echtarget鑾稭atrix鎺堟潈鍙戝竷,濡傞渶杞澆璇瘋仈緋籑atrix 2銆備笉緇忔剰浣跨敤鐨勬棤涓諱綋鐨勬爣璁幫紝濡倃eb 鏈嶅姟鍣ㄨВ鏋愭椂褰撲綔涓涓棤涓諱綋鐨勬爣璁幫紝闅忓悗浣跨敤鐨勬爣璁伴兘琚涓烘槸鍦ㄨ繖涓爣璁頒箣澶栫殑 4銆俻roperty蹇呴』鍜屾墍瑕佹彁浜ょ殑action瀵瑰簲鐨刦ormbean涓殑鏌愪釜灞炴х浉鍖歸厤錛堝繀欏繪湁涓涓猣ormbean)
褰揂ction鐨剉alueStack涓湁璇ュ睘鎬х殑鍊兼椂錛屽彧闇鐩存帴浣跨敤璇ュ睘鎬х殑鍚嶅瓧鍗沖彲錛?
褰揂ction鐨剉alueStack涓病鏈夎灞炴х殑鍊兼椂錛屾瘮濡傚湪session,application鑼冨洿涓殑灞炴у兼椂錛岄渶瑕佸姞#鎴栬?attr.錛?
渚嬪瓙錛?
鍋囪鏌怉ction涓湁person鎴愬憳鍙橀噺錛屽湪application涓瓨鍦╟ompany灞炴?
閭d箞鎴戜滑鍙互閫氳繃浠ヤ笅鏂規硶鍙栧鹼細
<s:property value="person.name" />
<s:property value="#person.name" />
<s:property value="company.name" /> //鏃犳硶鍙栧埌錛屽洜涓篶ompany涓嶅湪action鐨剉alueStack涓?
<s:property value="#company.name" />
<s:textfield name="person.name" value="person.name" /> //閿欒錛寁alue浼氱洿鎺ユ樉紺簆erson.name瀛楁牱
<s:textfield name="person.name" value="%{person.name}" />
<s:textfield name="person.company.name" value="%{#company.name}" />
<s:textfield name="person.company.name" value="%{#attr.company.name}" />
]]>
寰堟樉鐒惰繖鏄竴涓病鏈夋壘鍒板搴旂殑綾繪枃浠剁殑寮傚父銆?br />
榪樻湁涓や釜鍖卌ommons-pool.jar鍜宑ommons-dbcp-1.2.1.jar闇瑕佸紩鍏ュ埌宸ョ▼涓?/span>
]]>
AJAX鏄?#8220;寮傛鐨凧avaScript鍜孹ML”鐨勭緝鍐欍傝繖鏄竴欏規妧鏈紝鑰屼笉鏄竴涓Struts涓鏍風殑妗嗘灦銆備負浠涔堝湪AJAX鍛ㄥ洿浼氭湁榪欎箞澶氱殑鍏蟲敞鍛?榪欐槸鍥犱負AJAX浣縲eb欏甸潰鐪嬭搗鏉ュ茍涓嶅儚涓涓鉤闈㈢殑鏂囨。錛岃屾洿鍍忕敤鎴鋒墍鏈熸湜鐨勫妗岄潰搴旂敤鐨勫姩鎬丟UI搴旂敤紼嬪簭銆侫JAX鎶鏈兘鍦ㄥ緢澶氱殑嫻忚鍣ㄤ笂浣跨敤(鍖呮嫭IE鍜孨etscape/Mozilla)銆傚畠宸茬粡涓篗icrosoft(鐢ㄤ簬Outlook鐨剋eb瀹㈡埛绔?鍜孏oogle(鐢ㄦ埛Google Maps鍜孏mail)鎵浣跨敤銆?
url=url+getFormAsString(nameOfFormToPost);
if (window.XMLHttpRequest) {
req.onreadystatechange = processStateChange;
try {
req.open("GET", url, true);
} catch (e) {
alert("Server Communication Problem\n"+e);
}
req.send(null);
} else if (window.ActiveXObject) {
// IE
if (req) {
req.onreadystatechange=processStateChange;
req.open("GET", url, true);
req.send();
}
}
}
//鍍?/strutsaction.do&name=value'榪欐牱鐨勬牸寮?/p>
//杞寲姣忎竴涓?br>returnString+="&"
+escape(formElements[i].name)+"="
+escape(formElements[i].value);
}
}
if (req.status == 200) { // 鍝嶅簲姝e父
spanElements =
splitTextIntoSpan(req.responseText);
replaceExistingWithNewHtml(spanElements);
alert("Problem with server response:\n "
+ req.statusText);
}
}
}
replaceExistingWithNewHtml() 鏄負processStateChange()浣跨敤鐨?#8220;縐佹湁”鏂規硶銆?/p>
(newTextElements){
for(var i=newTextElements.length-1;i>=0;--i){
indexOf("-1){
//紜span鍏冪礌鏄互涓嬬殑鏍煎紡
//NewContent
startNamePos=newTextElements[i].
indexOf('"')+1;
endNamePos=newTextElements[i].
indexOf('"',startNamePos);
name=newTextElements[i].
substring(startNamePos,endNamePos);
indexOf('>')+1;
content=newTextElements[i].
substring(startContentPos);
// 紜繚鏂囨。瀛樺湪璇ュ厓绱?br>if(document.getElementById(name)){
document.getElementById(name).
innerHTML = content;
}
}
}
splitTextIntoSpan() 鏄負processStateChange() 浣跨敤鐨?#8220;縐佹湁”鏂規硶銆?br>function splitTextIntoSpan(textToSplit){
returnElements=textToSplit.
split("")
for(var i=returnElements.length-1;i>=0;--i){
indexOf("
if(spanPos>0){
subString=returnElements[i].
substring(spanPos);
returnElements[i]=subString;
}
}
return returnElements;
}
浣滆?浣滆?Paul Browne;pawenwen(浣滆呯殑blog:http://blog.matrix.org.cn/page/pawenwen)
璇戞枃:鐐瑰嚮
]]>
3銆傝繕鏈夊氨鏄湪浣跨敤taglib寮曞叆HTML鏍囪搴撴椂錛屼綘浣跨敤鐨刾refix鐨勫間笉鏄痟tml
5銆傝浣跨敤鏍囩錛屽灞傚繀欏諱嬌鐢ㄦ爣絳撅紝涓嶈兘浣跨敤html鐨?/font>
]]>
鍘熷洜錛?action鍙傛暟閰嶇疆涓嶅叏
瑙e喅鏂規硶錛氬湪 config鏂囦歡涓?娣誨姞 parameter="method"絳?
閿欒錛?琛ㄥ崟鏁版嵁楠岃瘉澶辮觸鏃跺彂鐢熼敊璇紝“No input attribute for mapping path”
鍘熷洜錛歛ction涓〃鍗曢獙璇?validate="true" 錛屽鏋渧alidate()榪斿洖闈炵┖鐨凙ctionErrors錛屽皢浼氳杞埌input灞炴ф寚瀹氱殑URI錛岃宎ction涓湭鎸囧畾input鏃朵細鎶ユ閿?
瑙e喅鏂規硶錛氭坊鍔?input="url" 鎴栬?validate="false"