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

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

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

    posts - 120,  comments - 19,  trackbacks - 0
     

    CSS中,一個很少被提及的優點就是能夠層疊背景圖片,允許它們之間通過"滑動"和層疊來創造出特定的效果。CSS2目前的狀況要求每個背景圖片都分別有與之相對應的HTML元素。在通常情況下,組成通用界面的典型標記已經提供了一些我們可以使用的元素。

    其 中的一個例子就是標簽導航欄(tabbed navigation)。隨著[標簽導航]的使用率不斷上升,它已逐漸成為了站點導航的主流方式,現在是時候來討論一下對標簽導航欄的控制了。既然CSS 被廣泛地支持,我們就可以用它來優化站點標簽的質地和外觀。你很可能會想到,CSS可以馴服平坦的無序列表。可能你已經見到過一些樣式化為標簽的列表,比如下面這個:

    如果我們采用與上面完全相同的標記,但卻把它們變成了下面的樣子,該如何去做呢:

    在這里,僅僅用非常簡單的樣式就可以實現。

    創新之道

    我所見過的許多基于CSS的標簽都受到了一些共同特性的限制:單色的矩形塊,可能在當前標簽上加了輪廓,或者邊框;在鼠標掠過時改變矩形的顏色等等。這就是CSS能為我們提供的全部嗎?僅僅是成堆的單色方塊?

    早 在CSS被廣泛采用之前,我們就能夠看到許多在導航設計上的創新。創新的外形,可控的色彩混合,以及對現實世界中物力表面的模仿。但是這些設計通常都依賴 于將文字內嵌于圖片的復雜結構或多層的表格嵌套。編輯標簽上的文字或者改變它們的順序都會引起繁重的工作。文字的縮放更是不可能,不然就會引起嚴重的頁面 布局錯誤。

    單純的文字導航要比嵌入文字的圖片式導航更加易于管理并且加載更迅速。而且,雖然我們可以給每個圖片都加上alt屬性, 但是單純的文字導航更具有可讀性,因為對于視力不好讀者,這些文字都是可縮放的。也正因為如此,由CSS樣式化的文字的導航欄再次成為網頁設計者們的選 擇,并不足為奇。但是到目前為止,大多數基于CSS的標簽設計,只是后退了一步,回到了我們曾經的做法--當然這些是無法被優秀的設計作品采用的。采用一 項新技術(比如CSS)應該能夠讓我們創作出一些更好的東西,而不至于失去先前的表格或者圖片式標簽所能表現的質地。

    “滑動門”技術

    只 要我們用兩片分離的背景圖片,就能夠創造出精美的手工界面,并且具有高度的靈活性,可隨文字的縮放而自動適應。試想一下,左右兩幅圖片,就像左右兩扇滑動 門一樣,構成了一扇完整的門。將這兩扇門推近,重疊的部分多一些,就可以適應一個比較狹窄的空間,而如果將它們拉開,重疊的部分減少,就可以滿足較寬的空 間,正如下圖所示:

    在 這個例子中,一幅圖片蓋住了另一幅的某些部分。假設每幅圖片的邊緣都有些獨特的形狀,例如標簽的圓角,我們不希望這些邊緣被它前方圖片蓋住。為了防止這種 情況發生,我們將放置在前方(以左邊為例)的圖片制作得盡可能地窄,但是保證它能夠完整地顯示出邊緣上的獨特形狀。以圓角標簽為例,我們將前方的圖片制作 到僅與圓角的部分同寬即可:

    如 果目標物由于不同文字或文字類型而變得比上圖所示的寬度更大,那么這兩幅圖就會被拉開,出現一個非常不美觀的缺口。 這時就需要我們對可能的擴展性進行預測。 在用戶縮放字體的時候,目標物會增大多少?實際上,我們至少應該為文字的縮放而作出300%的可伸縮性準備。 我們需要將背景圖擴大到足夠彌補缺口。 對于這些例子,我們將把后面的圖像 ( 右邊) 制作為 400 x150 圖素, 前面的圖像制作為 9 x150 圖素。

    要記住,背景圖片只能在它所應用的元素的“門前”出現 [內容區域+補丁區域(padding)]。 這兩幅圖被分別安放到他們所應用的元素外側。 而這些背景的可見部分交疊在一起構成了一個完整的標簽樣式:

    如果標簽被擴大的話,這兩幅圖就分別向兩側滑動,每一幅都更多地被顯示出來,以滿足更寬的“門”的需求。

    就 比如我用Photoshop制作了兩幅平滑的,略帶3D效果的個性化標簽圖片,正如文章開頭的圖片所示。在另一個色彩明亮一點的版本中,這兩幅圖片的填充 色變的更亮,邊緣的陰影更暗,這是為“當前”標簽準備的。為了給上面所述的技術作示范,我們需要擴展標簽背景的覆蓋區域,并把它切成了兩片:

    那個明亮一些的版本也需要這樣做,一旦這些圖片都作好了(1, 2, 3, 4),我們就可以進入CSS標記部分了。

    創建標簽

    當發現了如何利用CSS創建橫向列表后,你可能會注意到,至少有兩種方法能夠將一組列表排列成一行。一種是用內嵌方框,另一種是利用浮動屬性。它們各有利弊。而且每一種方法都會遇到CSS中非常奇怪的方面,很容易讓人迷惑。

    第一種方法,也是最常用的方法,就是將列表的項目屬性設置為“內嵌”,這種方法由于非常簡便而具有相當的吸引力。然而,對于我們將要討論的“滑動門”技術來說,這種內嵌的方法在某些特定的瀏覽器上會出現渲染問題。第二種方法,也是我們所要關注的,是利用“浮動”屬性將列表項排成一橫行。而浮動屬性也會同樣令人無所適從。它們那些看來不協調的行為并不遵從自然邏輯。盡管如此,處理多個浮動元素的基本認識以及將它們確實可靠地處理為可用元素的方法依然會取得另人驚奇的效果。

    我 們會在一個浮動的容器中創建多個浮動的元素。這樣做是為了使外部容器緊密圍繞在內容元素的周圍。利用這種方法,我們可以給標簽后的空白加上背景。要切記, 在標簽之后布局的元素,一定要在CSS中用clear屬性重新定位它的位置。這樣是為了防止浮動標簽影響布局中的其他頁面元素的位置。

    那么,現在就讓我們看看這些標記語言:

    <div id="header">
    <ul>
    <li><a href="#">Home</a></li>
    <li id="current"><a href="#">News</a></li>
    <li><a href="#">Products</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Contact</a></li>
    </ul>
    </div>

    事實上,頭部(#header)的層可能同時會包含網站的LOGO以及一個搜索框。在這個的例子中,我們會精簡每個錨點(anchor)中的href值。顯然,正常情況下這些值應該為錨點地址或者文件位置。

    我 們最初的樣式化就是讓頭部(#header)的層浮動。這樣做是為了讓這個作為容器的層能夠真正地將它所容納的那些浮動列表項包在內部。由于這個元素是浮 動的,我們需要給它標記為“100%”的寬度。再給它加上臨時的黃色背景來確認這一父容器的伸縮能夠正好填滿標簽的整個背景區域。同時設置默認文字的屬 性,以保證容器內的文字看起來一致:

    #header {
    float:left;
    width:100%;
    background:yellow;
    font-size:93%;
    line-height:normal;
    }

    現在,我們將無序列表默認的內外補丁(padding)都設置為0,并將列表的項目符號去掉,給他們加上向左浮動的屬性:

    #header ul {
    margin:0;
    padding:0;
    list-style:none;
    }
    #header li {
    float:left;
    margin:0;
    padding:0;
    }

    我們將錨點的顯示屬性設置為“塊(display:block;)”,這樣在控制它們的時候就不必擔心內嵌方框的問題了:

    #header a {
    display:block;
    }

    接下來,我們將右側的圖片添加到列表項的背景中(添加的部分用粗體顯示):

    #header li {
    float:left;
    background:url("norm_right.gif")
    no-repeat right top;

    margin:0;
    padding:0;
    }

    在加入左邊的圖片之前,我們先停下來看看到目前為止,效果一究竟是怎樣的。

    - - -

    現在,我們就可以將在上方顯示的左側圖片加入到錨點(內層元素)的背景中,與此同時,我們也加入了內補丁,將標簽擴展,給文字與標簽的邊緣間添加一些空白:

    #header a {
    display:block;
    background:url("norm_left.gif")
    no-repeat left top;
    padding:5px 15px;

    }

    這些變化出現在效果二中。 看,現在標簽已經有了大體的形狀。對于這一點,IE5/Mac的用戶可能會感到奇怪了,“這是怎么了,為什么標簽會堆疊著伸展地穿過整個屏幕?”別急,我 們很快就要幫你解決這些問題。那么現在,盡可能地跟著我們繼續下去,如果手頭有其他瀏覽器的話,暫時先換一個來繼續往下看。IE5/Mac的問題一定會得 到很好的解決。

    - - -

    這時,普通的標簽背景已經做好了,接下來,需要為“當前”標簽加上背景。我們通過為當前標簽內的錨點加上id=“current”來實現對它的定位。由于并不需要改變當前標簽的其他設置,只需要更換背景,所以我們僅用以下的代碼即可:

    				#header #current {
    background-image:url("norm_right_on.gif");
    }
    #header #current a {
    background-image:url("norm_left_on.gif");
    }

    在標簽的下方,我們想要有邊框出現,但是如果用對父容器#header設置下邊框的的方法,那么就無法消除當前標簽的下邊框。因此,我們用創建一幅新圖片的方法來代替,這幅圖片的底部包含了我們想要的邊框,同時將圖片的顏色設置為少許的梯度,就像下面這幅:

    我們將這幅圖片用于容器#header的背景(代替了我們剛才所用的黃色),并將它設置為底部對齊,給容器設置與之相應的背景色。同時,將body的內補丁移除,給列表ul的上,左,右側,分別加上10像素的內補丁:

    #header {
    float:left;
    width:100%;
    background:#DAE0D2 url("bg.gif")
    repeat-x bottom;

    font-size:93%;
    line-height:normal;
    }
    #header ul {
    margin:0;
    padding:10px 10px 0;
    list-style:none;
    }

    要 完成標簽導航欄,還需要將當前標簽的下邊框消除。你可能會想到,給其他標簽加上與#header背景色完全相同的下邊框,然后給當前標簽加上一個白色的下 邊框。然而,那些觀察非常仔細的人還是會在這樣的做法中發現些許破綻。我們用給錨點加上內補丁的方法來替代它,這樣就可以創建出完美的方形邊角了。在下面 經過放大的示意圖中就可以看出區別:

    為了實現這樣的效果,我們為其他標簽設置了4像素的內補丁,而當前標簽的設置為5像素:

    #header a {
    display:block;
    background:url("norm_left.gif")
    no-repeat left top;
    padding:5px 15px 4px;
    }
    #header #current a {
    background-image:url("norm_left_on.gif");
    padding-bottom:5px;
    }

    上面的代碼保證了在效果三中下邊框只出現在其他標簽上,而不出現在當前標簽上。

    打磨完工

    敏 銳的目光可能會發現,在上一效果圖中,圓角標簽的角落上仍然留有白色的色塊。這些前方圖片上的不透明的邊角擋住了導航欄的背景。從理論上說,我們可以將這 些邊角的背景修改為與導航欄背景色一致來達到看似透明的效果。但是我們的導航標簽可能會改變高度,超過背景的范圍,或者背景色出現更改。因此,不如直接將 前方背景的邊角設置為透明,這樣更為方便。如果圓角是抗鋸齒的話,我們可以讓它的邊緣以背景色進行柔化。

    現在邊角透明了,可是右側圖片的一部分出現在左側透明的邊角后。為了抵消它,我們在項目列表的左側加上與左側圖片相同大小的9像素的內補丁。由于項目列表加上了左內補丁,就需要在錨點的左側減去一部分內補丁,以保證文字的居中(15px - 9px = 6px):

    #header li {
    float:left;
    background:url("right.gif")
    no-repeat right top;
    margin:0;
    padding:0 0 0 9px;
    }
    #header a {
    display:block;
    background:url("left.gif")
    no-repeat left top;
    padding:5px 15px 4px 6px;
    }

    然而,并不能就這樣把它放在那兒,因為左側的圖片由于剛才加上的9像素的內補丁而被推開了。既然左右兩幅圖片的內邊緣已經相連了,我們就沒必要非將左側的圖片保持在上方。因此,我們交換一下左右兩幅圖片,讓他們應用到對方的元素上。當然,當前標簽也需要這樣做:

    #header li {
    float:left;
    background:url("left.gif")
    no-repeat left top;
    margin:0;
    padding:0 0 0 9px;
    }
    #header a, #header strong, #header span {
    display:block;
    background:url("right.gif")
    no-repeat right top;
    padding:5px 15px 4px 6px;
    }
    #header #current {
    background-image:url("left_on.gif");
    }
    #header #current a {
    background-image:url("right_on.gif");
    padding-bottom:5px;
    }

    一旦這樣做好了,就完成了效果四。 注意,為了使邊角透明而做的這一系列調整使得每個標簽的左側都有一小部分不可點擊。這一非活動區域是在文字之外的,所以并不是非常引人注目。并不是每個站 點都要求標簽背景是透明的,如果不希望有這一小部分非活動區域的話,盡可以用純色的背景和方角來代替透明和圓角。在我們的例子中,依然保持透明和圓角的效 果。

    - - -

    剩下的調整就很簡單了,我們一并來完成:將標簽字體設置為粗體,正常標簽的字體顏色設置為棕色,當前標簽顏色設置為深灰色,去掉下滑線,將鼠標懸浮時的字體顏色同樣設置為深灰色。這些增加的變化在效果五中表現出來。

    一致性的特例

    在效果二之后,我們認識到,在IE5/Mac中,標簽被擴大到與頁面同寬,導致了他們垂直堆疊在下一個的上方,這并不是我們想要的效果。

    在大多數瀏覽器中,浮動會引起收縮的效果-它會收縮到僅能容納其所含元素的最小空間。如果浮動元素中包含的是圖片,那么它會收縮到與圖片大小相同,如果僅包含文字的話,它會收縮到與最長的不換行文字同寬。

    而 在IE5/Mac中,當一個自動調整寬度的塊級元素(block-level element)被插入到另一浮動元素中時,就會出現問題。其他瀏覽器依然會盡可能地收縮浮動元素,并不理會它所容納的塊級元素。但是IE5/Mac在這 種情況下并不收縮浮動元素,反而將浮動和塊級元素擴展到最大的可用寬度。在這種情況下,我們需要將錨點也同時浮動,但是僅在IE5/Mac中這樣做,以免 影響到其他瀏覽器。之后,我們就可以用反斜杠注釋法(Commented Backslash Hack)來隱藏這些代碼,使其僅在IE5/Mac下工作:

    #header a {
    float:left;
    display:block;
    background:url("right.gif")
    no-repeat right top;
    padding:5px 15px 4px 6px;
    text-decoration:none;
    font-weight:bold;
    color:#765;
    }
    /* Commented Backslash Hack
    hides rule from IE5-Mac \*/
    #header a {float:none;}
    /* End IE5-Mac hack */

    這回,IE5/Mac瀏覽器應該顯示我們所希望的效果了,見效果六。 在非IE5/Mac瀏覽器中,應該沒有任何變化。注意,IE5.0/Mac中出現了很多渲染錯誤,在IE5.1中已得到更正。因此,在IE5.0中出現的 錯誤已經超出了我所應該作為特例而修改的范疇了。由于現在升級到5.1并不困難,而OS 9 Macs用戶中仍然使用IE5.0的已經相當的少了。

    適用性

    我 們剛剛看過如何運用滑動門技術創建純文本的導航標簽,它們是由一系列錨點組成的無序列表標記而成,并賦予一些個性化的樣式。它加載快速,易于維護,并且可 以在不破壞原有設計的同時對其文本進行大比例的縮放。那么這項技術足夠靈活嗎?可以勝任創建各種類型的精美導航欄的任務嗎?

    無需懷疑,這項技術的使用只局限于我們的想象力。最終效果只展示出了其中一種可能性。但是我們不應被一種設計局限了自己的想法.

    例如,標簽沒必要非得對稱。我很快就制作出這些標簽的2.0版, 在這個版本中,并沒有使用3D陰影效果,這樣更利于展示平面色彩,有角的邊緣,以及更寬,更細致的左邊框。正如2.0版所示,我們甚至可以交換左右兩幅圖 片的位置,當然,這些均取決于你的設計。通過細致的計劃和巧妙的圖片處理,我們盡可以將下邊框徹底放棄,這更有利于標簽圖片與背景的搭配,就如在我充滿靈 感的3.0版中所表現的那樣。如果你的瀏覽器支持在樣式表間切換的話,你甚至可以看到這個主文件在三個不同的版本的樣式間切換(注:Firefox和Opera支持樣式切換)。

    其 他我們沒有討論到的效果可以基于這項技術使用。在一路舉來的這個例子中,我只改變了鼠標懸浮時的文字顏色,但除此之外你還可以將整個背景替換掉,以創造出 更為有趣的翻轉效果。只要有兩個嵌套的HTML元素標記,就可以利用CSS為他們加上背景,創造出我們甚至想都沒想過的的效果。在這個例子中我制作了一個 水平的導航標簽,但是滑動門技術在其他許多情況下都是可以使用的。

    那么,會用它做什么呢?

    posted @ 2006-08-16 17:01 阿成 閱讀(808) | 評論 (0)編輯 收藏

    第一篇、http://www.blueidea.com/bbs/newsdetail.asp?id=996916(里面有很多例子)

    第二篇、徹底明白Java的IO系統(文摘)---JAVA之精髓IO流
    一. Input和Output
    1. stream代表的是任何有能力產出數據的數據源,或是任何有能力接收數據的接收源。在Java的IO中,所有的stream(包括Input和Out stream)都包括兩種類型:
    1.1 以字節為導向的stream
    以字節為導向的stream,表示以字節為單位從stream中讀取或往stream中寫入信息。以字節為導向的stream包括下面幾種類型:
    1) input stream:
    1) ByteArrayInputStream:把內存中的一個緩沖區作為InputStream使用
    2) StringBufferInputStream:把一個String對象作為InputStream
    3) FileInputStream:把一個文件作為InputStream,實現對文件的讀取操作
    4) PipedInputStream:實現了pipe的概念,主要在線程中使用
    5) SequenceInputStream:把多個InputStream合并為一個InputStream
    2) Out stream
    1) ByteArrayOutputStream:把信息存入內存中的一個緩沖區中
    2) FileOutputStream:把信息存入文件中
    3) PipedOutputStream:實現了pipe的概念,主要在線程中使用
    4) SequenceOutputStream:把多個OutStream合并為一個OutStream
    1.2 以Unicode字符為導向的stream
    以Unicode字符為導向的stream,表示以Unicode字符為單位從stream中讀取或往stream中寫入信息。以Unicode字符為導向的stream包括下面幾種類型:
    1) Input Stream
    1) CharArrayReader:與ByteArrayInputStream對應
    2) StringReader:與StringBufferInputStream對應
    3) FileReader:與FileInputStream對應
    4) PipedReader:與PipedInputStream對應
    2) Out Stream
    1) CharArrayWrite:與ByteArrayOutputStream對應
    2) StringWrite:無與之對應的以字節為導向的stream
    3) FileWrite:與FileOutputStream對應
    4) PipedWrite:與PipedOutputStream對應
    以 字符為導向的stream基本上對有與之相對應的以字節為導向的stream。兩個對應類實現的功能相同,字是在操作時的導向不同。如 CharArrayReader:和ByteArrayInputStream的作用都是把內存中的一個緩沖區作為InputStream使用,所不同的 是前者每次從內存中讀取一個字節的信息,而后者每次從內存中讀取一個字符。
    1.3 兩種不現導向的stream之間的轉換
    InputStreamReader和OutputStreamReader:把一個以字節為導向的stream轉換成一個以字符為導向的stream。
    2. stream添加屬性
    2.1 “為stream添加屬性”的作用
    運用上面介紹的Java中操作IO的API,我們就可完成我們想完成的任何操作了。但通過FilterInputStream和FilterOutStream的子類,我們可以為stream添加屬性。下面以一個例子來說明這種功能的作用。
    如果我們要往一個文件中寫入數據,我們可以這樣操作:
    FileOutStream fs = new FileOutStream(“test.txt”);
    然 后就可以通過產生的fs對象調用write()函數來往test.txt文件中寫入數據了。但是,如果我們想實現“先把要寫入文件的數據先緩存到內存中, 再把緩存中的數據寫入文件中”的功能時,上面的API就沒有一個能滿足我們的需求了。但是通過FilterInputStream和 FilterOutStream的子類,為FileOutStream添加我們所需要的功能。
    2.2 FilterInputStream的各種類型
    2.2.1 用于封裝以字節為導向的InputStream
    1) DataInputStream:從stream中讀取基本類型(int、char等)數據。
    2) BufferedInputStream:使用緩沖區
    3) LineNumberInputStream:會記錄input stream內的行數,然后可以調用getLineNumber()和setLineNumber(int)
    4) PushbackInputStream:很少用到,一般用于編譯器開發
    2.2.2 用于封裝以字符為導向的InputStream
    1) 沒有與DataInputStream對應的類。除非在要使用readLine()時改用BufferedReader,否則使用DataInputStream
    2) BufferedReader:與BufferedInputStream對應
    3) LineNumberReader:與LineNumberInputStream對應
    4) PushBackReader:與PushbackInputStream對應
    2.3 FilterOutStream的各種類型
    2.2.3 用于封裝以字節為導向的OutputStream
    1) DataIOutStream:往stream中輸出基本類型(int、char等)數據。
    2) BufferedOutStream:使用緩沖區
    3) PrintStream:產生格式化輸出
    2.2.4 用于封裝以字符為導向的OutputStream
    1) BufferedWrite:與對應
    2) PrintWrite:與對應
    3. RandomAccessFile
    1) 可通過RandomAccessFile對象完成對文件的讀寫操作
    2) 在產生一個對象時,可指明要打開的文件的性質:r,只讀;w,只寫;rw可讀寫
    3) 可以直接跳到文件中指定的位置
    4. I/O應用的一個例子
    import java.io.*;
    public class TestIO{
    public static void main(String[] args)
    throws IOException{
    //1.以行為單位從一個文件讀取數據
    BufferedReader in =
    new BufferedReader(
    new FileReader("F:\\nepalon\\TestIO.java"));
    String s, s2 = new String();
    while((s = in.readLine()) != null)
    s2 += s + "\n";
    in.close();

    //1b. 接收鍵盤的輸入
    BufferedReader stdin =
    new BufferedReader(
    new InputStreamReader(System.in));
    System.out.println("Enter a line:");
    System.out.println(stdin.readLine());

    //2. 從一個String對象中讀取數據
    StringReader in2 = new StringReader(s2);
    int c;
    while((c = in2.read()) != -1)
    System.out.println((char)c);
    in2.close();

    //3. 從內存取出格式化輸入
    try{
    DataInputStream in3 =
    new DataInputStream(
    new ByteArrayInputStream(s2.getBytes()));
    while(true)
    System.out.println((char)in3.readByte());
    }
    catch(EOFException e){
    System.out.println("End of stream");
    }

    //4. 輸出到文件
    try{
    BufferedReader in4 =
    new BufferedReader(
    new StringReader(s2));
    PrintWriter out1 =
    new PrintWriter(
    new BufferedWriter(
    new FileWriter("F:\\nepalon\\ TestIO.out")));
    int lineCount = 1;
    while((s = in4.readLine()) != null)
    out1.println(lineCount++ + ":" + s);
    out1.close();
    in4.close();
    }
    catch(EOFException ex){
    System.out.println("End of stream");
    }

    //5. 數據的存儲和恢復
    try{
    DataOutputStream out2 =
    new DataOutputStream(
    new BufferedOutputStream(
    new FileOutputStream("F:\\nepalon\\ Data.txt")));
    out2.writeDouble(3.1415926);
    out2.writeChars("\nThas was pi:writeChars\n");
    out2.writeBytes("Thas was pi:writeByte\n");
    out2.close();
    DataInputStream in5 =
    new DataInputStream(
    new BufferedInputStream(
    new FileInputStream("F:\\nepalon\\ Data.txt")));
    BufferedReader in5br =
    new BufferedReader(
    new InputStreamReader(in5));
    System.out.println(in5.readDouble());
    System.out.println(in5br.readLine());
    System.out.println(in5br.readLine());
    }
    catch(EOFException e){
    System.out.println("End of stream");
    }

    //6. 通過RandomAccessFile操作文件
    RandomAccessFile rf =
    new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
    for(int i=0; i<10; i++)
    rf.writeDouble(i*1.414);
    rf.close();

    rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
    for(int i=0; i<10; i++)
    System.out.println("Value " + i + ":" + rf.readDouble());
    rf.close();

    rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
    rf.seek(5*8);
    rf.writeDouble(47.0001);
    rf.close();

    rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
    for(int i=0; i<10; i++)
    System.out.println("Value " + i + ":" + rf.readDouble());
    rf.close();
    }
    }
    關于代碼的解釋(以區為單位):
    1區中,當讀取文件時,先把文件內容讀到緩存中,當調用in.readLine()時,再從緩存中以字符的方式讀取數據(以下簡稱“緩存字節讀取方式”)。
    1b區中,由于想以緩存字節讀取方式從標準IO(鍵盤)中讀取數據,所以要先把標準IO(System.in)轉換成字符導向的stream,再進行BufferedReader封裝。
    2區中,要以字符的形式從一個String對象中讀取數據,所以要產生一個StringReader類型的stream。
    4區中,對String對象s2讀取數據時,先把對象中的數據存入緩存中,再從緩沖中進行讀取;對TestIO.out文件進行操作時,先把格式化后的信息輸出到緩存中,再把緩存中的信息輸出到文件中。
    5 區中,對Data.txt文件進行輸出時,是先把基本類型的數據輸出屋緩存中,再把緩存中的數據輸出到文件中;對文件進行讀取操作時,先把文件中的數據讀 取到緩存中,再從緩存中以基本類型的形式進行讀取。注意in5.readDouble()這一行。因為寫入第一個writeDouble(),所以為了正 確顯示。也要以基本類型的形式進行讀取。
    6區是通過RandomAccessFile類對文件進行操作。

    第三篇、花1K內存實現高效I/O的RandomAccessFile類(http://www-128.ibm.com/developerworks/cn/java/l-javaio/index.html),解決RandomAccessFile類效率低下的問題,特別是“與JDK1.4新類MappedByteBuffer+RandomAccessFile的對比”部分講了怎樣用jdk自己的功能實現。

    posted @ 2006-08-16 16:59 阿成 閱讀(308) | 評論 (0)編輯 收藏


    1.網頁技術分為三個方面:靜態網頁、網頁美工、動態網頁。
    2.DHTML(動態HTML)是一種通過各種技術的綜合而得以實現的概念,包括三部分:HTML、Script(JavaScrip or VBScript)、CSS(Cascading Style Sheets)。
    3.顏色“#rrggbb”六位十六進制數。
    4.js刪除提示
    1)<a? href="#" onclick="return(confirm('刪除后無法恢復,您確定刪除嗎?'))">刪除</a>
    2)JS
    <a? href="#" >刪除</a>
    <script language="javascript" type="text/javascript">
    function delete_confirm(){
    ?if(event.srcElement.outerText=="刪除" || event.srcElement.value=="刪除")
    ? event.returnValue=confirm("刪除后將不能恢復,您確認執行刪除操作么?");
    ?}
    ?document.onclick=delete_confirm;
    </script>

    5.點擊按鈕/鏈接彈出提示
    1)<input type=button value="reload" onclick="javascript:reload()">
    <script type="text/javascript">
    function reload() {
    ??if (confirm("確認?"))
    ?{
    ?var url="#";
    ?window.location.href=url;
    ?}
    }
    2)<a? href="確認后的連接地址" onclick="return(confirm('想要的提示信息?'))">顯示信息</a>

    6.返回主頁/前頁
    返回前頁:使用OnClick="history.go(-1)"
    返回主頁:使用OnClick='top.location.href="index.jsp"'
    <a href="javascript:history.back()">后退</a>
    <a href="javascript:history.go()">前進</a>
    <a href="javascript:location.reload()">刷新</a>

    7.定時關閉網頁
    在head區加入
    <SCRIPT LANGUAGE="javascript">
    setTimeout('window.close();',2000);
    </SCRIPT>
    表示兩秒后自動關閉窗口。

    8. 背景音樂
    顯示操作面板:
    在相應地方加<embed src="aladdin.mid" width="140" height="35" autostart=true controls="middleconsole">
    不顯示操作面板:
    在頁中任意地方加<embed src="aladdin.mid" hidden=true autostart=true loop=true>
    或<embed src="aladdin.mid" autostart="true" loop="2" width="80" height="30">

    9. 如何讓瀏覽器正確顯示word 文件格式?
    為了正確處理word 等格式,你需要在HTML文件中設置好該文件類型
    <meta http-equiv="Content-Type" content="application/msword">
    還有其它經常設置的文件類型:
    application/msword Microsoft Word Document
    application/pdf PDF Document
    application/wordperfect6.0 WordPerfect 6.0 Document
    application/zip ZIP archive
    audio/x-wav WAV audio format
    audio/midi MIDI audio format
    audio/x-pn-realaudio RealAudio
    image/gif GIF image format
    image/jpeg JPEG image format
    image/png PNG image format
    text/html HTML document
    text/plain Plain text
    video/mpeg MPEG video format
    video/quicktime QuickTime video format
    video/x-msvideo AVI video format

    10. 鏈接的不同方式
    在幀里顯示:在鏈接處加target="main"語句,其中main為幀名
    整頁顯示:在鏈接處加target="_top"語句
    開新窗口:在鏈接處加target="resource window"語句,如<A HREF="index.htm" TARGET="resource window"></A>

    11. 強制主頁每次都不進行緩存,而從服務器上重讀
    在Head部分加
    <MEAT HTTP-EQUIV="Pragma" CONTENT="no-cache">
    這樣一來,瀏覽器將不考慮cacke中的內容而強制重新讀入您的頁面,等于用戶使用Reload。

    12. 自動刷新
    定時刷新:<META HTTP-EQUIV="Refresh" content="10; URL=http://自己的URL">
    幻燈片效果:語句類似上面,但在頁面1中URL指向頁面2,而頁面2指向頁面3 ...
    頁面n指回頁面1,即可實現循環顯示頁面的效果

    13.提前載入圖片
    如果您的站點中后面的頁有大圖形需要顯示,您不妨在第一頁中提前載入。把語句:
    <img src="image.jpg" width=0 height=0> ,其中width,height要設置為0, 放在第一頁HTML中的任何地方。
    如果您的訪問者在第一頁停留的時間足夠長,當他進入第二頁時,圖象會立即顯示出來

    14. 自動連接
    在預定時間后自動連入另一個指定的頁面。
    方法:
    在<title>...</title>中加入以下一行:
    <meta http-equiv="refresh" content="10"; url="otherpage.htm">
    其中10代表10秒后自動連接。

    15.?移動文字
    這在主頁上是常用的,其制作方法很簡單。
    <marquee>要移動的文字</marquee>
    ? 1.移動 的方向:<direction=!> !=left, right
    ? 2.移動的方式:<bihavior=!> !=scroll ,side,alternate
    ? 3.循環次數:<loop=!> !=次數。若未指定則循環不止。
    ? 4 循環速度:<scrollamount=!> !=數

    16. 浮動背景(背景圖像不滾動 )
    當你拉住下拉條時,背景不動。
    <body backgroud="#ffff" bgproperties="fixed">
    或用CSS樣式表定義:
    <style type="text/css">
    <!--
    body { background-image: url(image/bg.gif); background-attachment: fixed}
    -->
    </style>

    17. 讓背景圖像不平鋪的CSS樣式表定義:
    <style type="text/css">
    <!--
    body { background-image: url(image/bg.gif); background-repeat: no-repeat}
    -->
    </style>
    (不懂)18. 測試瀏覽器類別并自動裝入不同的網頁
    目前微軟和網景的瀏覽器并不能完全兼容所有網頁,有的在某種瀏覽器里非常漂亮,而用其它瀏覽器查看時卻一團糟。如果你需要測試瀏覽器,可以加入以下javascript代碼并保存單獨一個網頁:
    <script language="javascript">
    function TestBrowser(){
    ie = ((navigator.appName ==
    "Microsoft Internet Explorer") & &
    (parseInt(navigator.appVersion) >= 3 ))
    ns = ((navigator.appName == "Netscape") & &
    (parseInt(navigator.appVersion) >= 3 ))
    if (ns) {
    setTimeout(''location.href="nn4.htm"'',10);
    } else {
    setTimeout(''location.href="ie4.htm"'',10);
    }
    }
    </script>
    19. 定義本網頁的關鍵字
    在網頁中加入關鍵字,可以供某些搜索站臺機器人的使用,它們會利用該關鍵字為你的網站做索引,這樣,當別人用關鍵字搜索網站時,如果你的網頁包含該關鍵字,那么就可以被列出了,定義本網頁關鍵字,可以加入以下代碼:
    <meta name="keywords" content="html,dreamweaver,flash,css">
      content 所包含的就是關鍵字,你可以自行設置。
      這里有個技巧,你可以重復某一個單詞,這樣可以提高自己網站的排行位置,如:
    <meta name="keywords" content="dreamweaver,dreamweaver,dreamweaver">
    20. 在網頁中加入E-mail鏈接并顯示預定的主題
    <a href="mailto:renyang@mail.taiji.com.cn?cc=renyangok@yahoo.com.cn&subject=hello&body=hello">
    21. 隱藏在狀態欄里出現的鏈接信息
    當指向一個鏈接時,該鏈接的信息會出現在瀏覽器狀態欄里,如果需要隱藏信息,可以如下設置:
    <a href="  如果想要指向一個鏈接時,瀏覽器狀態欄里出現特定的信息,把none 改成你需要的文字即可。
    22.如何正確使用圖片格式?
    目前在網絡上的圖片準標準格式為JPG和GIF。當圖片顏色數很多時,就選擇JPG,它的壓縮比高,而GIF適合顏色數少的圖片。
    23. 如何在網頁上顯示訪問者系統信息?
    把以下代碼加入到<Body></Body>:
    <script Language="javascript">
    document.write(navigator.appVersion)
    </script>
    24. 如何點擊一個鏈接同時在兩個frame 內變化?
    對于一個由topFrame、leftFrame、mainFrame 構成的頁面,如果想在leftFrame 中點擊鏈接,同時在其他兩個frame 內變化,代碼如下:
    <a href="x1.htm" onclick="parent.topFrame.location.href=''x2.htm''" target="mainframe">
    25. 打開一個新的瀏覽器窗口并設置窗口的屬性
    如果你需要在載入站點的同時,再打開另一個新窗口,加入以下代碼即可:
    <script language="javascript">
    <!--
    var gt = unescape('%3e');
    var popup = null;
    var over = "Launch Pop-up Navigator";
    popup = window.open('', 'popupnav', 'width=160,height=160,resizable=1,
    ???? status=yes,menubar=no,scrollbars=yes');
    if (popup != null) {
    ???? if (popup.opener == null) {
    ????????? popup.opener = self;
    ???? }
    ??? popup.location.href = 'pop.htm';}
    //-->
    </script>
    期中pop.htm可以設置為你的htm文件,對于設置新窗口的屬性,對照以下設置:
    popup = window.open('', 'popupnav', 'width=200,height=170,resizable=1,scrollbars=auto');
    width:寬,height:高,resizable:是否允許訪客縮放新窗口,scrollbars:如果文本超過一屏,是否生成滾動條,status:是否顯示狀態欄,menubar:是否顯示菜單,location:是否顯示地址欄.
    以上所有屬性使用格式為:屬性=yes或者no.而width和height兩個屬性為:width=#pixels,height=#pixels.
    26. 打印按鈕
    <form>
    <input name="Print" onClick="window.print();
    return false" type="button" value="Print">
    </form>
    27. 查看源碼按鈕
    <input type=button name="view" value="查看源碼" onClick=''window.location="view-source:" +window.location.href'' style="font-size:9pt">
    28. 如何去掉頁面滾動條?
    在body 中加入樣式表控制,代碼如下:
    <body bgcolor="#000000" leftmargin="0" topmargin="0"
    style="overflow-x: hidden; overflow-y: hidden; width: 100%">
    29. 如何讓站點自動跳轉到另一頁?
    加入以下代碼到HTML文件中即可:
    <meta http-equiv="refresh" content="5;url=http://www.yhyhw.com/">
    content中的"5"為停留的秒數,
    http://www.yhyhw.com/ 是將要跳轉的頁面。
    30. 水平線、垂直線
    插入HR很簡單:<hr size="1">。如何讓它垂直呢,更簡單:<hr size="100" width="1">
    31. 如何讓下拉式菜單中的鏈接來打開一個新的窗口?
    先把下拉式菜單設置好,如:
    <form method="POST">
    <select name="D1" size="1">
    <option value="<option value="<input type="submit" value="確定" name="B1"><input type="reset" value="重置"name="B2"></p></form>
    然后把<select name="D1" size="1">改為
    <select onChange="javascript:window.open(this.options[this.selectedIndex].value)">即可。
    32. 如何讓下拉式菜單中的鏈接來打開一個新的窗口?
    先把下拉式菜單設置好,如:
    <form method="POST">
    <select name="D1" size="1">
    <option value="
    <option value="<input type="submit" value="確定" name="B1"><input type="reset" value="重置"name="B2"></p></form>
    然后把<select name="D1" size="1">改為
    <select onChange="javascript:window.open(this.options[this.selectedIndex].value)">即可。

    34. 如何跳到頁面的頂部?
    當瀏覽者瀏覽到頁面底部后,你需要提供一個單擊,讓瀏覽者方便的跳到頁面頂部,加入以下代碼:
    <a href="#top">返回頂部</a>
    35.如何讓瀏覽器正確顯示word文件格式?
    為了正確處理word等格式,你需要在HTML文件中設置好該文件類型,比如:
    <meta http-equiv="Content-Type" content="Application/msword">
    還有其它經常設置的文件類型:
    Application/msword Microsoft Word Document application/pdf PDF Documentapplication/wordperfect6.0 WordPerfect 6.0 Documentapplication/zip ZIP archiveaudio/x-wav WAV audio formataudio/midi MIDI audio formataudio/x-pn-realaudio RealAudioimage/gif GIF image formatimage/jpeg JPEG image formatimage/png PNG image formattext/html HTML documenttext/plain Plain textvideo/mpeg MPEG video formatvideo/quicktime QuickTime video formatvideo/x-msvideo AVI video format
    36.如何在一個站點不同頁面間播放同一種聲文件?
    大家 有這樣的經驗,當你訪問一個站點首頁時,會聽到該頁設置的背景聲音文件,比如一段音樂。當你鏈接到該站點另一頁時,音樂就停止了。如何讓聲音不斷呢。其 實,你只需要建立一個上下框架結構的網頁,把聲音文件建立在下框架里,并把下框架的寬度設置為一個像素,而上框架里是頁面內容,當訪問者離開站點首頁時, 因下框架內容未變,所以,聲音不會間斷。大家還要注意兩點,第一,把框架的邊框設置為0;第二,隱藏聲音文件的播放界面,然后把上下兩個框架的背景設置為 相同。
    37.如何讓所有頁面共享同一個層疊樣式表(CSS)?
    在每一個頁面的<HEAD></HEAD>部分中加入以下代碼:
    <link rel="stylesheet" Type="text/css" href="cnshell.css">
    其中cnshell.css為共享的層疊樣式表文件
    38.如何為鏈接定制新窗口?
    我們可以打開一個新的窗口來顯示鏈接的內容,但如何定制這個新窗口呢。
    只需要在標簽<A>中加入onClick事件:
    <a href="#" onClick="window.open('cnshell.htm','help','scrollbars=yes,
    resizable=yes,width=500,height=40')">問答</a>
    "#"表示單擊鏈接"問答"后,當前窗口保持不變,cnshell.htm為單擊鏈接"問答"后所打開新窗口裝載的內容,而scrollbars=yes,resizable=yes,width=500,height=40為設置新窗口的大小等屬性。
    39. 如何在頁面利用單擊來關閉瀏覽窗口?
    在<BODY></BODY>部分加入以下代碼:
    <a href="javascript:window.close()">關閉窗口</a>
    40. 如何刪除圖片鏈接的藍色邊框?
    如果我們設置了圖片為一個鏈接,會發現圖片四周出現了藍色邊框。要刪除邊框,需要在圖片標簽里加上border="0"。如:<img src="dog.jpg" border="0">
    41. 如何清除頁面中的框架結構?
    在鏈接屬性中加入target="_top" 如下設置:
    <a href="
    當你單擊了這個鏈接,頁面所有框架被清除并以該鏈接內容替代。
    42.直接跳轉到下一頁面
    <meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
    后加入下面語句,表示跳轉到Config.do
    <meta http-equiv="refresh" content="0;url=Config.do" />
    43. 如何創建一個下拉菜單?
    我們在主頁中常會用到下拉菜單,一般來說,它需要CGI程序支持。你也可以利用javascript編寫一個。
    <head>
    <script LANGUAGE="javascript">function formHandler(){var URL = document.form.site.options[document.form.site.selectedIndex]
    .value;window.location.href = URL;}
    </script>
    </head>
    <body>
    <form name="form"><select NAME="site" SIZE="1" onChange="formHandler()"><option value="請選擇">請選擇</option><option value="
    mailtocnshell@163.net">給我寫信</option></select></form>
    </body>
    44.如何建立一個站點的搜索引擎系統?
    如果你的站點有許多內容,你希望訪問者能很快找到他想要的信息。那么你需要建立一個搜索引擎。連接到網站網絡特區45. 什么是目標窗口,它該如何設置?
    目 標窗口是頁面鏈接所指內容顯示的窗口,也就是當你單擊了頁面某一個鏈接后,該鏈接所指的內容在那個窗口顯示。大多數情況下,我們無需關心它,因為一般都是 在同一窗口顯示。target是鏈接標簽<a>的屬性,它的作用就是指定目標窗口,target有以下幾個值:
    _self-將鏈接指向的內容裝載到當前頁的窗口或框架中
    _top-完全取代當前頁面的所有框架
    _blank-為鏈接指向的內容打開一個新的窗口
    _parent-把鏈接指向的內容裝入當前頁<FRAMESET>父窗口中
    以上設置多用在框架結構的頁面中。
    46. 如何為所有鏈接指定同一目標窗口?
    在框架網頁結構中,我們需要指定鏈接所指向的內容顯示在那個窗口中。如果你的鏈接大部分都指定到同一個窗口中,就可以在<HEAD></HEAD>部分中加入:<base target="窗口名">,你無需為每個鏈接再指定窗口了。
    47. 盡量用table標簽,這樣可以避免<td>之間的干擾;<table>盡量設為<table width="100%" border="0" cellpadding="0" ellspacing="0">,一方面是不顯示表格線,另一方面占滿整個寬度,不會因為內容不夠而寬度變窄;包含<table>的 <td>要設為<td valign="top">,不然內部table默認居中。
    48.<table>中第一行表格的width控制各列寬度;每列第一個格的height控制各行高度。
    49.如何把一行表單或圖片都放于middle位置:要把每一個都用<td>隔開,每個<td>都要設valign="middle"。
    50.<td></td>之間不要有空格或空行,即應該<td><img src="***"></td>這么寫,否則圖片上下會產生空白的一細條。
    51.&nbsp;表示一個空格,這個空格占一個字符(對于字母)還是兩個字符(對于漢字)是根據瀏覽器的(工具->Internet選項->語言)來決定的,是不確定的,所以中文開頭只需要兩個&nbsp;而不是四個&nbsp;。
    52.在線播放:
    下面兩個視頻,前一個是RM視頻(.rm .rmvb),后一個是MP視頻(.wmv .asf .avi),為了不影響大家,都設置為手動播放,并將相關的代碼及說明放在了視頻的下面:
    RM源代碼:
    <OBJECT classid=clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA class=OBJECT id=RAOCX width=352 height=288>
    <PARAM NAME=SRC VALUE="
    <PARAM NAME=CONSOLE VALUE="<PARAM NAME=CONTROLS VALUE=imagewindow>
    <PARAM NAME=AUTOSTART VALUE=0 >
    </OBJECT>
    <br>
    <OBJECT classid=CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA height=32 id="video" width=352>
    <PARAM NAME=SRC VALUE="
    <PARAM NAME=AUTOSTART VALUE=0>
    <PARAM NAME=CONTROLS VALUE=controlpanel>
    <PARAM NAME=CONSOLE VALUE="
    </OBJECT>
    說明:以后可以直接把以上代碼放到網頁中使用,需要修改的屬性說明如下width=352 height=288 這是控制媒體高度和寬度的VALUE="

    MP源代碼:
    <object align=middle classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95 class=OBJECT id=MediaPlayer width=160 height=168 >
    <PARAM NAME=AUTOSTART VALUE=0 >
    <param name=ShowStatusBar value=-1>
    <param name=Filename value=http://xiaoping.cqie.cn/wmv/jler.wmv>
    <embed type=application/x-oleobject codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701 flename=mp src="
    </embed>
    </object>

    53.樹狀顯示js代碼
    (要求:某行文本前面有一個加號的標簽,一點擊加號變成減號,同時該行展開它之下所屬信息,以縮進形式呈現,再點擊減號又變回加號、下面展開的文本收回,這應該怎么做?除了js方式有什么其他方式實現么?謝謝!)
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>無標題文檔</title>
    <script language="javascript">
    function showLay(divId){
    ??????? var objDiv = eval(divId);
    ??????? if (objDiv.style.display=="none"){
    ??????????????? eval("sp"+divId+".innerHTML='-'");
    ??????????????? objDiv.style.display="";
    ??????? }else{
    ??????????????? eval("sp"+divId+".innerHTML='+'");
    ??????????????? objDiv.style.display="none";
    ??????? }}
    </script>
    </head>
    <body>
    <a href="#" onclick="showLay('Layer1')"><span id="spLayer1">+</span>a</a><br>
    <div id="Layer1" style="display:none;">
    |-<a href="insert_unit_info.html" target="body">a1</a><br>
    |-<a href="select_unit_info.jsp" target="body">a2</a><br>
    </div>
    <a href="#" onclick="showLay('Layer2')"><span id="spLayer2">+</span>b</a><BR>
    <div id="Layer2" style="display:none;">
    |-<a href="insert_item_info.html" target="body">b1</a><br>
    |-<a href="select_item_info.jsp" target="body">b2</a><br>
    </div>
    <a href="#" onclick="showLay('Layer3')"><span id="spLayer3">+</span>c</a><BR>
    <div id="Layer3" style="display:none;">
    |-<a href="insert_expert_info.html" target="body">c1</a><br>
    |-<a href="select_expert_info.jsp" target="body">c2</a><br>
    </div>
    <a href="#" onclick="showLay('Layer4')"><span id="spLayer4">+</span>d</a><BR>
    <div id="Layer4" style="display:none;">
    |-d1<br>
    |-d2<br>
    </div>
    </body>
    </html>

    54.下拉菜單(新建個.html文件,把代碼考進去就行)
    <html>
    <head>
    <title>打造下拉菜單</title>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <script language="javascript">
    function MM_reloadPage(init) {? //reloads the window if Nav4 resized
    ? if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
    ??? document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
    ? else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
    }
    MM_reloadPage(true);
    function MM_findObj(n, d) { //v4.0
    ? var p,i,x;? if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    ??? d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
    ? if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
    ? for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
    ? if(!x && document.getElementById) x=document.getElementById(n); return x;
    }
    function MM_showHideLayers() { //v3.0
    ? var i,p,v,obj,args=MM_showHideLayers.arguments;
    ? for (i=0; i<(args.length-2); i+=3) if ((obj=MM_findObj(args[i]))!=null) { v=args[i+2];
    ??? if (obj.style) { obj=obj.style; v=(v=='show')?'visible':(v='hide')?'hidden':v; }
    ??? obj.visibility=v; }
    }
    </script>
    </head>
    <body bgcolor="#CCCCCC" text="#000000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" scroll=auto>
    <div id="title" style="position:absolute; left:8px; top:15px; width:240px; height:15px; z-index:1; background-color: #006699;
    layer-background-color: #006699; border: 1px none #000000">
    ? <table width="480" cellspacing="0" cellpadding="2">
    ??? <tr>
    ????? <td width="120" onMouseOver="MM_showHideLayers('menu1','','show')" onMouseOut="MM_showHideLayers
    ('menu1','','hide')"><b><font color="#FFFFFF"><a href="#">■
    ??????? 經典論壇</a></font></b> </td>
    ??? </tr>
    ? </table>
    </div>
    <div id="menu1" style="position:absolute; left:8px; top:34px; width:120px; height:80px; z-index:2; background-color: #999966;
    layer-background-color: #999966; border: 1px none #000000; visibility: hidden" onMouseOver="MM_showHideLayers
    ('menu1','','show')" onMouseOut="MM_showHideLayers('menu1','','hide')">
    ? <table width="100%" cellspacing="0" cellpadding="2" height="80">
    ??? <tr>
    ????? <td>&nbsp;<a href="#">Dreamweaver 專欄</a></td>
    ??? </tr>
    ??? <tr>
    ????? <td>&nbsp;<a href="#">Fireworks 專欄</a></td>
    ??? </tr>
    ??? <tr>
    ????? <td>&nbsp;<a href="#">Flash 基本操作</a></td>
    ??? </tr>
    ??? <tr>
    ????? <td>&nbsp;<a href="#">Flash 5 Action</a></td>
    ??? </tr>
    ? </table>
    </div>
    </body>
    </html>

    55.防止下載網頁信息(例如顯示受控文件)的簡單方法:
    a。屏蔽鼠標左右鍵,<body oncontextmenu=self.event.returnValue=false onselectstart="return false">
    b。加密網頁源文件,推薦Batch Html Encryptor加密軟件。
    c.用Adobe Acrobat 6.0 Standard軟件加密。
    ?
    55。此方法顯示下拉框默認值
    <select name="max">
    ?<option value="1">第一名</option>
    ?<option value="2">第二名</option>
    ?<option value="3">第三名</option>
    </select>
    <script>document.all("max").value="3"</script>

    56.用javascript設置輸入框焦點
    <html>
    <head>
    <script language="javascript">
    function t() {
    document.getElementById('aa').focus();?
    }?????????????????????????? <!--設置id為aa的元素得到焦點-->
    </script>
    </head>
    <body onload="javascript:t()">
    <input type="text" id="aa"> <!--設置文本輸入框的id為aa-->
    </body>
    </html>

    57.select標簽下的OPTION標簽沒有value屬性時,把內容當屬性傳過去,比如<OPTION>所有用戶</OPTION>傳的值就是所有用戶,建議用以下方法。
    <select name="account.accountId" >
    ????<OPTION value="">所有日志</OPTION>
    ????<OPTION value="renyang">任楊</OPTION>
    </select>

    58.不保留緩存方法:
    <%
    response.setHeader("Pragma", "No-cache");
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Cache-Control", "must-revalidate");
    response.setDateHeader("Expires",0);
    %>

    59.全選、全不選js方法 (直接放在.htm文件中即可)
    <SCRIPT language="javascript">
    function checkAll(e, itemName)
    {
    ? var aa = document.getElementsByName(itemName);
    ? for (var i=0; i<aa.length; i++)
    ?? aa[i].checked = e.checked;
    }
    function check(e, allName)
    {
    ? var all = document.getElementsByName(allName)[0];
    ? if(!e.checked) all.checked = false;
    ? else
    ? {
    ??? var aa = document.getElementsByName(e.name);
    ??? for (var i=0; i<aa.length; i++)
    ???? if(!aa[i].checked) return;
    ??? all.checked = true;
    ? }
    }
    </SCRIPT>
    <input type=checkbox name=allPersons id=allPersons onclick="checkAll(this, 'persons')">&nbsp;<label for="allPersons">全選</label><br>
    <input type="checkbox" name="persons" id=persons value="1">&nbsp;<label for="persons">第一名</label><br>
    <input type="checkbox" name="persons" id=persons value="2">&nbsp;<label for="persons">第二名</label><br>
    <!-- 問題:第一名和第二名這兩個字ID不能一樣,否則點第二名這三個字時第一名前的框變化 -->
    //對于gb2312來講, 首字節碼位從0×81 至0×FE,尾字節碼位分別是0×40 至0×FE
    //本例是驗證此串是否含有gb2312格式的字符,即是否含有漢字
    public class Test{
    ? public boolean isGB2312( String str )
    ? {
    ??? char[] chars = str.toCharArray();
    ??? boolean isGB2312 = false;
    ??? for ( int i = 0; i < chars.length; i++ )
    ??? {
    ????? byte[] bytes = ( "" + chars[i] ).getBytes();
    ????? if ( bytes.length == 2 )
    ????? {
    ??????? int[] ints = new int[2];
    ??????? ints[0] = bytes[0] & 0xff;
    ??????? ints[1] = bytes[1] & 0xff;
    ??????? if ( ints[0] >= 0x81 && ints[0] <= 0xFE && ints[1] >= 0x40 && ints[1] <= 0xFE )
    ??????? {
    ????????? isGB2312 = true;
    ????????? break;
    ??????? }
    ????? }
    ??? }
    ??? return isGB2312;
    ? }
    ?
    ? public static void main(String[] args)
    ? {
    ??? String s = "ss您好ss";//結果為true
    ??? String s = "ssssss";//結果為false
    ??? Test test = new Test();
    ??? System.out.println(test.isGB2312(s));
    ? }
    }
    posted @ 2006-08-16 16:38 阿成 閱讀(489) | 評論 (0)編輯 收藏

    插入排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;
    /**
    ?* @author treeroot
    ?* @since 2006-2-2
    ?* @version 1.0
    ?*/
    public class InsertSort implements SortUtil.Sort{

    ??? /* (non-Javadoc)
    ???? * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
    ???? */
    ??? public void sort(int[] data) {
    ??????? int temp;
    ??????? for(int i=1;i<data.length;i++){
    ??????????? for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
    ??????????????? SortUtil.swap(data,j,j-1);
    ??????????? }
    ??????? }???????
    ??? }

    }
    冒泡排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    ?* @author treeroot
    ?* @since 2006-2-2
    ?* @version 1.0
    ?*/
    public class BubbleSort implements SortUtil.Sort{

    ??? /* (non-Javadoc)
    ???? * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
    ???? */
    ??? public void sort(int[] data) {
    ??????? int temp;
    ??????? for(int i=0;i<data.length;i++){
    ??????????? for(int j=data.length-1;j>i;j--){
    ??????????????? if(data[j]<data[j-1]){
    ??????????????????? SortUtil.swap(data,j,j-1);
    ??????????????? }
    ??????????? }
    ??????? }
    ??? }

    }

    選擇排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    ?* @author treeroot
    ?* @since 2006-2-2
    ?* @version 1.0
    ?*/
    public class SelectionSort implements SortUtil.Sort {

    ??? /*
    ???? * (non-Javadoc)
    ???? *
    ???? * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
    ???? */
    ??? public void sort(int[] data) {
    ??????? int temp;
    ??????? for (int i = 0; i < data.length; i++) {
    ??????????? int lowIndex = i;
    ??????????? for (int j = data.length - 1; j > i; j--) {
    ??????????????? if (data[j] < data[lowIndex]) {
    ??????????????????? lowIndex = j;
    ??????????????? }
    ??????????? }
    ??????????? SortUtil.swap(data,i,lowIndex);
    ??????? }
    ??? }

    }

    Shell排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    ?* @author treeroot
    ?* @since 2006-2-2
    ?* @version 1.0
    ?*/
    public class ShellSort implements SortUtil.Sort{

    ??? /* (non-Javadoc)
    ???? * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
    ???? */
    ??? public void sort(int[] data) {
    ??????? for(int i=data.length/2;i>2;i/=2){
    ??????????? for(int j=0;j<i;j++){
    ??????????????? insertSort(data,j,i);
    ??????????? }
    ??????? }
    ??????? insertSort(data,0,1);
    ??? }

    ??? /**
    ???? * @param data
    ???? * @param j
    ???? * @param i
    ???? */
    ??? private void insertSort(int[] data, int start, int inc) {
    ??????? int temp;
    ??????? for(int i=start+inc;i<data.length;i+=inc){
    ??????????? for(int j=i;(j>=inc)&&(data[j]<data[j-inc]);j-=inc){
    ??????????????? SortUtil.swap(data,j,j-inc);
    ??????????? }
    ??????? }
    ??? }

    }

    快速排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    ?* @author treeroot
    ?* @since 2006-2-2
    ?* @version 1.0
    ?*/
    public class QuickSort implements SortUtil.Sort{

    ??? /* (non-Javadoc)
    ???? * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
    ???? */
    ??? public void sort(int[] data) {
    ??????? quickSort(data,0,data.length-1);???????
    ??? }
    ??? private void quickSort(int[] data,int i,int j){
    ??????? int pivotIndex=(i+j)/2;
    ??????? //swap
    ??????? SortUtil.swap(data,pivotIndex,j);
    ???????
    ??????? int k=partition(data,i-1,j,data[j]);
    ??????? SortUtil.swap(data,k,j);
    ??????? if((k-i)>1) quickSort(data,i,k-1);
    ??????? if((j-k)>1) quickSort(data,k+1,j);
    ???????
    ??? }
    ??? /**
    ???? * @param data
    ???? * @param i
    ???? * @param j
    ???? * @return
    ???? */
    ??? private int partition(int[] data, int l, int r,int pivot) {
    ??????? do{
    ?????????? while(data[++l]<pivot);
    ?????????? while((r!=0)&&data[--r]>pivot);
    ?????????? SortUtil.swap(data,l,r);
    ??????? }
    ??????? while(l<r);
    ??????? SortUtil.swap(data,l,r);???????
    ??????? return l;
    ??? }

    }
    改進后的快速排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    ?* @author treeroot
    ?* @since 2006-2-2
    ?* @version 1.0
    ?*/
    public class ImprovedQuickSort implements SortUtil.Sort {

    ??? private static int MAX_STACK_SIZE=4096;
    ??? private static int THRESHOLD=10;
    ??? /* (non-Javadoc)
    ???? * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
    ???? */
    ??? public void sort(int[] data) {
    ??????? int[] stack=new int[MAX_STACK_SIZE];
    ???????
    ??????? int top=-1;
    ??????? int pivot;
    ??????? int pivotIndex,l,r;
    ???????
    ??????? stack[++top]=0;
    ??????? stack[++top]=data.length-1;
    ???????
    ??????? while(top>0){
    ??????????? int j=stack[top--];
    ??????????? int i=stack[top--];
    ???????????
    ??????????? pivotIndex=(i+j)/2;
    ??????????? pivot=data[pivotIndex];
    ???????????
    ??????????? SortUtil.swap(data,pivotIndex,j);
    ???????????
    ??????????? //partition
    ??????????? l=i-1;
    ??????????? r=j;
    ??????????? do{
    ??????????????? while(data[++l]<pivot);
    ??????????????? while((r!=0)&&(data[--r]>pivot));
    ??????????????? SortUtil.swap(data,l,r);
    ??????????? }
    ??????????? while(l<r);
    ??????????? SortUtil.swap(data,l,r);
    ??????????? SortUtil.swap(data,l,j);
    ???????????
    ??????????? if((l-i)>THRESHOLD){
    ??????????????? stack[++top]=i;
    ??????????????? stack[++top]=l-1;
    ??????????? }
    ??????????? if((j-l)>THRESHOLD){
    ??????????????? stack[++top]=l+1;
    ??????????????? stack[++top]=j;
    ??????????? }
    ???????????
    ??????? }
    ??????? //new InsertSort().sort(data);
    ??????? insertSort(data);
    ??? }
    ??? /**
    ???? * @param data
    ???? */
    ??? private void insertSort(int[] data) {
    ??????? int temp;
    ??????? for(int i=1;i<data.length;i++){
    ??????????? for(int j=i;(j>0)&&(data[j]<data[j-1]);j--){
    ??????????????? SortUtil.swap(data,j,j-1);
    ??????????? }
    ??????? }??????
    ??? }

    }

    歸并排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    ?* @author treeroot
    ?* @since 2006-2-2
    ?* @version 1.0
    ?*/
    public class MergeSort implements SortUtil.Sort{

    ??? /* (non-Javadoc)
    ???? * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
    ???? */
    ??? public void sort(int[] data) {
    ??????? int[] temp=new int[data.length];
    ??????? mergeSort(data,temp,0,data.length-1);
    ??? }
    ???
    ??? private void mergeSort(int[] data,int[] temp,int l,int r){
    ??????? int mid=(l+r)/2;
    ??????? if(l==r) return ;
    ??????? mergeSort(data,temp,l,mid);
    ??????? mergeSort(data,temp,mid+1,r);
    ??????? for(int i=l;i<=r;i++){
    ??????????? temp[i]=data[i];
    ??????? }
    ??????? int i1=l;
    ??????? int i2=mid+1;
    ??????? for(int cur=l;cur<=r;cur++){
    ??????????? if(i1==mid+1)
    ??????????????? data[cur]=temp[i2++];
    ??????????? else if(i2>r)
    ??????????????? data[cur]=temp[i1++];
    ??????????? else if(temp[i1]<temp[i2])
    ??????????????? data[cur]=temp[i1++];
    ??????????? else
    ??????????????? data[cur]=temp[i2++];???????????
    ??????? }
    ??? }

    }

    改進后的歸并排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    ?* @author treeroot
    ?* @since 2006-2-2
    ?* @version 1.0
    ?*/
    public class ImprovedMergeSort implements SortUtil.Sort {

    ??? private static final int THRESHOLD = 10;

    ??? /*
    ???? * (non-Javadoc)
    ???? *
    ???? * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
    ???? */
    ??? public void sort(int[] data) {
    ??????? int[] temp=new int[data.length];
    ??????? mergeSort(data,temp,0,data.length-1);
    ??? }

    ??? private void mergeSort(int[] data, int[] temp, int l, int r) {
    ??????? int i, j, k;
    ??????? int mid = (l + r) / 2;
    ??????? if (l == r)
    ??????????? return;
    ??????? if ((mid - l) >= THRESHOLD)
    ??????????? mergeSort(data, temp, l, mid);
    ??????? else
    ??????????? insertSort(data, l, mid - l + 1);
    ??????? if ((r - mid) > THRESHOLD)
    ??????????? mergeSort(data, temp, mid + 1, r);
    ??????? else
    ??????????? insertSort(data, mid + 1, r - mid);

    ??????? for (i = l; i <= mid; i++) {
    ??????????? temp[i] = data[i];
    ??????? }
    ??????? for (j = 1; j <= r - mid; j++) {
    ??????????? temp[r - j + 1] = data[j + mid];
    ??????? }
    ??????? int a = temp[l];
    ??????? int b = temp[r];
    ??????? for (i = l, j = r, k = l; k <= r; k++) {
    ??????????? if (a < b) {
    ??????????????? data[k] = temp[i++];
    ??????????????? a = temp[i];
    ??????????? } else {
    ??????????????? data[k] = temp[j--];
    ??????????????? b = temp[j];
    ??????????? }
    ??????? }
    ??? }

    ??? /**
    ???? * @param data
    ???? * @param l
    ???? * @param i
    ???? */
    ??? private void insertSort(int[] data, int start, int len) {
    ??????? for(int i=start+1;i<start+len;i++){
    ??????????? for(int j=i;(j>start) && data[j]<data[j-1];j--){
    ??????????????? SortUtil.swap(data,j,j-1);
    ??????????? }
    ??????? }
    ??? }

    }
    堆排序:

    package org.rut.util.algorithm.support;

    import org.rut.util.algorithm.SortUtil;

    /**
    ?* @author treeroot
    ?* @since 2006-2-2
    ?* @version 1.0
    ?*/
    public class HeapSort implements SortUtil.Sort{

    ??? /* (non-Javadoc)
    ???? * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])
    ???? */
    ??? public void sort(int[] data) {
    ??????? MaxHeap h=new MaxHeap();
    ??????? h.init(data);
    ??????? for(int i=0;i<data.length;i++)
    ??????????? h.remove();
    ??????? System.arraycopy(h.queue,1,data,0,data.length);
    ??? }


    ???? private static class MaxHeap{
    ????????
    ???????
    ??????? void init(int[] data){
    ??????????? this.queue=new int[data.length+1];
    ??????????? for(int i=0;i<data.length;i++){
    ??????????????? queue[++size]=data[i];
    ??????????????? fixUp(size);
    ??????????? }
    ??????? }
    ????????
    ??????? private int size=0;

    ??????? private int[] queue;
    ???????????????
    ??????? public int get() {
    ??????????? return queue[1];
    ??????? }

    ??????? public void remove() {
    ??????????? SortUtil.swap(queue,1,size--);
    ??????????? fixDown(1);
    ??????? }
    ??????? //fixdown
    ??????? private void fixDown(int k) {
    ??????????? int j;
    ??????????? while ((j = k << 1) <= size) {
    ??????????????? if (j < size && queue[j]<queue[j+1])
    ??????????????????? j++;
    ??????????????? if (queue[k]>queue[j]) //不用交換
    ??????????????????? break;
    ??????????????? SortUtil.swap(queue,j,k);
    ??????????????? k = j;
    ??????????? }
    ??????? }
    ??????? private void fixUp(int k) {
    ??????????? while (k > 1) {
    ??????????????? int j = k >> 1;
    ??????????????? if (queue[j]>queue[k])
    ??????????????????? break;
    ??????????????? SortUtil.swap(queue,j,k);
    ??????????????? k = j;
    ??????????? }
    ??????? }

    ??? }

    }

    ?

    SortUtil:

    package org.rut.util.algorithm;

    import org.rut.util.algorithm.support.BubbleSort;
    import org.rut.util.algorithm.support.HeapSort;
    import org.rut.util.algorithm.support.ImprovedMergeSort;
    import org.rut.util.algorithm.support.ImprovedQuickSort;
    import org.rut.util.algorithm.support.InsertSort;
    import org.rut.util.algorithm.support.MergeSort;
    import org.rut.util.algorithm.support.QuickSort;
    import org.rut.util.algorithm.support.SelectionSort;
    import org.rut.util.algorithm.support.ShellSort;

    /**
    ?* @author treeroot
    ?* @since 2006-2-2
    ?* @version 1.0
    ?*/
    public class SortUtil {
    ??? public final static int INSERT = 1;

    ??? public final static int BUBBLE = 2;

    ??? public final static int SELECTION = 3;

    ??? public final static int SHELL = 4;

    ??? public final static int QUICK = 5;

    ??? public final static int IMPROVED_QUICK = 6;

    ??? public final static int MERGE = 7;

    ??? public final static int IMPROVED_MERGE = 8;

    ??? public final static int HEAP = 9;

    ??? public static void sort(int[] data) {
    ??????? sort(data, IMPROVED_QUICK);
    ??? }
    ??? private static String[] name={
    ??????????? "insert","bubble","selection","shell","quick","improved_quick","merge","improved_merge","heap"
    ??? };
    ???
    ??? private static Sort[] impl=new Sort[]{
    ??????????? new InsertSort(),
    ??????????? new BubbleSort(),
    ??????????? new SelectionSort(),
    ??????????? new ShellSort(),
    ??????????? new QuickSort(),
    ??????????? new ImprovedQuickSort(),
    ??????????? new MergeSort(),
    ??????????? new ImprovedMergeSort(),
    ??????????? new HeapSort()
    ??? };

    ??? public static String toString(int algorithm){
    ??????? return name[algorithm-1];
    ??? }
    ???
    ??? public static void sort(int[] data, int algorithm) {
    ??????? impl[algorithm-1].sort(data);
    ??? }

    ??? public static interface Sort {
    ??????? public void sort(int[] data);
    ??? }

    ??? public static void swap(int[] data, int i, int j) {
    ??????? int temp = data[i];
    ??????? data[i] = data[j];
    ??????? data[j] = temp;
    ??? }
    }

    posted @ 2006-08-16 16:06 阿成 閱讀(306) | 評論 (0)編輯 收藏
    一、一對多映射
    1、在映射一對多的雙相關聯關系時,應該在one方把inverse屬性設為true,可以提高應用的性能。
    2、建立兩個對象的雙向關聯時,應該同時修改關聯兩端的對象的應用屬性,這樣使程序更加健壯,提高業務邏輯層的獨立性,使業務邏輯層的程序代碼不受hibernate實現的影響;同理,當解除雙相關聯關系時,也應該修改關聯兩端的對象的相應屬性。
    eg://添加
    customer.getOrders().add(order);
    order.setCustomer(customer);
    //刪除
    customer.getOrders().remove(order);
    order.setCustomer(null);
    3、在定義一對多映射中“一”的POJO類時,注意要private Set orders?= new HashSet();//通常把它初始化為集合實現類的一個實例,這樣避免訪問取值為null,引發NullPointerException異常,提高健壯性。
    二、Session三種檢索方法:
    1.load():根據給定OID從數據庫中加載一個持久化對象,如數據庫中沒有則拋出net.sf.hibernate.ObjectNotFoundException異常。
    2.get():根據給定OID從數據庫中加載一個持久化對象,如數據庫中沒有則返回null。
    3.find():按照參數指定的HQL語句加載一個或多個持久化對象,實際是HQL檢索方式的一種簡寫形式。
    三、hql查詢:
    在數組和Collection中的查詢:
    String hql = "select??u from?User u where u in (:users)";
    query.setParameterList("users", users);
    //括號千萬別忘寫,否則出現如下錯誤:
    2006-07-07 11:07:35 WARN [org.hibernate.util.JDBCExceptionReporter] - SQL Error: 907, SQLState: 42000
    2006-07-07 11:07:35 ERROR [org.hibernate.util.JDBCExceptionReporter] - ORA-00907: 缺失右括號
    posted @ 2006-08-16 15:37 阿成 閱讀(424) | 評論 (0)編輯 收藏

    Java FAQ
    ?
    目錄:
    Q1.1 什么是Java、Java2、JDK?JDK后面的1.3、1.4版本號又是怎么回事?
    Q1.2 什么是JRE/J2RE?
    Q1.3 學習Java用什么工具比較好?
    Q1.4? 學習Java有哪些好的參考書?
    Q1.5? Java和C++哪個更好?
    Q1.6? 什么是J2SE/J2EE/J2ME?
    Q2.1? 我寫了第一個Java程序,應該如何編譯/運行?
    Q2.2? 我照你說的做了,但是出現什么“'javac' 不是內部或外部命令,也不是可運行的
    程序或批處理文件。”。
    Q2.3? 環境變量怎么設置?
    Q2.4? 我在javac xxx.java的時候顯示什么“unreported exception java.io.IOExcepti
    on;”。
    Q2.5? javac xxx.java順利通過了,但是java xxx的時候顯示什么“NoClassDefFoundErr
    or”。
    Q2.6? 我在java xxx的時候顯示“Exception in thread "main" java.lang.NoSuchMetho
    dError: main”。
    Q2.7? 在java xxx的時候顯示“Exception in thread "main" java.lang.NullPointerEx
    ception”。
    Q2.8 package是什么意思?怎么用?
    Q2.9 我沒有聲明任何package會怎么樣?
    Q2.10 在一個類中怎么使用其他類?
    Q2.11 我用了package的時候顯示"NoClassDefFoundError",但是我把所有package去掉的
    時候能正常運行。
    Q2.12 我想把java編譯成exe文件,該怎么做?
    Q2.13 我在編譯的時候遇到什么"deprecated API",是什么意思?
    Q3.1 我怎么給java程序加啟動參數,就像dir /p/w那樣?
    Q3.2 我怎么從鍵盤輸入一個int/double/字符串?
    Q3.3 我怎么輸出一個int/double/字符串?
    Q3.4 我發現有些書上直接用System.in輸入,比你要簡單得多。
    Q3.5 我怎么從文件輸入一個int/double/字符串?
    Q3.6 我想讀寫文件的指定位置,該怎么辦?
    Q3.7 怎么判斷要讀的文件已經到了盡頭?
    Q4.1? java里面怎么定義宏?
    Q4.2? java里面沒法用const。
    Q4.3? java里面也不能用goto。
    Q4.4? java里面能不能重載操作符?
    Q4.5? 我new了一個對象,但是沒法delete掉它。
    Q4.6? 我想知道為什么main方法必須被聲明為public static?為什么在main方法中不能調
    用非static成員?
    Q4.7? throw和throws有什么不同?
    Q4.8? 什么是異常?
    Q4.9? final和finally有什么不同?
    Q5.1? extends和implements有什么不同?
    Q5.2? java怎么實現多繼承?
    Q5.3 abstract是什么?
    Q5.4 public,protected,private有什么不同?
    Q5.5 Override和Overload有什么不同?
    Q5.6 我繼承了一個方法,但現在我想調用在父類中定義的方法。
    Q5.7 我想在子類的構造方法中調用父類的構造方法,該怎么辦?
    Q5.8 我在同一個類中定義了好幾個構造方法并且想在一個構造方法中調用另一個。
    Q5.9 我沒有定義構造方法會怎么樣?
    Q5.10 我調用無參數的構造方法失敗了。
    Q5.11 我該怎么定義類似于C++中的析構方法(destructor)?
    Q5.12 我想將一個父類對象轉換成一個子類對象該怎么做?
    Q5.13 其實我不確定a是不是B的實例,能不能分情況處理?
    Q5.14 我在方法里修改了一個對象的值,但是退出方法后我發現這個對象的值沒變!
    Q6.1 java能動態分配數組嗎?
    Q6.2 我怎么知道數組的長度?
    Q6.3 我還想讓數組的長度能自動改變,能夠增加/刪除元素。
    Q???? 什么是鏈表?為什么要有ArrayList和LinkedList兩種List?
    Q6.5 我想用隊列/棧。
    Q6.6 我希望不要有重復的元素。
    Q6.7 我想遍歷集合/Map。
    Q6.8 我還要能夠排序。
    Q6.9 但是我想給數組排序。
    Q6.10 我想按不同方式排序。
    Q6.11 Map有什么用?
    Q6.12 set方法沒問題,但是get方法返回的是Object。
    Q6.13 ArrayList和Vector有什么不同?HashMap和Hashtable有什么不同?
    Q6.14 我要獲得一個隨機數。
    Q6.15 我比較兩個String總是false,但是它們明明都是"abc" !
    Q6.16 我想修改一個String但是在String類中沒找到編輯方法。
    Q6.17 我想處理日期/時間。

    一、準備篇

    Q1.1 什么是Java、Java2、JDK?JDK后面的1.3、1.4版本號又是怎么回事?
    答:Java是一種通用的,并發的,強類型的,面向對象的編程語言(摘自Java規范第二版
    )。
    JDK是Sun公司分發的免費Java開發工具包,正式名稱為J2SDK(Java2 Software Develop K
    it)。
    包括基本的java工具包和標準類庫。
    到目前(2003年7月)為止,Java有3個主要版本,即1.0,1.1,2.0;
    JDK有1.0,1.1,1.2,1.3,1.4五個版本。
    從JDK1.2起,Sun公司覺得Java改變足夠大而將java語言版本號提升為2.0。
    不同的JDK主要在于提供的類庫不同。作為學習你可以下載最新的JDK1.4.2。
    真正開發時則應考慮向前兼容,比如1.3。下載請去http://java.sun.com
    JDK1.5預計將在2004年推出,屆時其中將包含若干嶄新的特性。

    Q1.2 什么是JRE/J2RE?
    答:J2RE是Java2 Runtime Environment,即Java運行環境,有時簡稱JRE。
    如果你只需要運行Java程序或Applet,下載并安裝它即可。
    如果你要自行開發Java軟件,請下載JDK。在JDK中附帶有JRE。
    注意由于Microsoft對Java的支持不完全,請不要使用IE自帶的虛擬機來運行Applet,務必
    安裝一個JRE或JDK。

    Q1.3 學習Java用什么工具比較好?
    答:作者建議首先使用JDK+文本編輯器,這有助你理解下列幾個基礎概念:path,classp
    ath,package
    并熟悉基本命令:javac和java。并且下載和你的JDK版本一致的API幫助。
    如果你不確定類或函數的用法,請先查閱API而不是發貼求助。
    當你熟悉Java之后,你可以考慮開始使用一個IDE。
    作者推薦eclipse,下載網址http://www.eclipse.org。因為eclispe是免費的,插件化的

    eclispe的主要缺點是缺乏一個可視化的桌面程序開發工具,
    幸運的是IBM在2003年11月已經將部分代碼捐給eclipse組織,可以預計這個缺點很快就會
    得到彌補。
    無論如何,請不要使用Microsoft的VJ++!眾所周知Microsoft從來就沒有認真支持過Java

    最后但并非最不重要,要有一本好的參考書,并且英文要過關。

    Q1.4? 學習Java有哪些好的參考書?
    答:作者首先推薦Thinking in Java,中文名《Java編程思想》,有中文版。
    目前的最新版本是第三版。
    http://64.78.49.204可以免費下載英文版。
    該書第一章介紹了很多面向對象的編程思想,作為新手應當認真閱讀。
    除此以外,O'relly出版社和Wrox出版社的書也不錯。作者本人不喜歡大陸作者的書。
    也許你覺得英文太難,但是網上大多數資料都是英文的。另外,你需要經常查閱API,而那
    也是英文的。

    Q1.5? Java和C++哪個更好?
    答:這個問題是一個很不恰當的問題。你應該問:Java和C++哪個更適用于我的項目?
    Java的優點和缺點一樣明顯。
    跨平臺是Java的主要優點,但代價是運行速度的下降。
    VC和Windows平臺有良好的集成和足夠快的速度,但是也只能局限在Windows平臺上。
    和C++相比,Java學起來更快,開發人員不會碰到很多容易出錯的特性。
    但是VB程序員甚至只需要拼裝模塊就可以了。

    Q1.6? 什么是J2SE/J2EE/J2ME?
    答:J2SE就是一般的Java。
    J2ME是針對嵌入式設備的,比如支持Java的手機,它有自己的JRE和SDK。
    J2EE是一組用于企業級程序開發的規范和類庫,它使用J2SE的JRE。

    二、命令篇

    Q2.1? 我寫了第一個Java程序,應該如何編譯/運行?
    答:首先請將程序保存為xxx.java文件,注意你可能需要修改文件后綴名。
    然后在dos窗口下使用javac xxx.java命令,你會發現該目錄下多了一個xxx.class文件,

    再使用java xxx命令,你的java程序就開始運行了。

    Q2.2? 我照你說的做了,但是出現什么“'javac' 不是內部或外部命令,也不是可運行的
    程序或批處理文件。”。
    答:你遇到了path問題。操作系統在一定的范圍(path)內搜索javac.exe,但是沒能找到。

    請編輯你的操作系統環境變量,新增一個JAVA_HOME變量,設為你JDK的安裝目錄,
    再編輯Path變量,加上一項 %JAVA_HOME%\bin。
    然后保存并新開一個dos窗口,你就可以使用javac和java命令了。

    Q2.3? 環境變量怎么設置?
    答:請向身邊會設的人咨詢。

    Q2.4? 我在javac xxx.java的時候顯示什么“unreported exception java.io.IOExcepti
    on;”。
    答:參見Q4.8以了解java中的異常機制。

    Q2.5? javac xxx.java順利通過了,但是java xxx的時候顯示什么“NoClassDefFoundErr
    or”。
    答:1. 你遇到了classpath問題。java命令在一定的范圍(classpath)內搜索你直接或間接
    使用的class文件,但是未能找到。
    首先請確認你沒有錯敲成java xxx.class,
    其次,檢查你的CLASSPATH環境變量,其實你并不需要設置該變量,
    但如果你設置了該變量又沒有包含.(代表當前目錄)的項,
    你就會遇到這個問題。請在你的CLASSPATH環境變量中加入一項. 或干脆刪掉這個變量。

    2. 如果你使用了并非JDK自帶的標準包,比如javax.servlet.*包,也會遇到這個問題,請
    將相應的jar文件加入classpath。
    3. 如果你在java源文件中定義了package,請參見Q2.11。


    Q2.6? 我在java xxx的時候顯示“Exception in thread "main" java.lang.NoSuchMetho
    dError: main”。
    答:首先,在你的程序中每個java文件有且只能有一個public類,
    這個類的類名必須和文件名的大小寫完全一樣。
    其次,在你要運行的類中有且只能有一個public static void main(String[] args)方法

    這個方法就是你的主程序。


    Q2.7? 在java xxx的時候顯示“Exception in thread "main" java.lang.NullPointerEx
    ception”。
    答:在程序中你試圖在值為null的對象變量上調用方法,請檢查你的程序確保你的對象被恰當的初始化。
    參見Q4.8以了解java中的異常機制。


    Q2.8 package是什么意思?怎么用?
    答:為了唯一標識每個類并分組,java使用了package的概念。
    每個類都有一個全名,例如String的全名是java.lang.String,其中java.lang是包名,S
    tring是短名。按照java命名慣例,包名是全部小寫的,而類名的第一個字母是大寫的。
    這樣,如果你自行定義了同樣名字的類String,你可以把它放在mypackage中,
    通過使用全名mypackage.String和java.lang.String來區分這兩個類。
    同時,將邏輯上相關的類放在同一個包中,可以使程序結構更為清楚。
    為了定義包,你要做的就是在java文件開頭加一行“package mypackage;”。
    注意包沒有嵌套或包含關系,mypackage包和mypackage.mysubpackage包對JRE來說是并列的兩個包(雖然開發者可
    能暗示包含關系)。

    Q2.9 我沒有聲明任何package會怎么樣?
    答:你的類被認為放在默認包中。這時全名和短名是一致的。

    Q2.10 在一個類中怎么使用其他類?
    答:如果你使用java.lang包或者默認包中的類,不用做任何事。
    如果你的類位于mypackage包中,并且要調用同一包中的其他類,也不用做任何事。
    如果你使用其他包中的類,在package聲明之后,類聲明之前使用import otherpackage1.Class
    1; 或 import otherpackage2.*;?
    這里.*表示引入這個包中的所有類。然后在程序中你可以使用其他類的短名。
    如果短名間有重名沖突,必須使用全名來區分。
    注意在使用其他包中的類時,你只能使用public的類和接口,參見Q5.4。

    Q2.11 我用了package的時候顯示"NoClassDefFoundError",但是我把所有package去掉的
    時候能正常運行。
    答:將你的java文件按包名組織存放。
    比如你的工作目錄是/work,你的類是package1.Class1,那么將它存放為/work/package1
    /Class1.java。
    如果沒有聲明包,那么直接放在/work下。
    在/work下執行javac package1/class1.java,再執行java package1.class1,你會發現一
    切正常。
    另外,如果你的類的個數已經多到了你需要使用包來組織的話,你可以考慮開始使用IDE。

    Q2.12 我想把java編譯成exe文件,該怎么做?
    答:JDK只能將java源文件編譯為class文件。
    class文件是一種跨平臺的字節碼,必須依賴平臺相關的JRE來運行。Java以此來實現跨平
    臺性。
    有些開發工具可以將java文件編譯為exe文件。作者反對這種做法,因為這樣就取消了跨平
    臺性。
    如果你確信你的軟件只在Windows平臺上運行,你可以考慮使用C++/C#來編程。

    Q2.13 我在編譯的時候遇到什么"deprecated API",是什么意思?
    答:所謂deprecated是指已經過時,但是為了向前兼容起見仍然保留的方法。
    這些方法可能會在以后取消支持。你應當改用較新的方法。
    在API里面會說明你應當用什么方法來代替之。

    三、I/O篇

    Q3.1 我怎么給java程序加啟動參數,就像dir /p/w那樣?
    答:還記得public static void main(String[] args)嗎?這里的args就是你的啟動參數

    在運行時你輸入java package1.class1 arg1 arg2,args中就會有兩個String,第一個是
    arg1,第二個是arg2。

    Q3.2 我怎么從鍵盤輸入一個int/double/字符串?
    答:java的I/O操作比C++要復雜一點。如果要從鍵盤輸入,樣例代碼如下:
    BufferedReader cin = new BufferedReader( new InputStreamReader( System.in ) );

    String s = cin.readLine();
    這樣你就獲得了一個字符串,如果你需要數字的話再使用:
    int n = Integer.parseInt( s ); 或者 double d = Double.parseDouble( s );
    來將字符串"534"轉換成int或double。

    Q3.3 我怎么輸出一個int/double/字符串?
    答:使用System.out.println(n)或者System.out.println("Hello")等等。

    Q3.4 我發現有些書上直接用System.in輸入,比你要簡單得多。
    答:java使用unicode,是雙字節。而System.in是單字節的stream。
    如果你要輸入雙字節文字比如中文,請使用作者的做法。

    Q3.5 我怎么從文件輸入/輸出一個int/double/字符串?
    答:類似于從鍵盤輸入,只不過換成
    BufferedReader fin = new BufferedReader( new FileReader(" myFileName " ) );
    PrintWriter fout = new PrintWriter( new FileWriter(" myFileName " ) );
    另外如果你還沒下載API,請開始下載并閱讀java.io包中的內容。

    Q3.6 我想讀寫文件的指定位置,該怎么辦?
    答:java.io.RandomAccessFile可以滿足你的需要。

    Q3.7 怎么判斷要讀的文件已經到了盡頭?
    答:在Reader的read方法中明確說明返回-1表示流的結尾。

    四、 關鍵字篇

    Q4.1? java里面怎么定義宏?
    答:java不支持宏,因為宏代換不能保證類型安全。
    如果你需要定義常量,可以將它定義為某個類的static final成員。參見Q4.2和Q4.6。


    Q4.2? java里面沒法用const。
    答:你可以用final關鍵字。例如 final int m = 9。被聲明為final的變量不能被再次賦
    值。唯一的例外是所謂blank final,如下例所示:
    public class MyClass1 {
    ??? private final int a = 3;
    ??? private final int b; // blank final

    ??? public MyClass1() {
    ??????? a = 5; // 不合法,final變量不能被再次賦值。
    ??????? b = 4; // 合法,這是b第一次被賦值。
    ??????? b = 6; // 不合法,b不能被再次賦值。
    ??? }
    }
    final也可以用于聲明方法或類,被聲明為final的方法或類不能被繼承。
    注意const是java的保留字以備擴充。

    Q4.3? java里面也不能用goto。
    答:甚至在面向過程的語言中你也可以完全不用goto。請檢查你的程序流程是否合理。

    如果你需要從多層循環中迅速跳出,java增強了(和C++相比)break和continue的功能,
    支持label。
    例如:
    outer :
    while( ... )
    {
    inner :
    for( ... )
    {
    ?????????? ...?? break inner; ...
    ?????????? ... continue outer; ...
    }
    }
    和const一樣,goto也是java的保留字以備擴充。

    Q4.4? java里面能不能重載操作符?
    答:不能。String的+號是唯一一個內置的重載操作符。你可以通過定義接口和方法來實現
    類似功能。

    Q4.5? 我new了一個對象,但是沒法delete掉它。
    答:java有自動內存回收機制,即所謂Garbarge Collection。你不需要刪除對象。你再也
    不用擔心指針錯誤,內存溢出了。

    Q4.6? 我想知道為什么main方法必須被聲明為public static?為什么在main方法中不能調
    用非static成員?
    答:聲明為public是為了這個方法可以被外部調用,詳情見Q5.4。
    static是為了將某個成員變量/方法關聯到類(class)而非實例(instance)。
    你不需要創建一個對象就可以直接使用這個類的static成員,因而在static成員中不能調
    用非static成員,因為后者是關聯到對象實例(instance)的。
    在A類中調用B類的static成員可以使用B.staticMember的寫法。
    注意一個類的static成員變量是唯一的,被所有該類對象所共享的,在多線程程序設計中尤其要謹慎小心。
    類的static成員是在類第一次被JRE裝載的時候初始化的。
    你可以使用如下方法來使用非static成員:
    public class A
    {
    ??? private void someMethod() //非static成員
    ??? {}
    ??? public static void main(String args)
    ??? {
    ???????? A a = new A();? //創建一個對象實例
    ???????? a.someMethod();? //現在你可以使用非static方法了
    ??? }
    }


    Q4.7? throw和throws有什么不同?
    答:throws用于方法聲明中,聲明一個方法會拋出哪些異常。而throw是在方法體中實際執行拋出異常的
    動作。
    如果你在方法中throw一個異常,卻沒有在方法聲明中聲明之,編譯器會報錯。
    注意Error和RuntimeException的子類是例外,無需特別聲明。

    Q4.8? 什么是異常?
    答:異常最早在Ada語言中引入,用于在程序中動態處理錯誤并恢復。
    你可以在方法中攔截底層異常并處理之,也可以拋給更高層的模塊去處理。
    你也可以拋出自己的異常指示發生了某些不正常情況。常見的攔截處理代碼如下:
    try
    {
    ......//以下是可能發生異常的代碼
    ??????? ...... //異常被你或低層API拋出,執行流程中斷并轉向攔截代碼。
    ??????? ......
    }
    catch(Exception1 e) //如果Exception1是Exception2的子類并要做特別處理,應排在前

    {
    ? //發生Exception1時被該段攔截
    }
    catch(Exception2 e)
    {
    ? //發生Exception2時被該段攔截
    }
    finally //這是可選的
    {
    ?? //無論異常是否發生,均執行此段代碼
    ?? //即使在catch段中又向外拋出了新的exception,finally段也會得到執行。
    }

    Q4.9? final和finally有什么不同?
    答:final請見Q4.2。finally用于異常機制,參見Q4.8。

    五、 面向對象篇

    Q5.1? extends和implements有什么不同?
    答:對于class而言,extends用于(單)繼承一個類(class),而implements用于實現一個接口(interf
    ace)。
    interface的引入是為了部分地提供多繼承的功能。
    在interface中只需聲明方法頭,而將方法體留給實現的class來做。
    這些實現的class的實例完全可以當作interface的實例來對待。
    在interface之間也可以聲明為extends(多繼承)的關系。
    注意一個interface可以extends多個其他interface。

    Q5.2? java怎么實現多繼承?
    答:java不支持顯式的多繼承。
    因為在顯式多繼承的語言例如c++中,會出現子類被迫聲明祖先虛基類構造函數的問題,

    而這是違反面向對象的封裝性原則的。
    java提供了interface和implements關鍵字來部分地實現多繼承。參見Q5.1。

    Q5.3 abstract是什么?
    答:被聲明為abstract的方法無需給出方法體,留給子類來實現。
    而如果一個類中有abstract方法,那么這個類也必須聲明為abstract。
    被聲明為abstract的類無法實例化,盡管它可以定義構造方法供子類使用。

    Q5.4 public,protected,private有什么不同?
    答:這些關鍵字用于聲明類和成員的可見性。
    public成員可以被任何類訪問,
    protected成員限于自己和子類訪問,
    private成員限于自己訪問。
    Java還提供了第四種的默認可見性,一般稱為package private,當沒有任何public,protected,private修飾符時,成員
    是同一包內可見。
    類可以用public或默認來修飾。

    Q5.5 Override和Overload有什么不同?
    答:Override是指父類和子類之間方法的繼承關系,這些方法有著相同的名稱和參數類型

    Overload是指同一個類中不同方法(可以在子類也可以在父類中定義)間的關系,
    這些方法有著相同的名稱和不同的參數類型。


    Q5.6 我繼承了一個方法,但現在我想調用在父類中定義的方法。
    答:用super.xxx()可以在子類中調用父類方法。

    Q5.7 我想在子類的構造方法中調用父類的構造方法,該怎么辦?
    答:在子類構造方法的第一行調用super(...)即可。

    Q5.8 我在同一個類中定義了好幾個構造方法并且想在一個構造方法中調用另一個。
    答:在構造方法第一行調用this(...)。

    Q5.9 我沒有定義構造方法會怎么樣?
    答:自動獲得一個無參數的構造方法。

    Q5.10 我調用無參數的構造方法失敗了。
    答:如果你至少定義了一個構造方法,就不再有自動提供的無參數的構造方法了。
    你需要另外顯式定義一個無參數的構造方法。
    另外一種可能是你的構造方法或者類不是public的,參見Q5.4了解java中的可見性。

    Q5.11 我該怎么定義類似于C++中的析構方法(destructor)?
    答:提供一個void finalize()方法。在Garbarge Collector回收該對象時會調用該方法。

    注意實際上你很難判斷一個對象會在什么時候被回收。作者從未感到需要用到該方法。


    Q5.12 我想將一個父類對象轉換成一個子類對象該怎么做?
    答:強制類型轉換。如
    public void meth(A a)
    {
    B b = (B)a;
    }
    如果a實際上并不是B的實例,會拋出ClassCastException。所以請確保a確實是B的實例。


    Q5.13 其實我不確定a是不是B的實例,能不能分情況處理?
    答:可以使用instanceof操作符。例如
    if( a instanceof B )
    {
    B b = (B)a;
    }
    else
    {
    ...
    }

    Q5.14 我在方法里修改了一個對象的值,但是退出方法后我發現這個對象的值沒變!
    答:很可能你把傳入參數重賦了一個新對象,例如下列代碼就會造成這種錯誤:
    public void fun1(A a) //a是局部參數,指向了一個外在對象。
    {
    a = new A(); //a指向了一個新對象,和外在對象脫鉤了。如果你要讓a作為傳出變量,
    不要寫這一句。
    ??????? a.setAttr(attr);//修改了新對象的值,外在對象沒有被修改。
    }
    基本類型也會出現這種情況。例如:
    public void fun2(int a)
    {
    a = 10;//只作用于本方法,外面的變量不會變化。
    }

    六、java.util篇

    Q6.1 java能動態分配數組嗎?
    答:可以。例如int n = 3; Language[] myLanguages = new Language[n];

    Q6.2 我怎么知道數組的長度?
    答:用length屬性。如上例中的? myLanguages.length 就為 3。

    Q6.3 我還想讓數組的長度能自動改變,能夠增加/刪除元素。
    答:用順序表--java.util.List接口。
    你可以選擇用ArrayList或是LinkedList,前者是數組實現,后者是鏈表實現。
    例如:? List list = new ArrayList(); 或是 List list = new LinkedList();? 。

    Q??? 什么是鏈表?為什么要有ArrayList和LinkedList兩種List?
    答:請補習數據結構。

    Q6.5 我想用隊列/棧。
    答:用java.util.LinkedList。

    Q6.6 我希望不要有重復的元素。
    答:用集合--java.util.Set接口。例如:Set set = new HashSet()。

    Q6.7 我想遍歷集合/Map。
    答:用java.util.Iterator。參見API。

    Q6.8 我還要能夠排序。
    答:用java.util.TreeSet。例如:Set set = new TreeSet()。放進去的元素會自動排序

    你需要為元素實現Comparable接口,還可能需要提供equals()方法,compareTo()方法,h
    ashCode()方法。

    Q6.9 但是我想給數組排序。
    答:java.util.Arrays類包含了sort等實用方法。

    Q6.10 我想按不同方式排序。
    答:為每種方式定義一個實現了接口Comparator的排序類并和Arrays或TreeSet綜合運用。


    Q6.11 Map有什么用?
    答:存儲key-value的關鍵字-值對,你可以通過關鍵字來快速存取相應的值。

    Q6.12 set方法沒問題,但是get方法返回的是Object。
    答:強制類型轉換成你需要的類型。參見Q5.12。

    Q6.13 ArrayList和Vector有什么不同?HashMap和Hashtable有什么不同?
    答:ArrayList和HashMap是多線程不安全的,在多個線程中訪問同一個ArrayList對象可能
    會引起沖突并導致錯誤。
    而Vector和Hashtable是多線程安全的,即使在多個線程中同時訪問同一個Vector對象也不
    會引起差錯。
    看起來我們更應該使用Vector和Hashtable,但是實際上Vector和Hashtable的性能太差,
    所以如果你不在多線程中使用的話,還是應該用ArrayList和HashMap。

    Q6.14 我要獲得一個隨機數。
    答:使用java.util.Random類。

    Q6.15 我比較兩個String總是false,但是它們明明都是"abc" !
    答:比較String一定要使用equals或equalsIgnoreCase方法,不要使用 == !
    ==比較的是兩個引用(變量)是否指向了同一個對象,而不是比較其內容。

    Q6.16 我想修改一個String但是在String類中沒找到編輯方法。
    答:使用StringBuffer類。
    String str = "......."; //待處理的字符串
    StringBuffer buffer = new StringBuffer(str); //使用該字符串初始化一個StringBuf
    fer
    buffer.append("..."); //調用StringBuffer的相關API來編輯字符串
    String str2 = buffer.toString(); //獲得編輯后的字符串。
    另外,如果你需要將多個字符串連接起來,請盡量避免使用+號直接連接,而是使用Strin
    gBuffer.append()方法。

    Q6.17 我想處理日期/時間。
    答:使用java.util.Date類。你可以使用java.text.SimpleDateFormat類來在String和Da
    te間互相轉換。
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //規
    定日期格式
    Date date = formatter.parse("2003-07-26 18:30:35"); //將符合格式的String轉換為
    Date
    String s = formatter.format(date); //將Date轉換為符合格式的String
    關于定義日期格式的詳細信息請參見API。
    ?

    J2EE FAQ
    ?
    目錄:

    一、準備篇
    Q1.1?? 什么是J2EE?它和普通的Java有什么不同?
    Q1.2?? J2EE好學嗎?
    Q1.3?? J2EE有什么用?
    Q1.4?? 學J2EE有前途嗎?
    Q1.5?? 據說J2EE的性能不如.NET好,是真的嗎?
    Q1.6?? 聽你說了這么多,我想學著玩玩。
    Q1.7?? 學習J2EE該怎么開始?
    Q1.8?? 我下了一個J2EE服務器但是不會配置。
    Q1.9?? 我發現你沒有提到Tomcat。

    二、 Servlet/JSP篇
    Q2.1?? 什么是Servlet?
    Q2.2?? 我怎么獲得Http請求里的參數?
    Q2.3?? 我怎么返回結果?
    Q2.4?? sendRedirect()和forward()有什么不同?
    Q2.5?? 我寫了一個Servlet程序,怎么運行它?
    Q2.6?? EAR和WAR有什么不同?
    Q2.7?? EAR格式是怎樣的?
    Q2.8?? WAR格式是怎樣的?
    Q2.9?? 我的普通HTML文件/JSP文件應當放在哪里?
    Q2.10? 我訪問不到servlet,甚至連HTML文件都訪問不到!
    Q2.11? 我能訪問HTML但是訪問不到servlet。
    Q2.12? 什么是JSP?它和Servlet有什么區別?
    Q2.13? 我的JSP顯示的漢字是亂碼。
    Q2.14? 為什么使用gb18030而不是gb2312?
    Q2.15? 在JSP里面怎么引用Java Bean。
    Q2.16? 我想在servlet間傳遞數據。
    Q2.17? 怎么調用cookie?
    Q2.18? 怎么在JSP里面實現文件下載?
    Q2.19? 怎么實現文件上傳?
    Q2.20? 我想讓頁面自動刷新,比如聊天室。
    Q2.21? 我想讓用戶登錄以后才能訪問頁面。
    Q2.22? 我想要能注冊用戶。
    Q2.23? 怎么在JSP中訪問數據庫?
    Q2.24? 什么是JSTL?

    一、準備篇

    Q1.1? 什么是J2EE?它和普通的Java有什么不同?
    答:J2EE全稱為Java2 Platform, Enterprise Edition。
    “J2EE平臺本質上是一個分布式的服務器應用程序設計環境——一個Java環境,它提供了

    ·宿主應用的一個運行基礎框架環境。
    ·一套用來創建應用的Java擴展API。”

    Q1.2? J2EE好學嗎?
    答:J2EE是很多技術的集合體,并且還在成長中。
    你會遇到很多專有名詞:比如(X)HTML,Servlet/JSP,JDBC,JMS,JNDI,EJB,XML,Web
    Service……。
    尤其是XML和Web Service正在快速成長。幸運的是,你不需要等到學會所有技術后再開始
    編程。
    大體上J2EE可以分成3個主要應用方式:Servlet/JSP,EJB,Web Service 和一些支撐技術
    例如JDBC和JNDI。
    你可以一個一個的學。

    Q1.3 J2EE有什么用?
    答:用來建設大型的分布式企業級應用程序。或者用更時髦的名詞說就是“電子商務”應
    用程序。
    這些企業可能大到擁有中心數據庫服務器,Web服務器集群和遍布全國的辦公終端,也可能
    小到只不過想做一個網站。但是你肯定聽過“殺雞焉用牛刀”的古訓。

    Q1.4 學J2EE有前途嗎?
    答:在這一市場目前只有一種技術可以和J2EE競爭,那就是Microsoft的.NET。
    相對來說.NET要“新”一些而J2EE要“老”一些。這也意味著.NET更易用一點而J2EE更成
    熟一點。
    但是.NET只能用于Windows平臺(Microsoft聲稱要開發C#在Linux上的虛擬機但是尚未兌現
    該諾言)。
    在過去幾年,.NET的市場份額并不理想。不過Microsoft還有Longhorn這一殺手锏,鹿死誰
    手還很難說。

    Q1.5 據說J2EE的性能不如.NET好,是真的嗎?
    答:在Sun公司提供的樣例程序Pet Store上,Microsoft聲稱不如相同的.NET程序好。
    而Sun公司反駁說這一程序不能真正體現J2EE的性能,并且指責Microsoft在數據庫上做了
    優化。
    作者沒有學習過.NET因而不能妄下斷言。
    無論如何,大型分布式程序中的性能瓶頸通常首先來自于錯誤的設計。

    Q1.6 聽你說了這么多,我想學著玩玩。
    答:除非你想靠它當飯吃或者作為技術儲備,否則請不要浪費你的時間。
    Flash要好玩得多。計算機游戲就更加好玩了。

    Q1.7 學習J2EE該怎么開始?
    答:首先,下載一個免費的J2EE服務器。其次,去java.sun.com下載J2EE的API。第三,找
    一本好的參考書。最后,找一個順手的IDE。
    J2EE服務器。你可以用Sun的J2EE SDK(免費),或者Weblogic(性能最好,但是太大,而
    且作者不推薦盜版行為),
    或者JBoss(免費,就是文檔太少),或者JRun(開發版免費,作者用這個)。
    參考書作者感覺Wrox的《J2EE服務器端高級編程》不錯,但是太老(作者手頭的是2001年
    中文版)。
    (似乎很多人不喜歡這本書......所以你得自己判斷它是否適合你。)
    你還需要去下載一些最新的技術資料(當然肯定是英文的)。
    IDE如果你的機器配置夠好(內存至少512M以上,256M或以下請勿考慮),可以用IBM的WS
    AD,不然就繼續用Eclipse或者其他。
    你也可以經常去水木清華的Java版逛逛,但是在發貼前先看看精華區里有沒有你要的答案

    Q1.8 我下了一個J2EE服務器但是不會配置。
    答:請認真閱讀隨機指導文檔,不同的服務器的配置都不一樣,作者愛莫能助。

    Q1.9 我發現你沒有提到Tomcat。
    答:Tomcat只是一個Web服務器,更準確地說主要只是一個Web Container。
    如果你想要學習EJB的話,Tomcat無法滿足你的需要。

    二、 Servlet/JSP篇

    Q2.1 什么是Servlet?
    答:一個Servlet是一個Java類。它處理Http(s)請求并作出響應,包括返回一個HTML頁面
    或轉交給其他URL處理。
    Servlet必須運行在一個Web Container例如Tomcat中。
    Servlet必須是javax.servlet.http.HttpServlet的子類,
    你可以繼承doGet()或者doPost()方法,兩者分別對應于Http(s)中的Get請求和Post請求。


    Q2.2 我怎么獲得Http請求里的參數?
    答:HttpRequest的getParameter()方法。例如:String paramValue = request.getPara
    meter("paramName");

    Q2.3 我怎么返回結果?
    答:你可以利用相關API打開一個輸出流,并向流中直接寫入一個HTML頁面。
    但是作者完全不贊成這樣做。一方面這樣做會很羅嗦。
    另一方面從Model-View-Controller模式(在《J2EE核心模式》中被歸為Front Controlle
    r模式)的觀點來看,
    你應當提供一些HTML或者JSP作為視圖(view),而Servlet則根據請求參數決定轉到哪一
    個視圖。
    你可以利用response.sendRedirect(...)方法或request.getDispatcher(...).forward()
    方法來實現。

    Q2.4 sendRedirect()和forward()有什么不同?
    答:sendRedirect()是向瀏覽器發送一個redirect通知,瀏覽器向新的URL發送一個新的請
    求。
    而forward是在服務器端直接將請求轉到新的URL,對于瀏覽器是透明的。
    換而言之,sendRedirect()應當將共享數據放在session中,forward應當將共享數據放在
    request中(當然你也可以放在session中,但放在request中可以有效減小session中的數
    據量,從而改善性能)。
    前者瀏覽器的地址欄顯示的是新的URL,后者瀏覽器的地址欄顯示的是Servlet的URL。
    因而當刷新目標URL時,兩者會造成一些差別。

    Q2.5 我寫了一個Servlet程序,怎么運行它?
    答:開發J2EE程序有一個部署(deploy)的概念,實際上是開發——部署——運行的三部
    曲。
    大多數服務器支持Hot deploy。你只需要在相應的Application目錄(具體路徑依賴于服務
    器)下面
    建立一個符合WAR或EAR格式(參見Q2.7,Q2.8)的目錄,啟動服務器,就可以通過瀏覽器
    訪問了。
    特別的,你的Servlet的class文件應當放在/WEB-INF/classes目錄中。
    注意J2EE SDK不支持Hot deploy,你需要通過它的deploy tool來部署。
    Tomcat只支持WAR格式。

    Q2.6 EAR和WAR有什么不同?
    答:EAR是一個完整的J2EE應用程序,包括Web部分和EJB部分。
    WAR只是其中的Web部分。

    Q2.7 EAR格式是怎樣的?
    答:一個EAR可以包含任意多個WAR或EJB JAR,并且包含一個META-INF的目錄。
    在/META-INF中包含了一個application.xml,其中描述了這個EAR包含哪些模塊,以及安全
    性配置。
    細節請看參考書。

    Q2.8 WAR格式是怎樣的?
    答:一個WAR包含一個WEB-INF的目錄,這個目錄下包含classes目錄,lib目錄和web.xml。

    /WEB-INF/classes存放按package組織的class文件,/WEB-INF/lib目錄存放jar文件,
    web.xml描述了很多東西,請讀參考書。

    Q2.9 我的普通HTML文件/JSP文件應當放在哪里?
    答:放在除了/WEB-INF以外的其他地方。

    感謝antegg網友對于安全性的提醒:
    如果你想直接用http://url/***.jsp的方式來訪問,就要像上面說得那樣放。
    但是這樣的做法是不安全的,安全的做法是把所有的JSP頁面放在/WEB-INF目錄下面,并且

    通過WEB-CONTAINER來訪問。

    作者意見:
    我更喜歡用filter來做安全性檢查。
    在MVC模式中,JSP只是一個視圖而已,一般無需特別擔憂安全性。和普通的html放在一起
    也利于維護。

    Q2.10 我訪問不到servlet,甚至連HTML文件都訪問不到!
    答:
    第一你沒啟動服務器。
    第二你敲錯了端口。
    第三你沒有正確配置context-path。
    第四你的服務器不支持auto reload或者你關閉了這一選項,你得重啟服務器或重新部署W
    AR。
    第五確認你沒有把HTML放在/WEB-INF目錄下,那是訪問不到的。

    Q2.11 我能訪問HTML但是訪問不到servlet。
    答:請檢查你的web.xml文件。確保你正確定義了<servlet>和<servlet-mapping>元素。

    前者標識了一個servlet,后者將一個相對于context-path的URL映射到一個servlet。
    在Tomcat中你可以通過/context-path/servlet/package/servletname的形式訪問servlet

    但是這只是Tomcat的便捷訪問方式,并不是正式規范。
    細節請看參考書。

    Q2.12? 什么是JSP?它和Servlet有什么區別?
    答:你可以將JSP當做一個可擴充的HTML來對待。
    雖然在本質上JSP文件會被服務器自動翻譯為相應的Servlet來執行。
    可以說Servlet是面向Java程序員而JSP是面向HTML程序員的,除此之外兩者功能完全等價

    Q2.13? 我的JSP顯示的漢字是亂碼。
    答:在你的JSP開頭加上一行 <%@ page contentType="text/html; charset=gb18030"%>

    如果你已經聲明了page我想你知道該怎么修改。

    Q2.14? 為什么使用gb18030而不是gb2312?
    答:gb18030是繼gb2312之后的下一代漢字編碼標準,最終將過渡到Unicode。

    Q2.15? 在JSP里面怎么引用Java Bean。
    答:首先,確認你要引用的類在/WEB-INF/classes下或在/WEB-INF/lib的某個jar內。
    其次,在JSP里加一行 <jsp:useBean id="..." scope="..." class="..."/>
    具體解釋請看參考書。

    Q2.16? 我想在servlet間傳遞數據。
    答:利用session。在Servlet/JSP中,你可以在4個地方保存數據。
    1) page,本頁面。
    2) session,用來存放客戶相關的信息,比如購物車,對應接口為javax.servlet.http.H
    ttpSession。
    session機制實際上是cookie和URL Rewriting的抽象,服務器會自動使用cookie或URL Re
    writing來實現。
    3) request,可以在forward()時傳遞信息,對應接口為javax.servlet.http.HttpReques
    t。
    4) application,或稱context,存放全局信息,對應接口為javax.servlet.ServletCont
    ext。

    Q2.17? 怎么調用cookie?
    答:作者建議使用session,你總是會遇到某些禁用cookie的用戶。這時session會自動使
    用URL重寫來實現。

    Q2.18? 怎么在JSP里面實現文件下載?
    答:實際上這是一個HTML的問題。答案是一個超鏈接<a>。

    Q2.19? 怎么實現文件上傳?
    答:客戶端是HTML問題,在form中設置method為post,enctype為multi-part/form-data,
    加一個<input type="file">。
    而在接收的servlet中只是一個I/O問題,你可以使用jakarta的file-upload庫。

    Q2.20? 我想讓頁面自動刷新,比如聊天室。
    答:這是一個HTML問題,在<head>部分中加一條<meta http-equiv="refresh" content="
    5" url="...">。
    這是所謂的Client-pull,客戶端刷新技術。
    相對的還有Server-push,服務器端刷新技術,但是這一技術由于要占用服務器端資源而會
    在大量訪問時出現瓶頸現象,參見http://216.239.33.104/search?q=cache:autUfoakirY
    J:www.kfunigraz.ac.at/edvndwww/books/books/javaenterprise/servlet/ch06_03.htm+
    server-push+servlet&hl=zh-CN&ie=UTF-8

    Q2.21? 我想讓用戶登錄以后才能訪問頁面。
    答:使用聲明式安全措施。
    你只需要在web.xml中定義安全角色(Role),并定義受保護的URL集合只能由特定Role訪
    問。
    大多數服務器支持基于數據庫的用戶映射,你只要在相應數據庫中建立兩張表并配置服務
    器就可以了。
    注意J2EE SDK不支持基于數據庫的用戶映射。
    細節請看參考書和服務器文檔。
    不過在商業環境中,J2EE所提供的聲明式安全措施仍然偏弱。一般商業程序會使用數據庫
    存儲user-role-privilege模型來達到安全性要求,細節請詢問你的構架設計師。

    Q2.22? 我想要能注冊用戶。
    答:參看Q2.21。在接受注冊請求的Servlet中執行寫入數據庫操作即可。

    Q2.23? 怎么在JSP中訪問數據庫?
    答:標準做法是使用DAO模式,定義一個Java bean來訪問數據庫并在JSP中使用。
    然而,當你的數據庫模式很簡單時,你可以使用JSTL中的<sql:query>標簽來快速訪問。

    在一般的J2EE項目中,JSP處于表示層(展現層),需要先后通過業務層和集成層才會訪問
    到數據庫,所以這個問題確實只會在很小的程序中才會遇到。

    Q2.24? 什么是JSTL?
    答:JSTL是Jsp Standard Tag Library的縮寫。這是一組通用標簽并將成為JSP 2.0的一部
    分。
    其中包含賦值<c:set>,分支<c:if>,循環<c:forEach>,查詢數據庫<sql:query>,更新數
    據庫<sql:update>
    等。目前你需要像添加自定義標簽庫一樣來添加JSTL,但是可以預計JSP 2.0會將JSTL作為
    組成部分。
    標簽庫可以在http://jakarta.apache.org下載。注意JSTL需要在支持JSP 1.2或更高版本
    的容器下運行。
    幫助文件可以閱讀sun的JSTL正式規范
    posted @ 2006-08-16 14:43 阿成 閱讀(275) | 評論 (0)編輯 收藏
    (轉自:轉自:http://cutelife.bokee.com/blog/3474380.html
    前言:該文章只是簡單介紹一下hsql的入門內容,如果想仔細了解的話,參考官方幫助文檔最為有用。

    一、簡介:
    hsql數據庫是一款純Java編寫的免費數據庫,許可是BSD-style的協議,如果你是使用Java編程的話,不凡考慮一 下使用它,相對其他數據庫來說,其體積小,才563kb。僅一個hsqldb.jar文件就包括了數據庫引擎,數據庫驅動,還有其他用戶界面操作等內容。 在Java開源世界里,hsql是極為受歡迎的(就Java本身來說),JBoss應用程序服務器默認也提供了這個數據庫引擎。由于其體積小的原因,又是 純Java設計,又支持SQL99,SQL2003大部分的標準,所以也是作為商業應用程序展示的一種選擇。請到以下地址下載hsql: http://prdownloads.sourceforge.net/hsqldb/hsqldb_1_7_3_3.zip?download

    二、使用hsql數據庫:
    1、hsql數據庫引擎有幾種服務器模式:常用的Server模式、WebServer模式、Servlet模式、Standlone模式、Memory-Only數據庫。
    2、最為常用的Server模式:
    1)首先卻換到lib文件夾下,運行java -cp hsqldb.jar org.hsqldb.Server -database.0 db/mydb -dbname.0 xdb
    執行命令后,將會在db文件夾下創建一個數據庫mydb,別名(用于訪問數據庫)是xdb,如果存在mydb數據庫,將會打開它。
    2)運行數據庫界面操作工具:java -cp hsqldb.jar org.hsqldb.util.DatabaseManager
    在Type 選項里選上相應的服務器模式,這里選擇HSQL Database Engine Server模式;Driver不用修改;URL修改為jdbc:hsqldb:hsql://localhost/xdb (主要這里xdb就是上面我們設置的別名);user里設置用戶名,第一次登錄時,設置的是管理員的用戶名,password設置密碼。然后點擊Ok。
    3)第一次運行數據庫引擎,創建數據庫完畢。好了,你可以打開db文件夾,會發現里面多了幾個文件。
    mydb.properties文件:是關于數據庫的屬性文件。
    mydb.script:hsql主要保存的表(這里按hsql的說法是Memory表,就是最為常用的),里面的格式都是文本格式,可以用文本查看,里面的語句都是sql語句,熟悉sql語句的話,你也可以手動修改它。每次運行數據庫引擎的話都是從這里加載進內存的。
    mydb.lck表示數據庫處于打開狀態。
    其他的請參看hsqldb包里的手冊。

    3、WebServer模式和Server運行模式基本一樣,只是支持了Http等協議,主要用于防火墻,默認端口是9001。啟動Server,java -cp hsqldb.jar org.hsqldb.WebServer ...剩余的和上面的一致。

    4、Servlet模式可以允許你通過Servlet容器來訪問數據庫,請查看hsqlServlet.java的源代碼,和WebServer類似。

    5、 另一個值得思考的模式是Standalone模式:不能通過網絡來訪問數據庫,主要是在一個JVM中使用,那樣的話,訪問的速度會更加快。雖然文檔里面提 到主要是用于開發時使用,但是我們可以假設一下,該方法不需要一個引擎類的東西,而類似于打開文件的方式,返回一個Connection對象:
    Connection c = DriverManager.getConnection("jdbc:hsqldb:file:mydb", "sa", "");
    將 會在當前目錄找到mydb數據庫相關文件,打開并返回一個Connection對象。該方式有點好處就是可以不使用引擎,在需要的時候操作數據。所以那些 對數據庫不是特別有要求的,但又需要一個操作數據庫的方式的話,可以使用這種方法。對于那些不想額外在數據庫引擎花費金錢的話,可以使用這種方法。但是不 推薦使用該方法。記得Hibernate里SessionFactory可以使用openSession(Connecttion c)來獲得一個Session對象的,因此,在測試或者實際應用的話都可以這樣使用。

    6、Memory-Only 數據庫:顧名思義,主要是內存中使用,不用于保存數據。可以用于在內存中交換數據。

    三、具體的鏈接與操作的話,和一般的JDBC操作一樣。而相應的Server模式的話,連接地址主要你運行數據庫界面操作工具時,在URL一欄時默認已經設好了,自己實習一下,對比其中參數。

    這篇文章介紹大致內容很詳細,不過也大都是從Hsql的幫助上翻譯的,我有必要加入點新鮮的血液。
    這篇文章美中不足的是缺少實戰性,往往初學者第一步都走不出來,比如我。
    我在實踐中遇到的問題是打開數據庫管理器怎么也連接不上數據庫,總是說
    java.sql.sqlException Socket create error
    搞了一個晚上,到第二天早上清醒一下,想起來這個數據庫應該在創建庫之后,保持那個cmd窗口,在此過程中連接。
    果然好用,也邁出了開拓Hsql的第一步。

    另外不用在互聯網上搜索別的介紹,Hsql自帶的guide就已經很詳細了。

    posted @ 2006-08-16 14:24 阿成 閱讀(326) | 評論 (0)編輯 收藏

    1.如何調試.jsp文件
    ? 現在.jsp文件的前一個.java文件設端點,再在.jsp文件設端點,debug下先停在.java文件的斷點處,執行到下一斷點,即.jsp文件中。

    盡管這樣,有時用jdeveloper在jsp里設置斷點還是不太管用。

    2.如何顯示原文件的改變
    對 于模板元素的改變(html和javascript)只需要保存,刷新頁面即可;對于腳本元素、jsp標簽的改變要先make再刷新頁面;如果不行的話就 重新run項目;再不行就設斷點,一步一步走過改變的代碼;再不行就把class文件夾全部刪掉,讓他重新編譯;再不行就重啟機器。對于html中引用的 圖片或是script函數,修改后很可能還顯示原來的,這是可能是在某個臨時文件夾存有原來的文件,以上方法無效,這時要把定義函數的名字和引用函數的名 字都改變,使電腦不得不找臨時文件以外的文件,這樣才會顯示改變,對于圖片則是改變文件名稱。

    3.如何run和debug
    run或debug之前都要把之前的run或debug先terminate,這樣才能避免錯誤。

    4.本機調試時用戶名如果為"acheng"會變成"jazn/acheng",所以取用戶名一定要先過濾掉 "jazn/",這樣在本機調試和服務器調試時都不會齟?
    username = remoteUserName.substring(remoteUserName.indexOf("/") + 1, remoteUserName.length());

    5.確定網站入口:打開圖形化的struts_config.xml,右鍵單擊想作為入口的.do或.jsp文件,選擇“set as default run target”選項,即可。struts_config.xml中的welcome標簽就沒用了。

    6. 建立自定義庫:右鍵單擊某項目,選擇project properties -> properties -> libaries -> new... 則打開creat libary對話框,單擊add entry把該庫向關的所有jar包選中,再添上此庫名稱以后即可用了。

    7.引入已有的項目
    對于.war或.ear文件可以File -> Import -> 選擇相關的加入方式。
    對于已經解壓的文件夾(以Struts書上的addressbook為例)
    ? a.先建立空工作區addressbook,建立空項目addressbook,新建struts。
    ? b.把源文件根目錄的圖片和.jsp文件拷貝到新文件public_html下。
    ? c.用源文件WEB-INF替換新文件public_html下WEB-INF。
    ? d.用源文件src替換新文件src。
    ? e.把新文件WEB-INF下classes中的.properties文件拷貝到src相應位置,后刪除classes文件夾。

    8.制作oracle portlet只能在jdeveloper10.12上進行,并且portlet上的鏈接根目錄必須如下表示:(不可以)
    <%
    ??? String server=null;
    ??? StringBuffer buff = new StringBuffer();
    ??? buff.append(request.getScheme()).append("://");
    ??? buff.append(request.getServerName()).append(":");
    ??? buff.append(request.getServerPort());
    ??? buff.append(request.getContextPath());
    ??? server = buff.toString();
    %>
    <a href="<%=server%>/login/login.jsp">login.jsp</a>
    <!--a href="login/login.jsp">login.jsp</a--><!--這樣寫不行,可能portlet找不到這樣的位置-->

    posted @ 2006-08-16 14:14 阿成 閱讀(615) | 評論 (0)編輯 收藏

    1。插件安裝有三種方法:

    ??? a、是將文件靠到eclipse的根目錄,如文件夾取名為chajian,下層文件夾為eclipse,下層文件夾為?? ? features和plugins,再在eclipse的根目錄建links文件夾,內部建chajian.link,編輯為path=??? chajian (或者c:/eclipse/chajian,即絕對和相對路徑皆可),就ok了(多個插件可以定義一個??? ??? pluge.link,一個path=***一行;或者定義多個.link文件,每個包含一個path)。

    ??? b、是把插件包內的plugins和features內的文件拷貝到本目錄下plugins和 features中。

    ??? c、通過Help->Software Update->Find and Instal直接安裝

    2.打包成jar文件時,需要根據自定義的文件生成MANIFEST.MF,其中每行的冒號后面都有一個空格,否則出錯。例:Manifest-Version: 1.0(1.0前有空格,其他行也是如此)

    3.由數據庫中的表自動建立.java和.hbm.xml文件

    ??? a.建立項目:打開帶HibernateTools插件的eclipse,建立一個名為“test”的java project,內部新?? 建一個名字為src的source folder。

    ??? b. 建立hibernate配置文件:新建“hibernate configuration file”,輸出路徑選擇“test項目的src目錄”,然后的對話框填寫配置文件(包括database dialect,driver class,connection url,username,password,creat a console configuration),下一個對話框先填寫name(即console configuration name),再點“add external jars”,選擇數據庫驅動的jar文件,看到src中有“hibernate.cfg.xml”就是配置文件建立成功。

    ??? c. 建立目標文件:點工具欄hibernate圖標,選擇“hibernate code generation...”,在彈出的對話框中點擊左側“新建”,把名字改為“test”,console configuration選剛才建立的console configuration name,package填想生成的包結構,點reveng.xml的“setup”,接下來對話框選擇test的src目錄,然后導入需要的數據庫表(有關聯的就要導入,即外鍵的表也要導入),然后點“finish”;選擇main右邊的exporters,選中generate domain code,generate mappings三項,run,刷新項目,看到包中生成的.java和.hbm.xml文件,成功,把它們拷入myeclipse的相應項目里。

    hbm文件的主鍵有一條<generator class="assigned"/>表示用程序來設置主鍵,一般改為"increment"表示遞增生成主鍵。?

    ? d.刪除Console Configuration:打開Hibernate Console的透視圖(perspective),在左側Hibernate Configuration的視圖(view)中右鍵單擊,就可以刪除。
    刪除Hivernate Code Generation:點擊工具欄Hibernate圖標,左側即可刪除。


    4.eclipse 中程序代碼做了改變但服務器上的代碼沒有同步改變,先看其他項目是否也如此(我上次遇到這問題其他項目可以同步改變,故不是eclipse的問題,應該是這個項目的問題);我用盡各種方法都不行,最后把項目從workspace中考出,運行eclpse關閉,再考進去項目,運行,就好了(為什么我也不清楚,可能保存了默認的一些錯誤設置吧);后來又遇到這種問題,action中的代碼改了不起作用,上面方法也不行,刪除workspace中代碼,再 checkout,就ok了。看來遇到不能同步的問題應該在workspace中刪除程序,再checkout就好了。

    5.CVS的bug

    ??? 在用MyEclipse的CVS時發現,如果項目里其他人新建了文件夾,自己同步代碼時就會出錯。就算自己也新建了那個文件夾也不行,難道是個bug?還是使用方法的不當。

    6.顯示列號方法:eclipse的preferences
    ??? a)General -> Editors -> Text Editors -> Show Line Number(java代碼行號)
    ??? b)MyEclipse -> Editors => Common Editor Preferences -> Show Line Number(jsp加行號)
    都選中

    7、按ctrl+t會列出接口的實現類列表

    8、頁面和java文件的縮進寬度
    MyEclipse -> Editors => Common Editor Preferences 的 Displayed tab width可以調整jsp頁面的縮進寬度
    windows->java->Code Style->Formatter->Edit

    9、查看某個具體文件或類,變量等
    F3或按住crtl點名字

    posted @ 2006-08-16 14:10 阿成 閱讀(1306) | 評論 (0)編輯 收藏
    僅列出標題
    共10頁: 上一頁 1 2 3 4 5 6 7 8 9 下一頁 Last 
    主站蜘蛛池模板: 美女裸免费观看网站| 亚洲成在人线中文字幕| 国产精品亚洲片在线花蝴蝶| 国产福利在线观看免费第一福利| 91亚洲精品第一综合不卡播放| 热99RE久久精品这里都是精品免费 | 亚洲婷婷在线视频| 天天影视色香欲综合免费| 亚洲最新在线视频| 歪歪漫画在线观看官网免费阅读 | 中文字幕第一页亚洲| 国产精品无码永久免费888| 国产精品亚洲美女久久久| 国产成人无码精品久久久免费| 亚洲一区视频在线播放| 免费无码黄网站在线看| 亚洲天堂中文资源| 国产免费不卡v片在线观看| 亚洲国产精品18久久久久久| 免费国产成人高清在线观看麻豆| 一级毛片人与动免费观看| 亚洲精品乱码久久久久久中文字幕| 日本视频免费高清一本18| 亚洲成av人片在线看片| 女人被男人躁的女爽免费视频| 亚洲a无码综合a国产av中文| 奇米影视亚洲春色| 亚洲一级毛片免费看| 妇女自拍偷自拍亚洲精品| 亚洲国产成人爱av在线播放| 花蝴蝶免费视频在线观看高清版| 亚洲色图.com| 国产麻豆剧传媒精品国产免费| fc2成年免费共享视频18| 666精品国产精品亚洲| 精品无码国产污污污免费| av片在线观看永久免费| 亚洲最大在线观看| 国产一级淫片a视频免费观看| 永久免费av无码网站yy| 亚洲影院天堂中文av色|