今天在看JPetStore代碼時(shí),對(duì)他的鏈接中的請求參數(shù)感到疑惑,最后發(fā)現(xiàn)是自己的對(duì)Struts框架不熟悉導(dǎo)致的。
我是從Net陣營中剛轉(zhuǎn)入Java里的,在Net中對(duì)請求參數(shù)的名稱無特殊限制,只要在頁面中取參數(shù)的值即可。當(dāng)然這個(gè)功能在Java中也具備。即request.Getparameter()
今天我在看JpetStore代碼時(shí),在點(diǎn)擊
http://127.0.0.1:8083/JPetStore/shop/viewCategory.shtml?categoryId=BIRDS時(shí),當(dāng)跟蹤函數(shù)viewCategory時(shí)發(fā)現(xiàn)此時(shí)categoryID已經(jīng)賦值了,我卻找不到在什么地方賦值的,好是花費(fèi)了一番周執(zhí)。
查看此段鏈接對(duì)應(yīng)的struts.xml

????<action?path="/shop/viewCategory"?type="org.apache.struts.beanaction.BeanAction"
????????????name="catalogBean"?scope="session"
????????????validate="false">
??????<forward?name="success"?path="/catalog/Category.jsp"/>我首先跟蹤BeanAction的excute函數(shù)發(fā)現(xiàn)在此之前就已經(jīng)賦值,說明和BeanAction無關(guān),是Struts系統(tǒng)本身的結(jié)構(gòu)。我故意將鏈接修改,修改成
http://127.0.0.1:8083/JPetStore/shop/viewCategory.shtml?category=BIRDS此時(shí)出現(xiàn)錯(cuò)誤,錯(cuò)誤如下:
java.lang.IllegalArgumentException:?Cannot?invoke?com.ibatis.jpetstore.presentation.CatalogBean.setCategory?-?argument?type?mismatch
????org.apache.commons.beanutils.PropertyUtilsBean.invokeMethod(PropertyUtilsBean.java:1778)
????org.apache.commons.beanutils.PropertyUtilsBean.setSimpleProperty(PropertyUtilsBean.java:1759)
????org.apache.commons.beanutils.PropertyUtilsBean.setNestedProperty(PropertyUtilsBean.java:1648)
????org.apache.commons.beanutils.PropertyUtilsBean.setProperty(PropertyUtilsBean.java:1677)
????org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:1022)
????org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
????org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
????org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)
????org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:805)
????org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:203)
????org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
????org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
????javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
????javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

根據(jù)這個(gè)錯(cuò)誤堆棧可知,它實(shí)際上采用的是反射,setProperty,此時(shí)找不到category的Setter函數(shù)報(bào)錯(cuò)。然后我查看了一下RequestProcessor的默認(rèn)實(shí)現(xiàn)代碼
//?Process?any?ActionForm?bean?related?to?this?request
ActionForm?form?=?processActionForm(request,?response,?mapping);
processPopulate(request,?response,?form,?mapping);這段函數(shù)功能為:
1)調(diào)用processActionForm( )方法檢查是否存在為ActionMapping配置的ActionForm 。如果存在,則在有效區(qū)
域內(nèi)查找是否存在該ActionForm 的實(shí)例,存在,則復(fù)用,不存在,則創(chuàng)建一個(gè)實(shí)例。然后將實(shí)例保存與再配置
文件中配置好的有效區(qū)域(request,session,application)內(nèi),并用Action元素的name屬性作為該實(shí)例的關(guān)鍵字。
2)調(diào)用processPopulate( )方法,如果存來存在為ActionMapping配置的ActionForm,則封裝請求對(duì)象中的數(shù)據(jù)
到ActionForm 中,在進(jìn)行封裝之前,先調(diào)用ActionForm 的reset( )方法進(jìn)行屬性值的默認(rèn)化。
根據(jù)以上的分析,可得知,在調(diào)用鏈接前struts框架會(huì)自動(dòng)的將所有的請求參數(shù)封裝入指定的formbean中。所以請求參數(shù)的名稱應(yīng)該是對(duì)應(yīng)formbean的一個(gè)屬性。
這就是struts中請求參數(shù)的處理過程。主要是我對(duì)struts還沒有完全掌握,加上Net的影響,才花費(fèi)了一圈發(fā)現(xiàn)這個(gè)原因。
posted on 2007-01-15 20:56
滌生 閱讀(970)
評(píng)論(0) 編輯 收藏