浠ヤ笅鎵璇寸殑struts-config.xml鍜孉pplicationResources.properties絳夋枃浠跺悕鏄己鐪佹椂浣跨敤鐨勶紝濡傛灉浣犱嬌鐢ㄤ簡澶氭ā鍧楋紝鎴栨寚瀹氫簡涓嶅悓鐨勮祫婧愭枃浠跺悕縐幫紝榪欎簺鍚嶅瓧瑕佸仛鐩稿簲鐨勪慨鏀廣?/p>
1銆?#8220;No bean found under attribute key XXX”
鍦╯truts-config.xml閲屽畾涔変簡涓涓狝ctionForm錛屼絾type灞炴ф寚瀹氱殑綾諱笉瀛樺湪錛宼ype灞炴х殑鍊煎簲璇ユ槸Form綾葷殑鍏ㄥ悕銆傛垨鑰呮槸錛屽湪Action鐨勫畾涔変腑錛宯ame鎴朼ttribute灞炴ф寚瀹氱殑ActionForm涓嶅瓨鍦ㄣ?br>
2銆?#8220;Cannot find bean XXX in any scope”
鍦ˋction
閲屼竴鑸細request.setAttribute()涓浜涘璞★紝鐒跺悗鍦ㄨ漿鍚戠殑jsp鏂囦歡閲岋紙鐢╰ag鎴杛equest.getAttribute()鏂?
娉曪級寰楀埌榪欎簺瀵硅薄騫舵樉紺哄嚭鏉ャ傝繖涓紓甯告槸璇磈sp瑕佸緱鍒頒竴涓璞★紝浣嗗墠闈㈢殑Action閲屽茍娌℃湁灝嗗璞¤緗埌request錛堜篃鍙互鏄痵ession銆?
servletContext錛夐噷銆?br>鍙兘鏄悕瀛楅敊浜嗭紝璇鋒鏌sp閲岀殑tag鐨勪竴鑸槸name灞炴э紝鎴杇etAttribute()鏂規硶鐨勫弬鏁板鹼紱鎴栬呮槸Action閫昏緫鏈夐棶棰樻病鏈夋墽琛宻etAttribute()鏂規硶灝卞厛杞悜浜嗐?br>榪?
鏈夊彟澶栦竴涓彲鑳斤紝綰補鏄痡sp鏂囦歡鐨勯棶棰橈紝渚嬪<logic:iterate>浼氭寚瀹氫竴涓猧d鍊鹼紝鐒跺悗鍦ㄥ驚鐜噷<bean:
write>浣跨敤榪欎釜鍊間綔涓簄ame鐨勫鹼紝濡傛灉榪欎袱涓間笉鍚岋紝涔熶細鍑虹幇姝ゅ紓甯搞傦紙閮芥槸涓涓亾鐞嗭紝request閲屾病鏈夊搴旂殑瀵硅薄銆傦級
3銆?#8220;Missing message for key "XXX"”
緙哄皯鎵闇鐨勮祫婧愶紝媯鏌pplicationResources.properties鏂囦歡閲屾槸鍚︽湁jsp鏂囦歡閲岄渶瑕佺殑璧勬簮錛屼緥濡傦細
榪? 琛屼唬鐮佷細鎵緈sg.name.prompt璧勬簮錛屽鏋淎ppliationResources.properties閲屾病鏈夎繖涓祫婧愬氨浼氬嚭鐜版湰寮傚父銆傚湪浣? 鐢ㄥ妯″潡鏃訛紝瑕佹敞鎰忓湪妯″潡鐨剆truts-config-xxx.xml閲屾寚瀹氳浣跨敤鐨勮祫婧愭枃浠跺悕縐幫紝鍚﹀垯褰撶劧浠涔堣祫婧愪篃鎵句笉鍒幫紝榪欎篃鏄竴涓緢瀹規槗鐘殑閿? 璇?/p>
4銆?#8220;No getter method for property XXX of bean teacher”
榪欐潯寮傚父淇℃伅璇村緱寰堟槑鐧斤紝jsp閲岃鍙栦竴涓猙ean鐨勫睘鎬у嚭鏉ワ紝浣嗚繖涓猙ean騫舵病鏈夎繖涓睘鎬с備綘搴旇媯鏌sp涓煇涓爣絳劇殑property灞炴х殑鍊箋備緥濡備笅闈唬鐮佷腑鐨刢ade搴旇鏀逛負code鎵嶅錛?/p>
5銆?#8220;Cannot find ActionMappings or ActionFormBeans collection”
涓鑸槸鍥犱負struts-config.xml閲岄潰鐨?lt;action鍐欓敊浜嗐倄ml鐢ㄦ墜宸ュ啓寰堝鏄撳嚭閿?#8230;…
6銆?#8220;Cannot retrieve mapping for action XXX”
鍦?jsp鐨?lt;form>鏍囩閲屾寚瀹歛ction='/XXX'錛屼絾榪欎釜Action騫舵湭鍦╯truts-config.xml閲岃緗繃銆?/p>
7銆丠TTP Status 404 - /xxx/xxx.jsp
Forward鐨刾ath灞炴ф寚鍚戠殑jsp欏甸潰涓嶅瓨鍦紝璇鋒鏌ヨ礬寰勫拰妯″潡錛屽浜庡悓涓妯″潡涓殑Action杞悜錛宲ath涓笉搴斿寘鍚ā鍧楀悕錛涙ā鍧楅棿杞悜錛岃浣忎嬌鐢╟ontextRelative="true"銆?/p>
8銆佹病鏈変換浣曞紓甯鎬俊鎭紝鏄劇ず絀虹櫧欏甸潰
鍙兘鏄疉ction閲屼嬌鐢ㄧ殑forward涓巗truts-config.xml閲屽畾涔夌殑forward鍚嶇О涓嶅尮閰嶃?br>
9銆?#8220;The element type "XXX" must be terminated by the matching end-tag "XXX".”
榪欎釜鏄痵truts-config.xml鏂囦歡鐨勬牸寮忛敊璇紝浠旂粏媯鏌ュ畠鏄惁鏄壇鏋勭殑xml鏂囦歡錛屽叧浜巟ml鏂囦歡鐨勬牸寮忚繖閲屽氨涓嶈禈榪頒簡銆?/p>
10銆?#8220;Servlet.init() for servlet action threw exception”
涓鑸嚭鐜拌繖縐嶅紓甯稿湪鍚庨潰浼氭樉紺轟竴涓叧浜嶢ctionServlet鐨勫紓甯稿爢鏍堜俊鎭紝鍏朵腑鎸囧嚭浜嗗紓甯稿叿浣撳嚭鐜板湪浠g爜鐨勫摢涓琛屻傛垜鏇劇粡閬囧埌鐨勪竴嬈℃彁紺哄涓嬶細
涓鴻В鍐抽棶棰橈紝鍏堜笅杞絪truts鐨勬簮鐮佸寘錛岀劧鍚庡湪ActionServlet.java鐨勭1003琛屾彃鍏ユ柇鐐癸紝騫跺鍚勫彉閲忚繘琛岀洃瑙嗐傚緢涓漢錛屾垜绔熺劧鎶妔truts-config.xml鏂囦歡寮勪涪浜嗭紝鍥犳鍑虹幇浜嗕笂闈㈢殑寮傚父錛屽簲璇ユ槸鍜孋VS鍚屾鏃朵笉灝忓績鍒犻櫎鐨勩?/p>
11銆?#8220;Resources not defined for Validator”
榪欎釜鏄埄鐢╒alidator鎻掍歡鍋氶獙璇佹椂鍙兘鍑虹幇鐨勫紓甯革紝榪欐椂浣犺媯鏌alidation.xml鏂囦歡錛岀湅閲岄潰浣跨敤鐨勮祫婧愭槸鍚︾‘瀹炴湁瀹氫箟錛宖orm鐨勫悕縐版槸鍚︽紜紝絳夌瓑銆?/p>
涓婇潰榪欎簺鏄垜鍦ㄧ敤Struts鍋氶」鐩椂閬囧埌榪囩殑闂錛屽叾涓竴浜涙浘鍥扮粫鎴戜笉灝戞椂闂達紝鍏跺疄澶ч儴鍒嗛兘鏄嚜宸變笉緇嗗績閫犳垚鐨勩傚笇鏈涜繖綃囨枃绔犺兘瀵逛綘鐨勫紑鍙戞湁鎵甯姪錛屽茍嬈㈣繋緇х畫琛ュ厖銆?/p>
宸ュ叿綆?/b>:聽聽"default.properties"鏄厤緗夐」瀹氫箟鏂囦歡銆傞氳繃鍦╟lasspath涓寘鍚竴涓彨"struts.properties"鐨勬枃浠訛紝騫惰緗笉鍚岀殑灞炴у鹼紝浣犲彲浠ヨ鐩栬繖涓粯璁ょ殑閰嶇疆錛屽疄鐜拌嚜宸辯殑閰嶇疆銆?/blockquote>瀵逛簬Struts, servlet閰嶇疆鎻愪緵浜嗗垵濮嬪寲tag鐨勫弬鏁板拰浣跨敤鐨勬枃浠訛紝鑰孲truts2娌℃湁榪欐牱鐨勯厤緗弬鏁幫紝鍙栬屼唬涔嬬殑鏄湪classpath涓嬬殑榛樿閰嶇疆鏂囦歡"struts.xml"銆?br />宸ュ叿綆?鎻愮ず:銆Struts actions(鎵╁睍鍚?.do")錛孲truts2 actions(鎵╁睍鍚?.action"),鎵浠truts鍜孲truts2鍙互鍦ㄤ竴涓郴緇熶腑鍏卞瓨銆傛墍浠ユ渶濂芥槸淇濇寔鍘熷厛鐨勭郴緇燂紝鍦ㄦ柊鍔熻兘鐨勫紑鍙戜笂鐢⊿truts2,銆濡傛灉鏃墮棿鍜岃祫婧愬厑璁哥殑鎯呭喌涓嬪啀閫愭榪佺Щ銆傚彟涓縐嶆柟娉曟槸鍙槸鎶奡truts2鐨勬墿灞曞悕鏀逛負".do",鍙噸鐢↗SPs.鍒嗘瀽Actions
鍦ㄤ笂闈粙緇嶇殑璇鋒眰榪愪綔嫻佺▼涓紝鎴戜滑璋堝強浜嗕竴浜汼truts鍜孲truts2鐨勪笉鍚岀偣銆傜幇鍦ㄦ垜浠皢杈冩繁鍏ュ湴鎺㈣榪欎袱涓鏋朵腑action緇撴瀯鐨勫叿浣撳樊鍒?br />璁╂垜浠潵鍥為【涓涓?Struts 鐨?action 緇撴瀯, 涓昏鐨勫艦寮忓涓嬶細CODE:public class MyAction extends Action {
聽 聽 public ActionForward execute(ActionMapping mapping,
聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽ActionForm form,
聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽HttpServletRequest request,
聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽聽 聽HttpServletResponse response)
聽 聽聽 聽聽 聽聽 聽throws Exception {
聽 聽聽 聽聽聽// do the work
聽 聽聽 聽聽聽return (mapping.findForward("success"));
聽 聽 }
}
褰撳疄鐜頒竴涓猄truts action鏃? 浣犻渶瑕佹敞鎰忎竴涓嬮棶棰橈細鐩告瘮杈冧箣涓嬶紝 Struts2鐨刟ction銆鎻愪緵浜嗗緢澶氱畝鍗曠殑瀹炵幇銆備笅闈㈠氨鏄釜渚嬪瓙
- 鎵鏈夌殑action銆閮藉繀欏葷戶鎵夸簬base Action 綾?
- 鎵鏈夌殑action閮藉繀欏繪槸綰跨▼瀹夊叏鐨?鍥犱負action鏄崟渚嬬殑,singleton鐨?
- 鍥犱負鎵鏈夌殑action閮藉繀欏繪槸綰跨▼瀹夊叏鐨?鎵浠ユ墍鏈夌殑瀵硅薄閮戒笉鑳芥槸綾誨睘鎬? 閮藉繀欏諱互鏂規硶鍙傛暟鐨勫艦寮忎紶鍊箋?
- 璋冪敤action鐨勬柟娉曞繀欏誨懡鍚嶄負 "execute" ( 鍦⊿truts涓殑聽聽DispatchAction 綾誨ソ鍍忓彲浠ョ敤鍏跺畠鏂規硶鍘繪墽琛屽悓涓涓猘ction 錛屼絾瀹為檯涓婂湪妗嗘灦涓皟鐢ㄧ殑浠嶇劧鏄?"execute" 鏂規硶銆?.
- ActionForward 鐨勭粨鏋滄槸閫氳繃ActionMapping 綾諱腑鐨勬柟娉曟潵浜х敓鐨?閫氬父鏄?findForward"鏂規硶.
CODE:public class MyAction {
聽 聽public String execute() throws Exception {
聽 聽聽 聽聽聽// do the work
聽 聽聽 聽聽聽return "success";
聽 聽}
}
棣栧厛浣犱細娉ㄦ剰鍒扮殑鏄紝Struts2涓殑action涓嶅啀緇ф壙浜庝換浣曠被鎴栭渶瑕佸疄鐜頒換浣曟帴鍙c傚疄闄呬笂錛屽畠榪樿繙涓嶅彧榪欎簺銆傛寜鐓ф儻渚嬶紝鍙湁"execute"鏂規硶鑳借皟鐢╝ction,銆浣嗗湪Struts2涓茍闈炲繀瑕侊紝浠諱綍澹版槑涓簆ublic String methodName() 鏂規硶閮借兘閫氳繃閰嶇疆鏉ヨ皟鐢╝ction.
鍙﹀錛屼綘浼氭敞鎰忓埌榪斿洖鍊間笉鍐嶆槸"ActionForward ",鑰屾槸String, 濡傛灉浣犻渶鍠滄String鐨勫艦寮忥紝閭e湪Action鎺ュ彛閲屾湁涓府鍔╂柟娉曞彲浠ユ彁渚涚畝鍗曠殑緇撴灉甯擱噺錛屽"success", "none", "error", "input" 鍜?"login"銆?br />鏈鍚庯紝鍜孲truts鏈澶х殑闈╁懡鎬х殑涓嶅悓鏄? 璋冪敤action涓嶅啀鏄甫鍙傛暟鐨勩傞偅浣犲浣曞湪鑾峰緱浣犳墍闇瑕佺殑鍊煎憿錛熺瓟妗堟槸"inversion of control" 鎴?"dependency injection", 鍙嶈漿鎺у埗(鎯充簡瑙f洿澶氬彲浠ョ湅Martin Fowler鐨勬枃绔?http://www.martinfowler.com/articles/injection.html)銆?br />涓轟簡鏇村ソ鍦頒簡瑙e弽杞帶鍒訛紝璁╂垜浠潵鐪嬬湅涓涓緥瀛愶紝濡備綍鍦╝ction澶勭悊榪囩▼涓彲浠ヨ闂埌HttpServerRequest 銆傚湪鎴戜滑鐨勪緥瀛愪腑錛屾垜浠敤ServletRequestAware 鎺ュ彛錛岃繖涓帴鍙e寘鍚簡鐩稿簲灞炴х殑setter,濡備笅CODE:public interface ServletRequestAware {
聽 聽 public void setServletRequest(HttpServletRequest request);
}
褰撴垜浠戶鎵胯繖涓帴鍙f椂錛屾垜浠渶瑕侀氳繃setter涓烘垜浠殑HttpServerRequest 灞炴у彉閲忚祴鍊鹼細CODE:public class MyAction implements ServletRequestAware {
聽 聽private HttpServletRequest request;
聽 聽public void setServletRequest(HttpServletRequest request) {
聽 聽聽 聽聽聽this.request = request;
聽 聽}
聽 聽public String execute() throws Exception {
聽 聽聽 聽聽聽// do the work using the request
聽 聽聽 聽聽聽return Action.SUCCESS;
聽 聽}
}
鐪嬭搗鏉ョ幇鍦ㄨ繖浜涘睘鎬ф槸綾葷駭鍒殑錛屽茍涓嶆槸綰跨▼瀹夊叏鐨勶紝浣嗘槸鍦⊿truts2閲屽茍娌℃湁闂錛屽洜涓烘瘡涓姹傝繃鏉ョ殑鏃跺欓兘浼氫駭鐢熶竴涓柊鐨刟ction瀵硅薄瀹炰緥錛屽畠騫舵病鏈夊拰鍏朵粬璇鋒眰鍏變韓涓涓璞★紝鎵浠ヤ笉闇瑕佽冭檻綰跨▼瀹夊叏闂銆?br />
鐜板湪鎴戜滑榪樻湁鏈鍚庝竴姝ワ紝灝辨槸鎶奱ction鍏寵仈涓?b>ServletConfigInterceptor 鎷︽埅鍣ㄣ傝繖涓嫤鎴櫒緇ф壙浜?b>ServletRequestAware 鎺ュ彛錛屽茍鎻愪緵浜嗘妸HttpServletRequest 娉ㄥ叆鍒癮ction涓殑鍔熻兘銆備絾鏄綘鐜板湪涓嶇敤鎷呭績濡備綍閰嶇疆榪欎簺錛屾垜浠皢鍦ㄤ笅涓綃囨枃绔犱腑鍏蜂綋璁茶堪銆傛渶閲嶈鐨勬槸鎴戜滑鏄庣櫧浜嗘嫤鎴櫒鍜屾帴鍙e叡鍚屼負action鎻愪緵浜嗗弽杞帶鍒剁殑鍔熻兘銆?br />榪欎釜璁捐鐨勫ソ澶勬槸鑳借action瀹屽叏鍜屾鏋惰В鑰︺俛ction浠呬粎鏄竴涓妗嗘灦浣跨敤鐨勭畝鍗曠殑POJO銆傝繖瀵逛簬鍗曞厓嫻嬭瘯浣嗘潵鏋佸ぇ鐨勫ソ澶勶紝 浣犺兘鏂逛究鐨勪負Struts action瀹炵幇 StrutsTestCase 鎴柭犅燤ockStrutsTestCase銆鍗曞厓嫻嬭瘯銆?br />
鎬葷粨
By鍒扮幇鍦ㄤ負姝紝浣犲簲璇ュ凡緇忎簡瑙d簡Struts2鐨勬暣涓姹傛祦紼嬶紝榪樻湁楂樺眰鐨勬鏋舵蹇碉紝 浣犱篃搴旇鑳借嚜宸卞姩鎵嬮厤緗甋truts2鐨刟ction錛屽拰璁插嚭Struts鍜孲truts2鐨勫樊鍒簡銆?br />鍦ㄤ笅綃囨枃绔犱腑錛屾垜浠皢浼氫粙緇嶄竴涓緇嗙殑Struts搴旂敤鍚慡truts2榪佺Щ鐨勪緥瀛愶紝鍚屾椂鎴戜滑涔熶細浠嬬粛榪佺Щ涓浉鍏崇殑鐭ヨ瘑錛屼細璁茶堪濡備綍緇煎悎浣跨敤JSTL, JSP 鍜?Struts2錛岃繘涓姝ヨ榪癝truts鍜孲truts2鐨刟ction鐨勫樊鍒紝Struts2鐨勯厤緗拰鍏朵粬妗嗘灦鍏冪礌錛屽拰璋堝埌鏇村鐨勫叾浠栫浉鍏蟲鏋剁殑鐗瑰緛銆?br />(鑷?a target="_blank">http://www.infoq.com/, cac 緲昏瘧)
]]>
package com.sharp.struts.action;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.Globals;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import com.sharp.struts.form.OwnerForm;
/**
* OwnerAction.java created by EasyStruts - XsltGen.
* http://easystruts.sf.net
* created on 10-09-2004
*
* XDoclet definition:
* @struts:action path="/owner" name="ownerForm" input="/owner.jsp" validate="true"
* @struts:action-forward name="/success.jsp" path="/success.jsp"
*/
public class OwnerAction extends DispatchAction {
public ActionForward changeLanguage(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
String language = request.getParameter("language");
if (language.equals("en")) {
request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.ENGLISH);
} else {
request.getSession().setAttribute(Globals.LOCALE_KEY, Locale.CHINESE);
}
return mapping.findForward("owner");
}
}
榪欓噷闇瑕佹敞鎰忎竴涓嬶紝鍗冧竾涓嶈寮勯敊錛屾垜鍦ㄨ繖閲屽氨鑺辮垂浜嗕竴涓灝忔椂錛屽洜涓烘妸鏂囦歡鍚嶅啓閿欎簡
Locale.ENGLISH鏄竴涓狶ocale瀵硅薄錛実etLanguage()鏂規硶榪斿洖en錛岃窡璧勬簮鏂囦歡(ApplicationResources_en.properties)鐨勫悗緙鐩稿悓
Locale.CHINESE鏄竴涓狶ocale瀵硅薄錛実etLanguage()鏂規硶榪斿洖zh錛岃窡璧勬簮鏂囦歡(ApplicationResources_zh_CN.properties)鐨勫悗緙鐩稿悓
鍙﹀榪樼敤鍒頒竴涓猳wnerForm.java鏂囦歡錛屽唴瀹瑰涓嬶細
// Created by Xslt generator for Eclipse.
// XSL : not found (java.io.FileNotFoundException: (Bad file descriptor))
// Default XSL used : easystruts.jar$org.easystruts.xslgen.JavaClass.xsl
package com.sharp.struts.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
/**
* OwnerForm.java created by EasyStruts - XsltGen.
* http://easystruts.sf.net
* created on 10-09-2004
*
* XDoclet definition:
* @struts:form name="ownerForm"
*/
public class OwnerForm extends ActionForm {
// --------------------------------------------------------- Instance Variables
/** Email property */
private String email;
/** Greet property */
private String greet = "Mr.";
/** Address property */
private String address;
/** Tel property */
private int tel = 0;
/** Name property */
private String name;
// --------------------------------------------------------- Methods
......
//getter,setter mothod錛岃繖閲屼笉璧樺垪浜?BR>
}
5銆佹葷粨
榪欐牱涓涓浗闄呭寲鐨勫皬渚嬪瓙灝卞彲浠ヨ繍琛屼簡錛屼笉榪囦笂闈㈠啓寰楁瘮杈冪矖鐣ワ紝闇瑕佸java鍜宻truts鏈変竴瀹氫簡瑙c?BR>緗戜笂瀵瑰浗闄呭寲涔熸湁鍏朵粬鐨勫仛娉曪紝涔熷彲浠ュ弬鑰冦?BR>濡傛灉涓婅堪鏈夋墍鍋忛錛屾暚璇鋒枾姝c?BR>