這就是在前面的簡(jiǎn)單應(yīng)用中,在view中,通過(guò)<bean:write name="myform" property="name">調(diào)用Actionform時(shí)出的問(wèn)題,這個(gè)問(wèn)題的直接原因很簡(jiǎn)單就是:找不到"myform"這個(gè)Bean,用網(wǎng)上的話說(shuō)就是“在Action里一般會(huì)request.setAttribute()一些對(duì)象,然后在轉(zhuǎn)向的jsp文件里(用tag或request.getAttribute()方法)得到這些對(duì)象并顯示出來(lái)。這個(gè)異常是說(shuō)jsp要得到一個(gè)對(duì)象,但前面的Action里并沒(méi)有將對(duì)象設(shè)置到request(也可以是session、servletContext)里??赡苁敲皱e(cuò)了,請(qǐng)檢查jsp里的tag的一般是name屬性,或getAttribute()方法的參數(shù)值;或者是Action邏輯有問(wèn)題沒(méi)有執(zhí)行setAttribute()方法就先轉(zhuǎn)向了。
還有另外一個(gè)可能,純粹是jsp文件的問(wèn)題,例如<logic:iterate>會(huì)指定一個(gè)id值,然后在循環(huán)里<bean:write>使用這個(gè)值作為name的值,如果這兩個(gè)值不同,也會(huì)出現(xiàn)此異常。(都是一個(gè)道理,request里沒(méi)有對(duì)應(yīng)的對(duì)象。)”。
??????我對(duì)Actionform的機(jī)制不理解,心中的疑問(wèn):
??????1)如果ActionForm是Struts自動(dòng)封裝到Request中,那么我可以直接在view.jsp中,能過(guò)<bean:write>調(diào)用這個(gè)ActionForm,如果假設(shè)這種情況成立時(shí),那么Beanwrite中的bean名應(yīng)該是ActionForm的類名,還是在Struts-config.xml里給ActionForm定義的類名?
????? 2)如果沒(méi)有封裝的話,那么是不是需要在Action中把Actionform通過(guò)request.setAttribute("","")放到request中
還是要放到Session中,
????? 我測(cè)試時(shí)候出的問(wèn)題
?????? 有一次就是在1)的情況下測(cè)試成功的,但是以后再怎么試都不行,那次是引用的Struts-config.xml里給ActionForm定義的類名。非常奇怪,
????????還有就是2)的情況,測(cè)試中如果Action和Frombean在一個(gè)包下面,那么通過(guò)request.setAttribute("",""),就可以獲取到Bean,如果不是的話,有時(shí)候行,有時(shí)候不行,
??????? 如果通過(guò)request.getSession.setAttribute()設(shè)置ActionForm的話,每次都可以,他們的Scope肯定在一個(gè)Request中,那么為什么Session就可以,而Request不行。(結(jié)論:因?yàn)槭窃贏ctionfoward中設(shè)置了“redirect='true',這樣的話一跳轉(zhuǎn)時(shí),Request中的內(nèi)容都會(huì)被重置,所以不行,把這一句去掉就可以了”)