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

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

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

    cerulean

    2007年2月1日

    從上班開始沒多久,就開始用Evernote,是portable 2.2版本。
    好記性不如爛筆頭。真的是做到了隨手記,尤其是搜索功能簡單易用,用來挖很久以前記下的tips,界面也很簡潔,明了、夠用。
    備份也方便,反正換了電腦,文件夾直接拷貝,數(shù)據(jù)沒丟。

    就這樣,一用多少年過去了。
    如今,“印象筆記”在iphone應用推薦榜的筆記類里一直居高位,圖標也早就不是我v2.2的老土模樣,如果不是英文名字就叫evernote,我完全對不上號。
    人家其實從v3開始就不是老土的本地應用了,都講究“云”了。

    雖然手頭的v2.2完全滿足我隨手記一記的需求,但是,本著與時俱進和稍微保證一下數(shù)據(jù)的安全性,我還是下了個最近的v4.x的版本,結果發(fā)現(xiàn)還是要從v3開始才能導入v2的數(shù)據(jù)。嗯,看來是落后太久了。
    有一點夸獎一下:免費賬戶的每月上傳容量是有限的,但是對于我這種文本筆記,夠傳3w條的。

    ——嗯,其實,本來只是個小軟件的更新而已,竟然跑到blogjava寫上一篇,可能是因為伴隨感吧,再有點兒時過境遷的唏噓。
    posted @ 2012-11-22 11:35 cerulean 閱讀(448) | 評論 (1)編輯 收藏
    春節(jié)過后這幾天干的活兒就沒一件痛痛快快的?
    第一天是發(fā)現(xiàn)編譯環(huán)境有異動,我以為是代碼有問題,折騰了1天多。。。
    第二天是自己機器上的IE8抽瘋弄得我以為是build有問題。。。
    第三天從TimesTen轉到Psql的各種毛病。。。

    好吧。言歸正傳:
    1)找一個跟表無關的通用的單純的select語句作為測試語句不容易啊,
    Dual是Oracle自帶的表,其他DBS木有的。。不用Dual的話Oracle又不認。

    2)Cause: org.postgresql.util.PSQLException: Method org.postgresql.jdbc2.Jdbc2PreparedStatement.setQueryTimeout(int) is not yet implemented.
    這個錯誤,把sqlMapConfig.xml中在settings里配置的defaultStatementTimeout去掉就可以避免了。但是,這個配置對PSQL應該OK啊。。。待查

    【續(xù)】——
    defaultStatementTimeout 確實不是所有的driver都支持的。
    但去掉的話,TimesTen又不干了:太囧了。。。
    [TimesTen][TimesTen 7.0.5.9.0 CLIENT]Query Timeout must be numeric; if the Network Timeout
    is non-zero, the Query Timeout must be greater than zero and less than the Network Timeout, else if the Network Timeout is zero, the Query Timeout must be greater than or equal to zero.
    兜兜轉轉又遇到了這個之前遇到過的問題。這些driver就不能統(tǒng)一統(tǒng)一咩!

    posted @ 2012-02-01 17:32 cerulean 閱讀(1200) | 評論 (0)編輯 收藏
    parseInt(String s, int radix) 
    Parses the string argument as a signed integer in the radix specified by the second argument.

    今兒頭回用,真是……反省ing

    posted @ 2012-01-18 17:28 cerulean 閱讀(360) | 評論 (0)編輯 收藏
    文檔寫到現(xiàn)在,猛然說不上abbreviation 和 acronym 的區(qū)別。。。真是慚愧。。。
    abbreviation:單詞、語句的縮略形式,縮到短一點兒。
    acronym:“首字母”縮寫
    posted @ 2011-12-05 15:21 cerulean 閱讀(501) | 評論 (0)編輯 收藏
    之前都沒注意過有這么個方法,否則判斷日期格式就太不靠譜了。
    又是晦澀的單詞:setLenient(false),嚴格匹配日期格式
            SimpleDateFormat df = new SimpleDateFormat("MMddyyyy");
            
    /*
             * With lenient parsing, the parser may use heuristics to interpret inputs that 
             * do not precisely match this object's format. 
             * With strict parsing, inputs must match this object's format. 
             
    */
            df.setLenient(
    false);
            
    try {
                Date a 
    = df.parse("23232011");
                System.out.print(
    "date: " + a);
            } 
    catch (java.text.ParseException e) {
                
    // TODO Auto-generated catch block
                e.printStackTrace();
            }

    posted @ 2011-07-18 17:23 cerulean 閱讀(3206) | 評論 (0)編輯 收藏
    i18n,之前在J2EE里,自然用struts來做。但是Web Service里貌似應該不需要這部分,但是實際上,有些操作還是避免不了要支持多國語言。
    查了一圈兒,好像WS-i18n還在working draft的階段,而且好像已經(jīng)好幾年了……也沒找到什么開源中間件的實現(xiàn)。
    大意是在SOAP header中加上<i18n:international>相關的標簽。
    因為畢竟是Web Service,利用http header還是不太妥,還是要放在SOAP里面。

    記錄一下查到的鏈接,備用。

    http://www.coderanch.com/t/224875/Web-Services/java/Web-Services-Internationalization-jax-ws
    For a SOAP web service the language/country code should be part of the SOAP request and possibly the SOAP response. You can always base your solution on the above WS-I18N working draft.
    Internationalization isn't as big a priority with SOAP web services as it is with web pages as web services are consumed by other applications - not humans. In most cases normalized "generic data" is exchanged which is displayed on the client using the client's locale. SOAP web services exchanging localized text are pretty much in the minority.

    http://www.w3.org/TR/ws-i18n/


    posted @ 2011-06-15 16:49 cerulean 閱讀(282) | 評論 (0)編輯 收藏
    這回是更加深深地體會到IDE的重要性了!
    想當初要不是eclipse,估計上手過程會很痛苦;
    后來myeclipse的官方網(wǎng)站竟然封掉了;
    現(xiàn)在,眼巴巴瞅著NetBeans美麗的GUI Builder,假如當年Swing那部分是用NetBeans開發(fā)的,或者NetBeans可以不要那個.form的文件直接解析代碼,就好了啊!!!
    唉……
    posted @ 2010-08-11 16:32 cerulean 閱讀(325) | 評論 (0)編輯 收藏
    繁瑣的登陸過程讓人抓狂,telnet到第一臺機器輸入用戶名之前,點擊SecureCRT里menu->Script->Start recording script,錄下接下來的步驟,然后點擊Stop recording script,就會提示保存腳本。以后登陸時,選擇Run腳本就可以了。
    posted @ 2010-07-07 08:54 cerulean 閱讀(296) | 評論 (0)編輯 收藏
    遍歷集合,批量刪除時,遇到ConcurrentModificationException
    因為操作的集合會在過程中遇到結構性的改變,例如:
    HashMap<String, String> testMap = new HashMap<String, String>();
            testMap.put(
    "1""a");
            testMap.put(
    "2""b");
            testMap.put(
    "3""c");
            Set
    <Map.Entry<String,String>> enterySet = testMap.entrySet();
            

            
    for(Iterator<Map.Entry<String, String>> i = enterySet.iterator(); i.hasNext();){
                Map.Entry
    <String, String> entry = i.next();
                
    if(entry.getValue().equalsIgnoreCase("a")){
                    testMap.remove(entry.getKey());
                }

            }


    解決方法:不要在集合上刪除,而是在迭代器上刪除:i.remove();

    p.s.還有另外一個可能性是多線程同時操作該集合了,那需要進行同步來避免。
    posted @ 2010-06-11 13:57 cerulean 閱讀(375) | 評論 (0)編輯 收藏
    引子只是個小問題,JTextArea多行文本,想設置文字的對齊方式為居中對齊,卻發(fā)現(xiàn)死活沒有合適有效的方法,又試了JTextField和JLabel,都不理想。搜了一溜夠看到JTextPane的解決方法,其實真是有點兒大材小用了。JTextPane里可以設置style,對齊方式、字體字號、顏色等等,并且還可以設置style的作用范圍,挺方便的。另外,想把文字區(qū)域背景設為透明的也是在API中找了一通,才發(fā)現(xiàn)敢情就是setOpacity,呃,對這個單詞實在是太不敏感了。。。。

    把在coderanch上搜的例子貼在這里吧,以防以后忘了:
    import java.awt.*;  
    import javax.swing.*;  
    import javax.swing.text.*;  
       
    public class Styling  
    {  
        
    public Styling()  
        
    {  
            String text 
    = "To refer to locations within the sequence, the " +  
                          
    "coordinates used are the location between two " +  
                          
    "characters.\nAs the diagram below shows, a location " +  
                          
    "in a text document can be referred to as a position, " +  
                          
    "or an offset. This position is zero-based.";  
       
            SimpleAttributeSet aSet 
    = new SimpleAttributeSet();   
            StyleConstants.setForeground(aSet, Color.blue);  
            StyleConstants.setBackground(aSet, Color.orange);  
            StyleConstants.setFontFamily(aSet, 
    "lucida bright italic");  
            StyleConstants.setFontSize(aSet, 
    18);  
       
            SimpleAttributeSet bSet 
    = new SimpleAttributeSet();  
            StyleConstants.setAlignment(bSet, StyleConstants.ALIGN_CENTER);  
            StyleConstants.setUnderline(bSet, 
    true);  
            StyleConstants.setFontFamily(bSet, 
    "lucida typewriter bold");  
            StyleConstants.setFontSize(bSet, 
    24);  
       
            JTextPane textPane 
    = new JTextPane();  
            textPane.setText(text);  
            StyledDocument doc 
    = textPane.getStyledDocument();  
            doc.setCharacterAttributes(
    105, doc.getLength()-105, aSet, false);  
            doc.setParagraphAttributes(
    0104, bSet, false);  
       
            JFrame f 
    = new JFrame();  
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
            f.add(
    new JScrollPane(textPane));  
            f.setSize(
    400,400);  
            f.setLocation(
    200,200);  
            f.setVisible(
    true);  
        }
      
       
        
    public static void main(String[] args)  
        
    {  
            
    new Styling();  
        }
      
    }
      
    posted @ 2010-03-10 17:20 cerulean 閱讀(7895) | 評論 (1)編輯 收藏
    之前用axis2生成代碼的時候都沒有在意過,一路用default configuration下來。
    前一陣子發(fā)現(xiàn)以前的代碼在生成時選擇的data binding不是用默認的adb方式,而是用xmlbeans。
    google了一番不同數(shù)據(jù)綁定的區(qū)別,好像也沒什么結果,大意就是adb的最簡單,但是有局限性;xmlbeans支持的比較全面,但是用起來有點兒復雜。不過,我也沒有體會出來xmlbeans強大在哪里……只是知道生成的代碼更多了,調用起來更繞彎子而已。。。

    server端用xmlbeans生成,client端用adb生成,互通是沒有問題的。
    client端用xmlbeans生成時,需要把產生于resources里面的所有.class文件打成jar包加到client端的build path里,否則運行client加載類的時候就會報錯了,好詭異,太不友好了。
    類似這種錯誤:

    ClassNotFoundException : Cannot load SchemaTypeSystem. Unable to load class with name schemaorg_apache_xmlbeans.system.s68C41DB812F52C975439BA10FE4FEE54.TypeSystemHolder. Make sure the generated binary files are on the classpath.


    所幸是在官方網(wǎng)站上有說明:http://ws.apache.org/axis2/tools/1_2/CodegenToolReference.html
    posted @ 2009-12-30 15:59 cerulean 閱讀(692) | 評論 (0)編輯 收藏
    一個JNLP文件中的資源必須由同一個證書簽名
    當需要不同證書時,可以創(chuàng)建多個JNLP文件,并在主JNLP文件中引用之。

    遇到過的問題:找不到子JNLP文件中的資源
    解決方法:竟然把子JNLP文件放到比主JNLP文件所在目錄低一級就可以了?!
    posted @ 2009-11-20 15:13 cerulean 閱讀(481) | 評論 (0)編輯 收藏

     

    JLabel.setText("<html>auto new line</html>");
    JLabel.setText("<html>line<br>force new line</html>");

     

    posted @ 2009-10-29 11:43 cerulean 閱讀(3442) | 評論 (1)編輯 收藏
    費了半天勁,敢情Firefox在3.0版本后又支持彈出modal window啦
    window.showModalDialog


    posted @ 2009-09-22 15:59 cerulean 閱讀(343) | 評論 (0)編輯 收藏
    HttpClient.getHttpConnectionManager().getParams().setSoTimeout()
    HttpClient.getHttpConnectionManager().getParams().setConnectionTimeout()

    第一個針對連接建立后,但是沒有收到response的超時時間,測試時可將server simulator收到request后等一段時間后再回response。
    出錯信息:
    java.net.SocketTimeoutException: Read timed out

    第二個針對連接建立的超時時間,測試時可將目的IP地址設為不存在的IP地址。
    出錯信息:
    org.apache.commons.httpclient.ConnectTimeoutException: The host did not accept the connection within timeout of 8000 ms
            at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:154)
    默認值為0,如果不設置的話大概2分多鐘才會得到異常


    posted @ 2009-09-10 16:09 cerulean 閱讀(5176) | 評論 (1)編輯 收藏
    導入了某證書至truststore,建立SSL連接時遇到錯誤
    javax.net.ssl.SSLKeyException: RSA premaster secret error
    Caused by: java.security.InvalidKeyException: Illegal key size or default parameters

    在windows上雙擊查看該證書時發(fā)現(xiàn)Public Key是4096bit,查了一番后發(fā)現(xiàn)Java默認好像不能處理這么長的key,必須要按照JCE的一個Unlimited Strength Jurisdiction Policy
    http://java.sun.com/javase/downloads/index_jdk5.jsp里面就有下載,這樣貌似就可以處理這種強度比較高的了。


    posted @ 2009-09-08 17:24 cerulean 閱讀(2084) | 評論 (0)編輯 收藏
    打印數(shù)組的方法,小地方,卻老忘記,來自FindBugs的提示:
    The code invokes toString on an array, which will generate a fairly useless result such as [C@16f0472. Consider using Arrays.toString to convert the array into a readable String that gives the contents of the array.

    Arrays提供一系列接收不同類型數(shù)組作為參數(shù)的toString方法

    String[] array = new String[]{"a","b","c"};
    System.out.println(Arrays.toString(array));

    posted @ 2009-08-17 15:17 cerulean 閱讀(1177) | 評論 (0)編輯 收藏
    FindBugs,http://findbugs.sourceforge.net/
    發(fā)現(xiàn)代碼中潛在bug的工具,有eclipse的插件,安裝后右鍵單擊java project name,點擊Find Bugs,切換到FindBugs得perspective可以看到結果,速度還比較快,比之前用過的一個(雖然已經(jīng)記不得名字了)快一些~具體的效果還是要逐個分析。

    Bug categories:

    Correctness bug
    Probable bug - an apparent coding mistake resulting in code that was probably not what the developer intended. We strive for a low false positive rate.
    Bad Practice
    Violations of recommended and essential coding practice. Examples include hash code and equals problems, cloneable idiom, dropped exceptions, serializable problems, and misuse of finalize. We strive to make this analysis accurate, although some groups may not care about some of the bad practices.
    Dodgy
    Code that is confusing, anomalous, or written in a way that leads itself to errors. Examples include dead local stores, switch fall through, unconfirmed casts, and redundant null check of value known to be null. More false positives accepted. In previous versions of FindBugs, this category was known as Style.
    Multithreaded correctness
         Incorrect lazy initialization and update of static field
         Calls Thread.sleep() with a lock held: better to use wait(lock)
         Synchronization on interned String could deadlock: 最好不用字符串,以免重復
    Performance
         invokes inefficient new String() constructor
         concatenates strings using + in a loop: better to use append StringBuffer
         inner class usage


    posted @ 2009-08-14 16:04 cerulean 閱讀(990) | 評論 (0)編輯 收藏
    Server

    創(chuàng)建本地證書:

    keytool -genkey -alias testserver-keyalg RSA -keystore keystore

    其中alias自己起一個別名,keystore為證書庫的文件路徑

    還可以加上-keysize 1024、2048、4096等來指定公鑰的大小,由此導出的證書查看時可以看到公鑰的大小是與之一致的。keysize越大genkey時耗費時間越長。


    會要求鍵入一個密碼,為這個證書庫的訪問密碼

    會要求填寫一些信息,姓名、單位、地區(qū)之類

    最后要求鍵入一個密碼,為這條證書別名的密碼

    導出cert

    keytool -export -alias testserver-file testcert.cer -keystore keystore

    這里的別名和文件名同上一步


    Client

    直接導入cert

    Truststore文件中存儲的是作為client,信任那些server的證書。所以需要將server提供的證書導入進來(當然可以導入n個),client才能信任。

    keytool -import -alias testserver-file testcert.cer -keystore truststore

    導入時需要輸入密碼,該密碼應該是truststore文件的訪問密碼,密碼正確才能修改其信息。

    提示是否信任該證書信息,確認。

    查看證書信息:

    keytool –list –v –keystore truststore

    如果導入過多個,則可以看到多條entry

    刪除某一個證書entry,通過指定別名來刪:

    keytool -delete -alias testserver-keystore truststore


    上述是自簽名的證書,證書鏈的長度只為
    1

    真正商用時,需要找相關機構(例如verisign)認證通過才能成為有效的證書:

    生成證書簽名請求:

    keytool -certreq -keyalg RSA -alias testserver -file certreq.csr -keystore keystore

    之后能夠收到一個證書文件,證書鏈信息包含了該機構的一些信息,然后再導入。


    有兩種方法建立
    HTTPS連接,

    一種是,在java中可以設置相關的4個系統(tǒng)參數(shù),指向相關的keystore,truststore,一旦設置,在運行時就不可改變了。除非一定要使用多個不同的證書庫文件,否則可以把多個不同證書都導入到同一個證書庫里,這樣,設置系統(tǒng)參數(shù)為唯一的值也夠用,而且也比較簡單一些。

    另一種是,自己繼承相關接口實現(xiàn)自己的證書管理器,這樣可以自定義相關行為,也可以load不同的證書庫。


    如果不設置
    password,就認為不檢查文件完整性,也能通過。如果設置了password,但是不正確,則會遇到密碼錯誤的異常;如果server證書沒有導入到client得信任列表里,則會遇到找不到可信證書的異常。

    posted @ 2009-07-16 17:27 cerulean 閱讀(575) | 評論 (0)編輯 收藏
    一個反編譯的好工具,600KB,簡單好使又免費,比之前用過的好~
    http://java.decompiler.free.fr/?q=jdgui
    posted @ 2009-06-24 13:45 cerulean 閱讀(297) | 評論 (0)編輯 收藏

    MySQL Cluster 不支持windows
    之前的說法是max版支持集群,standard版不支持,但是官方下載點里已經(jīng)看不出任何關于max,standard的標志。官方網(wǎng)站上又說5.0版本已經(jīng)包含了MySQL Cluster,所以還是下了個5.0的試試,結果是可以的。

    基本的安裝:
    linux下官方網(wǎng)站的安裝說明還是挺明確的,一步一步做就是了。
    遇到了一個問題與這篇文章一模一樣:http://www.91linux.com/html/linux_pub/fedora/20071114/8195.html
    按它的方法修改之后再次

    cd /usr/local/mysql
    bin
    /mysqld_safe --user=mysql &


    Starting mysqld daemon with databases from /var/lib/mysql
    看到上面這一行說明啟動成功。

    修改密碼:

    bin/mysqladmin -u root password yourpassword


    允許遠程訪問:

    bin/mysql -u root -p
    grant all on 
    *.* to root@"202.11.10.253" Identified by "dboomysql"

    允許地址202.11.10.253上用root用戶,密碼dboomysql來連接mysql的所有數(shù)據(jù)庫,付給所有權限。
    實質上是修改了自帶的database:mysql中user這一張表,與PostgreSQL需要修改配置文件相比還是方便一些。
    另外就是MySQL的GUI客戶端(MySQL Administrator)也比PostgreSQL的漂亮很多。

    停止MySQL:
    bin/mysqladmin -u root shutdown -p

    安裝完成后,按照這篇文章配置雙機互備
    http://hi.baidu.com/%CA%AB%D5%B9/blog/item/3b99dbc48140f7ca38db49f7.html
    但是這篇文章有筆誤:

    四、初始化集群
    在Server1中
    # ndbd --nodeid=3 --initial
    在Server2中
    # ndbd --nodeid=4 --iniitial

    應該改為——
    四、初始化集群
    在Server1中
    # ndbd --ndb_nodeid=3 --initial
    在Server2中
    # ndbd --ndb_nodeid=4 --initial

    這樣的集群配置兩臺機器都是一樣的,所以有2個管理節(jié)點,2個SQL節(jié)點,2個數(shù)據(jù)節(jié)點。集群的驗證:從任何一臺機器登上去操作數(shù)據(jù)都能雙寫。

    ndb_mgm -e show

    可以看到集群節(jié)點的信息。
    從官方網(wǎng)站上看到的例子都是用了多于3臺的機器來做的集群,僅用兩臺來做的方法好像是大家特意這么做的。

    盡管集群配置完畢,但是應用程序與數(shù)據(jù)庫建立連接不能使用其中任何一臺機器的真實IP,否則一旦該機器網(wǎng)絡連接出問題還是不行,所以還是要給DB集群的機器配置虛擬IP以供外部訪問。


    遇到過的問題:
    無法mysqld_safe啟動,也找不到日志
    解決方法:加啟動參數(shù)以指定日志

    mysqld_safe --log-error=/var/log/mysqld.log

    可以查看到錯誤日志了。

    [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
    沒轍,google唄,好像是系統(tǒng)數(shù)據(jù)庫mysql里host表的權限有問題什么的,而mysql這個庫是之前安裝時初始化過的。

    解決方法:刪除data,重新install_db

    rm -rf /usr/local/mysql/data
    cd 
    /usr/local/mysql
    scripts
    /mysql_install_db --user=mysql
    chown 
    -R root .
    chown 
    -R mysql data
    chgrp 
    -R mysql .

     

    bin/mysqld_safe --log-error=/var/log/mysqld.log --ndb_nodeid=5 --user=mysql &

    啟動成功了。

    btw, mysql官方網(wǎng)的forum好像不能“平板顯示”,好不方便。


    關閉Cluster,在管理節(jié)點所在的機器上:
    /usr/local/mysql/ndb_mgm -e shutdown
    關閉SQL節(jié)點的mysqld服務:
    /usr/local/mysql/bin/mysqladmin -uroot shutdown

    posted @ 2007-12-17 21:38 cerulean 閱讀(616) | 評論 (0)編輯 收藏
    java默認的JVM內存占用:初始1MB,最大64MB
    可以通過java -Xms256m -Xmx256m ClassName來調整。
    xms和xmx的值最好相同,否則調整的效率可能不高。
    如果程序運行中,發(fā)生內存溢出,那么不會以Exception的形式拋出,而是"Error"
    如果沒有catch(Error error),那么控制臺將顯示錯誤:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space,而且后面的程序也不會執(zhí)行。
    posted @ 2007-12-17 21:26 cerulean 閱讀(1130) | 評論 (0)編輯 收藏
    雖然RMI已經(jīng)不大推薦使用了,但是方法還是要記住的。
    在產生.class文件的根目錄,例如/bin
    cd /bin
    rmic com.test.RMIImpl

    將在/bin/com/test目錄下產生RMIImpl_Stub.class文件
    cd /bin
    jar cvf test.jar com
    /test/RMIIntf.class com/test/RMIImpl_Stub.class

    將在/bin目錄下產生test.jar文件,供RMI客戶端調用
    posted @ 2007-12-17 21:12 cerulean 閱讀(887) | 評論 (0)編輯 收藏

    遇到經(jīng)典的getParameter中文亂碼的問題,網(wǎng)上已經(jīng)有很多總結和討論了。
    在jsp里調用了*.do?param=name,當name本身的值為中文時,在action里獲取時有亂碼問題。

    調用.do的jsp頁面頭已經(jīng)設置過

    <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>


    即便在action里設置了

    request.setCharacterEncoding 

    也沒有效果。

    最后的解決方法:

    String str = request.getParameter("param");

    改為

    String str = new String(request.getParameter("param").getBytes("ISO-8859-1"),"GB2312");
    posted @ 2007-12-17 21:09 cerulean 閱讀(3715) | 評論 (0)編輯 收藏

    struts的<html:form>標簽中沒有"name"屬性,但是使用"styleId"屬性可以替代。
    需要注意的問題是,假如定義了:

    <html:form styleId="test" action="testIt.do">

    同時還定義了一個一樣名為test的javascript function:
    function test(){
       alert('hello');
    }

    則,在試圖調用此function時會出現(xiàn)錯誤:
    <onclick="test()">click me</a>
    posted @ 2007-12-05 10:53 cerulean 閱讀(3341) | 評論 (1)編輯 收藏
    windows下.exe安裝版中,TOMCAT_HOME/conf下,是沒有l(wèi)ogging.properties這個文件的(在解壓版中有)。安裝版的logging.properties文件位于TOMCAT_HOME/common/classes下。
    posted @ 2007-09-03 17:01 cerulean 閱讀(1138) | 評論 (0)編輯 收藏
    Windows->Preferences->General->Compare/Patch->Ignore white space
    posted @ 2007-08-28 16:45 cerulean 閱讀(872) | 評論 (0)編輯 收藏
    Team->Branch/Tag時,必須輸入注釋,否則即便看起來好像執(zhí)行了操作,但是卻沒有真正創(chuàng)建分支在SVN server上。
    posted @ 2007-08-28 15:35 cerulean 閱讀(1092) | 評論 (0)編輯 收藏
    其實還是挺糊涂的,org.apache.struts.action.ActionForm的Reset()方法,不過知道可以在該方法中set該Form的一些屬性值,就能夠在頁面上顯示為該對應控件的默認值,比較方便。

    public void reset(ActionMapping mapping, HttpServletRequest request) {
       
    //set default value for the first display
       this.setType("0");
    }
    posted @ 2007-08-23 14:55 cerulean 閱讀(1260) | 評論 (0)編輯 收藏
    在eclipse中已經(jīng)集成了ant,如果創(chuàng)建名為build.xml的文件,就會被識別為ant的文件。ShowView->Outline會有一些提示。
    在eclipse中,右鍵build.xml,
    選擇:Run As Ant Build,會執(zhí)行默認的任務
    選擇:Run As Ant Build...,在彈出框中,可以選擇執(zhí)行哪些任務.

    當直接使用ant命令時,可以用-D來輸入?yún)?shù),
    例如ant -buildfile package.xml -Dversion=1_0,指定了version的值。
    posted @ 2007-08-14 15:18 cerulean 閱讀(444) | 評論 (0)編輯 收藏
    **.jsp?param=1
    那么request.getParameter("param")就可以勒!
    原來用request.getAttribute死活不行,以為必須得用form傳遞呢,敢情getParameter就行~~

    所以如果想只用jsp頁面的話,可以這樣子做:
    hello.jsp:
    function hello(name)
    {
        sayHello(name);
    }

    function sayHello(id)
    {
        window.location
    ="sayHelloCommit.jsp?id="+id;
    }

    sayHelloCommit.jsp:
    <%@ page contentType="text/html;charset=gb2312"%>
    <%
    String str = (String) request.getParameter("id");
    //To Something using the "str"
    //redirect to a page
    response.sendRedirect(
    "hello.jsp");
    %>

    posted @ 2007-08-13 16:51 cerulean 閱讀(692) | 評論 (0)編輯 收藏
    more *.log | grep keywords

    vi一個寫有中文內容的文件,只能看到其unicode。more該文件就可以看到中文內容。
    當keywords中包含空格時,需要用""將keywords擴起來。
     
    posted @ 2007-08-02 17:19 cerulean 閱讀(334) | 評論 (0)編輯 收藏
    如題
    posted @ 2007-08-01 09:41 cerulean 閱讀(2150) | 評論 (0)編輯 收藏

    Linux和windows下,文件中的換行符好像是不同的,當在windows下用UE打開一來自linux的文件時,好像會問你是不是要轉換到DOS格式什么的。在eclipse中打開代碼時,有時也會遇到類似的問題,尤其是.xml文件。
    今天在看weka的網(wǎng)站時,無意看到在eclipse中有一個設置貌似是專門用來做這個的:
    eclipse->Window -> Preferences -> General -> Editors 里面有一個"New text file line delimiter",可以在other中選擇Unix。

    posted @ 2007-07-26 10:27 cerulean 閱讀(817) | 評論 (0)編輯 收藏
    7種武器
    array/String/HashMap
    regular expressions
    debug
    two programming languages
    one IDE
    SQL
    software idea
    posted @ 2007-07-25 22:21 cerulean 閱讀(251) | 評論 (0)編輯 收藏
    小心仔細的使用靜態(tài)變量,因為有的時候它表現(xiàn)的過于“靜態(tài)”,而不符合習慣性的想法,容易引入不易發(fā)現(xiàn)的bug。
    因為經(jīng)常是在單次運行程序時還不會反映出來,只有在多次運行時才能顯露效果。
    posted @ 2007-07-25 22:20 cerulean 閱讀(290) | 評論 (0)編輯 收藏

    windows命令行支持的ftp命令,下載東西時默認是ASCII編碼,于是一個.war文件下載后的文件大小就不大對,部署時tomcat也不認識,報出invalid header的錯誤。
    因此用這個命令下載時需要轉換成二進制。而如果用現(xiàn)成的FTP工具下載就不會有問題。

    posted @ 2007-07-25 22:18 cerulean 閱讀(337) | 評論 (0)編輯 收藏

    以前天真的認為只要把兩個tomcat的端口號修改成不同的就哦了呢,結果不行。
    實際情況是(轉自CSDN):
    1.特別要注意:不要設置CATALINA_HOME
    2.分別修改安裝目錄下的conf子目錄中的server.xml文件:
    a.修改http訪問端口(默認為8080端口),將8080修改為tomcat不在使用的端口號。此處所設的端口號即是以后訪問web時所用的端口號。
    b.修改Shutdown端口(默認為8005端口),將8005修改為沒有在使用的端口號,例如8055。
    c.修改8009端口,將8009修改為沒有在使用的端口號,例如8099
    (注意:兩個文件中對應的端口號要不一樣)
    3.依次啟動兩個tomcat。

    另外,因為打開了axis2的SOAPMonitor,今天不知道怎么回事兒monitor頁面無法正常顯示了,tomcat啟動時也報出了address in use:5001的錯誤。一開始以為是兩個tomcat的問題,后來才意識到是SOAPMonitor的端口沖突了(也不知道是和誰沖突了。。。)反正改吧:
    webapps/axis2/WEB-INF/web.xml
    <init-param>
              <param-name>SOAPMonitorPort</param-name>
              <param-value>5011</param-value>
    </init-param>
    把原來的5001改成比如5011就哦了。

    posted @ 2007-07-25 22:15 cerulean 閱讀(1382) | 評論 (0)編輯 收藏
    用myeclipse創(chuàng)建web工程時,向web.xml文件中添加一些taglib的時候,總會報錯,不過不影響使用。
    在網(wǎng)上查了一下,好像是web.xml文件頭格式的問題,最簡單的解決方法是多加一個<jsp-config>標簽,以struts標簽為例:
    <jsp-config>
    <taglib>
          
    <taglib-uri>/WEB-INF/struts-html</taglib-uri>
          
    <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
      
    </taglib>
      
      
    <taglib>
          
    <taglib-uri>/WEB-INF/struts-bean</taglib-uri>
          
    <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
      
    </taglib>
      
      
    <taglib>
          
    <taglib-uri>/WEB-INF/struts-logic</taglib-uri>
          
    <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
      
    </taglib>
    </jsp-config>
    posted @ 2007-04-15 10:13 cerulean 閱讀(1839) | 評論 (2)編輯 收藏
    在web.xml中,會將HTTP的404錯誤導向一個錯誤頁面:
    <error-page>
        
    <error-code>404</error-code>
        
    <location>/errors.jsp</location>
    </error-page>

    但是今天發(fā)現(xiàn)隨便訪問一個不存在頁面時,并沒有如預期的一樣出現(xiàn)自定義的錯誤頁面。在網(wǎng)上查了一下,原來是IE對于內容非常少的自定義錯誤頁面是不會顯示出來的,而firefox就沒有問題。
    于是,把錯誤頁面的內容多加了幾行字,就可以了。
    posted @ 2007-04-15 10:04 cerulean 閱讀(386) | 評論 (0)編輯 收藏

    ????以前上學的時候數(shù)據(jù)庫學的是皮毛中的皮毛,唯一的課程設計也只是跑幾個簡單得很得SQL語句而已。無論是數(shù)據(jù)庫設計,還是SQL語句的各種經(jīng)典寫法和強大功能都沒有怎么好好地研究過。
    ??????? 功能上的學習都不全面,就更不要提性能、安全和大數(shù)據(jù)量等等在實際應用中會遇到的問題勒。參與的一個項目中,就涉及到比較大量的數(shù)據(jù)量的處理和存儲(當然處理大數(shù)據(jù)量就是另外一個問題勒)。加之分配給數(shù)據(jù)庫所在的磁盤空間相當有限,造成了非常捉襟見肘的局面。
    ??????? 幻想著有朝一日可以不為這些事情煩惱,像google,sina一樣,用幾十上百臺配置一般的機器連起來也能作為一個強壯的server。

    從網(wǎng)上看到一些關于存儲海量數(shù)據(jù)的討論:
    1、分表、分數(shù)據(jù)庫
    根據(jù)一定的規(guī)則把不同的數(shù)據(jù)庫表分開
    缺點:有一定風險,因為一旦分開存放的兩個數(shù)據(jù)庫表有朝一日需要“聯(lián)表”操作,那么就郁悶了,而且最好是把幾個數(shù)據(jù)量大的表分開,單獨拎出來幾個小表意義很不大,而且業(yè)務邏輯層的代碼需要知道自己要處理的數(shù)據(jù)存在哪個服務器里,有一點兒奇怪。

    例如:(來自ball_lei)
    ??????? 我現(xiàn)在采用的架構采用數(shù)據(jù)庫群的方式,每個客戶的數(shù)據(jù)單獨存在一臺數(shù)據(jù)庫服務器上,所有的客戶根據(jù)一定的規(guī)則安排存放的數(shù)據(jù)庫服務器,在主數(shù)據(jù)庫服務器上有一張-索引表保存客戶與數(shù)據(jù)庫服務器的對應關系,每臺數(shù)據(jù)庫服務器中用于存放這些數(shù)據(jù)的表按照月份分成12張,每張存放當月的全部客戶的數(shù)據(jù),目前計算出單臺服務器-單表需要容納9億條數(shù)據(jù),并且每臺服務器在這種方式下可以容納10000個客戶的數(shù)據(jù),以后客戶數(shù)量增加時只需要增加數(shù)據(jù)庫服務器即可。
    ??????? 程序邏輯,我采用業(yè)務邏輯層的概念,對外提供應用服務器接口,全部的客戶端通過應用服務器接口進行業(yè)務運算,應用服務器我也采用服務器群的概念,有一個主的應用服務器,有幾個副應用服務器,全部客戶端只知道該主應用服務器的地址,上線時登陸主應用服務器,然后主應用服務器根據(jù)各臺應用服務器的負載情況返回給客戶端真正的登陸地址(副應用服務器的地址),然后客戶端再登陸到上面進行業(yè)務處理,每臺應用服務器都能夠訪問各臺數(shù)據(jù)服務器進行數(shù)據(jù)提取。

    問題:需要每臺應用服務器都配備一個公網(wǎng)ip么,還是有其他的方式可以只需要一個公網(wǎng)ip可以給全部的服務器公用?Nat能夠實現(xiàn)么?或者能否進行更好的負載均衡,就是客戶端的各種業(yè)務都可以在不同的服務器上運算

    改進:
    用戶規(guī)則配置應該不大,所以也可以做成配置一次Load到內存中。

    如此大數(shù)據(jù)量的項目竟不用Oracle,實在讓人費解。我現(xiàn)在的月數(shù)據(jù)量大概2.5億,用了3臺HP
    SUPERDEMO,9個CUSTERMOR DB。其中一個CATALOG數(shù)據(jù)庫,相當于你的客戶索引。
    你的插入操作很多,所以建議少建幾個索引,其實一些業(yè)務完全可以在數(shù)據(jù)庫中完成,通過觸發(fā)器,約束和存儲過程,這樣性能會有大的提高。大數(shù)據(jù)的表,分區(qū)的確是必須的,當然,還需要更完善的維護計劃,否則很容易,你的業(yè)務可能就會因為性能問題掛起了。

    1、通過(數(shù)據(jù)庫+文件)方式進行數(shù)據(jù)存儲

    2、集群方案

    還有當初選修的“分布式數(shù)據(jù)庫”,不知道這個概念是不是能夠活生生的用到項目中來。。。

    posted @ 2007-03-20 21:21 cerulean 閱讀(889) | 評論 (0)編輯 收藏

    DAO層: JUnit test,需要用dbunit恢復現(xiàn)場;
    service層:JUnit test,需要用dbunit恢復現(xiàn)場,邏輯更重要些,分支覆蓋更重要些;
    action:不做測試;
    selenium:做集成測試。
    ????盡管有人認為struts action不需要做測試,不過無意中看到strutsTestCase這個東東,還沒有試,用途是測試struts的action.覺得比較有用.
    ????尤其是,如果web頁面交由第三方來做的話,那么單獨對action進行測試就是十分有必要的.
    ????但是,如果整個web系統(tǒng)從前臺到后臺都是一個team來做,那么個人認為還不如跟頁面一起集成測,畢竟這是真實情況,而且從頁面上可視性更強,更容易發(fā)現(xiàn)問題.與此同時,使用腳本錄制回放測試工具(還沒有試過)提高效率.

    posted @ 2007-03-20 21:17 cerulean 閱讀(431) | 評論 (0)編輯 收藏

    “jMock利用mock objects思想來對Java code進行測試。jMock具有以下特點:容易擴展,讓你快速簡單地定義mock objects,因此不必打破程序間的關聯(lián),你定義靈活的超越對象之間交互作用而帶來測試局限,減少你測試地脆弱性。”

    ??? 跟JMock功能類似的還有EasyMock。
    ??? 簡單試驗后的感覺沒有試驗DBUnit后的感覺強烈,試了DBUnit的感覺是這東西以后一定要用.
    ??? 但個人認為mock object這種東西能不用就不用,模擬來模擬去,最后還是要和真東西聯(lián)調,所以mock的階段應該是盡可能的短才是.

    使用模仿對象進行測試的常用編碼樣式是:
    · 創(chuàng)建模仿對象的實例
    · 設置模仿對象中的狀態(tài)和期望值
    · 將模仿對象作為參數(shù)來調用域代碼
    · 驗證模仿對象中的一致性

    代碼中的大概過程:
    ???? Mock mock = new Mock(**.class);//構造一個那個類的mock對象,把這個類傳入Mock
    ???? 使用mock.expects方法,來設置想要執(zhí)行的操作:執(zhí)行幾次、執(zhí)行哪個方法、傳什么參、返回什么值
    ?????獲得那個mock對象:** x = (**)mock.proxy();//proxy方法返回代理類實例,即虛擬對象實例
    ???? 然后run **.class的那個方法(call methods on the mock object, expectation on it will deliver the result set up by yourself)

    ???? 寫mock-object 測試,需要有獨立的接口作為mock的對象(從而促進了針對接口編程的習慣),還有個好的副作用:他迫使你來重寫一些代碼。實際上,代碼常常寫的不好。你讓類和環(huán)境之間產生了不必要的耦合。

    posted @ 2007-03-20 21:05 cerulean 閱讀(473) | 評論 (0)編輯 收藏

    DBUnit擴展自JUnit.在使用DBUnit之前,為了驗證自己編寫的涉及數(shù)據(jù)庫操作方法的正確性,每次都要執(zhí)行一個簡單的sql腳本,灌些數(shù)據(jù),然后人眼觀察著數(shù)據(jù)表中的數(shù)據(jù).然后,代碼執(zhí)行完畢后,再次觀察數(shù)據(jù)變化情況.久而久之,表里面的數(shù)據(jù)就變得雜亂,一般會全部刪除,重新來過.
    ??? DBUnit的目標正是保證數(shù)據(jù)庫數(shù)據(jù)環(huán)境的穩(wěn)定性,具備將數(shù)據(jù)庫中數(shù)據(jù)與xml文件之間雙向轉換的能力.
    試驗了一下,

    首先,下載dbunit的jar包,加入工程即可.
    1.從xml中將數(shù)據(jù)導入數(shù)據(jù)庫表
    tc不再繼承自TestCase,而是繼承DatabaseTestCase
    覆蓋幾個方法,包括獲得xml文件內容,獲得DB連接,以及在setup方法和teardown方法中調用提供的dbunit操作類型,構建數(shù)據(jù)庫內數(shù)據(jù)環(huán)境.

    這時,我以為如果只有幾個簡單的數(shù)據(jù),寫xml固然簡單,但想測試大數(shù)據(jù)量時(雖然UT主要是測試功能而非性能,但是大數(shù)據(jù)量也方便驗證)就有點問題,好在是雙向的,可以先把數(shù)據(jù)用function灌入數(shù)據(jù)庫,再導進xml里面:

    2.從數(shù)據(jù)庫表數(shù)據(jù)導入xml文件
    ??? 用ant+DBUnit來完成這個任務非常方便!

    < target? name ="export" >
    ????????
    < taskdef? name ="dbunit" ?classname ="org.dbunit.ant.DbUnitTask" ?classpathref ="compile.path" ? />
    ????????
    < dbunit? driver ="com.mysql.jdbc.Driver" ?url ="jdbc:mysql://127.0.0.1:3306/mydb" ?userid ="root" ?password ="root" ?supportBatchStatement ="true" >
    ????????????
    < export? dest ="${test.srcpath}/export.xml" > ????????????????
    ????????????????
    < query? name ="test_table" ?sql ="SELECT?*?FROM?test_table" ? /> ????????
    ????????????????
    < table? name ="user_table" ? />
    ????????????
    </ export >
    ????????
    </ dbunit >
    ????
    </ target >


    ??? 疑問,看到有人說DBUnit在清除數(shù)據(jù)時,有時不能徹底,原因是分析不出來外鍵等表之間的約束.因為在試驗中采用的數(shù)據(jù)庫里沒啥表之間的約束,所以還沒有體會到.

    ??? DatabaseTestCase類提供了兩個方法來控制測試前和測試后的數(shù)據(jù)庫狀態(tài):getSetUpOperation() 和 getTearDownOperation().???????
    ??? 一種高效的實施方案就是讓getSetUpOperation()方法執(zhí)行REFRESH操作,通過這個操作,我們可以用種子文件中的數(shù)據(jù)去更新目標數(shù)據(jù)庫里的數(shù)據(jù)。
    ??? 接下來,就是getTearDownOperation(),讓他去執(zhí)行一個NONE操作,也就是什么也不執(zhí)行
    ??? 常用操作:
    ??? DatabaseOperation.CLEAN_INSERT;?先刪除表中所有,再插入準備的數(shù)據(jù)
    ??? DatabaseOperation.REFRESH;?使用準備數(shù)據(jù)更新表,存在則update,不存在則insert
    ??? DatabaseOperation.DELETE;??只刪除準備的數(shù)據(jù)
    ??? DatabaseOperation.NONE;??啥都不做

    posted @ 2007-03-20 20:59 cerulean 閱讀(1808) | 評論 (0)編輯 收藏

    前提:testlink已經(jīng)跟mantis安裝在同一個環(huán)境下
    步驟:
    參照http://crystaliris.bokee.com/5588155.html,testlink網(wǎng)站也給出了比較清楚的文檔說明。
    1.修改testlink關于interface的配置為"MANTIS",如果用別的BTS(Bug Trace System),有其他的對應值。
    2.修改testlink目錄下cfg/mantis.cfg.php(如果用別的BTS,修改其他對應目錄下的配置),配置一些關于mantis的數(shù)據(jù)庫和url屬性。
    3.修改mantis的配置文件,打開匿名登錄,由于匿名登錄的用戶名需要是一個已經(jīng)存在的真實用戶,而我又沒在mantis上創(chuàng)建新的用戶,所以就填寫成administrator了。

    posted @ 2007-03-11 21:33 cerulean 閱讀(861) | 評論 (0)編輯 收藏
    測試RMI接口實現(xiàn)修改后,jar包用不用重新打
    可以的,接口實現(xiàn)修改了,只要接口定義不變,RMIClient調用后,都會按照Server端最新的實現(xiàn)來得到結果.

    在class文件的根目錄下(例如bin目錄)執(zhí)行rmic命令,寫完整接口實現(xiàn)的包名。
    posted @ 2007-03-11 21:29 cerulean 閱讀(350) | 評論 (0)編輯 收藏

    環(huán)境:windows
    下載scarab-1.0-b20.zip,直接解壓即可.
    需要JDK,Ant(或者maven,scarab推薦maven),DB(推薦MySQL)
    在解壓后的\scarab-1.0-b20目錄中,創(chuàng)建build.properties,以指定數(shù)據(jù)庫連接的參數(shù).

    例如:
    scarab.database.type=mysql
    scarab.database.name=scarab
    scarab.database.jdbc.driver=org.gjt.mm.mysql.Driver
    scarab.database.host=localhost
    scarab.database.port=3306
    scarab.database.username=root
    scarab.database.password=root
    scarab.database.admin.username=${scarab.database.username}
    scarab.database.admin.password=${scarab.database.password}

    #發(fā)送郵件的郵件服務器也可以寫在這里
    system.mail.host=smtp.126.com

    數(shù)據(jù)庫方面,本來想使用postgreSQL,結果發(fā)現(xiàn)對于scarab來說配置比較特殊,于是就裝了MySQL[見MySQL的那篇文吧].
    數(shù)據(jù)庫配置寫好以后,進入\scarab-1.0-b20\build\目錄,運行ant,就對scarab進行構建啦,能夠看到BUILD SUCCESSFULLY就成功啦!!
    感覺scarab可以配置的地方很多很多,不過配置修改后還是需要重新build的.之前遇到過的錯誤就是在寫好數(shù)據(jù)庫配置后沒有重新build造成的.

    構建成功后,就可以使用啦: 進入\scarab-1.0-b20\tomcat\bin目錄,運行startup.bat,tomcat就啟動起來了,訪問http://localhost:8080/scarab/就可以啦。

    因為很多功能都需要發(fā)郵件來協(xié)助,所以要使用SMTP服務器,比方說smtp.126.com,user=realuser,password=realuserpassword

    總得來說,覺得scarab界面不是很友好,也不是很美觀。
    由于一開始郵件服務器不能用,所以直接到數(shù)據(jù)庫中update用戶的狀態(tài)為CONFIRMED。這樣子成功登錄后,點擊“申請新角色”時,竟然拋出錯誤了,不知道是什么原因,無法繼續(xù)了,挺郁悶的。

    posted @ 2007-03-06 22:11 cerulean 閱讀(800) | 評論 (0)編輯 收藏

    C-JDBC(Java 數(shù)據(jù)庫連接群集)作為開發(fā)源碼的數(shù)據(jù)庫群集中間件,可以讓任何應用程序通過JDBC能夠透明的訪問數(shù)據(jù)庫群集。數(shù)據(jù)庫可以分布在多個節(jié)點并可以進行數(shù)據(jù)復制,C-JDBC能夠均衡在這些節(jié)點之間的查詢負載。 C-JDBC通過軟件來實現(xiàn)RAIDb(廉價數(shù)據(jù)庫冗余陣列)。C-JDBC是GNU LGPL許可證下的ObjectWeb項目。
    http://c-jdbc.objectweb.org/網(wǎng)站上的C-JDBC-Brochure-EN.pdf寫的內容挺好。(C-JDBC)tutorial.pdf內容也挺翔實。

    大型應用隨著用戶量訪問越來越大,增加數(shù)據(jù)庫存儲和做好數(shù)據(jù)庫冗余可以增加系統(tǒng)的可靠性和性能。

    無需修改客戶端應用程序,無需變更應用服務器或數(shù)據(jù)庫服務器軟件。C-JDBC的JDBC driver把SQL請求轉給C-JDBC controller(負責在databases之間做負載均衡)
    The database is distributed and replicated among several nodes and C-JDBC load balances the queries between these nodes.
    就這一句話就太誘人了!

    上周的某一個上午,搞定C-JDBC的安裝配置啦~
    主要根據(jù)官方的user guide和這篇好文: http://huaronghu.spaces.live.com/blog/cns!B9A68E1C1CA857AD!288.entry


    準備工作:
    環(huán)境:windows,postgreSQL,JDK
    建立數(shù)據(jù)庫“們”,安裝若干db在若干server上,所以如果使用商業(yè)數(shù)據(jù)庫的話,就會需要好幾套的錢哪。
    安裝C-JDBC:
    下載了binary版的c-jdbc-2.0.2-bin.zip,解壓到作為C-JDBC server的機器上(e.g. C:\software\c-jdbc-2.0.2-bin),
    設置環(huán)境變量,新增系統(tǒng)變量:CJDBC_HOME =C:\software\c-jdbc-2.0.2-bin
    把實際使用的數(shù)據(jù)庫的JDBC driver(例如mysql-connector-java-3.1.12-bin.jar ,postgresql-8.0.309.jdbc2.jar)拷貝到c-jdbc/drivers 中

    配置文件:
    在c-jdbc-2.0.2-bin/config/virtualdatabase目錄中創(chuàng)建虛擬數(shù)據(jù)庫配置文件。
    里面DatabaseBackend 標簽中定義的就是被集群的數(shù)據(jù)庫。
    試驗時,創(chuàng)建了文件:postgresql-raidb1-distribution.xml,使用了2個postgreSQL數(shù)據(jù)庫,采用了全復制的方法。
    注意,如果采用全復制,所以在2個數(shù)據(jù)庫上建庫、建表的全部腳本都要完全相同,否則將會報出mismatch的錯誤。
    目前感覺配置里面最有用的配置就是<AuthenticationManager>,<DatabaseBackend>和<LoadBalancer>(還沒有仔細看)。
    配置時可以參考已經(jīng)提供的例子,c-jdbc-2.0.2-bin/config/RAIDb-1-full-example.xml,里面對每一個屬性都有比較詳細的注釋,DatabaseBackend中還有各個開源數(shù)據(jù)庫連接的例子,挺貼心的。

    <? xml?version="1.0"?encoding="UTF8" ?>
    <! DOCTYPE?C-JDBC?PUBLIC?"-//ObjectWeb//DTD?C-JDBC?2.0.2//EN"?"http://c-jdbc.objectweb.org/dtds/c-jdbc-2.0.2.dtd" >

    < C-JDBC >
    ??
    ??
    < VirtualDatabase? name ="myDB" ?maxNbOfConnections ="20" ?minNbOfThreads ="1" ?maxNbOfThreads ="20" ?blobEncodingMethod ="hexa" >
    ????
    < AuthenticationManager >
    ??????
    < Admin >
    ???????
    < User? username ="admin" ?password ="c-jdbc" />
    ??????
    </ Admin > ?
    ??????
    < VirtualUsers >
    ????????
    < VirtualLogin? vLogin ="boss" ?vPassword ="boss" />
    ??????
    </ VirtualUsers >
    ????
    </ AuthenticationManager >

    ???
    < DatabaseBackend? name ="postgreSQLNode114" ?driver ="org.postgresql.Driver" ?url ="jdbc:postgresql://10.10.0.114:5432/clusterdb" ?connectionTestStatement ="select?now()" >
    ?
    < DatabaseSchema? dynamicPrecision ="column" />
    ??????
    < ConnectionManager? vLogin ="boss" ?rLogin ="postgres9" ?rPassword ="12345" >
    ?
    < RandomWaitPoolConnectionManager? poolSize ="20" />
    ??????
    </ ConnectionManager >
    ????
    </ DatabaseBackend >

    ????
    < DatabaseBackend? name ="postgreSQLNode155" ?driver ="org.postgresql.Driver" ?url ="jdbc:postgresql://10.10.0.155:5432/clusterdb" ?connectionTestStatement ="select?now()" >
    ?
    < DatabaseSchema? dynamicPrecision ="column" />
    ??????
    < ConnectionManager? vLogin ="boss" ?rLogin ="postgres" ?rPassword ="abcde" >
    ?
    < RandomWaitPoolConnectionManager? poolSize ="20" />
    ??????
    </ ConnectionManager >
    ????
    </ DatabaseBackend >

    ????
    < RequestManager >
    ??????
    < RequestScheduler >
    ?????????
    < RAIDb-1Scheduler? level ="passThrough" /> ???
    ??????
    </ RequestScheduler >

    ??????
    < RequestCache >
    ?????????
    < MetadataCache? maxNbOfMetadata ="10000" ?maxNbOfField ="0" />
    ?????????
    < ParsingCache? backgroundParsing ="false" ?maxNbOfEntries ="5000" /> ???
    ?????????
    < ResultCache? granularity ="table" ?maxNbOfEntries ="100000" ?pendingTimeout ="0" >
    ???????
    < ResultCacheRule? queryPattern ="default" ?timestampResolution ="1000" >
    ?????????????
    < EagerCaching />
    ?????????
    </ ResultCacheRule >
    ?????????
    </ ResultCache >
    ??????
    </ RequestCache >

    ??????
    < LoadBalancer >
    ?????????
    < RAIDb-1 >
    ?????????
    < RAIDb-1-LeastPendingRequestsFirst /> ??
    ?????????
    </ RAIDb-1 >
    ??????
    </ LoadBalancer > ????????
    ????
    </ RequestManager >
    ??
    </ VirtualDatabase >
    </ C-JDBC >

    ?

    在c-jdbc-2.0.2-bin/config/controller目錄中創(chuàng)建一個c-jdbc controller的配置文件。
    試驗時,創(chuàng)建的配置文件為:uud-controller-distributed.xml

    <? xml?version="1.0"?encoding="UTF8"? ?>
    <! DOCTYPE?C-JDBC-CONTROLLER?PUBLIC?"-//ObjectWeb//DTD?C-JDBC-CONTROLLER?2.0.2//EN"??"http://c-jdbc.objectweb.org/dtds/c-jdbc-controller-2.0.2.dtd" >
    < C-JDBC-CONTROLLER >
    ??
    < Controller? port ="25322" >
    ????
    < Report />
    ????
    < JmxSettings >
    ??????
    < RmiJmxAdaptor? port ="1091" />
    ????
    </ JmxSettings >
    ????
    < VirtualDatabase? configFile ="postgresql-raidb1-distribution.xml" ?virtualDatabaseName ="myDB" ?autoEnableBackends ="true" ?checkpointName ="Initial_empty_recovery_log" />
    ??
    </ Controller >
    </ C-JDBC-CONTROLLER >

    ?

    注意:Controller和VirtualMachine的配置文件不能采用相同的文件名

    啟動:
    在c-jdbc-2.0.2-bin\bin目錄下,運行controller.bat -f ../config/controller/uud-controller-distributed.xml
    unix用戶使用controller.sh來啟動controller

    截圖:(下回補)
    湊合看一下吧,控制臺的正常輸出:
    C:\software\c-jdbc-2.0.2-bin\bin>controller.bat -f ../config/controller/uud-cont
    roller-distributed.xml
    2007-03-07 15:16:44,017 INFO? controller.core.Controller C-JDBC controller (2.0.
    2)
    2007-03-07 15:16:44,439 INFO? controller.core.Controller Loading configuration f
    ile: ../config/controller/uud-controller-distributed.xml
    2007-03-07 15:16:44,752 INFO? controller.core.Controller JMX is enabled
    2007-03-07 15:16:44,830 INFO? controller.core.Controller Starting JMX server on
    host: 10.10.0.155
    2007-03-07 15:16:46,376 INFO? backend.DatabaseBackend.postgreSQLNode114 Adding c
    onnection manager for virtual user "boss"
    2007-03-07 15:16:46,501 INFO? backend.DatabaseBackend.postgreSQLNode155 Adding c
    onnection manager for virtual user "boss"
    2007-03-07 15:16:46,642 INFO? controller.RequestManager.myDB Request manager wil
    l parse requests with the following granularity: TABLE
    2007-03-07 15:16:46,657 WARN? controller.virtualdatabase.myDB No recovery log ha
    s been configured, enabling backend without checkpoint.
    2007-03-07 15:16:48,641 INFO? backend.DatabaseBackend.postgreSQLNode114 Detected
    ?backend as: PostgreSQL
    2007-03-07 15:16:49,063 WARN? backend.DatabaseBackend.postgreSQLNode114 Statemen
    t.getGeneratedKeys not supported.
    2007-03-07 15:16:49,579 INFO? backend.DatabaseBackend.postgreSQLNode114 Gatherin
    g database schema
    2007-03-07 15:16:49,782 INFO? controller.RequestManager.myDB Setting new virtual
    ?database schema.
    2007-03-07 15:16:49,782 INFO? cjdbc.controller.cache Setting new database schema
    .
    2007-03-07 15:16:49,782 INFO? controller.loadbalancer.RAIDb1 Adding blocking tas
    k worker thread for backend postgreSQLNode114
    2007-03-07 15:16:49,797 INFO? controller.loadbalancer.RAIDb1 Adding non blocking
    ?task worker thread for backend postgreSQLNode114
    2007-03-07 15:16:49,797 INFO? controller.RequestManager.myDB Database backend po
    stgreSQLNode114 is now enabled
    2007-03-07 15:16:50,922 INFO? backend.DatabaseBackend.postgreSQLNode155 Detected
    ?backend as: PostgreSQL
    2007-03-07 15:16:51,328 WARN? backend.DatabaseBackend.postgreSQLNode155 Statemen
    t.getGeneratedKeys not supported.
    2007-03-07 15:16:52,172 INFO? backend.DatabaseBackend.postgreSQLNode155 Gatherin
    g database schema
    2007-03-07 15:16:52,390 INFO? controller.RequestManager.myDB Virtual database sc
    hema merged with new schema.
    2007-03-07 15:16:52,390 INFO? cjdbc.controller.cache Merging new database schema

    2007-03-07 15:16:52,390 INFO? controller.loadbalancer.RAIDb1 Adding blocking tas
    k worker thread for backend postgreSQLNode155
    2007-03-07 15:16:52,390 INFO? controller.loadbalancer.RAIDb1 Adding non blocking
    ?task worker thread for backend postgreSQLNode155
    2007-03-07 15:16:52,406 INFO? controller.RequestManager.myDB Database backend po
    stgreSQLNode155 is now enabled
    2007-03-07 15:16:52,422 WARN? VirtualDatabaseWorkerThread.myDB.metadata Metadata
    ?key [getMaxColumnsInIndex] is not compatible. (Backends are: [jdbc:postgresql:/
    /10.10.0.114:5432/clusterdb] and [jdbc:postgresql://10.10.0.155:5432/clu
    sterdb] ; Values are:[32] and [0])
    2007-03-07 15:16:52,422 INFO? controller.core.Controller Adding VirtualDatabase
    myDB
    2007-03-07 15:16:52,437 INFO? controller.core.Controller Waiting for connections
    ?on 0.0.0.0:25322
    2007-03-07 15:16:52,469 INFO? controller.core.Controller Controller started on 2
    007.03.07 10 at 03:16:52 下午 GMT+08:00
    2007-03-07 15:16:52,484 INFO? controller.core.Controller Controller 10.10.0.
    155:25322 ready, listening to requests ...



    遇到過的問題:
    1、
    剛啟動沒一會兒,就看到config文件讀取錯誤,控制臺信息也就此結束。
    解決方法:controller.bat -f filename中filename的相對路徑和文件名竟然都寫錯了,汗。。。。

    2、
    啟動時,控制臺拋出ERROR以及exception,大意是connection failed, IP沒有配置到pg_hba.conf中
    解決方法:雖然是連本機的一個數(shù)據(jù)庫,但是由于數(shù)據(jù)庫連接的url里面寫的是IP地址,所以仍然要把本機的IP地址配置到pg_hba.conf以允許其訪問。

    3、
    還是啟動時拋錯了,Connection test failed(org.postgresql.util.PSQLException:Backend start-up failed:FATAL:role "boss_user" does not exist.)
    解決方法:原來是在自己寫的.xml配置文件中,DatabaseBackend標簽里面寫的用戶名和密碼需要是真實數(shù)據(jù)庫的真實用戶名和密碼。

    最后都整好了,但是遇到一個warn的log:
    backend.DatabaseBackend.postgreSQLNode155 Statement.getGeneratedKeys not supported
    至今不知道是什么問題,有什么影響.

    代碼部分:
    只需要修改應用程序用到的jdbc driver的配置,把c-jdbc/drivers/目錄下的c-jdbc-driver.jar拷貝到應用程序的工程里,并加入到class-path中。
    之前是使用 Class.forName("com.somevendor.jdbcDriver.Driver") 去連接某特定的數(shù)據(jù)庫
    現(xiàn)在是使用 Class.forName("org.objectweb.cjdbc.driver.Driver") 統(tǒng)一處理。
    連接字符串:DriverManager.getConnection("jdbc:cjdbc://localhost:25322/mycjdbc") 取得數(shù)據(jù)庫連接。

    c-jdbc server稱為c-jdbc controller,聆聽請求們
    其他所有通過c-jdbc來訪問的DB們稱為db backends.

    jdbc:cjdbc://host1:port1,host2:port2/database
    host是指跑著c-jdbc controller的機器IP,port是指controller監(jiān)聽客戶端鏈接的端口,默認端口號:25322
    注意,不僅真正的DB安裝多個在多個機器上,c-jdbc controller也可以安在不同的機器上,這樣可以防止一個c-jdbc 壞掉帶來的風險。
    例如:

    Class.forName( " org.objectweb.cjdbc.driver.Driver " );?
    DriverManager.getConnection(
    " jdbc:cjdbc://c1.objectweb.org,c2.objectweb.org/tpcw " );? // 不驗證用戶名密碼
    DriverManager.getConnection( " jdbc:cjdbc://host/db?user=me&password=secret " ) // 驗證用戶名密碼的寫法1
    DriverManager.getConnection( " jdbc:cjdbc://host/db;user=me;password=secret " ) // 驗證用戶名密碼的寫法2

    然后可以在代碼中insert/update幾個記錄,再單獨到各個數(shù)據(jù)庫中去查一下,應該都受到影響就對了。

    問題:
    1、管理C-JDBC,不知道C-JDBC需要啥管理,不過好像是已經(jīng)有一個簡單的 Desktop Application 可以控制相關的 administration 介面, 最重要的是, 他結合了 JMX , 可以讓整個監(jiān)控的環(huán)境更完整.. (等待嘗試)
    2、不知道通過C-JDBC來操作速度如何
    3、RAIdb的3種類型,采取哪個更好?把表分開在不同server上對聯(lián)表查應該不會有影響吧?

    其他:
    1、Configuring C-JDBC with Jakarta Tomcat
    Copy the c-jdbc-driver.jar file to the lib directory of your web application (for example: $TOMCAT_HOME/webapps/mywebapp/WEB-INF/lib).
    There are many ways to obtain connections from a Tomcat application. Just ensure that you are using org.objectweb.cjdbc.driver.Driver as the driver class name and that the JDBC URL is a C-JDBC URL

    2、Configuring C-JDBC with Hibernate
    C-JDBC just has to be defined as any JDBC driver in Hibernate, leaving the syntax set to the proper database. Here is a configuration example to use Hibernate with a C-JDBC cluster made of Sybase backends:
    ## C-JDBC
    hibernate.dialect???????????????? net.sf.hibernate.dialect.SybaseDialect
    hibernate.connection.driver_class org.objectweb.cjdbc.driver.Driver
    hibernate.connection.username???? user
    hibernate.connection.password???? pass
    hibernate.connection.url????????? jdbc:cjdbc://localhost:25322/test???????

    posted @ 2007-03-05 20:42 cerulean 閱讀(1412) | 評論 (2)編輯 收藏
    第一次做J2EE的網(wǎng)站時也遇到了這個“常見問題”。

    轉自http://huaronghu.spaces.live.com/default.aspx?_c02_owner=1

    經(jīng)常出現(xiàn)的Connection reset by peer: 原因可能是多方面的,不過更常見的原因是:
    1:服務器的并發(fā)連接數(shù)超過了其承載量,服務器會將其中一些連接Down掉;
    2:客戶關掉了瀏覽器,而服務器還在給客戶端發(fā)送數(shù)據(jù);
    3:瀏覽器端按了Stop;
    4:服務器給客戶端響應結果給防火墻攔截了。
    posted @ 2007-03-01 21:05 cerulean 閱讀(1047) | 評論 (0)編輯 收藏

    一些遇到過的小錯誤,記錄下來,不要絆倒第二次:
    trim
    ????trim(),4個字母的方法,一定要記得使用啊,已經(jīng)碰到過很多次由于沒有trim字符串而導致查詢匹配失敗的事情了。

    copy
    ?
    ????Ctrl+C,Ctrl+V,引入低級bug的魁首之一吧,當然低級bug表現(xiàn)出來就有可能是匪夷所思的錯誤情況了。

    對齊<>們
    ????有時候讀取spring的applicationContext.xml會拋出錯誤,“well-formed data”什么什么的,一般是.xml文件的內容不符合要求,亂掉了,注意,此時不僅應該檢查applicationContext.xml,它里面用到的sql-map-config.xml,以及所以表的sqlMap.xml都應該檢查。
    ????對于內容本身包含<>符號的,需要用 <![CDATA[ …… ]]>括起來

    posted @ 2007-03-01 21:03 cerulean 閱讀(335) | 評論 (0)編輯 收藏
    在postgreSQL中,使用copy命令從文件(包含主鍵字段的值)向數(shù)據(jù)庫表(主鍵為自增型)導入數(shù)據(jù)后,需要執(zhí)行一下setval,否則copy進來的serialID和日后insert進去的會重復,造成自增型主鍵沖突。
    例如:
    copy?my_table?from?'C:\\tmp\\data.txt'?using?delimiters?'\t'?
    select?setval('my_table_recordid_seq',(select?max(recordid)?from?my_table));

    還要注意的是,文件不能是在根目錄下,必須在一個文件夾下。
    posted @ 2007-03-01 20:59 cerulean 閱讀(3351) | 評論 (0)編輯 收藏

    設置環(huán)境變量:
    1. windows:就不說了,圖形化界面的好處:我的電腦高級屬性中的環(huán)境變量。
    ?注意的地方是可以用%***%來引用其他定義好的變量,多個值之間用分號分隔,PATH值多為各軟件包的bin目錄。

    2. unix/solaris
    ?進入etc/profile
    ?set NAME=VALUE
    ?echo NAME

    posted @ 2007-02-17 14:22 cerulean 閱讀(288) | 評論 (0)編輯 收藏
    注釋:
    .xml
    ???<!-- -->
    .jsp
    ???
    <%-- --%>不會編譯,<!-- -->會編譯
    .ini:
    ???
    分號;
    .conf:
    ???
    井號#
    .php:
    ???
    //
    posted @ 2007-02-17 14:21 cerulean 閱讀(270) | 評論 (0)編輯 收藏

    coverlipse:[喜歡這種coverlipse,subclipse的插件名字,簡單明了]

    功能:負責顯示JUnit測試的代碼覆蓋率。

    安裝:http://coverlipse.sourceforge.net/index.php?下載了coverlipse-0.9.5.3.zip,直接解壓到eclipse目錄中的相關文件夾(feature/plugin)。

    使用:選擇run as JUnit w/Coverlipse即可,也就是運行了JUnit
    然后show view中,可以選擇:
    Coverlipse Markers View?? ?看測試的覆蓋率(行級的)
    Coverlipse Class View?????????可以看到包級/類級的覆蓋百分比

    通過使用這個簡單的小插件,可以看到JUnit對測試類、以及被測試類的覆蓋率,不過比較懷疑在開發(fā)過程中能不能真正用起來,畢竟寫出完善的UT case的情況還是很少的,可能不能對每一行代碼都覆蓋到。不過,對于一些重要業(yè)務邏輯處理的方法,用coverlipse來看test case對邏輯代碼中分支的測試覆蓋率還是比較有用的吧。


    注:eclipse->window->customize perspective可以看到一些已經(jīng)安裝的插件。

    ?
    posted @ 2007-02-17 14:18 cerulean 閱讀(2869) | 評論 (0)編輯 收藏

    作為開源數(shù)據(jù)庫,MySQL安裝還是挺簡單的:

    MySQL, windows下的安裝
    下載mysql-5.0.18-win32.zip,解壓后運行Setup.exe
    一步步走,沒什么特別的地方.默認會將MySQL注冊為windows的服務.(run services.msc 也可以看到啦)
    連接:在MySQL_HOME/bin/> 下輸入命令mysql -h localhost -u root -p
    輸入密碼后就可以進入數(shù)據(jù)庫的命令行模式輸入命令啦(感覺跟postgreSQL差不多,好用一些)

    MySQL, windows下的卸載
    停掉MySQL的服務(控制面板-管理工具-服務)
    在MySQL_HOME/bin/> 下輸入mysqld-nt -remove
    再通過控制面板卸載MySQL程序.
    最好再刪除安裝目錄

    一些命令:
    show databases;???????可以看到mySQL中目前都有哪些database
    show tables;?????????????可以看到該database中有哪些表
    describe tablename;??可以看到某表的結構

    網(wǎng)站和文檔:
    官方網(wǎng)站:http://www.mysql.org/
    中文文檔:http://dev.mysql.com/doc/refman/5.1/zh/index.html

    posted @ 2007-02-17 14:02 cerulean 閱讀(420) | 評論 (0)編輯 收藏

    使用ant:
    1. eclipse 3.x 版本都集成了ant.可以直接用.但是脫離了eclipse就沒法用了.
    2. 在機器上安裝ant:從ant.apache.org上下載,解壓到DOWNLOAD_ANT_HOME
    ??? 配置環(huán)境變量:ANT_HOME= DOWNLOAD_ANT_HOME
    ???????????????????????????? PATH= %PATH%;%ANT_HOME%\bin
    ??? windows下需要重啟機器才能生效.
    ??? 注意:還需要把junit.jar包,手工拷貝到ANT_HOME\lib下面才可以讓ant正確執(zhí)行junit測試.(或者把junit.jar包也放進工程的lib里面作為classpath)
    ???????????? 否則會導致BUILD FAILED: The classpath for junit must include junit.jar if not in Ant's own classpath.
    ??? 命令行方式進入工程所在目錄,敲入ant,則自動找尋該目錄下build.xml的構建文件,并執(zhí)行構建

    錯誤總是防不勝防,層出不窮:
    ??? 本來ant在eclipse里面都試通了,覺得安裝個獨立的ant,在命令行下執(zhí)行也沒啥問題,可是配置之后,在eclipse下面成功的竟然拋出exception:Unsupported major.minor version 49.0。上網(wǎng)查了一下,應該是編譯源代碼和執(zhí)行源代碼不是同一個版本的jdk而引起的。因此,修改了build.xml,加入了clean的打掃編譯后的class文件的target。再次ant時,等于是重新編譯,重新執(zhí)行junit test case,就通過了。

    posted @ 2007-02-08 21:18 cerulean 閱讀(1488) | 評論 (1)編輯 收藏

    建立工程:
    在eclipse中建立一個java project.
    AntTest
    ?-src
    ??-com.test
    ???-ABS.java
    ???-ABSTest.java (Junit Test Case)
    ?-lib
    ?-build.xml
    ?-JUNIT_HOME/junit.jar

    配置:
    eclipse->window->preference->ANT->Runtime->Classpath->ANT Home Entry
    選擇Add External JAR,加入ECLIPSE_HOME/plugins/org.junit.../junit.jar

    build.xml的內容:

    ?1
    ?2 <? xml?version="1.0" ?>
    ?3 < project? name ="project" ?default ="junit" >
    ?4 ? < property? name ="run.classpath" ?value ="bin" ></ property >
    ?5 ? < property? name ="run.srcpath" ?value ="src" ></ property >
    ?6 ? < property? name ="test.srcpath" ?value ="src" ></ property >
    ?7 ? < property? name ="test.report" ?value ="report" ></ property >
    ?8 ? < property? name ="lib.dir" ?value ="lib" ? />
    ?9 ? < path? id ="compile.path" >
    10 ?? < fileset? dir ="${lib.dir}" >
    11 ??? < include? name ="**/*.jar" ? />
    12 ?? </ fileset >
    13 ? </ path >
    14 ? < target? name ="compile" >
    15 ?? < javac? destdir ="${run.classpath}" ?srcdir ="${run.srcpath}" ?classpathref ="compile.path" ? />
    16 ?? < javac? destdir ="${run.classpath}" ?srcdir ="${test.srcpath}" ?classpathref ="compile.path" ? />
    17 ? </ target >
    18 ? < target? name ="junit" ?depends ="compile" >
    19 ?? < tstamp? />
    20 ?? < mkdir? dir ="${test.report}" ? />
    21 ?? < mkdir? dir ="${test.report}/framework-${DSTAMP}-${TSTAMP}" ? />
    22 ?? < junit? printsummary ="true" >
    23 ??? < classpath >
    24 ???? < pathelement? path ="${run.classpath}" ? />
    25 ???? < fileset? dir ="${lib.dir}" >
    26 ????? < include? name ="**/*.jar" ? />
    27 ???? </ fileset >
    28 ??? </ classpath >
    29 ??? < formatter? type ="plain" ? />
    30 ??? < batchtest? fork ="yes" ?todir ="${test.report}/framework-${DSTAMP}-${TSTAMP}" >
    31 ???? < fileset? dir ="${test.srcpath}" >
    32 ????? < include? name ="**/*Test.java" ? />
    33 ???? </ fileset >
    34 ??? </ batchtest >
    35 ?? </ junit >
    36 ? </ target >
    37
    38 </ project >
    39
    40



    運行:
    右鍵build.xml->run as "Ant Build".

    結果:
    控制臺有輸出結果,例如:
    Buildfile: C:\Documents and Settings\qianwang\My Documents\D\SMPWorkspace\AntTest\build.xml
    compile:
    junit:
    ??? [mkdir] Created dir: C:\Documents and Settings\qianwang\My Documents\D\SMPWorkspace\AntTest\report\framework-20070201-1712
    ??? [junit] Running com.test.ABSTest
    ??? [junit] Tests run: 3, Failures: 0, Errors: 0, Time elapsed: 0 sec
    BUILD SUCCESSFUL
    Total time: 19 seconds

    同時,AntTest/report(如果沒有自動建立的目錄)中,產生.txt格式的文本文件.
    結果文件中,會指出運行了哪些testcase(指出被測試的方法名test**).
    如果有failures/errors,異常的詳細信息也會輸出在這里.

    posted @ 2007-02-08 21:17 cerulean 閱讀(2521) | 評論 (0)編輯 收藏
    ??????? 鼓起勇氣開通一個技術相關的blog吧,一來是覺得自己目前粉粉嫩嫩(皮膚以及內容)的生活blog實在是不大適合寫技術文章(不過可能也有一天會放在一起,那樣子看起來是不是有點兒詭異呢),二來,也是主要是以此來督促自己,記錄下學習的過程,不然匆匆忙忙半天,都不知道自己學了些啥。
    ??????? 不是技術牛人,所以大約會是個“流水帳”型的技術blog吧。

    ??????? 分不清楚這里“發(fā)布隨筆”和“發(fā)布文章”的區(qū)別,不過這一篇怎么也該算是“隨筆”吧~喜歡這里插入的表情符號分為msn和QQ兩大類,呵呵,很貼心的設計。
    posted @ 2007-02-01 22:29 cerulean 閱讀(252) | 評論 (0)編輯 收藏

    導航

    <2007年2月>
    28293031123
    45678910
    11121314151617
    18192021222324
    25262728123
    45678910

    統(tǒng)計

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 特级毛片免费观看视频| 亚洲欧洲AV无码专区| 中文字幕亚洲免费无线观看日本| 亚洲综合精品一二三区在线| 亚洲日本在线免费观看| 亚洲国产美女精品久久久| 日韩在线观看视频免费| 国产偷伦视频免费观看| 99无码人妻一区二区三区免费| 国产高清在线免费视频| 亚洲色婷婷一区二区三区| 久久亚洲美女精品国产精品| 亚洲色一区二区三区四区| 无码日韩人妻AV一区免费l| 99免费在线观看视频| 在线观看免费污视频| 国产亚洲欧洲精品| 456亚洲人成影院在线观| 国产精品综合专区中文字幕免费播放| 亚洲成人免费在线| 好爽…又高潮了毛片免费看| 国产成人亚洲精品影院| 亚洲成A∨人片在线观看无码| 午夜亚洲乱码伦小说区69堂| 午夜影院免费观看| 成年女人永久免费观看片| 亚洲高清专区日韩精品| 亚洲国产欧美日韩精品一区二区三区 | 18级成人毛片免费观看| heyzo亚洲精品日韩| 亚洲白色白色永久观看| 麻豆69堂免费视频| 最近中文字幕国语免费完整 | 在线综合亚洲中文精品| 九九热久久免费视频| 免费观看AV片在线播放| 永久亚洲成a人片777777| 亚洲熟妇AV一区二区三区浪潮| 在线观看免费黄色网址| 精品免费国产一区二区三区| 亚洲人成影院在线|