瀛︿範鍐呭
聽Struts 2鏍囩搴?
聽OGNL
鑳藉姏鐩爣
聽鐔熺粌浣跨敤Struts 2甯哥敤鏍囩
聽鐔熺粌浣跨敤OGNL
聽
鏈珷绠€浠?
鍓嶉潰鎴戜滑缂栧啓鐨勬渚嬩娇鐢ㄧ殑閮芥槸HTML鏍囩锛岃繖浜涙爣绛惧苟涓嶈兘寰堝ソ鐨勪笌Struts 2妗嗘灦缁撳悎锛孲truts 2鍜孲truts 1涓€鏍烽兘鑷甫浜嗗姛鑳藉己澶с€佹垚鐔熷畬鍠勭殑鏍囩搴撲緵鎴戜滑浣跨敤锛岄€氳繃浣跨敤杩欎簺鏍囩搴撳彲浠ュぇ澶ф彁楂樺紑鍙戞晥鐜囧拰浠g爜鐨勫彲缁存姢鎬с€?
鍏跺疄Struts 2鐨勬爣绛惧簱鏄缓绔嬪湪OGNL鍩虹涓婄殑锛孫GNL鏄竴绉嶅姛鑳藉己澶х殑琛ㄨ揪寮忚瑷€锛岄€氳繃绠€鍗曠殑璇硶鍗冲彲瀛樺彇瀵硅薄鐨勫睘鎬с€佽皟鐢ㄥ璞$殑鏂规硶銆侀亶鍘嗙瓑鍔熻兘銆?
鏈珷灏嗗涔燨GNL鍜孲truts 2鏍囩搴擄紝鍖呮嫭鏁版嵁璁块棶鏍囩銆佹帶鍒舵爣绛?
鏍稿績鎶€鑳介儴鍒?
6.1聽OGNL
6.1.1聽ActionContext
Struts 2涓殑ActionContext銆乂alueStack鍜孲tackContext瀵硅薄涓嶰GNL瀵嗗垏鐩稿叧锛岀悊瑙h繖涓変釜瀵硅薄鏃跺涔燨GNL鐨勫墠鎻愩€?
鍦ㄥ墠闈㈢殑瀛︿範涓紝鎴戜滑宸茬粡鍦ㄤ娇鐢ˋctionContext銆乂alueStack鍜孲tackContext瀵硅薄浜嗭紝杩欎笁涓璞$殑浣滅敤鍙婂叾涔嬮棿鐨勫叧绯诲鍥?.1.1鎵€绀恒€?
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CXwkEVNVnVHFmak1mYohWblZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM2ADOzgTMxIjNyUDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
鍥?.1.1 ActionContext
1.聽ActionContext瀵硅薄
ActionContext锛坈om.opensymphony.xwork.ActionContext锛夋槸Action鎵ц鏃剁殑涓婁笅鏂囥€傛垜浠彲浠ユ妸涓婁笅鏂囩湅浣滄槸涓€涓鍣紝鐢ㄤ簬瀛樻斁Action鎵ц鏃堕渶瑕佷娇鐢ㄧ殑瀵硅薄淇℃伅锛屼緥濡傝姹傜殑鍙傛暟(Parameter)銆佷細璇濓紙Session锛夈€丼ervlet涓婁笅鏂囷紙ServletContext锛夌瓑銆傚湪姣忔璇锋眰鎵цAction涔嬪墠閮戒細鍒涘缓鏂扮殑ActionContext銆備繚瀛樺埌ActionContext瀵硅薄涓殑鏁版嵁鍙互閫氳繃Struts2鏍囩鍜孫GNL琛ㄨ揪寮忚瑷€杩涜璁块棶銆?
2.聽StackContext瀵硅薄
StackContext瀵硅薄鏄疉ctionContext涓婁笅鏂囦腑鐨勪竴涓被鍨嬩负java.utiI.Stack鐨勫疄渚嬨€備笂闈㈡彁鍒扮殑璇锋眰鍙傛暟锛圥arameter锛夈€佷細璇濓紙Session锛夈€丼ervlet涓婁笅鏂囷紙ServletContext锛夌瓑瀵硅薄锛屽疄闄呬笂閮藉瓨鍌ㄥ湪ActionContext涓婁笅鏂囦腑鐨凷tackContext瀵硅薄涓€?
3.聽ValueStack瀵硅薄
Struts2浼氫负姣忎竴娆ction鐨勮姹傚垱寤轰笌涔嬪搴旂殑ValueStack锛屽苟灏嗘墍鏈堿ction灞炴€ф暟鎹瓨鍌ㄥ埌ValueStack涓紝鍐嶅皢ValueStack聽鏆撮湶缁欒鍥鹃〉闈紝杩欐牱椤甸潰灏卞彲浠ョ洿鎺ヨ闂瓵ction涓殑灞炴€у€笺€?
聽
6.1.2聽浣跨敤OGNL
OGNL鍗筹紙Object-Graph Navigation Language锛夛紝鏄璞″浘瀵艰埅璇█鐨勭缉鍐欙紝瀹冩槸涓€涓紑婧愰」鐩紝宸ヤ綔鍦ㄨ鍥惧眰锛岀敤鏉ュ彇浠i〉闈腑鐨凧ava鑴氭湰锛岀畝鍖栨暟鎹闂搷浣溿€?
OGNL鏄竴绉嶆瘮EL鍔熻兘鏇村己澶х殑琛ㄨ揪寮忚瑷€銆傞€氳繃鍏剁畝鍗曚竴鑷寸殑琛ㄨ揪寮忚娉曪紝鍙互瀛樺彇瀵硅薄鐨勫睘鎬с€佽皟鐢ㄥ璞$殑鏂规硶銆侀亶鍘嗕互鍙婅繘琛岀被鍨嬭浆鎹㈢瓑鍔熻兘銆係truts 2妗嗘灦榛樿浣跨敤OGNL浣滀负琛ㄨ揪寮忚瑷€銆?
1.聽璁块棶涓婁笅鏂囦腑鐨勬暟鎹?
ActionContext鏄疭truts聽2涓璒GNL鐨勪笂涓嬫枃鐜锛屽嵆ActionContext涓殑鏁版嵁锛堝疄闄呭瓨鍌ㄥ湪StackContext涓級閮藉彲浠ラ€氳繃OGNL鏉ヨ闂€傝€孉ctionContext鍙堝寘鎷琑equest銆丼ession銆乂alueStack绛夊璞★紝鎵€浠ラ€氳繃OGNL涔熷彲浠ヨ闂瓨鍌ㄥ湪杩欎簺瀵硅薄涓殑鏁版嵁銆?
ValueStack鏄疧GNL鐨勬牴锛屽悓鏃剁敱浜嶰GNL涓婁笅鏂囦腑鐨勬牴瀵硅薄鍙互鐩存帴璁块棶锛屾墍浠ラ€氳繃OGNL璁块棶ValueStack涓殑鏁版嵁鏃讹紝涓嶉渶瑕佷娇鐢ㄤ换浣曠壒娈婄殑鏍囪锛岃€岃闂瓵ctionConext涓殑鍏朵粬瀵硅薄鏃跺垯闇€瑕佷娇鐢ㄢ€?鈥濇爣璁般€係truts聽2涓彁渚涗簡<s:property>鏍囩鏉ユ樉绀篛GNL涓婁笅鏂囦腑鐨勬暟鎹紝鍦ㄥ疄闄呭簲鐢ㄤ腑閫氬父鍒嗕负浠ヤ笅鍥涚鎯呭喌锛?
锛?锛?lt;s:property聽聽value=鈥漸id鈥濓紡>锛毬燬truts2浼氬湪ValueStack涓煡鎵惧悕涓簎id鐨勯」锛屽苟杈撳嚭鍏跺€笺€?
锛?锛?lt;s:property 聽value=鈥?uid鈥濓紡>锛毬燬truts2浼氬湪StackContext涓煡鎵惧悕涓簎id鐨勯」锛屽苟杈撳嚭鍏跺€笺€?
锛?锛?lt;s:property 聽value=鈥?session.uid鈥濓紡>锛毬燬truts2浼氬湪StackContcxt涓殑Session浣滅敤鍩熶腑鏌ユ壘鍚嶄负uid鐨勯」锛屽苟杈撳嚭鍏跺€笺€傝繖閲岀殑session涔熷彲浠ユ洿鎹负request鍜宎pplication锛屼互渚垮湪Request鍜孉pplication浣滅敤鍩熶腑鏌ユ壘鎸囧畾鐨勯」銆?
锛?锛壜?lt;s:property 聽value =鈥?attr.uid鈥?>锛毬燬truts2浼氫緷娆″湪StackContext鐨凱age銆丷equest銆丼ession銆丄pplication浣滅敤鍩熷唴鏌ユ壘瀵瑰簲鐨剈id涓殑鍊笺€?
2.聽璁块棶JavaBean灞炴€?
閫氳繃OGNL鍙互闈炲父鏂逛究鐨勮闂甁avaBean锛屽亣璁剧幇鍦╒alueStack涓瓨鍦⊿tudentAction锛岃Action鐨勫睘鎬ф湁name銆乤ge绛夈€?
(1) <s:property value=鈥漬ame鈥濓紡>锛歋truts2浼氭墽琛孲tudentAction瀵硅薄鐨刧etName()鏂规硶鏉ヨ幏寰楀苟杈撳嚭name灞炴€х殑鍊?
(2) <s:property value=鈥漚ge鈥濓紡>锛歋truts2浼氭墽琛孲tudentAction瀵硅薄鐨刧etAge()鏂规硶鏉ヨ幏寰楀苟杈撳嚭age灞炴€х殑鍊?
鐢变簬ValueStack鏄疧GNL鐨勬牴锛屾墍浠ユ鏃跺湪浣跨敤<s:property>鏍囩鏃舵棤闇€鈥?鈥濇爣璁般€?
3. 聽鎵цJavaBean鏂规硶
OGNL涓嶄粎鍙互鑷姩鎵цgetter鏂规硶锛岃€屼笖鑳藉鎵цJavaBean鐨勫叾浠栨柟娉曘€傛洿閲嶈鐨勬槸锛岃繕鑳藉鍦ㄦ墽琛屾柟娉曠殑鏃跺€欎紶鍏ュ弬鏁帮紝OGNL鎵ц鐨勬柟娉曞彲浠ユ槸闈欐€佹柟娉曞拰闈為潤鎬佹柟娉曘€傛墽琛岄潤鎬佹柟娉曠殑鏍煎紡涓猴細@绫荤殑鍏ㄧ被鍚岪鏂规硶鍚嶏紙鍙傛暟锛夈€備负浜嗚兘澶熻OGNL鎵ц闈欐€佹柟娉曪紝杩樺繀椤诲湪struts.xml閰嶇疆鏂囦欢涓厤缃父閲忓弬鏁帮紝鎵嶅彲浠ュ紑鍚疧GNL璋冪敤闈欐€佹柟娉曠殑鍔熻兘锛岄厤缃唬鐮佸涓嬶細
<constantname="struts.ognl.allowStaticMethodAccess" value="true" />
绀轰緥6.1婕旂ず浜嗕娇鐢∣GNL鎵цJavaBean鏂规硶銆?
绀轰緥6.1
(1)鍒涘缓JavaBean聽锛屽懡鍚嶄负鈥淥gnlInfo.java鈥濄€?
[java]聽 view plain 聽copy
- public聽class聽OgnlInfo聽{聽聽聽
- //瀹氫箟闈欐€佹柟娉暵犅?
- public聽static聽String聽sayBye(String聽name)聽聽
- {聽聽
- return聽name聽+聽"鍐嶈!";聽聽
- }聽聽
- //瀹氫箟闈為潤鎬佹柟娉暵犅?
- public聽String聽sayHello(String聽name)聽聽
- {聽聽
- return聽name聽+聽"浣犲ソ!";聽聽
- }聽聽
- }聽聽
(2)鍒涘缓index.jsp銆?
聽
[html]聽 view plain 聽copy
- <body>聽聽
- 聽聽聽聽<%聽聽
- 聽聽聽聽聽聽聽聽//瀹炰緥鍖杘gnl瀵硅薄聽聽
- 聽聽聽聽聽聽聽聽OgnlInfo聽ognlInfo聽=聽new聽OgnlInfo();聽聽
- 聽聽聽聽聽聽聽聽//灏唎gnlinfo瀵硅薄瀛樺叆request浣滅敤鍩熷唴聽聽
- 聽聽聽聽聽聽聽聽request.setAttribute("ognlInfo",ognlInfo);聽聽聽聽
- 聽聽聽聽聽聽
- 聽聽聽聽聽聽
- 聽聽聽聽%>聽聽
- 聽聽聽聽<!--聽鎵цognl瀵硅薄闈為潤鎬佹柟娉暵?->聽聽
- 聽聽聽聽<s:property聽value="#request.ognlInfo.sayHello('jack')"/>聽聽
- 聽聽聽聽<!--聽鎵цognl瀵硅薄闈欐€佹柟娉暵?->聽聽
- 聽聽聽聽<s:property聽value="@[email聽protected]('tom')"/>聽聽
- 聽聽聽
- 聽聽</body>聽聽
4. 聽聽OGNL鎿嶄綔绗?
OGNL琛ㄨ揪寮忎腑鑳戒娇鐢ㄧ殑鎿嶄綔绗﹀熀鏈笌Java涓殑鎿嶄綔绗︾浉鍚岋紝闄や簡鑳戒娇鐢?銆佲€斻€?銆?銆?=銆?=銆?绛夋搷浣滅涔嬪锛岃繕鑳戒娇鐢╩od锛堝彇浣欙級銆乮n銆乶ot in绛夋搷浣滅銆?
5. 鈥?鈥濆彿
鈥?鈥濆彿鐢ㄤ簬瀵瑰睘鎬т负瀛楃涓茬被鍨嬬殑OGNL琛ㄨ揪寮忕殑鍊艰繘琛岃绠楋紝鈥?鈥濈鍙峰湪OGNL涓殑浣跨敤鏂规硶濡備笅锛?
<body>
<%
String value="纭畾";
pageContext.setAttribute("val", value);
%>
涓嶄娇鐢?绗﹀彿锛屼細鎸夊師鏍锋樉绀?lt;br>
<s:submit value="#attr.val"/>
<br>
浣跨敤%绗﹀彿锛屼細璁$畻OGNL琛ㄨ揪寮忕殑鍊?lt;br>
<s:submit value="%{#attr.val}"/>
</body>
杩愯缁撴灉濡傚浘6.1.2鎵€绀恒€?
聽
鍥?.1.2 %鐨勪娇鐢?
6. OGNL鐨勯泦鍚堟搷浣?
锛?锛夌敓鎴怢ist绫诲瀷鐨勯泦鍚堛€傚叿浣撹娉曚负{e1,e2,e3,...}銆傛璇硶灏嗙洿鎺ョ敓鎴愪竴涓猯ist绫诲瀷闆嗗悎锛岃闆嗗悎鍖呭惈3涓厓绱狅細e1,e2,e3銆傚鏋滈渶瑕佹洿澶氱殑鍏冪礌锛屽垯澶氫釜鍏冪礌涔嬮棿浠ヨ嫳鏂囬€楀彿闅斿紑銆?
锛?锛夌敓鎴怣ap绫诲瀷鐨勯泦鍚堛€傚叿浣撹娉曚负#{key1,key2,key3...}銆傛璇硶灏嗙洿鎺ョ敓鎴愪竴涓狹ap绫诲瀷闆嗗悎锛岃Map涓瘡涓猭ey-value瀵硅薄涔嬮棿浠ヨ嫳鏂囧啋鍙烽殧寮€锛屽鏋滈渶瑕佹洿澶氱殑鍏冪礌锛屽垯澶氫釜鍏冪礌涔嬮棿浠ヨ嫳鏂囬€楀彿闅斿紑銆?
锛?锛変娇鐢╥n鍜宯ot in聽杩愮畻绗︺€傚浜庨泦鍚堬紝OGNL鎻愪緵鍏冪礌绗n涓巒ot in銆傚叾涓紝in鐢ㄤ簬鍒ゆ柇鏌愪釜鍏冪礌鏄惁鍦ㄦ寚瀹氶泦鍚堝唴锛沶ot in聽鍒欑敤浜庡垽鏂煇涓厓绱犳槸鍚︿笉鍦ㄦ寚瀹氱殑闆嗗悎涓€侷n鍜屄爊ot in聽鐨勭敤娉曞涓嬶細
<!--聽鍒ゆ柇java鏄惁鍦ㄦ寚瀹氶泦鍚堜腑-->
<s:if test="'java' in {'java','jsp','html'}">
瀛樺湪
<s:else>
涓嶅瓨鍦?
</s:else>
</s:if>
(4) 聽聽鑾峰彇闆嗗悎鐨勫瓙闆嗐€侽GNL鍏佽閫氳繃鏌愪釜瑙勫垯鍙栧緱闆嗗悎鐨勫瓙闆嗭紝鍙栧緱瀛愰泦鏃舵湁浠ヤ笅涓夌鎿嶄綔绗︼細
1锛夆€?鈥濇搷浣滅锛氬彇鍑烘墍鏈夌鍚堥€夋嫨閫昏緫鐨勫厓绱犮€?
2锛夆€淾鈥濇搷浣滅锛氬彇鍑虹鍚堥€夋嫨閫昏緫鐨勭涓€涓厓绱犮€?
3锛夆€?鈥濇搷浣滅锛氬彇鍑虹鍚堥€夋嫨閫昏緫鐨勬渶鍚庝竴涓厓绱犮€?
鍋囪鐜板湪Session涓瓨鍦ㄥ悕涓篠tudentList鐨勯泦鍚堬紝璇ラ泦鍚堝瓨鍌ㄤ簡澶氫釜Student瀵硅薄銆係tudent绫讳腑瀛樺湪涓€涓猘ge灞炴€э紝杩欎笁绉嶆搷浣滅殑璇硶濡備笅锛?
#session.StudentList.{?#this.age>20}鐢ㄤ簬鍙栧嚭骞撮緞澶т簬20鐨勫瓙闆嗗悎銆?
#session.StudentList.{^#this.age>20}鐢ㄤ簬鍙栧嚭绗竴涓勾榫勫ぇ浜?0鐨凷tudent瀵硅薄銆?
#session.StudentList.{$#this.age>20}鐢ㄤ簬鍙栧嚭鏈€鍚庝竴涓勾榫勫ぇ浜?0鐨凷tudent瀵硅薄銆?
6.2聽Struts 2鐨勬爣绛惧簱
Struts 2浣滀负涓€涓紭绉€鐨凪VC妗嗘灦锛屽畠涓哄紑鍙戜汉鍛樻彁渚涗簡涓€涓姛鑳藉己澶с€佹敮鎸佸箍娉涖€侀珮鎵╁睍鎬х殑鏍囩搴擄紝瀹屽叏鑳芥弧瓒砏eb椤甸潰澶嶆潅銆佸鍙樼殑闇€姹傘€?
Struts 2鐨勬爣绛惧簱澶уぇ绠€鍖栦簡瑙嗗浘椤甸潰鐨勪唬鐮佺紪杈戝伐浣滐紝鎻愰珮浜嗚鍥鹃〉闈㈢殑缁存姢鏁堢巼銆備笌Struts 1鐨勬爣绛惧簱鐩告瘮锛孲truts 2鐨勬爣绛惧簱涓嶄絾鍔熻兘寮哄ぇ锛岃€屼笖鏇村姞绠€鍗曟槗鐢ㄣ€?
鍦⊿truts 1鐨勬爣绛惧簱涓紝瀹冨垎鍒彁渚涗簡html銆乥ean銆乴ogic绛夊嚑涓爣绛惧簱銆係truts 2鏍囩搴撳苟娌℃湁涓ユ牸鐨勫鏍囩杩涜鍒嗙被锛岃€屾槸鎶婃墍鏈夋爣绛炬暣鍚堝埌浜嗕竴涓爣绛惧簱涓€備负浜嗕娇鍒濆鑰呭Struts 2鏍囩搴撹兘鏈夋洿鍔犳竻鏅扮殑璁よ瘑锛屾垜浠彲浠ュ皢Struts 2鐨勬爣绛惧簱鍒嗘垚涓夊ぇ绫伙紙濡傚浘6.1.3鎵€绀猴級锛?
聽UI鏍囩锛氫富瑕佺敤浜庣敓鎴怘TML椤甸潰鍏冪礌銆?
聽闈濽I鏍囩锛氫富瑕佺敤浜庨€昏緫鎺у埗銆佹暟鎹闂瓑鎿嶄綔銆?
聽Ajax鏍囩锛氫富瑕佺敤浜庢敮鎸丄jax璁块棶銆?
鍏朵腑鍙堝彲浠ユ妸UI鏍囩鍒嗕负濡備笅涓ょ被锛?
琛ㄥ崟鏍囩锛氫富瑕佺敤浜庣敓鎴怘TML涓殑琛ㄥ崟鍏冪礌銆?
聽闈炶〃鍗曟爣绛撅細涓昏鍖呭惈涓€浜涘父鐢ㄧ殑鍔熻兘鏍囩锛屼緥濡傛樉绀烘棩鏈熸垨鏍戝舰鑿滃崟銆?
瀵逛簬闈濽I鏍囩锛屼篃鍙互鍐嶇粏鍒嗕负濡備笅涓ょ被锛?
聽鏁版嵁璁块棶鏍囩锛氫富瑕佺敤浜庤幏寰楁垨杈撳嚭ValueStack涓殑鍊笺€?
聽閫昏緫鎺у埗鏍囩锛氫富瑕佺敤浜庢暟鎹闂腑鐨勬潯浠跺垎鏀€佸惊鐜瓑娴佺▼鎺у埗銆?
鍥?.1.3 鏍囩搴撳垎绫?
浣跨敤Struts2鏍囩搴撲箣鍓嶏紝涔熼渶瑕佸湪JSP椤甸潰涓鍏ャ€傜幇鍦ㄧ殑Web搴旂敤涓€鑸兘浣跨敤Servlet 2.4浠ヤ笂鐨勮鑼冿紝鍥犳鎴戜滑灏辨棤椤诲湪web.xml鏂囦欢涓鏍囩搴撹繘琛岄厤缃紝鍥犱负Servlet 2.4浠ヤ笂鐨勮鑼冨彲浠ョ洿鎺ヨ鍙栨爣绛惧簱瀹氫箟鏂囦欢锛圱LD鏂囦欢锛夛紝鍦↗SP椤甸潰涓洿鎺ラ€氳繃涓嬮潰涓€琛屼唬鐮佸氨鍙互瀵煎叆Struts 2鏍囩搴撱€?
<%@ taglib prefix="s" uri="/struts-tags" %>
聽
6.2.1聽鏁版嵁璁块棶鏍囩
鏁版嵁璁块棶鏍囩涓昏鐢ㄦ潵鑾峰緱鎴栬緭鍑哄悇绉嶆暟鎹殑鍔熻兘锛屽父搴旂敤浜庢樉绀篈ction涓殑灞炴€т互鍙婂浗闄呭寲杈撳嚭绛夊満鍚堛€傚父瑙佺殑鏁版嵁鏍囩涓昏鍖呭惈浠ヤ笅鍑犱釜锛?
聽action鏍囩锛氳鏍囩鐢ㄤ簬鍦↗SP椤甸潰涓洿鎺ヨ皟鐢ㄤ竴涓狝ction聽銆?
include鏍囩锛氳鏍囩鐢ㄤ簬鍦↗SP椤甸潰涓寘鍚叾浠栭〉闈㈣祫婧愩€?
聽param鏍囩锛氳鏍囩鐢ㄤ簬璁剧疆涓€涓弬鏁帮紝閫氬父鐢ㄤ綔bean銆乽rl鏍囩鐨勫瓙鏍囩銆?
聽property鏍囩锛氳鏍囩鐢ㄤ簬杈撳嚭鏌愪釜鍊笺€?
聽set鏍囩锛氳鏍囩鐢ㄤ簬璁剧疆涓€涓柊鍙橀噺銆?
聽text鏍囩锛氳鏍囩鐢ㄤ簬杈撳嚭鍥介檯鍖栨秷鎭€?
聽url鏍囩锛氳鏍囩鐢ㄤ簬鐢熸垚涓€涓猆RL鍦板潃銆?
聽date鏍囩锛氳鏍囩鐢ㄤ簬鏍煎紡鍖栬緭鍑轰竴涓棩鏈熴€?
1.聽action鏍囩
璇ユ爣绛惧彲浠ュ湪JSP椤甸潰涓洿鎺ヨ皟鐢ˋction锛屽苟鍙互鎶婃墽琛岀殑缁撴灉鍖呭惈鍦ㄦ爣绛剧殑浣嶇疆锛岃繖鏃堕渶瑕佹寚瀹欰ction鐨刵ame鍜宯amespace绛夊睘鎬с€備笅闈㈡槸璇ユ爣绛剧殑鍑犱釜涓昏灞炴€э細
聽id灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氳璋冪敤鐨凙ction鐨勫紩鐢↖D銆?
聽name灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氳璋冪敤鐨凙ction鐨勫悕瀛椼€?
聽namespace灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氳璋冪敤鐨凙ction鎵€鍦ㄧ殑namespace銆?
聽executeResult灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氭槸鍚﹀皢Action鐨勫鐞嗙粨鏋滃寘鍚埌褰撳墠椤甸潰涓紝璇?
灞炴€х殑榛樿鍊兼槸false锛屽嵆涓嶅寘鍚€?
绀轰緥6.2
涓嬮潰鎴戜滑閫氳繃涓€涓疄渚嬫潵浠嬬粛action鏍囩鐨勫叿浣撳簲鐢紝棣栧厛缂栧啓涓€涓畝鍗曠殑Action绫伙紝浠g爜濡備笅鎵€绀恒€?
public class TagAction
{
private String name;
//鐪佺暐getter鍜宻etter鏂规硶
public String exec()
{
return "ok";
}
}
閫氳繃涓婅堪浠g爜鍙互鐪嬪埌璇ction鍙寘鍚簡涓€涓猠xec涓氬姟鏂规硶銆備笅闈㈡槸璇ction鍦╯truts.xml鏂囦欢涓殑閰嶇疆锛?
[html]聽 view plain 聽copy
- <struts>聽聽
- 聽聽聽聽<package聽name="struts2_Tags"聽extends="struts-default"聽聽
- 聽聽聽聽聽namespace="/tags">聽聽聽聽聽聽聽聽
- <action聽name="tag1"聽class="com.zy.TagAction"聽method="exec">聽聽
- <result聽name="ok">succ.jsp</result>聽聽
- </action>聽聽
- 聽聽聽聽</package>聽聽
- </struts>聽聽
涓嬮潰鏄痵ucc.jsp瑙嗗浘鏂囦欢鐨勪唬鐮侊細
<body>
<br>
璋冪敤Action!!
</body>
涓嬮潰鏄娇鐢╝ction鏍囩鐨剆-action_Tag.jsp鏂囦欢锛屼唬鐮佸涓嬫墍绀猴細
<body>
涓嬮潰璋冪敤Action锛屽苟灏嗙粨鏋滃寘鍚埌鏈〉闈腑銆?lt;br>
<s:action name="tag1" executeResult="true" namespace="/tags"/>
</body>
涓婅堪浠g爜浣跨敤<s:action />鏍囩璋冪敤浜嗗悕瀛椾负tag1鐨勯€昏緫action锛屽苟閫氳繃璁剧疆executeResult灞炴€т负true灏嗙粨鏋滃寘鍚埌浜嗘湰椤甸潰涓€?
聽
鍥?.1.4 聽action鏍囩鐨勫簲鐢?
2.聽property鏍囩
璇ユ爣绛剧殑浣滅敤灏辨槸杈撳嚭ActionContext涓璞$殑鍊兼垨鑰匒ction銆丣avaBean鐨勫睘鎬у€硷紝閫氬父缁撳悎OGNL浣跨敤銆傝鏍囩鏈夊涓嬪嚑涓睘鎬э細
脴聽value锛岃灞炴€х敤鏉ユ寚瀹氳杈撳嚭鐨勫睘鎬ф垨OGNL琛ㄨ揪寮忋€?
脴聽default锛岃灞炴€х敤鏉ユ寚瀹氬綋value鎸囧畾鐨勫睘鎬у€间负null鏃惰緭鍑虹殑鍊笺€?
脴聽escape锛岃灞炴€х敤鏉ユ寚瀹氭槸鍚︾敓鎴怘TML浠g爜锛岄粯璁や负true锛岃〃绀哄湪娴忚鍣ㄤ笂杈撳嚭琛ㄨ揪寮忕殑鍊硷紱濡傛灉涓篺alse锛屽垯鎶婅〃杈惧紡鐨勫€间綔涓篐TML浠g爜宓屽叆銆?
绀轰緥6.3
涓嬮潰鏄簲鐢╬roperty鏍囩鐨勭畝鍗曠ず渚嬨€?
<body>
聽聽聽聽<%
聽聽聽聽 String url="<a href='index.jsp'>瓒呴摼鎺?lt;/a>";
聽聽聽聽 pageContext.setAttribute("su",url);
聽聽聽聽聽%>
聽聽聽聽聽<s:property value="#attr.su"/><hr>
聽聽聽聽聽<s:property value="#attr.su" escape="false"/><hr>
聽聽聽聽聽<s:property value="#attr.uid" default="鎵句笉鍒皍id"/>
</body>
杩愯鏁堟灉濡傚浘6.1.5鎵€绀恒€?
聽
鍥?.1.5 property鏍囩
3.聽include鏍囩
璇ユ爣绛剧敤鏉ュ皢涓€涓狫SP鎴朣ervlet绛夎祫婧愬寘鍚埌褰撳墠椤甸潰涓紝浣跨敤璧锋潵闈炲父绠€鍗曘€傝鏍囩涓昏鍖呭惈value灞炴€э紝鐢ㄦ潵鎸囧畾琚寘鍚殑JSP鎴朣ervlet绛夎祫婧愭枃浠躲€?
绀轰緥6.4
鎺ヤ笅鏉ラ€氳繃涓€涓畝鍗曠殑渚嬪瓙鏉ヤ粙缁峣nclude鏍囩鐨勫叿浣撳簲鐢紝棣栧厛鏄鍖呭惈鐨刬nclude-file.jsp椤甸潰鐨勪唬鐮侊細
[html]聽 view plain 聽copy
- <%@聽page聽contentType="text/html;聽charset=GBK"聽language="java"%>聽聽
- <%@taglib聽prefix="s"聽uri="/struts-tags"%>聽聽
- <html>聽聽
- <head>聽聽
- </head>聽聽
- <body>聽聽
- ---------------------------聽聽
- <h3>杩欐槸琚寘鍚殑椤甸潰</h3>聽聽
- </body>聽聽
- </html>聽聽
- 涓嬮潰鏄寘鍚玦nclude-file.jsp杩欎釜椤甸潰鐨剆-include_Tag.jsp鏂囦欢锛屼唬鐮佸涓嬫墍绀猴細聽聽
- <%@聽page聽contentType="text/html;聽charset=utf-8"聽language="java"%>聽聽
- <%@taglib聽prefix="s"聽uri="/struts-tags"%>聽聽
- <html>聽聽
- <head>聽聽
- <title>浣跨敤include鏍囩鏉ュ寘鍚洰鏍囬〉闈?lt;/title>聽聽
- </head>聽聽
- <body>聽聽
- <h2>浣跨敤include鏍囩鏉ュ寘鍚洰鏍囬〉闈?lt;/h2>聽聽
- <s:include聽value="include-file.jsp"/>聽聽
- </body>聽聽
- </html>聽聽
涓婅堪浠g爜閫氳繃浣跨敤include鏍囩鍖呭惈浜唅nclude-file.jsp椤甸潰锛岃繍琛屾晥鏋滃鍥?.1.6鎵€绀恒€?
聽
鍥?.1.6 include鏍囩
4.聽set鏍囩
璇ユ爣绛剧敤鏉ュ畾涔変竴涓彉閲忥紝骞舵妸杩欎釜鍙橀噺鏀惧埌鎸囧畾鐨勮寖鍥村唴锛屼緥濡俛pplication鑼冨洿銆乻ession鑼冨洿绛夈€傝鏍囩鏈変互涓嬩竴浜涘父鐢ㄥ睘鎬э細
脴聽id灞炴€э細璇ュ睘鎬х敤鏉ュ畾涔夊彉閲忕殑鍚嶅瓧銆?
脴聽scope灞炴€э細璇ュ睘鎬х敤鏉ュ畾涔夊彉閲忚鏀剧疆鐨勮寖鍥达紝鍙€夌殑鍊兼湁application銆乻ession銆乺equest銆乺esponse銆乸age鍜孲tackContext銆?
脴聽value灞炴€э細璇ュ睘鎬х敤鏉ュ畾涔夊皢瑕佽祴缁欏彉閲忕殑鍥哄畾鍊兼垨鑰呭彟涓€涓凡缁忓畾涔夌殑鍙橀噺銆?
绀轰緥6.5
涓嬮潰鎴戜滑閫氳繃涓€涓ず渚嬫潵浠嬬粛set鏍囩鐨勫叿浣撳簲鐢紝棣栧厛鎴戜滑瀹氫箟涓€涓彉閲弍锛屽苟鎶娾€滃皬鏍峰効鈥濊繖涓瓧绗︿覆璧嬪€肩粰瀹冿紝鐒跺悗瀹氫箟鍙︿竴涓彉閲弖ser锛屽苟鎶妏璧嬪€肩粰user銆備唬鐮佸涓嬫墍绀猴細
<body>
<h2>浣跨敤set鏍囩璁剧疆涓€涓柊鍙橀噺</h2>
<s:set id="p" value="'灏忔牱鍎?"/>
<s:property value="#attr.p"/><br>
灏唒鍙橀噺璧嬪€肩粰user鍙橀噺骞舵斁鍏ession鑼冨洿鍐?lt;br>
<s:set value="#p" id="user" scope="session"/>
<s:property value="#session.user"/><br>
</body>
杩愯鏁堟灉濡傚浘6.1.7鎵€绀恒€?
聽
鍥?.1.7 set鏍囩鐨勫簲鐢?
5.聽url鏍囩
璇ユ爣绛剧敤鏉ョ敓鎴愪竴涓猆RL鍦板潃锛屾垜浠篃鍙互閫氳繃宓屽param鏍囩鏉ヤ负URL鎸囧畾鍙戦€佸弬鏁般€傝鏍囩涓昏鏈変互涓嬩竴浜涘父鐢ㄥ睘鎬э細
脴聽includeParams灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氭槸鍚﹀湪鐢熸垚鐨刄RL鍙傛暟涓拷鍔犳湰椤甸潰鎺ユ敹鍒扮殑璇锋眰鍙傛暟锛屾湁3涓€煎彲渚涢€夋嫨锛宯one锛?get鍜宎ll锛屽垎鍒唬琛ㄢ€滀笉鍖呭惈鈥濄€佲€滃寘鍚玤et鏂规硶浼犻€掔殑鍙傛暟鈥濆拰鈥滄墍鏈夌殑鍙傛暟鈥濄€?
脴聽value灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氳鐢熸垚鐨刄RL鐨勫湴鍧€鍊笺€?
脴聽action灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氫竴涓狝ction浣滀负URL鍦板潃鍊笺€?
脴聽namespace灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氬懡鍚嶇┖闂淬€?
脴聽method灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氳皟鐢ˋction鐨勬柟娉曞悕銆?
脴聽includeContext灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氭槸鍚︽妸褰撳墠涓婁笅鏂囧寘鍚湪URL鍦板潃鍊间腑銆?
鍦ㄤ笂杩板睘鎬т腑锛宎ction鍜寁alue灞炴€у彧闇€鎸囧畾鍏朵竴鍗冲彲锛屽鏋滀袱涓兘鏈寚瀹氾紝灏变互褰撳墠椤甸潰浣滀负URL鍦板潃鍊笺€備笅闈㈡槸涓€涓簲鐢║RL鏍囩鐨勭ず渚嬨€?
绀轰緥6.6
[html]聽 view plain 聽copy
- <body>聽聽
- <h3>浣跨敤url鏍囩</h3>聽聽
- <hr>聽聽
- 鎸囧畾action灞炴€?涓斾娇鐢╬aram鏍囩浼犲叆鍙傛暟銆?lt;br>聽聽
- <s:url聽action="showPerson">聽聽
- 聽聽聽聽<s:param聽name="name"聽value="'Jack'"聽/>聽聽
- </s:url>聽聽
- <hr>聽聽
- 鎸囧畾value灞炴€?涓斾娇鐢╬aram鏍囩浼犲叆鍙傛暟銆?lt;br>聽聽
- <s:url聽value="http://localhost:8080/firstStruts2/news.jsp">聽聽
- 聽聽聽聽<s:param聽name="name"聽value="'Jack'"聽/>聽聽
- </s:url>聽聽
- </body>聽聽
璇ラ〉闈㈢殑杩愯鏁堟灉濡傚浘6.1.8鎵€绀恒€?
聽
鍥?.1.8 URL鏍囩鐨勫簲鐢?
6.聽date鏍囩
date鏍囩鐢ㄦ潵鎸夋寚瀹氱殑鏍煎紡杈撳嚭涓€涓棩鏈燂紝杩樺彲浠ヨ绠楁寚瀹氭棩鏈熷埌褰撳墠鏃堕棿鐨勬椂宸€傝鏍囩涓昏鏈夊涓嬩竴浜涘睘鎬э細
脴聽format灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氭棩鏈熻緭鍑虹殑鏍煎紡锛屼緥濡傗€測yyy-MM-dd鈥濄€?
脴聽name灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氳琚牸寮忓寲杈撳嚭鐨勬棩鏈熷€笺€?
绀轰緥6.7
鎴戜滑鐪嬩笅闈㈢殑瀹炰緥浠g爜锛岀敤鈥滃勾/鏈?鏃モ€濈殑瀹屾暣鏍煎紡鏄剧ず褰撳墠鏃ユ湡锛?
[html]聽 view plain 聽copy
- <body>聽聽
- <h3>date鏍囩鐨勪娇鐢?lt;/h3>聽聽
- <%聽聽
- java.util.Date聽now聽=聽new聽java.util.Date();聽聽
- pageContext.setAttribute("now"聽,聽now);聽聽
- %>聽聽
- <s:date聽name="#attr.now"聽format="yyyy/MM/dd"聽nice="false"/><hr><br>聽聽
- </body>聽聽
璇ラ〉闈㈢殑杩愯鏁堟灉濡傚浘6.1.9鎵€绀恒€?
聽
鍥?.1.9 date鏍囩鐨勪娇鐢?
7. <s:bean>鏍囩
<s:bean>鐢ㄦ潵鍒涘缓JavaBean瀹炰緥锛屽垱寤篔avaBean瀹炰緥鐨勬椂鍊欙紝鍙互鍦ㄨ鏍囩鍐呴儴浣跨敤<param/>鏍囩涓鸿JavaBean瀹炰緥浼犲叆灞炴€с€傚叾甯歌灞炴€у涓嬶細
脴聽Id:鎸囧畾鍒涘缓JavaBean鐨勫紩鐢╥d.
脴聽name:鎸囧畾闇€瑕佸疄渚嬪寲鐨凧avaBean鐨勫疄鐜扮被
<s:bean>鏍囩鐢ㄦ硶鐨勫涓嬶細
锛?锛壜犲垱寤篔avaBean,鍛藉悕涓築ook.java銆?
[java]聽 view plain 聽copy
- public聽class聽Book聽{聽聽聽
- private聽String聽isbn;聽聽
- private聽String聽name;聽聽
- private聽double聽price;聽聽
- public聽Book()聽{聽聽
- super();聽聽
- }聽聽
- public聽Book(String聽isbn,聽String聽name,聽double聽price)聽{聽聽
- super();聽聽
- this.isbn聽=聽isbn;聽聽
- this.name聽=聽name;聽聽
- this.price聽=聽price;聽聽
- }聽聽
- public聽String[]聽getAllBooks()聽聽
- {聽聽
- String[]聽books聽=聽{"JAVA","JSP","ASP.NET","C#"};聽聽
- return聽books;聽聽
- }聽聽
- }聽聽
(2)聽鍒涘缓Jsp椤甸潰.
<!--聽瀹炰緥鍖朾ook JavaBean瀵硅薄,骞跺瓨鍌ㄥ埌StackContext涓?->
<s:bean id="book" name="com.zzab.entity.Book">
<s:param name="isbn" value="'621345'"/>
<s:param name="name" value="'HTML'"/>
</s:bean>
<!--聽杈撳嚭bean瀵硅薄鐨勫€悸?->
book瀵硅薄灞炴€у€?<br>
isbn:<s:property value="#book.isbn"/><br/>
name:<s:property value="#book.name"/><br/>
璋冪敤book瀵硅薄鐨刧etAllBooks鏂规硶鑾峰彇鍏ㄩ儴涔︾睄鍒楄〃:<br/>
<c:forEach var="book" items="${book.allBooks}">
<div>${book }</div>
</c:forEach>
[html]聽 view plain 聽copy
- <s:bean聽id="book"聽name="com.zzab.entity.Book">聽聽
- <s:param聽name="isbn"聽value="'621345'"/>聽聽
- <s:param聽name="name"聽value="'HTML'"/>聽聽
- </s:bean>聽聽
- <!--聽杈撳嚭bean瀵硅薄鐨勫€悸?->聽聽
- book瀵硅薄灞炴€у€?<br>聽聽
- isbn:<s:property聽value="#book.isbn"/><br/>聽聽
- name:<s:property聽value="#book.name"/><br/>聽聽
- 璋冪敤book瀵硅薄鐨刧etAllBooks鏂规硶鑾峰彇鍏ㄩ儴涔︾睄鍒楄〃:<br/>聽聽
- <c:forEach聽var="book"聽items="${book.allBooks}">聽聽
- <div>${book聽}</div>聽聽
- </c:forEach>聽聽
6.2.2聽閫昏緫鎺у埗鏍囩
Struts 2鐨勯€昏緫鎺у埗鏍囩涓昏鐢ㄤ簬绋嬪簭娴佺▼鐨勯€昏緫鎺у埗锛屼緥濡傞€夋嫨銆佸垎鏀€佸惊鐜瓑鎿嶄綔锛屽父瑙佺殑閫昏緫鎺у埗鏍囩涓昏鏈変互涓嬩簲涓爣绛撅細
脴聽if鏍囩锛氱敤浜庢帶鍒堕€夋嫨娴佺▼鐨勬爣绛俱€?
脴聽elseif鏍囩锛氫笌if鏍囩缁撳悎浣跨敤銆?
脴聽else鏍囩锛氫笌if鏍囩缁撳悎浣跨敤銆?
脴聽generator鏍囩锛岀敤浜庡皢涓€涓瓧绗︿覆瑙f瀽鎴愪竴涓泦鍚堛€?
脴聽iterator鏍囩锛氳繖鏄竴涓凯浠e櫒锛岀敤浜庡皢闆嗗悎杩涜寰幆杈撳嚭銆?
聽
1.聽if/elseif/else鏍囩
if/elseif/else杩欎笁涓爣绛鹃€氬父缁撳悎浣跨敤锛岄兘鏄敤浜庤繘琛岀▼搴忓垎鏀€昏緫鎺у埗锛岃窡澶氭暟缂栫▼璇█涓殑if/elseif/else璇彞鐨勫姛鑳界浉浼硷紝test灞炴€х敤鏉ヨ缃瘮杈冭〃杈惧紡锛屽叿浣撹娉曞涓嬫墍绀猴細
<s:if test="琛ㄨ揪寮?>
鏍囩浣?
<s:elseif test="琛ㄨ揪寮?>
鏍囩浣?
<s:else>
鏍囩浣?
</s:else>
涓嬮潰鏄竴涓疄渚嬬殑浠g爜鐗囨锛?
绀轰緥6.8
[html]聽 view plain 聽copy
- <s:set聽name="dengji"聽value="85"/>聽聽
- <s:if聽test="#dengji>=90">聽聽
- 聽聽聽聽鎴愮哗浼樼聽聽
- </s:if>聽聽
- <s:elseif聽test="#dengji>=80">聽聽
- 聽聽聽聽鎴愮哗鑹ソ聽聽
- </s:elseif>聽聽
- <s:elseif聽test="#dengji>=60">聽聽
- 鎴愮哗鍚堟牸聽聽
- </s:elseif>聽聽
- <s:else>聽聽
- 聽聽聽聽鎴愮哗涓嶅悎鏍悸犅?
- </s:else>聽聽
涓婅堪浠g爜鍏堥€氳繃set鏍囩瀹氫箟浜嗕竴涓悕涓篸engji鐨勫睘鎬у苟璧嬪€间负85锛岀劧鍚庨€氳繃if/elseif/else鏍囩鏍规嵁dengji灞炴€х殑鍊肩殑鑼冨洿鏉ユ帶鍒惰緭鍑烘垚缁╃殑璇勪环鏄€滀紭绉€鈥濄€佲€滆壇濂解€濄€佲€滃悎鏍尖€濇垨鈥滀笉鍚堟牸鈥濄€傝繍琛屾晥鏋滃鍥?.1.10鎵€绀恒€?
聽
鍥?.1.10 if/elseif/else鏍囩鐨勫簲鐢?
聽
2.聽iterator鏍囩
璇ユ爣绛句富瑕佺敤浜庡闆嗗悎绫诲瀷鐨勫彉閲忚繘琛岃凯浠h緭鍑猴紝杩欓噷鐨勯泦鍚堢被鍨嬪寘鎷琇ist銆丼et銆佹暟缁勫拰Map绛夈€傝鏍囩涓昏鏈変笁涓睘鎬э細
脴聽value灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氳杩唬杈撳嚭鐨勯泦鍚堬紝琚凯浠g殑闆嗗悎鍙互鐢監GNL琛ㄨ揪寮忔寚
瀹氫篃鍙互閫氳繃Action杩斿洖涓€涓泦鍚堢被鍨嬬殑鍙橀噺銆?
脴聽id灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氶泦鍚堜腑鍏冪礌鐨処D灞炴€с€?
脴聽status灞炴€э細璇ュ睘鎬у彲浠ュ疄鐜颁竴浜涢檮鍔犲姛鑳斤紝璇﹁鍚庨潰璁茶В銆?
涓嬮潰鏄竴涓疄渚嬬殑浠g爜鐗囨锛?
绀轰緥6.9
<h3>iterator鐨勭敤娉?lt;/h3>
聽<%
聽 List bookList=new ArrayList();
聽 bookList.add("Spring3.0鎶€鏈疂鍏?);
聽 bookList.add("Struts2鏉冨▉鎸囧崡");
聽 bookList.add("JavaScript鎶€鏈ぇ鍏?);
聽 bookList.add("JSP鎶€鏈瑙?);
聽 bookList.add("Ajax瀹炴垬");
聽 pageContext.setAttribute("bookList",bookList);
聽聽%>
聽<s:iterator value="#attr.bookList" id="bookname">
聽<li><s:property value="bookname" /></li>
聽</s:iterator>
涓婅堪浠g爜閫氳繃iterator鏍囩鐨剉alue灞炴€ф寚瀹氫簡涓€涓泦鍚堬紝骞舵寚瀹氬畠鐨刬d灞炴€т负bookname锛岀劧鍚庡氨鍙互閫氳繃<s:property value="bookname" />杈撳嚭闆嗗悎涓瘡涓厓绱犵殑鍊笺€傝椤甸潰鐨勮繍琛屾晥鏋滃鍥?.1.11鎵€绀恒€?
聽
鍥?.1.11 iterator鏍囩鐨勫簲鐢?
iterator鏍囩鐨剆tatus灞炴€у緢鏈夌敤锛屽埄鐢ㄥ畠鍙互瀹炵幇涓€浜涘緢瀹炵敤鐨勫姛鑳姐€傛寚瀹氳灞炴€у悗锛屾瘡娆¤凯浠i兘浼氫互姝ゅ睘鎬т负鍚嶇О鍒涘缓涓€涓狪teratorStatus鐨勫疄渚嬪璞★紝璇ュ疄渚嬪璞″寘鍚簡浠ヤ笅鍑犱釜灞炴€э細
脴聽count锛氳繑鍥炲綋鍓嶈凯浠d簡鍑犱釜鍏冪礌銆?
脴聽index锛氳繑鍥炲綋鍓嶈凯浠e厓绱犲湪闆嗗悎涓殑绱㈠紩鍊笺€?
脴聽even锛氳繑鍥炲綋鍓嶈凯浠e厓绱犵殑绱㈠紩鍊兼槸鍚︿负鍋舵暟銆?
脴聽odd锛氳繑鍥炲綋鍓嶈凯浠e厓绱犵殑绱㈠紩鍊兼槸鍚︿负濂囨暟銆?
脴聽first锛氳繑鍥炲綋鍓嶈凯浠e厓绱犳槸鍚︽槸绗竴涓厓绱犮€?
脴聽last锛氳繑鍥炲綋鍓嶈凯浠e厓绱犳槸鍚︽槸鏈€鍚庝竴涓厓绱犮€?
鎴戜滑鐪嬩笅闈㈢殑浠g爜鐗囨锛?
<table width="200">
聽<s:iterator value="#attr.bookList" id="name" status="st">
<tr <s:if test="#st.odd">style="background-color:#bbbbbb"</s:if>>
<td><s:property value="#st.index"/></td>
<td><s:property value="name"/></td>
</tr>
聽</s:iterator>
</table>
涓婅堪浠g爜浠ヨ〃鏍肩殑褰㈠紡杈撳嚭浜嗛泦鍚堜腑鐨勬瘡涓厓绱犲拰鍏冪礌鐨勭储寮曞€硷紝骞堕€氳繃iterator鏍囩鐨剆tatus灞炴€ф帶鍒跺鏁拌鐨勮儗鏅壊锛岃繍琛屾晥鏋滃鍥?.1.12鎵€绀恒€?
聽
鍥?.1.12 status灞炴€х殑搴旂敤
聽
聽
3.聽generator鏍囩
聽
璇ユ爣绛惧彲浠ュ皢涓€涓瓧绗︿覆鎸夋寚瀹氱殑鍒嗛殧绗﹀垎闅旀垚澶氫釜瀛愪覆锛屾柊鐢熸垚鐨勫涓瓙涓插彲浠ヤ娇鐢╥terator鏍囩杩涜杩唬杈撳嚭銆俫enerator鏍囩甯歌鐨勫睘鎬у涓嬶細
脴聽count灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氭墍鐢熸垚闆嗗悎涓厓绱犵殑鎬绘暟銆?
脴聽separator灞炴€э細璇ュ睘鎬х敤鏉ユ寚瀹氬垎闅旂銆?
脴聽converter灞炴€э細璇ュ睘鎬ф寚瀹氫簡涓€涓浆鎹㈠櫒锛岃杞崲鍣ㄨ礋璐e皢闆嗗悎涓殑姣忎釜瀛楃涓茶浆鎹㈡垚
瀵硅薄銆?
脴聽id灞炴€э細濡傛灉鎸囧畾浜嗚灞炴€э紝鍒欐柊鐢熸垚鐨勯泦鍚堜細浠ユ涓哄悕绉帮紝琚斁鍦╬ageContext涓€?
鎴戜滑鏉ョ湅涓嬮潰鐨勪唬鐮佺墖娈碉細
绀轰緥6.10
<s:generator val="'Spring鎶€鏈疂鍏?Ajax瀹炴垬,Struts2鏉冨▉鎸囧崡,JSP鎶€鏈瑙?
JavaScript鎶€鏈ぇ鍏?" separator="," id="generList"/>
<table width="320">
<caption>杩唬杈撳嚭鐢眊enerator鏍囩浜х敓鐨勯泦鍚?lt;/caption>
聽<s:iterator value="#attr.generList" id="name" status="st">
<tr>
<td><s:property value="#st.index"/></td>
<td><s:property value="name"/></td>
</tr>
聽</s:iterator>
</table>
涓婅堪浠g爜浣跨敤generator鏍囩鎶婁竴涓瓧绗︿覆鎸夐€楀彿杩涜浜嗗垎鍓诧紝骞舵妸浜х敓鐨勯泦鍚堟寜鐓ф寚瀹氱殑鈥済enerList鈥濅负id淇濆瓨鍦╬ageContext涓紝鎺ヤ笅鏉ヤ娇鐢╥terator鏍囩杩唬杈撳嚭generList闆嗗悎涓殑鍏冪礌锛岃繍琛屾晥鏋滃鍥?.1.13鎵€绀恒€?
聽
鍥?.1.13 generator鏍囩鐨勫簲鐢?
聽
聽
鏈珷鎬荤粨
脴聽ActionContext瀵硅薄銆侫ctionContext锛坈om.opensymphony.xwork.ActionContext锛夋槸Action鎵ц鏃剁殑涓婁笅鏂囥€傛垜浠彲浠ユ妸涓婁笅鏂囩湅浣滄槸涓€涓鍣紝鐢ㄤ簬瀛樻斁Action鎵ц鏃堕渶瑕佷娇鐢ㄧ殑瀵硅薄淇℃伅銆?
脴聽StackContext瀵硅薄銆傝姹傚弬鏁帮紙Parameter锛夈€佷細璇濓紙Session锛夈€丼ervlet涓婁笅鏂囷紙ServletContext锛夌瓑瀵硅薄锛屽疄闄呬笂閮藉瓨鍌ㄥ湪ActionContext涓婁笅鏂囦腑鐨凷tackContext瀵硅薄涓€?
脴聽ValueStack瀵硅薄銆係truts2浼氫负姣忎竴娆ction鐨勮姹傚垱寤轰笌涔嬪搴旂殑ValueStack锛屽苟灏嗘墍鏈堿ction灞炴€ф暟鎹瓨鍌ㄥ埌ValueStack涓紝鍐嶅皢ValueStack聽鏆撮湶缁欒鍥鹃〉闈紝杩欐牱椤甸潰灏卞彲浠ョ洿鎺ヨ闂瓵ction涓殑灞炴€у€笺€?
脴聽OGNL鍗筹紙Object-Graph Navigation Language锛夛紝鏄璞″浘瀵艰埅璇█鐨勭缉鍐欙紝瀹冩槸涓€涓紑婧愰」鐩紝宸ヤ綔鍦ㄨ鍥惧眰锛岀敤鏉ュ彇浠i〉闈腑鐨凧ava鑴氭湰锛岀畝鍖栨暟鎹闂搷浣溿€?
锛?锛夎闂笂涓嬫枃涓殑鏁版嵁銆俈alueStack鏄疧GNL鐨勬牴锛屽悓鏃剁敱浜嶰GNL涓婁笅鏂囦腑鐨勬牴瀵硅薄鍙互鐩存帴璁块棶锛屾墍浠ラ€氳繃OGNL璁块棶ValueStack涓殑鏁版嵁鏃讹紝涓嶉渶瑕佷娇鐢ㄤ换浣曠壒娈婄殑鏍囪锛岃€岃闂瓵ctionConext涓殑鍏朵粬瀵硅薄鏃跺垯闇€瑕佷娇鐢ㄢ€?鈥濇爣璁般€?
锛?锛夋墽琛孞avaBean鏂规硶銆侽GNL涓嶄粎鍙互鑷姩鎵цgetter鏂规硶锛岃€屼笖鑳藉鎵цJavaBean鐨勫叾浠栨柟娉曘€傛洿閲嶈鐨勬槸锛岃繕鑳藉鍦ㄦ墽琛屾柟娉曠殑鏃跺€欎紶鍏ュ弬鏁帮紝OGNL鎵ц鐨勬柟娉曞彲浠ユ槸闈欐€佹柟娉曞拰闈為潤鎬佹柟娉曘€?
脴聽Struts 2鐨勬爣绛惧簱
锛?锛塖truts2鏍囩搴撶殑鍒嗙被銆傛垜浠彲浠ュ皢Struts 2鐨勬爣绛惧簱鍒嗘垚涓夊ぇ绫伙細UI銆侀潪UI銆乤jax鏍囩锛屽叾涓璘I鏍囩鍙堝彲鍒嗕负琛ㄥ崟 銆侀潪琛ㄥ崟鏍囩锛岄潪UI鏍囩鍙垎涓烘暟鎹闂€侀€昏緫鎺у埗鏍囩銆?
锛?锛夋暟鎹闂爣绛俱€傚父瑙佺殑鏁版嵁鏍囩涓昏鍖呭惈action銆乮nclude銆乸aram聽銆乸roperty銆乻et銆乼ext銆乽rl銆乨ate绛夈€?
锛?锛夐€昏緫鎺у埗鏍囩銆傞€昏緫鎺у埗鏍囩涓昏鐢ㄤ簬绋嬪簭娴佺▼鐨勯€昏緫鎺у埗锛屼緥濡傞€夋嫨銆佸垎鏀€佸惊鐜瓑鎿嶄綔锛屽父瑙佺殑閫昏緫鎺у埗鏍囩涓昏鏈変簲涓爣绛撅細if聽銆乪lseif銆伮爀lse聽銆乬enerator聽銆乮terator銆?
浠诲姟瀹炶閮ㄥ垎
1锛氭煡璇㈢鐞嗗憳
璁粌鎶€鑳界偣
脴聽OGNL
脴聽property鏍囩
脴聽iterator鏍囩
聽聽闇€姹傝鏄?
鍦ㄥ墠闈㈢珷鑺傜殑浠诲姟瀹炶閮ㄥ垎锛屾垜浠疄鐜颁簡绠$悊鍛樼殑澧炪€佸垹銆佹敼銆佹煡绛夊姛鑳斤紝鐜板湪瑕佹眰鍦ㄦ煡璇㈢鐞嗗憳鏃讹紝浣跨敤OGNL鍜宨terator銆乸roperty绛夋爣绛炬樉绀烘煡璇㈠埌鐨勭鐞嗗憳鍒楄〃锛屽苟涓斿彧鏄剧ず瀵嗙爜闀垮害灏忎簬3鐨勭鐞嗗憳淇℃伅銆?
聽聽鍏抽敭浠g爜
<s:iterator value="#attr.adminList.{?#this.pwd.length()>3}" id="admin">
聽聽 <tr>
聽聽聽聽 <td align="center"><s:property value="id"/></td>
聽聽聽聽 <td align="center"><s:property value="name"/></td>
聽聽聽聽 <td align="center"><s:property value="pwd"/></td>
聽聽 </tr>
</s:iterator>
2锛氭煡璇㈠浘涔?
璁粌鎶€鑳界偣
脴聽OGNL
脴聽property鏍囩
脴聽iterator鏍囩
聽聽闇€姹傝鏄?
鍦ㄥ墠闈㈢珷鑺傜殑浠诲姟瀹炶閮ㄥ垎锛屾垜浠疄鐜颁簡鏌ヨ鍥句功鐨勬渚嬶紝鐜板湪瑕佹眰浣跨敤OGNL鍜宨terator銆乸roperty绛夋爣绛炬樉绀烘煡璇㈠埌鐨勫浘涔﹀垪琛紝骞朵笖璁剧疆鍋舵暟琛岀殑鑳屾櫙鑹蹭负鐏拌壊銆?
3锛氭煡鎵惧鎴蜂俊鎭?
璁粌鎶€鑳界偣
脴聽OGNL
脴聽鏁版嵁璁块棶鏍囩
脴聽鎺у埗鏍囩
聽聽闇€姹傝鏄?
瀹炵幇杈撳叆瀹㈡埛缂栧彿鏃讹紝鏌ユ壘瀵瑰簲鐨勫鎴锋槸鍚﹀瓨鍦紝鑻ヤ笉瀛樺湪锛屽垯杈撳嚭鏃犳硶鏌ユ壘鍒版瀹㈡埛鐨勬彁绀猴紱鑻ュ瓨鍦紝鍒欒繘涓€姝ユ樉绀哄鎴风殑璁㈠崟淇℃伅銆?
聽
聽
聽聽瀹炵幇鎬濊矾
锛?锛壜犲垱寤虹敤浜庢弿杩拌鍗曠殑瀹炰綋绫伙紝鍛藉悕涓篛rder.java銆?
聽
public class Order implements Serializable{
//璁㈠崟Id
private String orderId;
//璁㈠崟鏃ユ湡
private Date orderDtm;
//璁㈠崟鐘舵€伮?锛氱鐢?锛氬惎鐢?
private int state;
//鏃犲弬鏋勯€犲嚱鏁?
public Order() {
super();
// TODO Auto-generated constructor stub
}
//鏈夊弬鏋勯€犲嚱鏁?
public Order(String orderId, Date orderDtm, int state) {
super();
this.orderId = orderId;
this.orderDtm = orderDtm;
this.state = state;
}
//getter setter鐪佺暐......
}
锛?锛壜犲垱寤虹敤浜庢弿杩板鎴风殑瀹炰綋绫伙紝鍛藉悕涓篊ust.java銆?
public class Cust implements Serializable{
//瀹㈡埛缂栧彿
private String custId;
//瀹㈡埛鍚嶇О
private String custName;
//鐢佃瘽
private String tel;
//璁㈠崟闆嗗悎
private List<Order> orders = new ArrayList<Order>();
//鏃犲弬鏋勯€犲嚱鏁?
public Cust() {
super();
// TODO Auto-generated constructor stub
}
//鏈夊弬鏋勯€犲嚱鏁?
public Cust(String custId, String custName, String tel) {
super();
this.custId = custId;
this.custName = custName;
this.tel = tel;
}
//getter setter鐪佺暐......
}
锛?锛壜犲垱寤虹敤浜庡鐞嗕笟鍔¢€昏緫鐨凧avaBean锛屽懡鍚嶄负CustService.java銆?
public class CustService {
//瀹氫箟瀹㈡埛鍒楄〃
private static List<Cust> custList = new ArrayList<Cust>();
//闈欐€佹瀯閫犲櫒锛屽垵濮嬪寲瀹㈡埛鍜岃鍗曚俊鎭?
static{
try {
//鐢ㄤ簬鏍煎紡鍖栨棩鏈?
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//鍒涘缓瀹㈡埛c1
Cust c1 = new Cust("c001", "寮犱笁", "110");
Order c1Order1 聽= new Order("OR001", sdf.parse("2012-01-01"), 0);
Order c1Order2 聽= new Order("OR002", sdf.parse("2012-01-02"), 0);
Order c1Order3 聽= new Order("OR003", sdf.parse("2012-01-03"), 1);
//娣诲姞璁㈠崟鍒癱1瀹㈡埛
c1.getOrders().add(c1Order1);
c1.getOrders().add(c1Order2);
c1.getOrders().add(c1Order3);
//鍒涘缓瀹㈡埛c2
Cust c2 = new Cust("c002", "鏉庡洓", "114");
Order c2Order1 聽= new Order("OR004", sdf.parse("2012-01-04"), 0);
Order c2Order2 聽= new Order("OR005", sdf.parse("2012-01-05"), 0);
Order c2Order3 聽= new Order("OR006", sdf.parse("2012-01-06"), 1);
//娣诲姞璁㈠崟鍒癱2瀹㈡埛
c2.getOrders().add(c2Order1);
c2.getOrders().add(c2Order2);
c2.getOrders().add(c2Order3);
//鍒涘缓瀹㈡埛c3
Cust c3 = new Cust("c003", "鐜嬩簲", "119");
Order c3Order1 聽= new Order("OR007", sdf.parse("2012-01-07"), 0);
Order c3Order2 聽= new Order("OR008", sdf.parse("2012-01-08"), 0);
Order c3Order3 聽= new Order("OR009", sdf.parse("2012-01-09"), 1);
//娣诲姞璁㈠崟鍒癱3瀹㈡埛
c3.getOrders().add(c3Order1);
c3.getOrders().add(c3Order2);
c3.getOrders().add(c3Order3);
//鎶婂鎴锋坊鍔犲埌List鍒楄〃涓?
custList.add(c1);
custList.add(c2);
custList.add(c3);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//
public static Cust findCustById(String custId){
//寰幆姣忎釜瀹㈡埛
for (Cust cust : custList) {
//寰幆姣忎釜瀹㈡埛
if(cust.getCustId().equals(custId)){
return cust;
}
}
//濡傛灉鎵句笉鍒板垯杩斿洖绌?
return null;
}
//
public static List<Order> getCustOrders(String custId){
//寰幆姣忎釜瀹㈡埛
for (Cust cust : custList) {
//寰幆姣忎釜瀹㈡埛
if(cust.getCustId().equals(custId)){
//杩斿洖瀵瑰簲瀹㈡埛鐨勮鍗?
return cust.getOrders();
}
}
//濡傛灉鎵句笉鍒板垯杩斿洖绌?
return null;
}
}
锛?锛壜犲垱寤虹敤浜庡鐞嗕笟鍔¢€昏緫鐨勬帶鍒跺櫒Action,鍛藉悕涓篊ustAction.java銆?
public class CustAction extends ActionSupport {
//灏佽鐢ㄦ埛鐨刬d
private String custId;
//鏌ユ壘璁㈠崟
public String findOrder()throws Exception{
//璋冪敤涓氬姟灞?
List<Order> orderList = CustService.getCustOrders(custId);
//灏嗚鍗曟斁鍒皉equest涓?
ServletActionContext.getRequest().setAttribute("orderList", orderList);
//杩斿洖input閫昏緫瑙嗗浘
return SUCCESS;
}
public String findCust() {
// TODO Auto-generated method stub
//璋冪敤涓氬姟閫昏緫
Cust cust = CustService.findCustById(custId);
if(cust!=null){
//灏哻ust瀛樺偍鍒皊ession涓?
ServletActionContext.getRequest().getSession().setAttribute("cust", cust);
}
else{
//鍚﹀垯缁檓sg璧嬪€硷紝鍑嗗寮瑰嚭瀵硅瘽妗嗐€?
ServletActionContext.getRequest().setAttribute("msg","<script>alert('娌℃湁姝ょ敤鎴?);</script>");
}
//杩斿洖input閫昏緫瑙嗗浘
return SUCCESS;
}
//getter setter鏂规硶
public String getCustId() {
return custId;
}
public void setCustId(String custId) {
this.custId = custId;
}
}
锛?锛壜犲垱寤篔sp椤甸潰锛屽懡鍚嶄负jd1.jsp銆?
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
聽
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
聽聽<head>
聽聽聽
聽聽聽聽<title>My JSP 'jd1.jsp' starting page</title>
聽聽聽聽
聽聽</head>
聽聽
聽聽<body>
聽聽聽 <h2>
聽聽聽 <form action="custaction!findCust.action" method="post">
聽聽聽 瀹屾垚瀹㈡埛鏌ユ壘鍔熻兘锛?lt;hr>
聽聽聽 瀹㈡埛缂栧彿锛?lt;input type="text" name="custId"> <br/>
聽聽聽 <input type="submit" value="鏌ユ壘">
聽聽聽 <!--聽濡傛灉鎵惧埌璇ョ敤鎴仿?->
聽聽聽 <s:if test="#session.cust">
聽聽聽 <hr/>
聽聽聽 缂栧彿锛?{cust.custId}<br/>
聽聽聽 濮撳悕锛?{cust.custName}<br/>
聽聽聽 鑱旂郴鏂瑰紡锛?{cust.tel}<br/><a href="custaction!findOrder.action?custId=${cust.custId }" target="_blank" rel="external nofollow" >鏌ョ湅璁㈠崟</a>
聽聽聽 <hr/>
聽聽聽 </s:if>
聽聽聽 <!--聽濡傛灉瀛樺湪璁㈠崟鍒楄〃聽-->
聽聽聽 <s:if test="#request.orderList">
聽聽聽 <hr/>
聽聽聽 <table >
聽聽聽 <tr>
聽聽聽 <td>璁㈠崟缂栧彿</td>
聽聽聽 <td>璁㈠崟鏃ユ湡</td>
聽聽聽 <td>璁㈠崟鐘舵€?lt;/td>
聽聽聽 </tr>
聽聽聽 <s:iterator id="row" value="#request.orderList">
聽聽聽 <tr>
聽聽聽 <td>${row.orderId }</td>
聽聽聽 <td><s:date name="#row.orderDtm" format="yyyy骞碝M鏈坉d鏃?/></td>
聽聽聽 <td>${row.state==0?"绂佺敤"锛?鍚敤" }</td>
聽聽聽
聽聽聽 </tr>
聽聽聽 </s:iterator>
聽聽聽 </table>
聽聽聽
聽聽聽 </s:if>
聽聽聽 </form>
聽聽聽
聽聽聽 </h2>
聽聽聽 <!--聽鎵цmsg -->
聽聽聽 ${msg }
聽聽</body>
</html>
锛?锛壜犻厤缃甋truts.xml鏂囦欢銆?
<struts>
<!--聽閰嶇疆瀛楃闆喡?->
<constant name="struts.i18n.encoding" value="utf-8"></constant>
<!--聽閰嶇疆涓婚聽-->
<constant name="struts.ui.theme" value="simple"></constant>
<package name="test" extends="struts-default">
<action name="custaction" class="com.zzzy.web.CustAction">
<result >/jd1.jsp</result>
</action>
</package>
</struts>
锛?锛壜犺繍琛宩d1.jsp椤甸潰锛屾晥鏋滃鍥?.2.1鎵€绀恒€?
聽
鍥?.2.1聽杩愯jd1.jsp
鍦ㄥ浘6.2.1涓緭鍏ラ渶瑕佹煡鎵剧殑瀹㈡埛缂栧彿銆?
鑻ョ紪鍙蜂笉瀛樺湪锛岀郴缁熷皢浼氭樉绀烘彁绀烘秷鎭€偮犲鍥?.2.2鎵€绀恒€?
聽
鍥?.2.2聽鐢ㄦ埛涓嶅瓨鍦?
鑻ョ紪鍙峰瓨鍦紝绯荤粺灏嗘樉绀鸿瀹㈡埛瀵瑰簲鐨勮缁嗕俊鎭紝濡傚浘鍥?.2.3鎵€绀恒€?
聽
鍥?.2.3聽鏌ユ壘瀹㈡埛骞舵樉绀鸿缁嗕俊鎭?
鍦ㄥ浘6.2.3涓崟鍑烩€滄煡鐪嬭鍗曗€濇寜閽紝绯荤粺灏嗘樉绀哄鎴峰搴旂殑璁㈠崟淇℃伅锛屽鍥?.2.4鎵€绀恒€?
聽
鍥?.2.4鏄剧ず瀹㈡埛鐨勮鍗曚俊鎭?
宸╁浐缁冧範
涓€銆侀€夋嫨棰?
1.聽浠ヤ笅鍏充簬OGNL鐨勮娉曟纭殑鏄紙锛夈€?
A.聽ActionContext鏄疧GNL鐨勪笂涓嬫枃鐜
B.聽ValueStack鏄疧GNL鐨勬牴
C.聽StackContext鏄疧GNL鐨勪笂涓嬫枃鐜
D.聽ActionContext鏄疧GNL鐨勬牴
2.聽鍋囪session涓瓨鍦ㄥ悕涓簎id鐨勫睘鎬э紝閫氳繃OGNL璁块棶璇ュ睘鎬х殑浠g爜鏄紙锛夈€?
A.聽#uid
E.聽uid
F.聽#session.uid
G.聽${session.uid}
3.聽鍏充簬鈥?session.users.{?#this.age>20}鈥濈殑OGNL浠g爜鎵€琛ㄧず鐨勬剰鎬濇槸锛堬級銆?
A.聽浠巙sers闆嗗悎涓彇鍑虹涓€涓勾榫勫ぇ浜?0鐨勫璞?
H.聽浠巙sers闆嗗悎涓彇鍑烘墍鏈夊勾榫勫ぇ浜?0鐨勫璞?
I.聽浠巙sers闆嗗悎涓彇鍑烘渶鍚庝竴涓勾榫勫ぇ浜?0鐨勫璞?
J.聽璇ヤ唬鐮佹湁璇硶閿欒
4.聽鍋囪椤甸潰涓瓨鍦ㄨ繖鏍蜂竴琛屼唬鐮佲€?lt;s:property />鈥濓紝鍒欎笅闈㈣娉曟纭殑鏄紙锛夈€?
A.聽缂栬瘧閿欒
K.聽椤甸潰涓嶆樉绀轰换浣曞唴瀹?
L.聽杈撳嚭ValueStack涓渶涓婇潰鐨勫璞?
M.聽浠ヤ笂璇存硶閮戒笉姝g‘
5.聽浠ヤ笅锛堬級涓嶅睘浜嶴truts 2鐨勬暟鎹闂爣绛俱€?
A.聽set
B.聽date
C.聽text
D.聽textfield聽