Java/JSP/JS Debug筆記

      ------------------------ 謹以此文獻給我沒有頭緒或心勁去debug的日子和很多辛苦debug的同志們。

      應部門一個科的需求,給他們寫一個夜維日誌記錄的功能模塊,本來是個很小的需求,計劃一週內上線的,可能是我這個人比較偷懶,用了一點點以前略有不同的實現方式,搞得它之後的複雜需求都完成了,它那個模塊還由於bug重重沒有調試出來。
       本來這種模塊可以用4到5個頁面實現,爲了圖方便,僅用了兩個頁面實現,導致內容更新頁面代碼過多,所以在這個頁面,問題比較多。
      東西寫完基本代碼快一個月了,剛出來的那段時間,可能是比較忙或者身體、心情的原因,debug一直是一籌莫展,最近感覺心勁還不錯,把那個模塊拿出來慢慢debug,今天一天(有點其他的雜事)定位了2個bug,解決了一個,一個還沒有完全解決。
      第一個bug:這個夜維日誌字段比較多,還需要上傳附件,本來附件上傳這個功能是比較熟悉的,可是我在附件上傳完以後其他參數的傳遞再顯示(在同一個頁面上傳附件,附件上傳的過程,其他編輯控件中的填寫值不變,這兒暫時沒有用ajax。)和修改時原日誌的從java到填寫控件的值的傳遞才用了JS方式,就是在onload函數裏對input空間賦初始值,我不知道這種方法是否最優,只是覺得這種方式在代碼的組織上非常好,可惜這種方式在這個模塊中我是第一次大規模用,可以說比較失敗:
              1、把window.onload編輯時編輯成了winodw.onload.
              2、在一個input空間賦值的時候遺漏了<%=java variable>兩邊的''號;也就是因爲這兩個原因導致了向頁面的傳參失敗。也就是第一個讓人鬱悶的“小”地方。JS的debug的確很考查人,難怪很多人都不喜歡用這個東西,第一:跨瀏覽器需要兼容,第二debug非常麻煩,差錯點很難發現,上一個模塊中有一個js的bug上線後才發現,還有一個上線N久都沒有發現,還是後來我在論壇上討論的時候發現自己代碼那個地方有問題。
      第二個bug:編碼的問題,我們這個項目編碼問題本來是一次性解決的,但後來不知道怎麼回事,在運行server Weblogic上可以正確運行的Charset Filter在我的測試Server Tomcat上沒有效用,所以一般我在寫代碼的時候都要對測試代碼的參數處理自己要寫一下編碼處理。本來這個處理我以前用過,可是後來那種代碼在上線後就刪除了,這次用到這種代碼的時候,一時居然找不到代碼,看了Charset資料寫出來的有問題,採用
            value=new String(value.getBytes(from_encoding),"to_encoding");
寫出來的代碼編碼以後並不能正確顯示,可能是今天馬上下班了,有點氣躁了(從這個問題發現自己真夠菜的!----Java基本功還很薄),可能是此處採用common upload組件作附件上傳處理,還不太清楚它的字段值是什麼編碼。問了一下同組的一位大拿,指點了一下,common upload的item.getstring()默認編碼方式可能是ISO-8859-1,所以需要使用getstring()的重載方法getstring("GB2312").代碼改了,還沒有上線測試——雜事太多。
      這個頁面還發現一個bug:刪除的時候文件名傳參還有問題,目前還沒有定位到此bug的差錯點。
      覺得Gmail的那種附件上傳方式不錯,決定嘗試一下!已經有人將它的原理解剖了(看http://howsmile.cnblogs.com/archive/2006/07/11/447837.html),不用我去啃GWT了。
       現在對GWT生成的JS和HTML比較感興趣,很想分析一下,可惜沒有時間和相關的分析資料。GWT的doc纔看了1/3左右,很想看一下它生成代碼的結構和運行流程,有相關經驗和資料的同志可以留言一下,當然可能需要自己實踐一下,昨天在一個網站上發現一個GWT  Visual eidtor,就是一個基於eclipse的GWT可視化界面編輯器,不過剛剛放出Beta版本,且不提供下載,需要發郵件申請,如果申請成功,給大家放出來------(主要是忘了收藏,鏈接也找不到了。用Firefox,沒存歷史。)
      10.24日今天在測試文檔管理模塊新功能時發現一個問題,select元素在disabled=true以後,就意味着其只是一個顯示體了,在向後段發出請求的時候,也沒有了這個元素對應的參數,所幸今天這個元素的readOnly不甚重要,我則直接設置爲普通元素,只是賦了個初值。給一個相關解決此問題的索引http://www.cnblogs.com/dotage/archive/2005/05/16/156463.html
      順便,這幾天從老外的blog上面找到一個不錯的JS tab控件,比較好用,完全的客戶端代碼,可惜免費版左下角有一個小小的鏈接,把地址也給貼出來吧:http://codethat.com/tab/ ,這家公司挺有名的,不過國內好像大多用它的grid和table控件。

    10.27日在安裝上面提到那種iframe方式實現這個模塊的無刷新上傳時,一個小間斷:給動態生成的一個元素的事件賦值一個函數對象,需要給這個函數傳的參數也是動態生成的,這時候想到了把這個參數賦給這個元素的id,然後通過this傳參,找到了一篇文章《JavaScript中this關鍵字使用方法詳解》,這是我看過《ajax in action》某個章節後一直想看的一個話題,另外這個blog也不錯,文章比較多。

     10.30日,以前做的一個工作用的 java的swt的小程序,每次都打開eclipse來啓動比較麻煩,今天打了一下包,搜索"java 打包 eclipse"裝了Fat Jar的eclipse打包插件,打好包,運行沒反應,又搜索“swt 打包”找到《Eclipse SWT應用程序項目的打包與部署 》,原來swt程序需要與包jar同時部署它的本地dll文件,fat jar+copy本地dll打包成功。

    11.2日,今日解決了某個*.js的文件中的變量無法引用的問題,原因在於通過servlet轉向到jsp文件,jsp文件的目錄在firefox中是servlet的目錄,導致原有的jsp中引用js的相對目錄失效所引起,所以js在服務器上引用最好用服務器絕對目錄。
         第二個問題比較讓人吐血,一個在firefox中通過html性質註冊的事件函數在IE下無效,最後試來試去,原來是函數名的問題,函數名不能是on**之類的元素事件性質的名字,否則就會導致此處的時間性質無效。這個性質倒可以說非正常之大正常

   11.3日  今天發現了IE中iframe file upload無反應的原因,因爲對top自定義的一個屬性好象不能成立。
firefox的刪除調試也趨近完成,發現一個令人意外的東西:在FireFox中一個Element的childNodes裏面竟然把換行符當作是text元素算在內,所以要真對有意義的childNodes作遍歷,最好前面用nodeType作一下過濾!

   11.7日 1、今天發現在FireFox中對NodeList遍歷的第二個問題,如果你需要獲得一個Node的非Node屬性的其他如id之類的區別於nodeType的Element屬性,不能用直接以屬性名索引的方式如:(children=Element.childNodes;)children[i].id這樣的方式,而必須用children[i].attributes['id'].value這樣的方式,也就是說Node的類型不能實現動態判定,可惜我還不清楚js中怎樣把Node的類型實現動態轉換爲具體的Element類型。
2、發現IE和FireFox給common fileupload上傳組件傳值的一個差別:IE傳給的文件名的是完整路徑包括盤符和目錄,而FireFox傳給的就是文件名。

    11.9日解決event.target爲空或不是對象的問題,下把那張貼子貼出來吧:
  事件通過以下方式註冊:
    var delA=document.createElement('a');
    delA.id=attachfile;
    delA.className='delfile';
    delA.appendChild(document.createTextNode("X"));
    delA.οnclick=top.deleteFile;//註冊事件
    attLi.appendChild(delA);
    事件處理函數如下定義
function deleteFile(event){
    var url='.....';
    var params='attachid='+Event.element(event).id;
                           ~~~~~~~~~~~~~~~~~~~~Prototype的函數!
    .....
}
//IE6的報錯“爲'target' 爲空或不是對象”出錯的也就是這條語句:
也就是在prototype中的這條語句:
  element: function(event) {
    return event.target || event.srcElement;
  },
請問Event在傳srcElement的合理用法應該是怎樣,或者各位在這種方式的事件註冊方式下有什麼更好的給函數傳參的方式,也歡迎提出來。
   ps:今天這個問題和那天那個iframe的問題在FireFox下都不會發生。
   而且IE中還發生了"不能執行已釋放 Script 的代碼"這個框架代碼相互操作時的怪異問題,被迫將本來動態生成的poptip最後還是用DIV寫在了網頁裏再進行操作
——————————————————————————————————————
解 決,通過採用Prototype的事件註冊方式註冊事件處理函數即可。我在事件處理函數中alert判定了一下,發現event本身就不是所要的 event,所以IE根本沒有把事件傳遞進來,於是採用Prototype的註冊方式試了一下,因爲我發現scriptaculous的事件處理代碼本身 並不作event是否爲空的判定,卻可以正確的處理event,也就是說在IE中如果要代碼中註冊事件並傳遞event參數,必須採用Event的事件處 理模型(Element.attachEvent)註冊事件,纔可以達到相應的目標,也就是意味着IE4以前的瀏覽器,Prototype這種代碼就沒法 用了。
      上面這個bug解決了以後,雖然也出現了其它的bug,但總的今天比較順利,全部解決,至此這個日誌模塊公開測試版開始交給配置管理員上線。
     總結一下:JS/JSP的調試非常瑣碎,需要極大的耐心和細心。比較便利的方法就是走比較正常的代碼路線,不要討巧走邪路。
                    


                                                                                       10.20日第一次更新
                                                                                       10.24日第二次更新
                                                                                       10.27日第三次更新
                                                                                       11.2日 第四次更新
                                                                                       11.7日第五次更新
                                                                                       11.8日第六次更新(最後一次)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章