Struts中Cannot find bean XXX in any scope的問題
這就是在前面的簡單應用中,在view中,通過<bean:write name="myform"
property="name">調用Actionform時出的問題,這個問題的直接原因很簡單就是:找不到"myform"這個Bean,用網
上的話說就是
“在Action里一般會request.setAttribute()一些對
象,然后在轉向的jsp文件里(用tag或request.getAttribute()方法)得到這些對象并顯示出來。這個異常是說jsp要得到一個對
象,但前面的Action里并沒有將對象設置到request(也可以是session、servletContext)里。可能是名字錯了,請檢查
jsp里的tag的一般是name屬性,或getAttribute()方法的參數值;或者是Action邏輯有問題沒有執行
setAttribute()方法就先轉向了。
還有另外一個可能,純粹是jsp文件的問題,例如<logic:iterate>會指
定一個id值,然后在循環里<bean:write>使用這個值作為name的值,如果這兩個值不同,也會出現此異常。(都是一個道
理,request里沒有對應的對象。)”。
我對Actionform的機制不理解,心中的疑問:
1)
如果ActionForm是Struts自動封裝到Request中,那么我可以直接在view.jsp中,能過<bean:write>調
用這個ActionForm,如果假設這種情況成立時,那么Beanwrite中的bean名應該是ActionForm的類名,還是在Struts-
config.xml里給ActionForm定義的類名?
2)如果沒有封裝的話,那么是不是需要在Action中把Actionform通過request.setAttribute("","")放到request中
還是要放到Session中,
我測試時候出的問題
有一次就是在1)的情況下測試成功的,但是以后再怎么試都不行,那次是引用的Struts-config.xml里給ActionForm定義的類名。非常奇怪,
還有就是2)的情況,測試中如果Action和Frombean在一個包下面,那么通過request.setAttribute("",""),就可以獲取到Bean,如果不是的話,有時候行,有時候不行,
如果通過request.getSession.setAttribute()設置ActionForm的話,每次都可以,他們的Scope肯定在一個Request中,那么為什么Session就可以,而Request不行。(
結論:因為是在Actionfoward中設置了“redirect='true',這樣的話一跳轉時,Request中的內容都會被重置,所以不行,把這一句去掉就可以了”)