Shao Fan

          關(guān)于JAVA與軟件工程
          posts - 31, comments - 71, trackbacks - 0, articles - 4
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          Struts2客戶端驗(yàn)證的一個(gè)bug

          Posted on 2007-06-03 17:56 shaofan 閱讀(2541) 評(píng)論(3)  編輯  收藏 所屬分類: Java
          Struts2默認(rèn)theme是xhtml,它用表格來(lái)對(duì)表單中的控件進(jìn)行排版。它也提供一個(gè)客戶端的js驗(yàn)證功能,但是它的js腳本卻有些問(wèn)題,在某些情況下,前次驗(yàn)證的提示信息無(wú)法被清除,提示信息會(huì)不斷的累積顯示在屏幕上。而按照設(shè)計(jì),每次提交表單時(shí)應(yīng)只顯示每次驗(yàn)證的出錯(cuò)信息。

          它的客戶端驗(yàn)證的流程大概是這樣,用戶提交表單時(shí),對(duì)各個(gè)控件的輸入按預(yù)先設(shè)置的規(guī)則進(jìn)行驗(yàn)證,如果有問(wèn)題,則清除表單里原有的出錯(cuò)提示信息,并寫入新的提示。其設(shè)計(jì)的功能是把出錯(cuò)信息寫表格里出錯(cuò)控件的上方,以便用戶看得更加清楚。問(wèn)題就出在其用來(lái)清除原出錯(cuò)信息的函數(shù),其代碼是這樣的(在struts.jar的template/xhtml目錄下可以找到):

           1 function clearErrorMessages(form) {
           2 
           3     var table = form.childNodes[1];
           4     iftypeof table == "undefined" ) {
           5         table = form.childNodes[0];
           6     }
           7 
           8     // clear out any rows with an "errorFor" attribute
           9     var rows = table.rows;
          10     var rowsToDelete = new Array();
          11     if (rows == null){
          12         return;
          13     }
          14 
          15     for(var i = 0; i < rows.length; i++) {
          16         var r = rows[i];
          17         if (r.getAttribute("errorFor")) {
          18             rowsToDelete.push(r);
          19         }
          20     }
          21 
          22     // now delete the rows
          23     for (var i = 0; i < rowsToDelete.length; i++) {
          24         var r = rowsToDelete[i];
          25         table.deleteRow(r.rowIndex);
          26         //table.removeChild(rowsToDelete[i]);
          27     }
          28 }


          看這個(gè)函數(shù)的前三行,它試圖取得form的第1個(gè)或第2個(gè)子節(jié)點(diǎn),并把它作為table來(lái)處理(看接下來(lái)的幾行)。要想清除表格里的錯(cuò)誤信息,首先要取得表格本身,這沒錯(cuò),但是如果第1個(gè)或第2個(gè)子節(jié)點(diǎn)不是table的話,腳本就會(huì)出錯(cuò),造成原出錯(cuò)信息無(wú)法清除,這樣每次提交后的提示信息就會(huì)累積在屏幕上。

          要解決這個(gè)問(wèn)題有兩個(gè)辦法:
          • 寫代碼時(shí)要小心,保證form的第1或2個(gè)子節(jié)點(diǎn)是table,不要在生成table前加其他代碼。
          • 或,修改xhtml的validation.js,使它總能獲得正確的table元素,重新打包到struts.jar。
          剛看了一下Struts的JIRA,已經(jīng)有人報(bào)告了這個(gè)問(wèn)題(id WW-1802),而且這個(gè)bug在2.1版本中已經(jīng)解決了。

          評(píng)論

          # re: Struts2客戶端驗(yàn)證的一個(gè)bug  回復(fù)  更多評(píng)論   

          2008-01-25 11:59 by encodinglife
          找了很久 終于找到 錯(cuò)誤信息累加 的原因了
          多謝了!!!

          # re: Struts2客戶端驗(yàn)證的一個(gè)bug  回復(fù)  更多評(píng)論   

          2008-01-25 12:13 by encodinglife
          struts 2.1 發(fā)布了嗎
          剛才到struts home 只有2.0.11版本的
          沒有 2.1 版本的
          這是怎么回事啊?
          請(qǐng)博主回復(fù)一下

          # re: Struts2客戶端驗(yàn)證的一個(gè)bug[未登錄]  回復(fù)  更多評(píng)論   

          2008-01-27 16:13 by shaofan
          樓上的提醒,剛?cè)タ戳艘谎郏瑂truts還真是沒發(fā)布到2.1.0,現(xiàn)在最高版本是2.0.11。但是JIRA上確實(shí)顯示去年5月份這個(gè)BUG已經(jīng)被搞定了,但是不知道為什么修復(fù)的版本是2.1.0。也許是寫錯(cuò)了??我現(xiàn)在沒有用struts在開發(fā)了,樓上試試最2.0.11,也許已經(jīng)修復(fù)了?
          主站蜘蛛池模板: 准格尔旗| 威信县| 肇东市| 凤凰县| 新巴尔虎左旗| 尚义县| 南雄市| 商都县| 洛川县| 中超| 禹州市| 竹山县| 博客| 道孚县| 临沧市| 永善县| 新源县| 甘泉县| 乐昌市| 诸暨市| 青海省| 鹿泉市| 墨脱县| 登封市| 和硕县| 灌云县| 玛多县| 灵石县| 昭苏县| 龙游县| 永德县| 台东县| 宁阳县| 长沙县| 德庆县| 武乡县| 厦门市| 福泉市| 阳东县| 盐边县| 岑溪市|