邊城愚人

          如果我不在邊城,我一定是在前往邊城的路上。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            31 隨筆 :: 0 文章 :: 96 評論 :: 0 Trackbacks

          #

               摘要: 對于沒有使用過Calendar的程序員來說,再次處理日期時不妨使用Calendar而不僅僅是Date和SimpleDateFormat等類。這篇文章根據幾個使用日期的場景來說明如何使用Calendar等類。
          在數據庫編程時,我們通常將java日期字段選作Date型的(一般是java.sql.Date,繼承于java.util.Date,使用方法是類似的),當然也可以存儲為字符串甚至是long型的time,但我們這里只討論date型的。如果存儲的時間是系統當前時間,我們可以使用Date d = new Date();就得到想要的時間;以前我編程時也指定存儲日期的格式,但現在想來不是很有必要,完全可以在讀出數據時指定格式。另一種可選的方法是使用 Calendar類,方法如下:  閱讀全文
          posted @ 2007-06-22 08:40 kafka0102 閱讀(4078) | 評論 (0)編輯 收藏

               摘要: 最近在看一個程序,該程序的圖形界面采用SWT編寫。想要將程序運行起來首先需要做的就是將swt(jface)包放到類路徑上,swt包可以從http://www.eclipse.org/swt下載(其中除了swt包還有和操作系統相關的文件),和swt開發相關的插件為VE。一切就緒,運行程序發現了“Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-pi-gtk-3232 in java.library.path ”的錯誤(我的操作系統為Ubuntu7.04)。解決方案有多種,這里只介紹我使用的一種方法。  閱讀全文
          posted @ 2007-06-21 09:11 kafka0102 閱讀(13683) | 評論 (1)編輯 收藏

               摘要: 哈夫曼樹又稱最優二叉樹,是一種帶權路徑長度最短的二叉樹。所謂樹的帶權路徑長度,就是樹中所有的葉結點的權值乘上其到根結點的路徑長度(若根結點為0層,葉結點到根結點的路徑長度為葉結點的層數)。樹的帶權路徑長度記為WPL=(W1*L1+W2*L2+W3*L3+...+ Wn*Ln),N個權值Wi(i=1,2,...n)構成一棵有N個葉結點的二叉樹,相應的葉結點的路徑長度為Li(i=1,2,...n)。可以證明哈夫曼樹的WPL是最小的。
          構造哈夫曼樹的算法如下:
          1)對給定的n個權值{W1,W2,W3,...,Wi,...,Wn}構成n棵二叉樹的初始集合F={T1,T2,T3,...,Ti,..., Tn},其中每棵二叉樹Ti中只有一個權值為Wi的根結點,它的左右子樹均為空。
          2)在F中選取兩棵根結點權值最小的樹作為新構造的二叉樹的左右子樹,新二叉樹的根結點的權值為其左右子樹的根結點的權值之和。
          3)從F中刪除這兩棵樹,并把這棵新的二叉樹同樣以升序排列加入到集合F中。
          4)重  閱讀全文
          posted @ 2007-06-21 08:23 kafka0102 閱讀(12246) | 評論 (7)編輯 收藏

               摘要: 設有主串s和子串t,子串t定位是指在主串s中找到一個與子串t相等的子串。通常把主串s稱為目標串,把子串t稱為模式串,因此定位也稱作模式匹配。模式匹配成功是指在目標串s中找到一個模式串t。

          傳統的字符串模式匹配算法(也就是BF算法)就是對于主串和模式串雙雙自左向右,一個一個字符比較,如果不匹配,主串和模式串的位置指針都要回溯。這樣的算法時間復雜度為O(n*m),其中n和m分別為串s和串t的長度。

          KMP算法是由Knuth,Morris和Pratt等人共同提出的,所以成為Knuth-Morris-Pratt算法,簡稱KMP算法。KMP算法是字符串模式匹配中的經典算法。和BF算法相比,KMP算法的不同點是匹配過程中,主串的位置指針不會回溯,這樣的結果使得算法時間復雜度只為O(n+m)。下面說說KMP算法的原理。  閱讀全文
          posted @ 2007-06-17 22:14 kafka0102 閱讀(9686) | 評論 (6)編輯 收藏

               摘要: 做java企業級開發時,我們通常采用三層架構。特別地,如果我們要做的系統的業務邏輯不是很復雜時,我們要處理的不過是CRUD操作,這時我們可能將dao層與service層合并為一層,盡管很多人會這樣做,但我仍傾向于將兩層分開;因為service與dao不是一一對應的,從復用及邏輯清晰的角度考慮,應該將它們分開。在三層架構下,對于web層,service層,dao層我們都該怎么測試?這里我將介紹基于Spring,Hibernate和DbUnit的情況下我的測試方法。由于使用了Spring,事務管理就不在dao,因此要單獨地測試dao可能要麻煩一些;另一方面,dao中的操作大多是簡單的,也不是很值得測試。在使用了Hibernate和Spring的情況下,我們要測試的除了HQL,還有其配置文件,我覺得對數據持久化的測試最好定在service上。如果service業務邏輯復雜的話,與數據持久化無關的業務邏輯(應該寫在領域對象中)可以單獨測試,在保證與數據持久化無關的業務邏輯的正確性下,帶上dao操作做集成(單元)測試。  閱讀全文
          posted @ 2007-06-14 09:18 kafka0102 閱讀(1474) | 評論 (0)編輯 收藏

               摘要: 在做Java企業程序的時候,不可避免地要和外部資源打交道,比如數據庫,Http請求等。對于這些外部資源的處理,我們可采取的操作或者是直接處理或者是模擬處理。當我們使用Webwork,Spring,Hibernate等框架時,我們要測試的并不僅僅是Java代碼,我們還要測試依賴于這些框架的配置文件等等。因此,對于數據持久化的測試,Mock方法是行不通的,我們需要真實地測試數據庫操作。對于持久化測試來說,重要的是創造出已知的“干凈的”的準備數據。如果我們在測試一個持久化方法前不能確定數據庫到底存著什么數據,我們只能通過反復地查看數據庫數據來驗證測試方法的正確性了(這就是我和大多數人以前使用的最“直接”的方法)。現在就讓我們使用DbUnit,來更好的更自動化的測試持久化操作吧!

          先介紹一下DbUnit。DbUnit是一個 JUnit擴展,適用于數據驅動的程序。使用DbUnit,可以在測試運行期間將數據庫的數據處于已知狀態,這樣在測試時可以方便地寫出測試斷言,也能自動地完成對數據持久化方法的測試。在使用上,DbUnit也很簡單, 它提供了大量的  閱讀全文
          posted @ 2007-06-14 09:03 kafka0102 閱讀(2769) | 評論 (2)編輯 收藏

               摘要: 很早就知道Jetty,但直到最近才使用它作為Web服務器。Jetty是一個開放源碼的HTTP服務器和Java serverlet容器,是完全使用Java語言實現的。作為嵌入的Web服務器,Jetty被廣泛應用,比如DWR,JBoss,Geronimo,Tapestry中都使用了Jetty。相比于其他Web服務器,Jetty最大的有點就是小巧且啟動速度快。當前的Jetty最新版本為6,相比以前的版本“重”了不少,“重”的原因自然是功能的增強。我使用myeclipse插件開發Web程序,Web服務器從Tomcat轉換成Jetty只需改變一下程序部署的位置而已。  閱讀全文
          posted @ 2007-06-11 15:48 kafka0102 閱讀(1877) | 評論 (1)編輯 收藏

               摘要: Web上最常用的兩種Http請求就是Get請求和Post請求了。我們在做java web開發時,也總會在servlet中通過doGet和doPost方法來處理請求;更經常地,我們會在doGet方法的實現中調用doPost方法。盡管做了近兩年的web開發,我對諸如Get請求和Post請求的基本概念仍不是十分了解。近日閱讀《javascript高級程序設計》(很長時間沒有看書了!),重新整理了一下Get請求和Post請求的概念,算是讀書筆記吧。  閱讀全文
          posted @ 2007-05-22 22:30 kafka0102 閱讀(3325) | 評論 (3)編輯 收藏

               摘要: 題按:做了幾年的java程序,卻很難說對基本的OO概念都有理解。即便每天都寫的代碼中,也很難說清楚其中到底運用了怎樣的概念和思想。前日的考試中看到關于上溯造型與下溯造型的問題,就查了些資料,集中說一下吧。  閱讀全文
          posted @ 2007-05-21 22:34 kafka0102 閱讀(3180) | 評論 (2)編輯 收藏

               摘要: 我們應該如何以及在哪里使用Mock對象呢?一般來說,對于目標對象中的合作者對象,在測試時如果其狀態或行為的實現嚴重地依賴外部資源(比如數據持久化中的DAO,比如負責發送電子郵件的類),或者團隊并行開發時,目標對象的合作者對象并沒有實現(比如J2EE中,橫向分工時,負責Action的調用Service,負責Service調用DAO時,相應的Service及DAO沒有實現),這時我們就需要模仿這些類。其實,在做J2EE時,傳統的N層架構中,我們都是面向接口編程的,我們定義了DAO接口,我們定義了Service接口,這樣做的優點就是我們在測試時可以構造實現接口的Mock類。這里不得不提依賴注入,通過依賴注入,我們才能在測試時set Mock對象。這也說明,為了方便測試,我們不得不一步一步重構代碼,而模式就在重構中自然地產生了。
            閱讀全文
          posted @ 2007-04-26 08:35 kafka0102 閱讀(4045) | 評論 (1)編輯 收藏

               摘要: 你可以使用eclipse的重構工具方便的生成javabean的getter和setter方法,但在編寫javabean時,你可能不得不手動編寫枯燥單調的繼承自Object的隱含的常用方法,如toString(),hashcode(),equals(Object),compareTo(Object)。當然也有省力的解決方法,那就是eclipse的插件Commonclipse。Commonclipse使用commons-lang包,自動生成上面的方法。你可以到其網站Commonclipse上下載插件感受一下。  閱讀全文
          posted @ 2007-04-22 12:36 kafka0102 閱讀(3053) | 評論 (6)編輯 收藏

               摘要: 當你偶然路過這里時,我假定你已經很明白java中范型和DAO模式了。當然,我也會順便嘮叨幾句范型和DAO模式,只是它們不會這篇隨筆的重點。我早先在DW上看到一篇蠻不錯的文章不要重復 DAO!Hibernate 和 Spring AOP 構建泛型類型安全的 DAO,它也促使我在一個實驗工程中使用了范型化的DAO模式。前幾天看到的另一篇文章Generic Data Access Objects使我重新想起了這檔事。以前的代碼不可追,索性就重做了一個sample實現范型化的DAO。坦白的講,和上面的兩篇文章相比,這篇隨筆并沒有太多新內容,如果你愿意的話,你可以只看上面的兩篇文章而關掉這個頁面。
            閱讀全文
          posted @ 2007-04-17 08:55 kafka0102 閱讀(3598) | 評論 (7)編輯 收藏

          ??? 實現JavaScript繼承的最簡單的方式是call方法(或者apply方法)及原型鏈方法,但這兩種方法都有缺陷,而其混合體就是很好的繼承實現方式。下面舉例說明:
          function?Animal(age){
          ????
          this.age?=?age;
          }

          Animal.prototype.sayAge?
          =?function(){
          ????window.alert(
          "My?age?is?"+this.age+"!");
          };

          function?Dog(age,name){
          ????Animal.call(
          this,age);
          ????
          this.name?=?name;
          }
          Dog.prototype?
          =?new?Animal();
          Dog.prototype.sayName?
          =?function(){
          ????window.alert(
          "I?am?a?"+this.name+"!");
          };

          var?dog?=?new?Dog(15,"dog");
          dog.sayName();
          dog.sayAge();
          ??? 對于類Animal來說,它有一個字段屬性age及函數屬性sayAge,sayAge方法的定義采用的是原型方式。Dog類要繼承Animal,其字段屬性除了age外還有name,通過Animal.call(this,age);可以實現Dog繼承Animal的字段屬性age并將其初始化了。call方法的第一個參數為繼承的類的this指針,第二個參數為Animal類的構造函數的參數。實際上,只是通過call方法就可以實現繼承,但唯一的要求是父類的函數屬性要在構造函數中定義,這對于這里的函數屬性使用原型方式定義來說就不適合了(采用原型方式定義函數屬性比在構造函數內定義更直觀一些)。要想繼承Animal的原型方式定義的函數屬性,需要的語句就是“Dog.prototype?=?new?Animal();”。而Dog類中的sayName()函數則是其自身的函數屬性了。
          ??? 除了這個最經典的實現繼承的方式外,目前還有一些免費的庫可供使用。但想到形形色色的庫,頭就大了,有時間有必要時再研究吧!
          posted @ 2007-04-08 21:11 kafka0102 閱讀(1482) | 評論 (0)編輯 收藏

               摘要: 最近在閱讀《JavaScript高級程序設計》,未免遺忘讀過的內容,就打算以博客的形式做些讀書筆記。今天介紹的是JavaScript的三種構造對象的方法,除了這三種方法,還有工廠方法來構造對象,但考慮到其簡單性及非正規性,這里就不做介紹。和Java這樣的面向對象語言相比,JavaScript更像是函數式語言,其并沒有類的概念,蓋之以對象定義的概念,而具體創建的對象叫做對象的實例。  閱讀全文
          posted @ 2007-04-08 11:24 kafka0102 閱讀(22160) | 評論 (8)編輯 收藏

               摘要: 網上看到一道java算法題,題目如下: 用1,2,2,3,4,5,這六個數字,用java寫一個main函數,打印出所有不同的排列,如:512234,412345等,要求:“4”不能排第3位,“1”與“5”不能相連。  閱讀全文
          posted @ 2007-03-13 09:06 kafka0102 閱讀(4527) | 評論 (12)編輯 收藏

          僅列出標題
          共3頁: 上一頁 1 2 3 下一頁 
          主站蜘蛛池模板: 杭锦旗| 德阳市| 浠水县| 都江堰市| 洛宁县| 新野县| 双流县| 资中县| 常德市| 南陵县| 永清县| 武乡县| 隆回县| 建湖县| 格尔木市| 黄龙县| 漳浦县| 青河县| 恩平市| 台东县| 桐柏县| 长顺县| 五寨县| 团风县| 南溪县| 贡嘎县| 黔南| 盱眙县| 靖江市| 桐乡市| 永定县| 株洲市| 六盘水市| 华坪县| 建始县| 凭祥市| 上虞市| 柳林县| 六盘水市| 佛山市| 石景山区|