<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 滌生 閱讀(976) 評論(0)  編輯  收藏

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


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

    常用鏈接

    留言簿(5)

    隨筆檔案

    UML

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 边摸边脱吃奶边高潮视频免费| 亚洲日韩精品无码AV海量| 成人免费夜片在线观看| 成年免费大片黄在线观看岛国| 亚洲人成电影在线天堂| 无码精品人妻一区二区三区免费看| 中文字幕亚洲无线码a| 国产日韩精品无码区免费专区国产| 亚洲av午夜福利精品一区| 一级一看免费完整版毛片| 国产91精品一区二区麻豆亚洲| 美女18一级毛片免费看| 亚洲国产精品无码久久青草 | 成年女人免费碰碰视频| 国产在线观看免费完整版中文版| 亚洲香蕉久久一区二区| 在线播放国产不卡免费视频 | 亚洲综合亚洲综合网成人| 粉色视频免费入口| 亚洲国产精品自在拍在线播放| 黄页视频在线观看免费| 亚洲日本中文字幕天堂网| 在线播放免费人成毛片乱码| 内射干少妇亚洲69XXX| 国产卡一卡二卡三免费入口| 亚洲欧美日韩久久精品| 亚洲国产婷婷综合在线精品 | 精品女同一区二区三区免费播放| 一本色道久久88亚洲综合| 成人a毛片视频免费看| 久久九九亚洲精品| www视频在线观看免费| 亚洲色无码国产精品网站可下载| 四虎永久在线免费观看| 国产在线精品一区免费香蕉| 亚洲高清无在码在线无弹窗| 国产美女精品视频免费观看| 中国一级特黄的片子免费| 亚洲欧洲春色校园另类小说| 嫩草在线视频www免费看| 亚洲国产日韩在线一区|