锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
OGNL錛圤bject-Graph Navigation Language錛夛紝澶ф鍙互鐞嗚В涓猴細(xì)瀵硅薄鍥懼艦鍖栧鑸璦銆傛槸涓縐嶅彲浠ユ柟渚垮湴鎿嶄綔瀵硅薄灞炴х殑寮婧愯〃杈懼紡璇█銆侽GNL鏈夊涓嬬壒鐐癸細(xì)
1銆佹敮鎸佸璞℃柟娉曡皟鐢紝褰㈠紡濡傦細(xì)objName.methodName()錛?br />
2銆佹敮鎸佺被闈欐佺殑鏂規(guī)硶璋冪敤鍜屽艱闂紝琛ㄨ揪寮忕殑鏍煎紡涓篅[綾誨叏鍚嶏紙鍖呮嫭鍖呰礬錛塢@[鏂規(guī)硶鍚?| 鍊煎悕]錛屼緥濡傦細(xì)
@java.lang.String@format('foo %s', 'bar')鎴朄tutorial.MyConstant@APP_NAME錛?br />
3銆佹敮鎸佽祴鍊兼搷浣滃拰琛ㄨ揪寮忎覆鑱旓紝渚嬪錛?br />
price=100, discount=0.8, calculatePrice()錛岃繖涓〃杈懼紡浼?xì)杩斿?0錛?br />
4銆佽闂甇GNL涓婁笅鏂囷紙OGNL context錛夊拰ActionContext錛?br />
5銆佹搷浣滈泦鍚堝璞°?br />
浜屻佷嬌鐢∣GNL琛ㄨ揪寮?br />
OGNL瑕佺粨鍚坰truts鏍囩鏉ヤ嬌鐢ㄣ傜敱浜庢瘮杈冪伒媧伙紝涔熷鏄撴妸浜虹粰寮勬檿錛屽挨鍏舵槸“%”銆?#8220;#”銆?#8220;$”榪欎笁涓鍙風(fēng)殑浣跨敤銆傜敱浜?騫挎硾搴旂敤浜嶦L涓紝榪欓噷閲嶇偣鍐?鍜?絎﹀彿鐨勭敤娉曘?br />
1銆?#8220;#”絎﹀彿鏈変笁縐嶇敤閫旓細(xì)
(1)銆佽闂潪鏍瑰璞★紙struts涓兼爤涓烘牴瀵硅薄錛夊OGNL涓婁笅鏂囧拰Action涓婁笅鏂囷紝#鐩稿綋浜嶢ctionContext.getContext()錛涗笅琛ㄦ湁鍑犱釜ActionContext涓湁鐢ㄧ殑灞炴э細(xì)
parameters
鍖呭惈褰撳墠HTTP璇鋒眰鍙傛暟鐨凪ap
#parameters.id[0]浣滅敤鐩稿綋浜巖equest.getParameter("id")
request
鍖呭惈褰撳墠HttpServletRequest鐨勫睘鎬э紙attribute)鐨凪ap
#request.userName鐩稿綋浜巖equest.getAttribute("userName")
session
鍖呭惈褰撳墠HttpSession鐨勫睘鎬э紙attribute錛夌殑Map
#session.userName鐩稿綋浜巗ession.getAttribute("userName")
application
鍖呭惈褰撳墠搴旂敤鐨凷ervletContext鐨勫睘鎬э紙attribute錛夌殑Map
#application.userName鐩稿綋浜巃pplication.getAttribute("userName")
娉細(xì)attr 鐢ㄤ簬鎸塺equest > session > application欏哄簭璁塊棶鍏跺睘鎬э紙attribute錛夛紝#attr.userName鐩稿綋浜庢寜欏哄簭鍦ㄤ互涓婁笁涓寖鍥達(dá)紙scope錛夊唴璇誨彇 userName灞炴э紝鐩村埌鎵懼埌涓烘銆傜敤浜庤繃婊ゅ拰鎶曞獎(jiǎng)錛坧rojecting)闆嗗悎錛屽books.{?#this.price<100}錛涙瀯閫?Map錛屽#{'foo1':'bar1', 'foo2':'bar2'}銆?br />
(2)銆佺敤浜庤繃婊ゅ拰鎶曞獎(jiǎng)錛坧rojecting)闆嗗悎錛屽: books.{?#this.price>35}
books.{?#this.price>35}
(3)銆佹瀯閫燤ap錛屽: #{'foo1':'bar1', 'foo2':'bar2'}
#{'foo1':'bar1', 'foo2':'bar2'}榪欑鏂瑰紡甯哥敤鍦ㄧ粰radio鎴杝elect銆乧heckbox絳夋爣絳捐祴鍊間笂銆傚鏋滆鍦ㄩ〉闈腑鍙栦竴涓猰ap鐨勫煎彲浠ヨ繖鏍峰啓錛?br />
<s:property value="#myMap['foo1']"/>
<s:property value="#myMap['foo1']"/>
2銆?#8220;%”絎﹀彿鐨勭敤閫旀槸鍦ㄦ爣絳劇殑灞炴у艱鐞嗚В涓哄瓧絎︿覆綾誨瀷鏃訛紝鍛婅瘔鎵ц鐜%{}閲岀殑鏄疧GNL琛ㄨ揪寮忋傚緢鏈夌偣綾諱技javascript閲岄潰鐨別val_r()鍔熻兘錛屼緥濡傦細(xì)
var oDiv = eval_r("document.all.div"+index)
var oDiv = eval_r("document.all.div"+index)
褰搃ndex鍙橀噺涓?鏃訛紝璇彞灝變細(xì)琚綋浣渧ar oDiv = document.all.div1
var oDiv = document.all.div1鏉ユ墽琛屻?{}灝辨槸璧瘋繖涓綔鐢ㄣ備婦渚嬶細(xì)
<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/> 絎?琛?br />
<s:property value="#myMap['key1']"/> 絎?琛?br />
<s:url value="#myMap['key1']" /> 銆銆銆絎?琛?br />
<s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/> 絎?琛?br />
<s:property value="#myMap['key1']"/> 絎?琛?br />
<s:url value="#myMap['key1']"/> 絎?琛?br />
涓婇潰鐨勪唬鐮佺2琛屼細(xì)鍦ㄩ〉闈笂杈撳嚭“value1”錛岃岀3琛屽垯浼?xì)杈撳?#myMap['key1']"榪欎箞涓涓瓧絎︿覆銆傚鏋滃皢絎?琛屾敼鍐欐垚榪欐牱錛?br />
<s:url value="%{#myMap['key1']}"/>
<s:url value="%{#myMap['key1']}"/>
鍒欒緭鍑轟負(fù)“value1”銆?br />
榪欒鏄巗truts2閲屼笉鍚岀殑鏍囩瀵筼gnl鐨勮〃杈懼紡鐨勭悊瑙f槸涓嶄竴鏍風(fēng)殑銆傚鏋滃綋鏈夌殑鏍囩“鐪嬩笉鎳?#8221;綾諱技“#myMap['key1']”鐨勮鍙ユ椂錛屽氨瑕佺敤%{}鏉ユ妸榪欐嫭榪涘幓錛?#8220;緲昏瘧”涓涓嬩簡銆?br />
3銆?#8220;$”鏈変袱縐嶇敤閫?br />
(1)銆佸湪鍥介檯鍖栬祫婧愭枃浠朵腑錛屽紩鐢∣GNL琛ㄨ揪寮忋?br />
(2)銆佸湪Struts 2閰嶇疆鏂囦歡涓紝寮曠敤OGNL琛ㄨ揪寮忥細(xì)
<action name="saveUser" class="userAction" method="save">
<result type="redirect">listUser.action?msg=${msg}</result>
</action>
<action name="saveUser" class="userAction" method="save">
<result type="redirect">listUser.action?msg=${msg}</result>
</action>
璧勬簮鏂囦歡鐨勫懡鍚嶏細(xì)basename_language_country.properties
JAVA鍥介檯鍖?br />濡傛灉緋葷粺鍚屾椂瀛樺湪璧勬簮鏂囦歡銆佺被鏂囦歡錛岀郴緇熷皢浠ョ被鏂囦歡涓轟富錛岃屼笉浼?xì)璋冪敤璧勬簮鏂囦欢銆?br />瀵逛簬綆浣撲腑鏂囩殑Locale錛孯esourceBundle鎼滅儲(chǔ)璧勬簮鐨勯『搴忔槸錛?br />(1)baseName_zh_CN.class
(2)baseName_zh_CN.properties
(3)baseName_zh.class
(4)baseName_zh.properties
(5)baseName.class
(6)baseName.properties
Struts2鐨勫浗闄呭寲鍏ラ棬
Struts2鍥介檯鍖栨槸寤虹珛鍦↗ava鍥介檯鍖栫殑鍩虹涓婄殑錛屼竴鏍鋒槸閫氳繃鎻愪緵涓嶅悓鍥藉/璇█鐜鐨勬秷鎭祫婧愶紝鐒跺悗閫氳繃ResourceBundle
鍔犺澆鎸囧畾Locale瀵瑰簲鐨勮祫婧愭枃浠訛紝鍐嶅彇寰楄璧勬簮鏂囦歡涓寚瀹歬ey瀵瑰簲鐨勬秷鎭?-鏁翠釜榪囩▼涓嶫AVA紼嬪簭鐨勫浗瀹跺寲瀹屽叏鐩稿悓錛屽彧鏄?br />Struts2妗嗘灦瀵笿AVA紼嬪簭鍥介檯鍖栬繘琛屼簡榪涗竴姝ュ皝瑁咃紝浠庤岀畝鍖栦簡搴旂敤紼嬪簭鐨勫浗闄呭寲銆?br />Struts2闇瑕佸浗闄呭寲鐨勯儴鍒?br />綾誨瀷杞崲:
鏁版嵁鏍¢獙:
楠岃瘉妗嗘灦xml閰嶇疆鏂囦歡鐨勫浗闄呭寲錛歊egisterAction-validation.xml鏂囦歡<message key="username.xml.invalid"/>
JSP欏甸潰鐨勫浗闄呭寲錛?lt;s:text name="addUser"/>
Action鐨勫浗闄呭寲:鍒╃敤ActionSupport綾繪彁渚涚殑getText()鏂規(guī)硶.
Struts2涓姞杞藉叏灞璧勬簮鏂囦歡
struts.xml
<constant name="struts.custom.i18n.resources" value="baseName"/>
鎴?br />struts.properties
struts.custom.i18n.resources=baseName
璁塊棶鍥介檯鍖栨秷鎭?/p>
Struts2璁塊棶鍥介檯鍖栨秷鎭富瑕佹湁濡備笅涓夌鏂瑰紡錛?br />(1)JSP欏甸潰錛?lt;s:text name="key"/>
(2)Action綾諱腑錛氫嬌鐢ˋctionSupport綾葷殑getText鏂規(guī)硶銆?br />(3)琛ㄥ崟鍏冪礌鐨凩abel閲岋細(xì)涓鴻〃鍗曞厓绱犳寚瀹氫竴涓猭ey灞炴?/p>
杈撳嚭甯﹀崰浣嶇鐨勫浗闄呭寲娑堟伅
Struts2涓彁渚涗簡濡備笅涓ょ鏂瑰紡鏉ュ~鍏呮秷鎭瓧絎︿覆涓殑鍗犱綅絎?/p>
(1)JSP欏甸潰錛屽湪<s:text.../>鏍囩涓嬌鐢ㄥ涓?lt;s:param.../>鏍囩鏉ュ~鍏呮秷鎭腑鐨勫崰浣嶇銆?br />(2)Action涓紝鍦ㄨ皟鐢╣etText鏂規(guī)硶鏃朵嬌鐢╣etText(String aTextName,List args)鎴杇etText(String key, String[] args)鏂規(guī)硶鏉ュ~鍏呭崰浣嶇銆?br />闄ゆ涔嬪錛孲truts2榪樻彁渚涗簡瀵瑰崰浣嶇鐨勪竴縐嶆浛浠f柟寮忥紝榪欑鏂瑰紡鍏佽鍦ㄥ浗闄呭寲娑堟伅璧勬簮鏂囦歡涓嬌鐢ㄨ〃杈懼紡錛屽浜庤繖縐嶆柟寮忥紝鍒欏彲閬垮厤鍦ㄤ嬌鐢ㄥ浗闄呭寲娑堟伅鏃惰繕闇瑕佷負(fù)鍗犱綅絎︿紶鍏ュ弬鏁?/p>
鍊箋?/p>
濡備笅鍦ㄦ秷鎭祫婧愪腑浣跨敤琛ㄨ揪寮?br />succTip=${username}, 嬈㈣繋, 鎮(zhèn)ㄥ凡緇忕櫥褰?
鍦ㄤ笂闈㈢殑娑堟伅璧勬簮涓紝閫氳繃浣跨敤琛ㄨ揪寮忥紝鍙互浠嶸alueStack涓彇鍑鴻username灞炴у鹼紝鑷姩濉厖鍒拌娑堟伅璧勬簮涓?/p>
鍔犺澆璧勬簮鏂囦歡鐨勬柟寮?br />(1)鍔犺澆鍏ㄥ眬璧勬簮鏂囦歡錛?<constant name="struts.custom.i18n.resources" value="baseName"/>
(2)鍖呰寖鍥磋祫婧愭枃浠?錛氫負(fù)Struts2鎸囧畾鍖呰寖鍥磋祫婧愭枃浠剁殑鏂規(guī)硶鏄?鍦ㄥ寘鐨勬牴璺緞涓嬪緩绔嬪涓枃浠跺悕涓簆ackage_language_country.properties鐨勬枃浠訛紝涓鏃﹀緩绔嬩簡
榪欎釜緋誨垪鐨勫浗闄呭寲璧勬簮鏂囦歡錛屽簲鐢ㄤ腑澶勪簬璇ュ寘涓嬬殑鎵鏈堿ction閮藉彲浠ヨ闂璧勬簮鏂囦歡銆傞渶瑕佹敞鎰忕殑鏄笂闈㈢殑鍖呰寖鍥磋祫婧愭枃浠剁殑baseName灝辨槸package錛屼笉鏄疉ction鎵鍦ㄧ殑鍖呭悕銆?br />(3)Action鑼冨洿璧勬簮鏂囦歡錛氬湪Action綾繪枃浠舵墍鍦ㄧ殑璺緞寤虹珛澶氫釜鏂囦歡鍚嶄負(fù)ActionName_language_country.properties鐨勬枃浠躲?br />(4)涓存椂鎸囧畾璧勬簮鏂囦歡錛?lt;s:i18n.../>鏍囩鐨刵ame灞炴ф寚瀹氫復(fù)鏃剁殑鍥介檯鍖栬祫婧愭枃浠?/p>
鍔犺澆璧勬簮鏂囦歡鐨勯『搴?br />Action涓姞杞借祫婧愭枃浠訛紝鍋囪鎴戜滑鍦ㄦ煇涓狢hildAction涓皟鐢ㄤ簡getText("user.title")錛孲truts 2.0鐨勫皢浼?xì)鎵ц浠ヤ笅鐨勬搷浣滃Q?br />(1)浼樺厛鍔犺澆緋葷粺涓繚瀛樺湪ChildAction鐨勭被鏂囦歡鐩稿悓浣嶇疆錛屼笖baseName涓篊hildAction鐨勭郴鍒楄祫婧愭枃浠躲?br />(2)濡傛灉鍦?1)涓壘涓嶅埌鎸囧畾key瀵瑰簲鐨勬秷鎭紝涓擟hildAction鏈夌埗綾籔arentAction錛屽垯鍔犺澆緋葷粺涓繚瀛樺湪ParentAction鐨勭被鏂囦歡鐩稿悓浣嶇疆錛屼笖
baseName涓篜arentAction鐨勭郴鍒楄祫婧愭枃浠躲?br />(3)濡傛灉鍦?2)涓壘涓嶅埌鎸囧畾key瀵瑰簲鐨勬秷鎭紝涓擟hildAction鏈夊疄鐜版帴鍙ChildAction錛屽垯鍔犺澆緋葷粺涓繚瀛樺湪IChildAction鐨勭被鏂囦歡鐩稿悓浣嶇疆錛屼笖
baseName涓篒ChildAction鐨勭郴鍒楄祫婧愭枃浠躲?br />(4)濡傛灉鍦?3)涓壘涓嶅埌鎸囧畾key瀵瑰簲鐨勬秷鎭紝涓擟hildAction鏈夊疄鐜版帴鍙odelDriven(鍗充嬌鐢ㄦā鍨嬮┍鍔ㄦā寮?錛屽垯瀵逛簬getModel()鏂規(guī)硶榪斿洖鐨刴odel瀵硅薄錛?br /> 閲嶆柊鎵ц絎?1)姝ユ搷浣溿?br />(5)濡傛灉鍦?4)涓壘涓嶅埌鎸囧畾key瀵瑰簲鐨勬秷鎭紝鍒欐煡鎵懼綋鍓嶅寘涓媌aseName涓簆ackage鐨勭郴鍒楄祫婧愭枃浠躲?br />(6)濡傛灉鍦?5)涓壘涓嶅埌鎸囧畾key瀵瑰簲鐨勬秷鎭紝鍒欐部鐫褰撳墠鍖呬笂婧紝鐩村埌鏈欏跺眰鍖呮潵鏌ユ壘baseName涓簆ackage鐨勭郴鍒楄祫婧愭枃浠躲?br />(7)濡傛灉鍦?6)涓壘涓嶅埌鎸囧畾key瀵瑰簲鐨勬秷鎭紝鍒欐煡鎵緎truts.custom.i18n.resources甯擱噺鎸囧畾baseName鐨勭郴鍒楄祫婧愭枃浠躲?br />(8)濡傛灉緇忚繃涓婇潰鐨勬楠や竴鐩存壘涓嶅埌key瀵瑰簲鐨勬秷鎭紝灝嗙洿鎺ヨ緭鍑鴻key鐨勫瓧絎︿覆鍊箋?/p>
瀵逛簬鍦↗SP涓闂浗闄呭寲娑堟伅錛屽垯綆鍗曠殑澶氾紝浠栦滑鍙堝彲浠ュ垎涓轟袱縐嶅艦寮忥細(xì)
(1)瀵逛簬浣跨敤<s:i18n.../>鏍囩浣滀負(fù)鐖舵爣絳劇殑<s:text.../>鏍囩銆佽〃鍗曟爣絳劇殑褰㈠紡錛?br /> a銆佸皢浠?lt;s:i18n.../>鏍囩鎸囧畾鐨勫浗闄呭寲璧勬簮鏂囦歡涓姞杞芥寚瀹歬ey瀵瑰簲鐨勬秷鎭?br /> b銆佸鏋滃湪a涓壘涓嶅埌鎸囧畾key瀵瑰簲鐨勬秷鎭紝鍒欐煡鎵緎truts.custom.i18n.resources甯擱噺鎸囧畾baseName鐨勭郴鍒楄祫婧愭枃浠躲?br /> c銆佸鏋滅粡榪囦笂闈㈡楠や竴鐩存壘涓嶅埌璇ey瀵瑰簲鐨勬秷鎭紝灝嗙洿鎺ヨ緭鍑鴻key鐨勫瓧絎︿覆鍊箋?/p>
(2)濡傛灉<s:text.../>鏍囩銆佽〃鍗曟爣絳炬病鏈変嬌鐢?lt;s:i18n.../>鏍囩浣滀負(fù)鐖舵爣絳撅細(xì)
鐩存帴鍔犺澆struts.custom.i18n.resources甯擱噺鎸囧畾baseName鐨勭郴鍒楄祫婧愭枃浠躲傚鏋滄壘涓嶅埌璇ey瀵瑰簲鐨勬秷鎭紝灝嗙洿鎺ヨ緭鍑鴻key鐨勫瓧絎︿覆鍊箋?/p>
鍏佽鐢ㄦ埛鑷閫夋嫨紼嬪簭璇█
Struts2鍥介檯鍖栫殑榪愯鏈哄埗
鍦⊿truts2涓紝鍙互閫氳繃ActionContext.getContext().setLocale(Locale arg)璁劇疆鐢ㄦ埛鐨勯粯璁よ璦銆?br />涓轟簡綆鍖栬緗敤鎴烽粯璁よ璦鐜錛孲truts2鎻愪緵浜嗕竴涓悕涓篿18n鐨勬嫤鎴櫒(Interceptor),騫朵笖灝嗗叾娉ㄥ唽鍦ㄩ粯璁ょ殑鎷︽埅鍣ㄤ腑(defaultStack)銆?br /> i18n鎷︽埅鍣ㄥ湪鎵цAction鏂規(guī)硶鍓嶏紝鑷姩鏌ユ壘璇鋒眰涓竴涓悕涓簉equest_locale鐨勫弬鏁般傚鏋滆鍙傛暟瀛樺湪錛屾嫤鎴櫒灝卞皢鍏朵綔涓哄弬鏁幫紝杞崲鎴怢ocale瀵硅薄錛?br />騫跺皢鍏惰涓虹敤鎴烽粯璁ょ殑Locale(浠h〃鍥藉/璇█鐜)銆?br /> 闄ゆ涔嬪錛宨18n鎷︽埅鍣ㄨ繕浼?xì)灏嗕笂闈㈢敓鎴愮殑Locale瀵硅薄淇濆瓨鍦ㄧ敤鎴稴ession鐨勫悕涓篧W_TRANS_I18N_LOCALE鐨勫睘鎬т腑銆備竴鏃︾敤鎴稴ession涓瓨鍦ㄤ竴涓悕涓?br />WW_TRANS_I18N_LOCALE鐨勫睘鎬э紝鍒欒灞炴ф寚瀹氱殑Locale灝嗕細(xì)浣滀負(fù)嫻忚鑰呯殑榛樿Locale銆?br /><%@ page language="java" contentType="text/html; charset=GBK"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<script. type="text/javascript">
function langSelecter_onChanged()
{
document.getElementById("langForm").submit();
}
</script>
<%-- 璁劇疆SESSION_LOCALE涓虹敤鎴穝ession涓殑WW_TRANS_I18N_LOCALE灞炴у?--%>
<s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/>
<%-- 浣跨敤lee.Locales鍒涘緩locales瀹炰緥 --%>
<s:bean id="locales" name="lee.Locales">
<%-- 涓簂ocales瀹炰緥浼犲叆current鍙傛暟鍊鹼紝濡傛灉SESSION_LOCALE涓虹┖錛屽垯榪斿洖ValueStack涓璴ocale灞炴у?鍗崇敤鎴鋒祻瑙堝櫒璁劇疆鐨凩ocale) --%>
<s:param name="current" value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"/>
</s:bean>
<%-- 璁╃敤鎴烽夋嫨璇█鐨勮〃鍗?--%>
<form. action="<s:url/>" id="langForm"
style="background-color:#bbbbbb; padding-top: 4px; padding-bottom: 4px;">
<s:text name="languag"/>
<s:select label="Language" list="#locales.locales" listKey="value" listValue="key"
value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"
name="request_locale" id="langSelecter"
nchange="langSelecter_onChanged()" theme="simple"/>
</form>
鍦ㄥ叾浠栭〉闈腑鍖呭惈璇ラ〉闈?
<s:include value="selectlanguage.jsp"/>
鍦╯truts.xml鏂囦歡涓鍔燗ction閫氶厤絎︾殑閰嶇疆錛?br /><?xml version="1.0" encoding="GBK"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.custom.i18n.resources" value="messageResource"/>
<constant name="struts.i18n.encoding" value="GBK"/>
<package name="lee" extends="struts-default">
<!-- 浣跨敤閫氶厤絎﹀畾涔堿ction鐨刵ame -->
<action name="*">
<!-- 灝嗚姹傝漿鍙戠粰/WEB-INF/jsp/璺緞涓嬪悓鍚嶇殑JSP欏甸潰 -->
<result>/WEB-INF/jsp/{1}.jsp</result>
</action>
</package>
</struts>
鐗堟湰錛歴truts2.1.6
姝ゅ疄渚嬪疄鐜板姛鑳斤細(xì)鐢ㄦ埛闇瑕佹寚瀹氱敤鎴峰悕鐧婚檰錛岀櫥闄嗘垚鍔熻繘鍏ョ浉搴旈〉闈㈡墽琛屾搷浣滐紝鍚﹀垯榪斿洖鍒扮櫥闄嗛〉闈㈣繘琛岀櫥闄嗭紝褰撶洿鎺ヨ闂搷浣滈〉闈紙鐧婚檰鍚庢墠鑳借闂殑欏甸潰錛夋椂鍒欎笉鍏佽錛岄』榪斿洖鐧婚檰欏甸潰銆?/p>
浠g爜濡備笅錛?/p>
涓銆侀〉闈?/p>
login.jsp
welcome.jsp
show.jsp
浜屻丄ction
LoginFormAction
LoginAction
ShowAction
涓夈佹嫤鎴櫒
鍥?struts.xml
Struts鐨勯厤緗枃浠訛細(xì)
input.jsp
褰撴彁浜nput.jsp 鐨勬椂鍊?Validate 媯(gè)鏌ユ病鏈夐氳繃錛岃繖鏃舵垜闇瑕佸洖鍒癷nput.jsp錛屾鏃跺簲璇ヤ笅鎷夊垪琛ㄦ鐨凜reditType搴旇琚繚鐣?鍙渶瑕佸湪example.CreditCardAction 瀹炵幇 Preparable鎺ュ彛錛屽茍瀹炵幇prepare 鏂規(guī)硶錛岀劧鍚庡湪add鐨?action涓姞涓?/span>
榪欐牱錛屽湪楠岃瘉鍓嶅皢棣栧厛璋冪敤 prepare鏂規(guī)硶錛屽嵆浣垮け璐ヤ簡鍥炲埌input.jsp欏甸潰creditCardType閫夋嫨妗嗙殑鍊間粛鐒跺瓨鍦ㄣ?/p>
<interceptor-ref name="defaultStack"/> 涓殑 defaultStack 鏄垜浠湪struts.xml 涓厤緗殑錛屽叾涓垜浠敞閲婃帀浜?<interceptor-ref name="prepare"/> 榪欐牱鍦╡xample.CreditCardAction涓殑鍏朵粬Action灝變笉浼?xì)棣栧厛鎵цprepare鏂規(guī)硶錛屽彧鏈夊姞涓婁簡 <interceptor-ref name="prepare"/> 鐨勬墠浼?xì)鍘婚鍏堟墽琛?prepare鏂規(guī)硶銆?/span>
棣栧厛錛屾垜浠渶瑕佷簡瑙truts2鏄皢Action涓殑灞炴у叏閮ㄥ皝瑁呭湪涓涓彨鍋歴truts.valueStack鐨勮姹傚睘鎬т腑錛岀劧鍚庢垜浠氨鍙互閫氳繃涓嬮潰鐨勪唬鐮佹潵鑾峰彇榪欎簺鍊間簡錛?/p>
someThing鏄疉ction涓睘鎬у肩殑鍚嶇О銆?/span>
Struts2鐨勫睘鎬ч┍鍔ㄦ寚鐨勬槸鍦╝ction涓璊SP欏甸潰鐨勬瘡涓涓猣orm涓殑name閮藉搴斿湪action涓湁涓涓睘鎬т笌涔嬪搴斻傜湅涓嬮潰浠g爜鐗囨:
<form action="register.do" name="RegisterForm" method="post">
Username:<input type="text" name="uname"><br>
Password:<input type="password" name="upass"><br>
Confirm: <input type="password" name="rpass"><br>
<input type="submit" value="Submit">
</form>
榪欐槸涓涓渶鍩烘湰鐨勭敤鎴鋒敞鍐岀殑琛ㄥ崟,瀹冩湁涓変釜鏁版嵁瑕佹彁浜? uname銆乽pass銆乺pass錛岄偅涔堝搴旂殑Action涔熻鏈変笁涓睘鎬э紙鍏跺疄鏄笁涓睘鎬х殑setter錛夛紝鐪媟egister.do瀹為檯鐨凙ction瀹氫箟綾伙細(xì)
package org.abu.csdn.action.user;
import com.opensymphony.xwork2.ActionSupport;
/**
* Struts2灞炴ч┍鍔ㄦ紨紺虹敤鐨凙ction
* @author 闃垮竷
*
*/
public class RegisterAction extends ActionSupport {
private String uname;
private String upass;
private String rpass;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
public String getRpass() {
return rpass;
}
public void setRpass(String rpass) {
this.rpass = rpass;
}
@Override
public String execute() throws Exception {
return ActionSupport.SUCCESS;
}
}
浣犱細(xì)鐪嬪埌RegisterAction涓殑涓変釜灞炴у拰RegisterForm琛ㄥ崟涓殑name灞炴у悕瀛椾竴妯′竴鏍鳳紝娌¢敊錛岃繖灝辨槸Struts2鐨勫睘鎬ч┍鍔紝褰撹〃鍗曟彁浜ゅ埌RegisterAction鍚庯紝Struts2灝嗕細(xì)鑷姩灝嗘牴鎹〃鍗曠殑name灞炴ц皟鐢ˋction涓浉搴旂殑灞炴etter錛屽幓鑷姩璧嬪箋?
2.Struts2鐨勬ā鍨嬮┍鍔?
Struts2鐨勬ā鍨嬮┍鍔ㄥ叾瀹炲拰Struts1.x涓殑ActionForm鏈夌偣綾諱技錛屽湪Struts1.x涓瘡涓涓狝ction閮藉繀欏繪湁涓涓狝ctionForm涓庝箣瀵瑰簲錛岃孲truts2.0涓紝姣忎竴涓狝ction鍚屾牱闇瑕佹彁渚涗竴涓狿OJO瀵硅薄錛岀敤鏉ュ皝瑁呰〃鍗曞睘鎬э紝鐪嬩唬鐮侊細(xì)
<form action="register.do" name="RegisterForm" method="post">
Username:<input type="text" name="uname"><br>
Password:<input type="password" name="upass"><br>
Confirm: <input type="password" name="rpass"><br>
<input type="submit" value="Submit">
</form>
榪欐琛ㄥ崟鐨勪唬鐮佸拰涓婇潰鐨勪竴妯′竴鏍鳳紝灝變笉璧樿堪浜嗐傛帴涓嬫潵鐪婸OJO鐨勪唬鐮侊紝鍏跺疄灝辨槸鏅氱殑Java Bean錛?
package org.abu.csdn.action.user;
import com.opensymphony.xwork2.ActionSupport;
/**
* Struts2灞炴ч┍鍔ㄦ紨紺虹敤鐨凧ava Bean
* @author 闃垮竷
*
*/
public class User {
private String uname;
private String upass;
private String rpass;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
public String getRpass() {
return rpass;
}
public void setRpass(String rpass) {
this.rpass = rpass;
}
}
瀵逛笉璧鳳紝涔熸槸鍜屽睘鎬ч┍鍔ㄤ腑鐨勪緥瀛愪竴鏍鳳紝寰堢畝鍗曪紝鍥犱負(fù)婕旂ず鐨勯兘鏄悓涓涓緥瀛愶紝鍙槸鏂規(guī)硶涓嶅悓鑰屽凡錛屼絾鏄帴涓嬫潵灝變笉涓鏍蜂簡錛岀湅RegisterAction浠g爜錛?
package org.abu.csdn.action.user;
import org.abu.csdn.dto.User;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
* Struts2妯″瀷椹卞姩婕旂ず鐢ㄧ殑Action
*
* @author 闃垮竷
*
*/
public class RegisterAction extends ActionSupport implements ModelDriven<User> {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Override
public String execute() throws Exception {
return ActionSupport.SUCCESS;
}
// 妯″瀷椹卞姩蹇呴』瀹炵幇鐨勬柟娉曪紝涔熸槸ModelDriven鎺ュ彛涓敮涓鐨勬柟娉?
public User getModel() {
return user;
}
}
鐪嬪埌娌℃湁錛屽拰灞炴ч┍鍔ㄧ殑Action鏈夊緢澶х殑鍖哄埆錛屼笅闈竴涓鍒椾婦錛?
錛?錛夋ā鍨嬮┍鍔ㄧ殑Action蹇呴』瀹炵幇ModelDriven鎺ュ彛錛岃屼笖瑕佹彁渚涚浉搴旂殑娉涘瀷錛岃繖閲屽綋鐒跺氨鏄叿浣撲嬌鐢ㄧ殑Java Bean浜嗐?
錛?錛夊疄鐜癕odelDriven鐨刧etModel鏂規(guī)硶錛屽叾瀹炲氨鏄畝鍗曠殑榪斿洖娉涘瀷鐨勪竴涓璞°?
錛?錛夊湪Action鎻愪緵涓涓硾鍨嬬殑縐佹湁瀵硅薄錛岃繖閲屽氨鏄畾涔変竴涓猆ser鐨剈ser瀵硅薄錛屽茍鎻愪緵鐩稿簲鐨刧etter涓巗etter銆?
濂戒簡錛屼笂闈㈢殑涓変歡浜嬪仛瀹屼箣鍚庯紝Action灝變細(xì)鍘昏嚜鍔ㄨ皟鐢║ser鐨剆etter灝嗚〃鍗曚腑鐨刵ame灞炴х殑鍊艱祴緇橴ser涓殑灞炴с傝孉ction鐨勫悗緇鐞嗙殑Jsp欏甸潰鍚庤呮槸Servlet灝卞彲浠ヤ嬌鐢╱ser瀵硅薄浜嗐?
3.鍒板簳鏄敤灞炴ч┍鍔ㄥ拰鏄ā鍨嬮┍鍔ㄥ憿錛?
榪欎釜闂鍥版壈浜嗗緢澶歋truts2鐨勫垵瀛﹁咃紝鎴戣繖閲屾彁渚涗竴浜涘緩璁細(xì)
錛?錛夎浣犵粺涓鏁翠釜緋葷粺涓殑Action浣跨敤鐨勯┍鍔ㄦā鍨嬶紝鍗寵涔堥兘鏄敤灞炴ч┍鍔紝瑕佷箞閮芥槸鐢ㄦā鍨嬮┍鍔ㄣ?
錛?錛夊鏋滀綘鐨凞B涓殑鎸佷箙灞傜殑瀵硅薄涓庤〃鍗曚腑鐨勫睘鎬ч兘鏄竴涓瀵瑰簲鐨勮瘽錛岄偅涔堝氨浣跨敤妯″瀷椹卞姩鍚э紝姣曠珶鐪嬭搗鏉ヤ唬鐮佽鏁存磥寰楀銆?
錛?錛夊鏋滆〃鍗曠殑灞炴т笉鏄竴涓瀵瑰簲鐨勮瘽錛岄偅涔堝氨搴旇浣跨敤灞炴ч┍鍔紝鍚﹀垯錛屼綘鐨勭郴緇熷氨蹇呴』鎻愪緵涓や釜Bean錛屼竴涓搴旇〃鍗曟彁浜ょ殑鏁版嵁錛屽彟涓涓敤涓庢寔涔呭眰銆?
鐪嬩笂闈㈢殑渚嬪瓙錛屽叾瀹炲瘑鐮佺‘璁pass鏄笉闇瑕佹斁鍒癉B涓幓鐨勶紝鑰屼粎浠呮槸鐢ㄤ簬鏍¢獙瀵嗙爜鐨勶紝涓嶆槸鍚楋紵閭d箞濡傛灉浣跨敤妯″瀷椹卞姩鐨勮瘽錛屽氨瀛樺湪榪欎釜闂浜嗭紝鑰屼嬌鐢ㄥ睘鎬ч┍鍔ㄧ殑璇濆張鏈変簺綣佺悙錛岀幇鍦ㄦ垜浠氨鏉ヨ皟鏁翠竴涓湅鎴戠殑瑙e喅鏂規(guī)硶錛?
4.瀹屾暣鐨勪緥瀛?
錛?錛夎〃鍗曟彁浜ょ殑JSP欏甸潰index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
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" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="<%=basePath%>">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>CSDN棣栭〉</title>
</head>
<body>
<s:a href="userManager/userRegister.jsp">鐢ㄦ埛娉ㄥ唽</s:a>
<form action="register.do" name="SampleForm" method="post">
Username:<input type="text" name="uname"><br>
Password:<input type="password" name="upass"><br>
Confirm: <input type="password" name="rpass"><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
(2)User鐨勫畾涔?
package org.abu.csdn.action.user;
import com.opensymphony.xwork2.ActionSupport;
/**
* Struts2灞炴ч┍鍔ㄦ紨紺虹敤鐨凧ava Bean
* @author 闃垮竷
*
*/
public class User {
private String uname;
private String upass;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
}
錛?錛塕egisterAction鐨勫畾涔?
package org.abu.csdn.action.user;
import com.opensymphony.xwork2.ActionSupport;
/**
* Struts2灞炴ч┍鍔ㄦ紨紺虹敤鐨凙ction
* @author 闃垮竷
*
*/
public class RegisterAction extends ActionSupport {
// 鐢ㄦ潵緇檚pring娉ㄥ叆錛屽強(qiáng)灞炴ф嫹璐?
private User user;
private String uname;
private String upass;
private String rpass;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpass() {
return upass;
}
public void setUpass(String upass) {
this.upass = upass;
}
public String getRpass() {
return rpass;
}
public void setRpass(String rpass) {
this.rpass = rpass;
}
@Override
public String execute() throws Exception {
// 璋冪敤鏂規(guī)硶灝嗗睘鎬opy鍒皍ser涓幓錛屼究浜庡悗緇殑service鏂規(guī)硶
copyAttribute();
// TODO錛氱紪鍐欒嚜宸辯殑user涓氬姟浠g爜
return ActionSupport.SUCCESS;
}
/**
* 娉ㄦ剰榪欐槸涓涓猘ction鍏ㄥ眬鐨勬牎楠?br />
*/
@Override
public void validate() {
// 榪涜瀵嗙爜鐨勬牎楠?
if (!(upass.trim()).equals((rpass.trim()))) {
// 娉ㄦ剰榪欓噷addFieldError鐨刦ieldName鍙傛暟蹇呴』鐢ㄥ紩鍙峰紩璧鋒潵,
// 涓嶈兘榪欐牱浣跨敤addFieldError(rpass,"XXXXXX"),鑰屽繀欏繪槸addFieldError("rpass","XXXXX")
this.addFieldError("rpass", this
.getText("csdn.action.user.register.validate.verify"));
}
}
/**
* 灝嗚〃鍗曞睘鎬т腑闇瑕佹寔涔呭寲鐨勫睘鎬ф嫹璐濆埌user涓幓
* @author 闃垮竷
*
*/
private void copyAttributes () {
user.setUname(uname);
user.setUpass(upass);
}
}
錛?錛塖truts.xml閰嶇疆
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="root" extends="struts-default" namespace="/userManager">
<action name="userRegister" class="org.abu.csdn.action.user.RegisterAction">
<result name="success">/index.jsp</result>
<result name="input">/userManager/userRegister.jsp</result>
</action>
</package>
</struts>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛歨ttp://blog.csdn.net/csuliky/archive/2009/05/30/4226917.aspx