分类: Java

  • JBoss的安裝

    JBoss+Tomcat已經成為一個免費的開源的穩定的J2EE服務器,雖然在JBoss中部署J2EE沒有商用J2EE服務器那麼方便,基本都是通過手工編寫XML配置文件,但是這樣可以讓我們更容易理解J2EE的來龍去脈。

    注意,正如Tomcat3和Tomcat 4兩個版本差異很大一樣,Jboss 2和Jboss 3兩者差異較大,本處是以Jboss 2為例,建議安裝JBoss 3. Jboss 3安裝其實更簡單,下載解壓就可運行,部署應用方式也一樣。

    1.從JBoss主頁httpwww.jboss.org下載JBoss整合tomcat的軟件包.

    從ant主頁下載ant用來發布J2EE(.ear)或WEB程序(.war)或Java包(.jar)

    2.設置環境變量
     JAVA_HOME = cjdk1.4
    –假設你安裝Java 2.0 SDK in cjdk1.4
     ANT_HOME = Cjakarta-ant-1.4
    –假設你安裝in Cjakarta-ant-1.4
     JBOSS_DIST = CJBoss_Tomcatjboss
    –假設你安裝Jboss在CJBoss_Tomcatjboss JBoss 3.0已經沒有jboss這個子目錄

     

    在windows 2000中的設置是需要到控制面板–系統–環境變量中設置

    3.設置Path加入%JAVA_HOME%bin;%ANT_HOME%bin以便能夠執行JDK和ANT

    4.從httpwww.jboss.orgdocsmanualfilesdocumentation-example.zip下載JBoss應用程序例子.解壓到

    CJBoss_Tomcat
     
    —- Examples —應用程序例子安裝目錄
    —- Jboss
    —- Catalina –Tomcat 4.0
    從windows的DOS窗口進入examplesbuild目錄執行
    ant intro-interest-ear

    會出現一系列信息,最後是build succesfully

    到examplesbuild-exampleinterest目錄,發現新建立的interest.ear

    5.啟動JBoss將interest.ear拷貝到CJBoss_Tomcatdeploy目錄下,在Jboss 3.x中是serverdefaultdeploy目錄。

    在JBoss控制窗口會看到部署interest.ear的一系列信息.

    6.通過httplocalhost8080interest訪問,會出現一個表單,按提交後,顯示正常.

    至此,你的J2EE應用服務器安裝完畢.

    推薦Jbuilder6或Jbuilder7與JBoss 2.4 JBoss 3的整合

  • Java認證考試必讀書籍

    我本來只是想要要記錄一下我個人Java 學習過程,
    不過我在學習 Java 的過程中碰到了很多問題
    看了三本書覺得寫的非常的好所以也想推薦給各位準考生,
    看過了這些書後我覺得按照程度這樣看下來是最循序漸進的,
    可以依照你們的程度來看看剛開始因為感受到了自己基礎不足,

    而且考 SCWCD 前也必須先考過 SCJP…..

    點擊下載:Java認證考試書單

  • 分享[考試心得] 我通過SCJP認證考試了

    準備參加SCJP考試該如何準備呢?分享一篇關於一位考生考試心得,寫的很詳細現在分享給大家!

    200807011827a

    SCJP考試全名是Sun Certified Programmer for Java,

    也就是昇陽公司對Java語言的認證考試。

    其實我很早以前就想要考這個認證考試了,

    畢竟工作的環境主要就是以Java為主。

    不過由於這個考試純粹是個人興趣,

    再加上人類特有的拖性,

    所以去年買的考試券,

    拖到今年快過期沒辦法了,

    我才去參加考試。

    (不過去年是有準備考TOEIC啦,詳見此篇。這是藉口嗎XP)

    就在準備好一陣子之後,

    我終於在鳳凰颱風來臨的前夕,

    前去SCJP考試中心看看能不能過關。

     

    雖然我買的考試券有允許失敗一次的機會,

    也就是萬一第一次沒考過,

    還可以考第二次,

    但是我還是希望能一次過關啊。

     

    幸好,努力是有代價的。

    因為SCJP是上機考試,

    所以當考完後,

    馬上就可以知道結果。

     

    There are 72 questions in this exam. You answered 68 questions correctly which gives you a score of 94%.PASSING SCORE:59%   YOUR SCORE:94%   TEST STATUS: Pass

     

    看了上面的成績報告書的資料,

    真的是太高興了。

    點擊閱讀全文….

    (更多…)

  • JAVA“高手”基礎素養

    世界上並沒有成為高手的捷徑,但一些基本原則是可以遵循的。

    1、紮實的基礎

    數據結構、離散數學、編譯原理,這些是所有計算機科學的基礎,如果不掌握它們,很難寫出高水平的程序。程序人人都會寫,但當你發現寫到一定程度很難再提高的時候,就應該想想是不是要回過頭來學學這些最基本的理論。不要一開始就去學OOP,即使你再精通OOP,遇到一些基本算法的時候可能也會束手無策。因此多讀一些計算機基礎理論方面的書籍是非常有必要的。

    2、豐富的想像力

    不要拘泥於固定的思維方式,遇到問題的時候要多想幾種解決問題的方案,試試別人從沒想過的方法。豐富的想像力是建立在豐富的知識的基礎上,除計算機以外,多涉獵其他的學科,比如天文、物理、數學等等。開闊的思維對程序員來說很重要。

    3、最簡單的是最好的

    …..

    (更多…)

  • Oracle收購Sun之後:有關Java未來的三個關鍵問題

    我們都已經聽說了有關為什麼Oracle收購Sun的一些猜測:
         Oracle一直都想和IBM站在同一水平線上。他們想要被看作是一個完整的供應商,提供應用程序,平台和數據庫。如果你想要,那就是一站式服務。

         Oracle已經佔據了應用程序和數據庫的大部分市場。為了保持在這一領域的主要地位,他們想要擴展並深入到硬件業務中。

        收購是一項長期的防禦舉動以回應微軟收購SAP的謠言。

        雖然收購的原因對很多人來說是很重要的,但是對於我來說最重要的是會在Sun這15年中所創建和服務的Java技術上發生什麼事情。我經常會寫到”Java is COBOL” ,因為今天幾乎所有的商業都有一些Java要做的事情。謠言在應用程序開發行業中漫天飛,但是我們早知道塵埃會落定,故事將會結束。這不意味著我們不能用歷史來引導我們預測未來。 Ruby能否成為第二個Java?

        從純粹的Java角度來看一看Oracle所得到的,這三個關鍵問題是:

         Java Community Process (JCP)會繼續存在嗎?

         Apache Software Foundation (ASF)和Sun之間的爭端會解決嗎?

         Oracle會通過為JDK扣交TCKs而取得Java IP嗎?

         JCP會繼續存在嗎?

         Oracle是JCP的高級成員,而且他們已經提交了80多個Java Specification Requests (JSRs)。儘管有這個長期的參與承諾,Oracle表示——和其他的供應商和參與者一起——JCP過程需要變得更開放,透明並且廠商中立。特別是在2007年12月12日的時候,Oracle提出了這個:Resolution 1 (由Oracle提議,第二個是由BEA提出) .

         “Executive Committee感覺到JCP變成一個開放獨立並且是廠商中立的標準組織,那裡所有的成員都參與公平競爭,具體有以下特點:

        成員基金開發和管理費用

        一個法人實體,有法律,理事會和董事成員等等。

        一個新的,簡單的IPR Policy(知識產權政策)允許更大範圍的執行。

        嚴格的兼容性要求

        致力於促進Java編程模式

        此外,EC將在對Java Community干預最小的情況下,盡快實施這個計劃以確保這樣的過渡盡快的實施。 “

        所以我們希望Oracle能繼續JCP,但是它可能變成一個完全不同的JCP.如果Oracle成功的實施了所期望的轉變,結果會是非常有趣的而且具有廣泛的影響。特別有趣的是看到Oracle如何實施這些變革。那將是第一個跡象表明Oracle將如何同Java工作。

         Apache Software Foundation (ASF)和Sun之間的爭端會解決嗎?客戶端Java的革命性飛躍圍繞Apache和Sun爭論的主要問題是多種多樣的,但是這裡有一個對這些事件的簡短總結:

         Apache Harmony Project目的是創建一個ASF授權的模塊化虛擬機(VM)和基於Java SE 5.0版本的JDK.

         Sun的JDK開源和OpenJDK項目。

        要成為一個認證的JDK,Harmony需要通過Sun的Technology Compatibility Kits(TCKs)。

         Sun說到Harmony是基於舊的JDK5.0而且不是在最新的JDK6.0上,所以認證過程停滯了,Harmony Project也懸而未決。

        到今天,OpenJDK管理委員會也沒有解決這個爭端。 Oracle如何處理這個情況是他們如何管理Java程序的第二個晴雨表。

         Oracle會通過為JDK扣交TCKs而取得Java IP嗎?

        在JDK認證中涉及了很多法律問題會成為Java的大量蠕蟲。例如,除非你為OpenJDK通過TCK,否則你不獲得Java Intellectual Property (IP)的權力——即你沒有認證的JDK.

        由於你沒有Java SE7的一套規範,而且Sun也沒有購買一個,所有沒有辦法擁有一個官方的OpenJDK 7.Oracle會採取同樣的辦法,而且不會發布一個規範或是TCKs,這樣將IP在內部保持。

        總結

        如你所見,這三個問題都有所關聯,每個答案本身有不同的水平和層次,例如:

         JCP肯能會繼續存在,但是它可能在指定技術方向上承擔不同的作用。

        管理上的這種差異為ASF問題提供一個簡單的解決方案,讓它們成為泛黃的記憶。

         Oracle可能會推出一個新的JDK規範連同TCKs一起,完全實現一個開放的JDK承諾。

        如何發揮這些因素將讓Java developmer community清楚的知道Oracle如何運行Java.

  • 淺談:Java代碼的優化策略

    1.如何使用Exception
    Exception降低性能。一個異常拋出首先需要創建一個新的對象。 Throwable接口中的構造器調用名為fillInStackTrace()的本地方法。這個方法負責巡檢棧的整個框架來收集跟踪信息。這樣無論何時有異常拋出,它要求虛擬機裝載調用棧,因為一個新的對像在中部被創建。

    異常應當僅用於有錯誤發生時,而不要控制流。

    2.不要兩次初始化變量

    Java通過調用獨特的類構造器默認地初始化變量為一個已知的值。所有的對像被設置成null,integers (byte, short, int, long)被設置成0,float和double設置成0.0,Boolean變量設置成false。這對那些擴展自其它類的類尤其重要,這跟使用一個新的關鍵詞創建一個對象時所有一連串的構造器被自動調用一樣。

    3.在任何可能的地方讓類為Final

    標記為final的類不能被擴展。在《核心Java API》中有大量這個技術的例子,諸如java.lang.String。將String類標記為final阻止了開發者創建他們自己實現的長度方法。

    更深入點說,如果類是final的,所有類的方法也是final的。 Java編譯器可能會內聯所有的方法(這依賴於編譯器的實現)。在我的測試裡,我已經看到性能平均增加了50%。

    4.在任何可能的地方使用局部變量

    屬於方法調用部分的自變量和聲明為此調用一部分的臨時變量存儲在棧中,這比較快。諸如static,實例(instance)變量和新的對象創建在堆中,這比較慢。局部變量的更深入優化依賴於你正在使用的編譯器或虛擬機。

    5.停止小聰明

    很多開發人員在腦子中編寫可複用和靈活的代碼,而有時候在他們的程序中就產生額外的開銷。曾經或者另外的時候他們編寫了類似這樣的代碼:

    public void doSomething(File file) {
    FileInputStream fileIn = new FileInputStream(file);
    // do something

    他夠靈活,但是同時他們也產生了更多的開銷。這個主意背後做的事情是操縱一個InputStream,而不是一個文件,因此它應該重寫如下:

    public void doSomething(InputStream inputStream){
    // do something

    6.乘法和除法

    我有太多的東東適用於摩爾法則——它聲明CPU功率每年成倍增長。 “摩爾法則”表明每年由開發者所寫的差勁的代碼數量三倍增加,劃去了摩爾法則的任何好處。

    考慮下面的代碼:

    for (val = 0; val < 100000; val +=5) { shiftX = val 8; myRaise = val 2; }

    如果我們狡猾的利用位移(bit),性能將會六倍增加。這是重寫的代碼:

    for (val = 0; val < 100000; val += 5) { shiftX = val << 3; myRaise = val << 1; }

    代替了乘以8,我們使用同等效果的左移3位。每一個移動相當於乘以2,變量myRaise對此做了證明。同樣向右移位相當於除以2,當然這會使執行速度加快,但可能會使你的東東以後難於理解;所以這只是個建議

    7.用代碼有效處理內存溢出

    OutOfMemoryError是由於內存不夠後普遍會遇到的問題,下面一段代碼能有效判斷內存溢出錯誤,並在內存溢出發生時有效回收內存

    通過該方法可以聯想到有效管理連接池溢出,道理等同。

    import Java.util.*;
    public class DataServer
    {
    private Hashtable data = new Hashtable();
    public Object get (String key)
    {
    Object obj = data.get (key);
    if (obj == null)
    {
    System.out.print (key + “ ”);
    try
    {
    // simulate getting lots of data
    obj = new Double[1000000];
    data.put (key, obj);
    }
    catch (OutOfMemoryError e)
    {
    System.out.print (“No Memory! ”);
    flushCache();
    obj = get (key);// try again
    }
    }
    return (obj);
    }
    public void flushCache()
    {
    System.out.println (“Clearing cache”);
    data.clear();
    }
    public static void main (String[] args)
    {
    DataServer ds = new DataServer();
    int count = 0;
    while (true) // infinite loop for test
    ds.get (“” count+);
    }
    }

    8. Lazy Loading (Lazy evaluation)在需要裝入的時候才裝入

    static public long
    factorial( int n ) throws IllegalArgumentException
    {
    IllegalArgumentException illegalArgumentException =
    new IllegalArgumentException( “must be >= 0” );
    if( n < 0 ) {
    throw illegalArgumentException ;
    } else if( ( n 0 ) || ( n 1 ) ) {
    return( 1 );
    } else (
    return( n * factorial( n – 1 ) ) ;
    }

    優化後代碼

    static public long
    factorial( int n ) throws IllegalArgumentException
    {
    if( n < 0 ) {
    throw new IllegalArgumentException( “must be >= 0” );
    } else if( ( n 0 ) || ( n 1 ) ) {
    return( 1 );
    } else (
    return( n * factorial( n – 1 ) ) ;
    }

    9.異常在需要拋出的地方拋出,try catch能整合就整合

    try {
    some.method1(); // Difficult for Javac
    } catch( method1Exception e ) { // and the JVM runtime
    // Handle exception 1 // to optimize this
    } // code
    try {
    some.method2();
    } catch( method2Exception e ) {
    // Handle exception 2
    }
    try {
    some.method3();
    } catch( method3Exception e ) {
    // Handle exception 3
    }

    已下代碼更容易被編譯器優化

    try {
    some.method1(); // Easier to optimize
    some.method2();
    some.method3();
    } catch( method1Exception e ) {
    // Handle exception 1
    } catch( method2Exception e ) {
    // Handle exception 2
    } catch( method3Exception e ) {
    // Handle exception 3
    }

    10. For循環的優化

    Replace…
    for( int i = 0; i < collection.size(); i++ ) {

    }
    with…
    for( int i = 0, n = collection.size(); i < n; i++ ) {

    }

    11.字符串操作優化

    在對字符串實行+操作時,最好用一條語句

    // Your source code looks like…
    String str = “profit = revenue( ” revenue
    “ – cost( ” cost ““;
    //編譯方法
    String str = new StringBuffer( ).append( “profit = revenue( “ ).
    append( revenue ).append( “ – cost( “ ).
    append( cost ).append( ““ ).toString( );
    在循環中對字符串操作時改用StringBuffer.append()方法
    String sentence = “”;
    for( int i = 0; i < wordArray.length; i++ ) {
    sentence += wordArray[ i ];
    }

    優化為

    StringBuffer buffer = new StringBuffer( 500 );
    for( int i = 0; i < wordArray.length; i++ ) {
    buffer.append( wordArray[ i ] );
    }
    String sentence = buffer.toString( );

    12.對象重用(特別對於大對象來說)

    public
    class Point
    {
    public int x;
    public int y;
    public Point( )
    {
    this( 0, 0 );
    }
    }

    優化為:

    public class Component
    {
    private int x;
    private int y;
    public Point getPosition( )
    {
    Point rv = new Point( ); // Create a new Point
    rv.x = x; // Update its state
    rv.y = y;
    return rv;
    }
    }
    // Process an array of Component positions…
    for( int i = 0; i < componentArray.length; i++ ) {
    Point position = componentArray[i].getPosition( );
    // Process position value…
    // Note: A Point object is created for each iteration
    // of the loop…
    }

    可再次優化,僅使用一個類對象:)

    public
    class Component
    {
    private int x;
    private int y;
    public Point getPosition( Point rv )
    {
    if( rv == null) rv = new Point( );
    rv.x = x; // Update its state
    rv.y = y;
    return rv;
    }
    // Create a single point object and reuse it…
    Point p = new Point( );
    for( int i = 0; i < componentArray.length; i++ ) {
    Point position = componentArray[i].getPosition( p );
    // Process position value…
    // Note: Only one Point object is ever created.
    }

    13. J2EE相關

    a)盡量不要將大對象放到HttpSession或其他須序列化的對像中,並註意及時清空Session

    b)使用預編譯語句prepareStatement代替createStatement

    c)盡可能使用連接池

    d)能使用Cache就使用Cache,具體實現可參考jive(CacheCacheableCacheObjectCacheSizesDefaultCacheLinkdListLinkdListNode)或ofbiz(org.ofbiz.core.util. UtilCache.Java)