posts - 11,  comments - 28,  trackbacks - 0
          今天在看JPetStore代碼時,對他的鏈接中的請求參數感到疑惑,最后發現是自己的對Struts框架不熟悉導致的。
          我是從Net陣營中剛轉入Java里的,在Net中對請求參數的名稱無特殊限制,只要在頁面中取參數的值即可。當然這個功能在Java中也具備。即request.Getparameter()

          今天我在看JpetStore代碼時,在點擊
          http://127.0.0.1:8083/JPetStore/shop/viewCategory.shtml?categoryId=BIRDS
          時,當跟蹤函數viewCategory時發現此時categoryID已經賦值了,我卻找不到在什么地方賦值的,好是花費了一番周執。
          查看此段鏈接對應的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函數發現在此之前就已經賦值,說明和BeanAction無關,是Struts系統本身的結構。我故意將鏈接修改,修改成
          http://127.0.0.1:8083/JPetStore/shop/viewCategory.shtml?category=BIRDS
          此時出現錯誤,錯誤如下:
          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)
          根據這個錯誤堆棧可知,它實際上采用的是反射,setProperty,此時找不到category的Setter函數報錯。然后我查看了一下RequestProcessor的默認實現代碼
          //?Process?any?ActionForm?bean?related?to?this?request
          ActionForm?form?=?processActionForm(request,?response,?mapping);
          processPopulate(request,?response,?form,?mapping);
          這段函數功能為:
          1)調用processActionForm( )方法檢查是否存在為ActionMapping配置的ActionForm 。如果存在,則在有效區
          域內查找是否存在該ActionForm 的實例,存在,則復用,不存在,則創建一個實例。然后將實例保存與再配置
          文件中配置好的有效區域(request,session,application)內,并用Action元素的name屬性作為該實例的關鍵字。
          2)調用processPopulate( )方法,如果存來存在為ActionMapping配置的ActionForm,則封裝請求對象中的數據
          到ActionForm 中,在進行封裝之前,先調用ActionForm 的reset( )方法進行屬性值的默認化。

          根據以上的分析,可得知,在調用鏈接前struts框架會自動的將所有的請求參數封裝入指定的formbean中。所以請求參數的名稱應該是對應formbean的一個屬性。

          這就是struts中請求參數的處理過程。主要是我對struts還沒有完全掌握,加上Net的影響,才花費了一圈發現這個原因。
          posted on 2007-01-15 20:56 滌生 閱讀(973) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2007年1月>
          31123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(5)

          隨筆檔案

          UML

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 闻喜县| 柘城县| 罗源县| 卫辉市| 紫阳县| 五寨县| 霸州市| 阿城市| 延寿县| 承德市| 英吉沙县| 荔波县| 彝良县| 宁都县| 扎赉特旗| 嘉峪关市| 韶山市| 勃利县| 威远县| 资兴市| 屏南县| 本溪| 长岭县| 安龙县| 定襄县| 金乡县| 陕西省| 东光县| 和龙市| 嘉禾县| 彝良县| 乌鲁木齐市| 绥宁县| 崇阳县| 丽江市| 德格县| 涟源市| 建瓯市| 黄大仙区| 张掖市| 武冈市|