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

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

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

    @OverWrite BlogJava

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      128 隨筆 :: 0 文章 :: 29 評(píng)論 :: 0 Trackbacks

    2008年4月10日 #

    httpclient已停止維護(hù),其替代產(chǎn)品為 Apache HttpComponents 。 官方聲明如下(詳細(xì)信息點(diǎn)擊這里):
    The Commons HttpClient project is now end of life, and is no longer being developed. It has been replaced by the Apache HttpComponents project in its HttpClient and HttpCore modules, which offer better performance and more flexibility.

    HttpClient 是 Apache Jakarta Common 下的子項(xiàng)目,可以用來(lái)提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的
    客戶端程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議。本文首先介紹 HTTPClient,然后根據(jù)作者實(shí)際工作經(jīng)驗(yàn)給出了一些常見(jiàn)問(wèn)題的解決方法。 

    所以打算用HttpClient的朋友,可以考慮使用HttpComponents 了。
    HttpComponents 入門(mén),筆者認(rèn)為 iteye上的一篇文章寫(xiě)的不錯(cuò),大家可以參考 《HttpComponents入門(mén)解析》
    posted @ 2012-08-12 17:50 vesung 閱讀(399) | 評(píng)論 (0)編輯 收藏

    現(xiàn)在本本屏幕越來(lái)越小, 在上面運(yùn)行eclipse就會(huì)顯得字體小, 那么如何調(diào)整字體大小那?
    方法一:
        打開(kāi)菜單 window->preferences->general->appearance->colors and fonts
    打開(kāi)basec里面的text font 進(jìn)行編輯會(huì)彈出一個(gè)字體編輯的窗口, 在里面調(diào)整字體即可。

    方法二:
        因?yàn)閑clipse版本眾多,所以菜單路徑也會(huì)有所差異。 還有一種方法可以不用擔(dān)心不同版本的差異:
        開(kāi)始先打開(kāi)菜單 window->preferences   在左上角數(shù)據(jù)font 回車, eclipse就會(huì)自動(dòng)搜索出可以設(shè)置字體的地方了。 接下來(lái)打開(kāi)basec里面的text font 進(jìn)行編輯會(huì)彈出一個(gè)字體編輯的窗口, 在里面調(diào)整字體即可。 


    一點(diǎn)小技巧希望對(duì)大家能有所幫助。
    posted @ 2012-07-26 14:46 vesung 閱讀(43766) | 評(píng)論 (1)編輯 收藏

    這篇文章在chinaunix上看到,寫(xiě)的很不錯(cuò)。希望能對(duì)學(xué)習(xí)linux的人有所幫助。

    隨著Linux應(yīng)用的擴(kuò)展許多朋友開(kāi)始接觸Linux,根據(jù)學(xué)習(xí)Windwos的經(jīng)驗(yàn)往往有一些茫然的感覺(jué):不知從何處開(kāi)始學(xué)起。作為一個(gè) Linux系統(tǒng)管理員,我看了許多有關(guān)Linux的文檔和書(shū)籍,并為學(xué)習(xí)Linux付出了許多艱苦的努力。當(dāng)真正獲得了一份正式的Linux系統(tǒng)管理工作 后,我更加深刻地理解了Linux的靈魂:服務(wù)與多用戶。Linux系統(tǒng)知識(shí)是非常廣博的,但是只要掌握了重點(diǎn)知識(shí),管理它并沒(méi)有想象中的那么可怕。在下 面我會(huì)將作為系統(tǒng)管理員的一些工作心得和總結(jié)出來(lái)的經(jīng)驗(yàn)系統(tǒng)地介紹給大家。

    一、 學(xué)習(xí)的目的

    通過(guò)Linux的學(xué)習(xí)掌握UNIX的目的想必不用多說(shuō)了,在這個(gè)網(wǎng)絡(luò)人才身價(jià)倍增的年代,想靠技術(shù)吃飯又不想掌握網(wǎng)絡(luò)和編程技術(shù)是不明智的。當(dāng)一人第一次 聽(tīng)說(shuō)Linux并躍躍欲試的時(shí)候,總會(huì)提出幾個(gè)?,它是什么(What)? 為什么要用它(Why)? 怎樣學(xué)習(xí)它(How)?做為開(kāi)放源碼運(yùn)動(dòng)的主要組成部分,Linux的應(yīng)用越來(lái)越廣泛,從我們平時(shí)的娛樂(lè)、學(xué)習(xí),到商業(yè)、政府辦公,再到大規(guī)模計(jì)算的應(yīng) 用。為了滿足人們的需求,各種各樣的、基于Linux的應(yīng)用軟件層出不窮。只要具備了LinuX的基本功,并具有了自學(xué)的能力之后,都可以通過(guò)長(zhǎng)期的學(xué)習(xí) 將專項(xiàng)內(nèi)容予以掌握。

    二、 從命令開(kāi)始從基礎(chǔ)開(kāi)始

    常常有些朋友一接觸Linux 就是希望構(gòu)架網(wǎng)站,根本沒(méi)有想到要先了解一下Linux 的基礎(chǔ)。這是相當(dāng)困難的。雖然Linux桌面應(yīng)用發(fā)展很快,但是命令在Linux中依然有很強(qiáng)的生命力。Linux是一個(gè)命令行組成的操作系統(tǒng),精髓在命 令行,無(wú)論圖形界面發(fā)展到什么水平這個(gè)原理是不會(huì)變的,Linux命令有許多強(qiáng)大的功能:從簡(jiǎn)單的磁盤(pán)操作、文件存取、到進(jìn)行復(fù)雜的多媒體圖象和流媒體文 件的制作。這里筆者把它們中比較重要的和使用頻率最多的命令,按照它們?cè)谙到y(tǒng)中的作用分成幾個(gè)部分介紹給大家,通過(guò)這些基礎(chǔ)命令的學(xué)習(xí)我們可以進(jìn)一步理解 Linux系統(tǒng):

    ●安裝和登錄命令:login、 shutdown、 halt、 reboot 、mount、umount 、chsh
    ●文件處理命令:file、 mkdir、 grep、dd、 find、 mv 、ls 、diff、 cat、 ln
    ●系統(tǒng)管理相關(guān)命令: df、 top、 free、 quota 、at、 lp、 adduser、 groupadd kill、 crontab、 tar、 unzip、 gunzip 、last
    ●網(wǎng)絡(luò)操作命令:ifconfig、 ip 、ping 、 netstat 、telnet、 ftp、 route、 rlogin rcp 、finger 、mail 、nslookup
    ●系統(tǒng)安全相關(guān)命令: passwd 、su、 umask 、chgrp、 chmod、chown、chattr、sudo、 pswho

    三、 選擇一本好的Linux書(shū)籍

    無(wú)論在論壇還是讀者反饋中,我們看到最多的問(wèn)題往往是某個(gè)新手,在安裝或使用linux的過(guò)程中遇到一個(gè)具體的問(wèn)題就開(kāi)始提問(wèn),很多都是重復(fù)性的問(wèn)題,甚 至有不少人連基本的問(wèn)題描述都不是很清楚。這說(shuō)明很多初學(xué)linux的人還沒(méi)有掌握基本功。怎樣才能快速提高掌握l(shuí)inux的基本功呢? 最有效的方法莫過(guò)于學(xué)習(xí)權(quán)威的linux工具書(shū),工具書(shū)對(duì)于學(xué)習(xí)者而言是相當(dāng)重要的。一本錯(cuò)誤觀念的工具書(shū)卻會(huì)讓新手整個(gè)誤入歧途。目前國(guó)內(nèi)關(guān)于 linux的書(shū)籍有很多不過(guò)精品的不多,筆者強(qiáng)烈建議閱讀影印本的“o'reilly原版linux圖書(shū)”,而且出版社還提供了一個(gè)非常好的路線圖


    四 、養(yǎng)成在命令行下工作

    一定要養(yǎng)成在命令行下工作的習(xí)慣,要知道X-window只是運(yùn)行在命令行模式下的一個(gè)應(yīng)用程序。在命令行下學(xué)習(xí)雖然一開(kāi)始進(jìn)度較慢,但是熟悉后,您未來(lái) 的學(xué)習(xí)之路將是以指數(shù)增加的方式增長(zhǎng)的。從網(wǎng)管員來(lái)說(shuō),命令行實(shí)際上就是規(guī)則,它總是有效的,同時(shí)也是靈活的。即使是通過(guò)一條緩慢的調(diào)制解調(diào)器線路,它也 能操縱幾千公里以外地遠(yuǎn)程系統(tǒng)。

    五、用Unix思維思考Linux

    由于Linux是參照Unix的思想來(lái)設(shè)計(jì)的,理解和掌握它就必須以Unix的思維來(lái)進(jìn)行,而不能以Windows思維。不可否認(rèn),windows 在市場(chǎng)上的成功很大一部分在于技術(shù)思想的獨(dú)到之處。可是這個(gè)創(chuàng)新是在面對(duì)個(gè)人用戶的前提下進(jìn)行的,而面對(duì)著企業(yè)級(jí)的服務(wù)應(yīng)用,它還是有些力不從心。多年來(lái) 在計(jì)算機(jī)操作系統(tǒng)領(lǐng)域一直是二者獨(dú)大:unix在服務(wù)器領(lǐng)域,Windows在個(gè)人用戶領(lǐng)域。由此可見(jiàn),用戶需求決定了所采用的操作系統(tǒng)。不管什么原因, 如果要學(xué)習(xí)Linux,那么首先要將思維從Windows的“這個(gè)小河” 中拖出來(lái),放入U(xiǎn)nix的海洋。

    六 、學(xué)習(xí)shell

    對(duì)于Shell(中文名稱殼),習(xí)慣Windows的讀者肯定是非常陌生的,因?yàn)閃indows只有一個(gè)“Shell”(如果可以說(shuō)是Shell的話), 那就是Windows自己。用一句話容易理解的解釋就是,shell是用戶輸入命令與系統(tǒng)解釋命令之間的中介。最直觀的說(shuō)法,一種Shell有一套自己的 命令。舉一個(gè)容易理解的例子,Linux的標(biāo)準(zhǔn)Shel是Bash Shel;Solaris的shell是B shell;Linux的Shell是以命令行的方式表現(xiàn)出來(lái)的。讀者可能會(huì)不理解,Windows從命令行“進(jìn)化”到了圖形界面,那么Linux現(xiàn)在還 使用命令行豈不是一種倒退?

    當(dāng)初我剛剛接觸Linux時(shí)就曾有過(guò)這種想法。可是后來(lái)發(fā)現(xiàn),如果使用圖形界面,那么分配給應(yīng)用軟件的資源就少了,在價(jià)格昂貴的服務(wù)器上,能夠以較低的硬件配置實(shí)現(xiàn)同樣的功能是非常重要的。

    下面舉例說(shuō)明,一臺(tái)服務(wù)器有1GB內(nèi)存,假設(shè)其中512MB用于處理圖形界面,若要安裝一個(gè)需要784MB內(nèi)存的數(shù)據(jù)庫(kù)軟件,惟一的辦法就是擴(kuò)大內(nèi)存。但 是如果使用命令行,系統(tǒng)可能只需要64MB內(nèi)存,其它的內(nèi)存就可以供數(shù)據(jù)庫(kù)軟件使用了。使用命令行,不僅是內(nèi)存,而且CPU及硬盤(pán)等資源的占用都要節(jié)省很 多。所以,作為服務(wù)器使用命令行是優(yōu)點(diǎn)而不是缺點(diǎn)。既然Shell有這么多優(yōu)點(diǎn),就必須要學(xué)習(xí)它。
    七、勤于實(shí)踐

    要增加自己Linux 的技能,只有通過(guò)實(shí)踐來(lái)實(shí)現(xiàn)了。所以,趕快找一部計(jì)算機(jī),趕快安裝一個(gè) Linux 發(fā)行版本,然后進(jìn)入精彩的Linux世界。相信對(duì)于你自己的 Linux 能力必然大有斬獲。此外,人腦不像計(jì)算機(jī)的硬盤(pán)一樣,除非硬盤(pán)壞掉了或者是資料被你抹掉了,否則儲(chǔ)存的資料將永遠(yuǎn)而且立刻的記憶在硬盤(pán)中。在人類記憶的曲 線中,你必須要不斷的重復(fù)練習(xí)才會(huì)將一件事情記得比較熟。

    同樣的,學(xué)習(xí) Linux 也一樣,如果你無(wú)法經(jīng)常學(xué)習(xí)的話,學(xué)了后面的,前面的忘了。你對(duì)Linux命令熟悉后你可以開(kāi)始搭建一個(gè)小的Linux網(wǎng)絡(luò),這是最好的實(shí)踐方法。 Linux是網(wǎng)絡(luò)的代名詞,Linux網(wǎng)絡(luò)服務(wù)功能非常強(qiáng)大,不論是郵件服務(wù)器、Web服務(wù)器、DNS服務(wù)器等都非常完善。當(dāng)然你不需搭建所有服務(wù),可以 慢慢來(lái)。需要說(shuō)明的是這個(gè)Linux網(wǎng)絡(luò)對(duì)于初學(xué)者有兩三臺(tái)計(jì)算機(jī)即可。自己多動(dòng)手,不要非要等著別人幫你解決問(wèn)題。

    八、學(xué)會(huì)使用文檔

    和私有操作系統(tǒng)不同,各個(gè)Linux的發(fā)行版本的技術(shù)支持時(shí)間都較短,這對(duì)于Linux初學(xué)者是往往不夠的。其實(shí)當(dāng)你安裝了一個(gè)完整的Linux系統(tǒng)后其 中已經(jīng)包含了一個(gè)強(qiáng)大的幫助,只是可能你還沒(méi)有發(fā)現(xiàn)和使用它們的技巧。主流Linux發(fā)行版都自帶非常詳細(xì)的文檔(包括手冊(cè)頁(yè)和FAQ),從系統(tǒng)安裝到系 統(tǒng)安全,針對(duì)不同層次的人的詳盡文檔,仔細(xì)閱讀文檔后40%問(wèn)題都可在此解決。查閱經(jīng)典工具書(shū)和Howto,特別是Howto是全球數(shù)以萬(wàn)計(jì)的 Linux、Unix的經(jīng)驗(yàn)總結(jié)非常有參考價(jià)值通常40%的問(wèn)題同樣可以解決。安裝一個(gè)新的軟件時(shí)先看README,再看INSTALL然后看FAQ,最 后才動(dòng)手安裝,這樣遇到問(wèn)題就知道為什么。如果說(shuō)明文檔不看,結(jié)果出了問(wèn)題再去論壇來(lái)找答案反而浪費(fèi)時(shí)間。

    當(dāng)查找文檔時(shí), 一定要看文檔是在何種版本、何種環(huán)境及何種狀態(tài)下出現(xiàn)的何種結(jié)果。對(duì)于文檔的有效性, 一時(shí)還無(wú)法在操作前就知道結(jié)論如何,那么對(duì)某個(gè)專題或問(wèn)題,閱讀相關(guān)的多篇文章將會(huì)節(jié)省大量的時(shí)間,還可以保證盡量“干凈”的環(huán)境,有效避免因?yàn)椴煌僮? 所造成的更多問(wèn)題。操作時(shí)要仔細(xì)核對(duì)各個(gè)步驟及輸出的結(jié)果,盡量保持與文檔一致。

    九、在Linux論壇獲取幫助

    如果上面的措施沒(méi)有解決問(wèn)題,此時(shí)你就需要Linux社區(qū)的幫助了。需要說(shuō)明的是你要有周全的思考,準(zhǔn)備好你的問(wèn)題,不要草率的發(fā)問(wèn),否則只會(huì)得到到草率 的回答或者根本得不到任何答案。越表現(xiàn)出在尋求幫助前為解決問(wèn)題付出的努力,你越能得到實(shí)質(zhì)性的幫助。最好先搜尋一下論壇是否有您需要的文章。這樣可以獲 得事半功倍的效果。

    你需要提供精確有效的信息。這并不是要求你簡(jiǎn)單的把成噸的出錯(cuò)代碼或者數(shù)據(jù)完全轉(zhuǎn)儲(chǔ)摘錄到你的提問(wèn)中。如果你有龐大而復(fù)雜的測(cè)試條件,盡量把它剪裁得越小 越好。可能你會(huì)遇到這種情況,對(duì)于一個(gè)問(wèn)題會(huì)出現(xiàn)不同內(nèi)容回答,這時(shí)你需要通過(guò)實(shí)踐來(lái)驗(yàn)證。另外把這個(gè)問(wèn)題放在其他Linux社區(qū)請(qǐng)求幫助也是一種選擇。 如果得不到答案,請(qǐng)不要以為我們覺(jué)得無(wú)法幫助你。有時(shí)只是看到你問(wèn)題的人不知道答案罷了。這時(shí)換一個(gè)社區(qū)是不錯(cuò)的選擇。

    十、學(xué)習(xí)專業(yè)英文

    如果你想深入學(xué)習(xí)Linux,看不懂因?yàn)槲臋n實(shí)在是太難了。寫(xiě)的最好的,最全面的文檔都是英語(yǔ)寫(xiě)的,最先發(fā)布的技術(shù)信息也都是用英語(yǔ)寫(xiě)的。即便是非英語(yǔ)國(guó)家的人發(fā)布技術(shù)文檔,也都首先翻譯成英語(yǔ)在國(guó)際學(xué)術(shù)雜志和網(wǎng)絡(luò)上發(fā)表。

    通過(guò)man、info等命令,可以從在線幫助中快速地獲得所需要的命令和操作方法。不要害怕海量的系統(tǒng)幫助,仔細(xì)閱讀幾個(gè)man或info文檔就會(huì)發(fā)現(xiàn), 這些幫助幾乎都按照固定格式寫(xiě)成一命令名稱、參數(shù)、參數(shù)說(shuō)明、使用例子、參考等。當(dāng)英語(yǔ)成為一種習(xí)慣,就會(huì)自覺(jué)地查找或訂閱互聯(lián)網(wǎng)上感興趣的英文材料。這 樣,在不知不覺(jué)中就已經(jīng)和世界同步。

    十一、在社區(qū)共享你的經(jīng)驗(yàn)

    隨著Linux應(yīng)用的擴(kuò)展,出現(xiàn)了不少Linux社區(qū)。其中有一些非常優(yōu)秀的社區(qū):水木清華、其中有一些非常優(yōu)秀的社區(qū):www.linuxforum.net(國(guó)內(nèi)最高水平GNU站點(diǎn))、http://www.chinaunix.net/ (中國(guó)最大的Unix技術(shù)社區(qū)),隨著知識(shí)的不斷積累,就可以把自己動(dòng)手解決一些前人沒(méi)有遇到的問(wèn)題寫(xiě)出文檔在網(wǎng)絡(luò)上共享給其他讀者。這個(gè)時(shí)候,也就成為 了一名“高手”。Linux的使用者一般都是專業(yè)人士,他們有著很好的電腦背景且愿意協(xié)助他人,Linux高手更具有鼓勵(lì)新手的文化精神。

    最后是一個(gè)筆者的Linux學(xué)習(xí)的路線圖(roadmap):

    ●了解Linux 的基礎(chǔ)知識(shí),這些包含了用戶管理、群組的概念、權(quán)限的觀念等;
    ●掌握至少50個(gè)以上的常用命令;
    ●掌握.tgz、.rpm等軟件包的常用安裝方法
    ●學(xué)習(xí)添加外設(shè),安裝設(shè)備驅(qū)動(dòng)程序(比如網(wǎng)卡)
    ●熟悉Linux文件系統(tǒng) 和目錄結(jié)構(gòu)。
    ●掌握vi,gcc,gdb等常用編輯器,編譯器,調(diào)試器 。
    ●理解shell別名、管道、I/O重定向、輸入和輸出以及shell腳本編程。
    ●網(wǎng)絡(luò)的基礎(chǔ)包括: 掌握路由概念、OSI七層網(wǎng)絡(luò)模型、TCP/IP模型及相關(guān)服務(wù)對(duì)應(yīng)的層次對(duì)于Linux學(xué)習(xí)非常重要的。然后學(xué)習(xí)Linux環(huán)境下的組網(wǎng)。
    posted @ 2008-07-31 17:49 vesung 閱讀(394) | 評(píng)論 (0)編輯 收藏

    國(guó)外開(kāi)發(fā)者博客中有一篇有趣的文章,將程序員按水平像軟件版本號(hào)那樣劃分為不同的版本。相對(duì)于在招聘時(shí)分為初級(jí),中級(jí),高級(jí)程序員,直接表明需要某種語(yǔ)言N版本的程序員或許更方便直接。根據(jù)作者的觀點(diǎn),可將WEB開(kāi)發(fā)者大致分為以下幾個(gè)版本:

    Alpha:閱讀過(guò)一些專業(yè)書(shū)籍,大多數(shù)能用Dreamweaver或者FrontPage幫朋友制作一些Web頁(yè)面。但在他們熟練掌握HTML代碼以前,你大概不會(huì)雇傭他們成為職業(yè)的WEB制作人員。

    Beta:已經(jīng)比較擅長(zhǎng)整合站點(diǎn)頁(yè)面了,在HTML技巧方面也有一定造詣,但還是用Tables來(lái)制作頁(yè)面,不了解CSS,在面對(duì)動(dòng)態(tài)頁(yè)面或數(shù)據(jù)庫(kù)連接時(shí)還是底氣不足。

    Pre Version 1 (0.1):比Beta版的開(kāi)發(fā)者水平要高。熟悉HTML,開(kāi)始了解CSS是如何運(yùn)作的,懂一點(diǎn)JavaScript,但還是基于業(yè)余水準(zhǔn),逐步開(kāi)始關(guān)心動(dòng)態(tài)站點(diǎn)搭建和數(shù)據(jù)庫(kù)連接的知識(shí)。這個(gè)版本的WEB開(kāi)發(fā)人員還遠(yuǎn)不能成為雇主眼中的香餑餑。

    1.0: 能夠基本把控整個(gè)站點(diǎn)開(kāi)發(fā),針對(duì)每個(gè)問(wèn)題盡可能的找到最直接的解決辦法。但對(duì)可測(cè)性,可擴(kuò)展性以及在不同(層)框架下如何選擇最合適的WEB設(shè)計(jì)工具尚無(wú)概念。這個(gè)版本的WEB開(kāi)發(fā)者有良好的技術(shù)基礎(chǔ),需要有進(jìn)一步的幫助和指導(dǎo)。

     

    2.0:懂面向?qū)ο蟮木幊陶Z(yǔ)言,理解分層開(kāi)發(fā)的必要性,關(guān)注代碼分離,對(duì)問(wèn)題尋找更完美的解決方法,偶然也會(huì)考慮設(shè)計(jì)模式的問(wèn)題,但對(duì)此仍然概念不清。屬于優(yōu)秀的初級(jí)開(kāi)發(fā)者,能完成較松散的代碼開(kāi)發(fā)(相對(duì)大型嚴(yán)謹(jǐn)?shù)恼军c(diǎn)開(kāi)發(fā)而言),在面對(duì)較復(fù)雜問(wèn)題尋找解決辦法時(shí)需要周邊人的幫助。

    3.0:開(kāi)始較為深入的理解面向?qū)ο缶幊毯驮O(shè)計(jì)模式,了解他們的用途,當(dāng)看到好的設(shè)計(jì)模式時(shí)能看透其本質(zhì),逐步關(guān)注分層的架構(gòu)解決辦法和可測(cè)試性。理解不同的開(kāi)發(fā)語(yǔ)言并能說(shuō)出他們的異同(例如各自的優(yōu)勢(shì))。屬于優(yōu)秀的中級(jí)別開(kāi)發(fā)者,雇主也確信他們最終能找到問(wèn)題的解決辦法,這個(gè)版本的人可以給1.0和2.0的開(kāi)發(fā)者以指導(dǎo)。但他們對(duì)架構(gòu)的理解仍然不夠清晰,值得一提的是,只要給予一些指導(dǎo),他們能很快理解并熟記做出的決定,以及選定方案的優(yōu)勢(shì)所在。

    4.0:理解模式,重視用戶的反饋。著手研究方法論,架構(gòu)設(shè)計(jì)和軟件開(kāi)發(fā)的最佳入口。頭腦中已經(jīng)形成了超越開(kāi)發(fā)語(yǔ)言,技術(shù)架構(gòu)的整體方案,可根據(jù)需求解構(gòu)程序。能從理論的角度,不同模式如何融合成最佳形態(tài),將多種X-驅(qū)動(dòng)的模式應(yīng)用到不同的方案中。是精通多語(yǔ)言的高手,理解不同系統(tǒng)和方法論的細(xì)微差別,屬于高級(jí)程序員。這個(gè)級(jí)別的人能夠輕易的輔導(dǎo)2.0和3.0的程序員,將他們推向更高的級(jí)別。

    5.0:從系統(tǒng)的角度考慮問(wèn)題。對(duì)各種系統(tǒng)結(jié)構(gòu)有深入研究,能對(duì)整個(gè)代碼架構(gòu)中的問(wèn)題進(jìn)行改進(jìn)。在團(tuán)隊(duì)粘合性以及代碼安全性方面有杰出貢獻(xiàn)。對(duì)1.0到4.0版本的開(kāi)發(fā)人員出現(xiàn)的問(wèn)題能及時(shí)察覺(jué),讓整個(gè)團(tuán)隊(duì)保持積極性且保持興奮的狀態(tài)創(chuàng)建軟件解決辦法。舉例來(lái)說(shuō),他們總是對(duì)新的技術(shù)和信息保持饑渴狀態(tài),試圖用最簡(jiǎn)便的方案解決開(kāi)發(fā)任務(wù)。在整個(gè)IT團(tuán)隊(duì)中獲得信任,屬于高級(jí)程序員和架構(gòu)師。

    那么,您屬于哪個(gè)版本的程序員呢?

    posted @ 2008-06-29 23:28 vesung 閱讀(626) | 評(píng)論 (1)編輯 收藏

    中國(guó)互聯(lián)網(wǎng)審查制度的不透明一直為人所詬病。現(xiàn)在還不清楚56.com是因?yàn)槭裁撮_(kāi)罪了監(jiān)管機(jī)構(gòu),也不知道該網(wǎng)站會(huì)關(guān)閉多久。這些疑問(wèn)也表明籠罩整個(gè)中國(guó)互聯(lián)網(wǎng)視頻領(lǐng)域的風(fēng)險(xiǎn),即使是那些有明智投資方支持的大型互聯(lián)網(wǎng)公司也面臨著同樣的問(wèn)題。該網(wǎng)站至少募集了3,000萬(wàn)美元資金,投資方中包括風(fēng)險(xiǎn)投資巨頭Sequoia Capita和華特•迪斯尼(Walt Disney Co.)旗下的Steamboat Ventures。

    網(wǎng)絡(luò)視頻主管部門(mén)之一的中國(guó)國(guó)家廣電總局(SARFT)沒(méi)有回復(fù)記者就56.com問(wèn)題的采訪申請(qǐng)。該網(wǎng)站首席財(cái)務(wù)長(zhǎng)張福興(Jay Chang)拒絕發(fā)表評(píng)論,其投資方的人士也拒絕置評(píng)。

    看來(lái)清理行動(dòng)開(kāi)始下狠手了。
    posted @ 2008-06-23 08:54 vesung 閱讀(355) | 評(píng)論 (0)編輯 收藏

    不說(shuō)廢話了,直接看代碼:
    頁(yè)面:
    <html>
    <head>
    <script type='text/javascript' src='jquery.js'></script>
    <script type='text/javascript'>
    //js代碼1
    <script>

    <body>
    <table>
     
    <tr>
      
    <td>級(jí)聯(lián)菜單</td>
      
    <td>
        
    <select name='city' class='amenu'>
         
    <option value=''>-市局全部-</option>
         
    <option value='1'>a市</option>
         
    <option value='2'>b市</option>
         
    <option value='3'>c市</option>
        
    </select>
      
    </td>
      
    <td>
        
    <select name='country' class='amenu'>
         
    <option value=''>-縣局全部-</option>
         
    <option value='1'>test</option>
        
    </select>
      
    </td>
      
    <td>
        
    <select name='taxOffice' class='amenu'>
         
    <option value=''>-所全部-</option>
         
    <option value='1'>test</option>    
        
    </select>
      
    </td>
      
    <td>
        
    <select name='taxOffical' class='amenu'>
         
    <option value=''>-職員全部-</option>
         
    <option value='1'>test</option>    
        
    </select>
      
    </td>
     
    </tr>
    </table>
    </body>

    對(duì)應(yīng)的js代碼:
    js代碼1:
    //本菜單是4級(jí)級(jí)聯(lián)菜單,采用jquery框架來(lái)實(shí)現(xiàn)
    $(document).ready(function(){
     
    //為所有class為amenu的元素綁定onchange事件
     $('.amenu').change(function(){
      
    //記錄本級(jí)菜單標(biāo)志
      var orgLevel = this.name;
      
    //下級(jí)菜單
      var nextMenu = $(this).parents().next().children[0];
      
    //ajax動(dòng)作提交的對(duì)象(后臺(tái)采用java程序)
      var postUrl = 'pubOrgAjax.do';

      
    //如果本菜單是最后一級(jí)菜單的話則不做任何動(dòng)作
      if(orgLevel=='taxOffical') return true;
      
    //本級(jí)菜單選擇為全部選項(xiàng),則下級(jí)菜單也置為全部
      if(this.value == ''){
       
    var firstOption = nextMenu.option[0];
       nextMenu.length
    =0;
       nextMenu.options.add(firstOption);
       
    return true;
      }


      
    //ajax動(dòng)作
      $.post(postUrl,{orgFlag:orgLevel,orgCode:this.value},function(xml){
        
    var dicts = $('dict',xml);
        
    if(dicts.length<1){alert('返回?cái)?shù)據(jù)錯(cuò)誤,請(qǐng)重新登陸');return false;}
        
    //清空nextMenu
        if(nextMenu.options[0].value == ''){
          
    var firstOption = nextMenu.options[0].text;
          nextMenu.length 
    = 0;
          nextMenu.options.add(
    new Option(firstOption,''));
        }
    else{
          nextMenu.length 
    = 0;
        }

        
    //為清空后的nextMenu填充新值
        for(var i=0;i<dicts.length;i++){
          
    var newOption = new Option($('name',dicts[i]).text(),$('code',dicts[i]).text());
          nextMenu.options.add(newOption);
        }

        
      }
    );
      
     }
    );
    }
    );

    后臺(tái)返回的數(shù)據(jù)格式:
    <?xml version="1.0" cencodeing="gbk"?>
    <ajax-response>
    <response>
     
    <dict>
        
    <code>1</code>
        
    <name>市局1</name>
     
    </dict>
     
    <dict>
     
     
    </dict>

     
    </response>
    </ajax-respnse>

    posted @ 2008-06-12 09:44 vesung 閱讀(9842) | 評(píng)論 (5)編輯 收藏

    Yahoo本周發(fā)表研發(fā)一年的Yahoo!BrowserPlus預(yù)覽版,這是一個(gè)用來(lái)延伸網(wǎng)絡(luò)應(yīng)用的平臺(tái),開(kāi)發(fā)人員可透過(guò)該平臺(tái)結(jié)合桌面程序,而用戶只要透過(guò)瀏覽器就能執(zhí)行利用該平臺(tái)開(kāi)發(fā)的網(wǎng)絡(luò)應(yīng)用。

    現(xiàn)階段BrowserPlus平臺(tái)所提供的功能包括自桌面拖曳、客戶端的圖像處理,以及桌面通知工具等。Yahoo指出,BrowserPlus的最大特色就是可以直接新增或更新服務(wù)而不用重新啟動(dòng)瀏覽器,甚至不需重新下載網(wǎng)頁(yè),對(duì)使用者而言,這代表在執(zhí)行這些新應(yīng)用時(shí)不用進(jìn)行安裝或受到其他干擾;開(kāi)發(fā)人員則能透過(guò)單一的功能呼叫檢視或啟動(dòng)新服務(wù)。

    Yahoo展示了基于BrowserPlus所設(shè)計(jì)的應(yīng)用范例,其中一個(gè)為照片上傳工具Photo Uploader,該工具參考了Flickr Uploader桌面應(yīng)用程序的功能,用戶可以透過(guò)瀏覽器,從桌面上拖曳照片,并進(jìn)行諸如旋轉(zhuǎn)、改變大小以及特效等簡(jiǎn)單的編輯功能。

    BrowserPlus屬于近來(lái)風(fēng)行的豐富網(wǎng)絡(luò)應(yīng)用程序(RIA)平臺(tái),Yahoo利用該平臺(tái)替開(kāi)發(fā)人員處理了復(fù)雜的軟件發(fā)表及更新功能,讓開(kāi)發(fā)人員及使用者皆能從中受益。

    Yahoo目前僅允許Yahoo及其合作伙伴使用BrowserPlus,預(yù)計(jì)在公開(kāi)版本發(fā)表后才會(huì)供其他開(kāi)發(fā)人員使用。現(xiàn)階段BrowserPlus支持Windows XP及Mac OS X等操作系統(tǒng),以及IE、Firefox及Safari等瀏覽器,未來(lái)將支持更多的平臺(tái)。

    Yahoo指出,Yahoo致力于開(kāi)發(fā)開(kāi)放的平臺(tái),其中一項(xiàng)重點(diǎn)是提供開(kāi)發(fā)人員用來(lái)開(kāi)發(fā)內(nèi)容的客戶端工具,Yahoo先前已釋出Yahoo用戶接口鏈接庫(kù)(Yahoo!User Interface Library,YUI)開(kāi)放源碼計(jì)劃,BrowserPlus則是提供以瀏覽器為基礎(chǔ)的網(wǎng)站開(kāi)發(fā)解決方案,該平臺(tái)之后也將朝開(kāi)放的目標(biāo)前進(jìn)。

    豐富網(wǎng)絡(luò)應(yīng)用程序平臺(tái)成為各大業(yè)者爭(zhēng)相競(jìng)逐的領(lǐng)域,市場(chǎng)上類似的平臺(tái)還包括微軟發(fā)表的Silverlight、Adobe的AIR,以及Mozilla基金會(huì)所開(kāi)發(fā)的Prism等

    posted @ 2008-06-05 08:50 vesung 閱讀(424) | 評(píng)論 (0)編輯 收藏

    (轉(zhuǎn)載)
    2007年6月項(xiàng)目準(zhǔn)備開(kāi)始了,剛來(lái)到一個(gè)新的項(xiàng)目組,什么都是新的,除了我自己。

    需要一個(gè)新的框架來(lái)開(kāi)發(fā)項(xiàng)目,香港的同事決定使用Dojo,DWR, 我開(kāi)始學(xué)習(xí)使用dojo,時(shí)間很短,但是我還是基本上熟悉了dojo的基本控件和架構(gòu)。在此基礎(chǔ)上搭建起了項(xiàng)目的基本框架。這是一個(gè)單頁(yè)面,基于ajax和dojo widget的系統(tǒng),一切都那么的新奇,又充滿挑戰(zhàn),但是既然dojo有這么多后臺(tái),又有香港同事的推薦,我顯得自信滿滿。

    框架搭建的同事,也開(kāi)始后了緊鑼密鼓的招兵買馬,一起都像是從零開(kāi)始。陸陸續(xù)續(xù),招了5個(gè)程序員和一個(gè)測(cè)試員。開(kāi)始了整個(gè)項(xiàng)目的快速開(kāi)發(fā),由于需求由香港負(fù)責(zé),而且需求做的比較細(xì)致,基本上問(wèn)題很少。Dojo 卻是麻煩不斷。

    首先的一個(gè)壞消息是當(dāng)我們做完了幾乎全部300個(gè)頁(yè)面的時(shí)候,dojo宣布0.43不在得到支持,取而代之是完全不同的dojo0.9。 而且dojo0.9 還不是穩(wěn)定的版本,問(wèn)題多多,讓我們騎虎難下,最后還是決定按兵不動(dòng)。 隨之而來(lái),是dojo1.0,dojo1.1 的陸續(xù)發(fā)布,但是一直都無(wú)法讓我看到希望的曙光。 與之相對(duì)的是ext在國(guó)內(nèi)的廣泛使用和熱烈追捧。

    Dojo 的控件有很多奇怪的地方,日期選擇控件的行為非常怪異,與國(guó)內(nèi)的使用習(xí)慣很不相同。而且樣式極其丑陋,當(dāng)字體放大縮小的時(shí)候更是丑陋。顯示的格式和保存的格式需要分別指定。我們修改了大量的代碼。

    dojo 的下拉框也被用戶投訴,過(guò)濾之后一定要再選擇一次或者按回車才能選定結(jié)果,前臺(tái)值和后臺(tái)值分開(kāi)操作也帶來(lái)很多不變。

    dojo 的驗(yàn)證文本框顏色現(xiàn)實(shí)有bug,我們不得不修改代碼

    dojo的對(duì)話框也有問(wèn)題,對(duì)話框中無(wú)法在彈出對(duì)話框。對(duì)話框的操作和控制很不靈活。

    js代碼不利于管理,容易發(fā)生命名沖突。

     

    致命的問(wèn)題發(fā)生在項(xiàng)目的后期,在客戶的系統(tǒng)進(jìn)行測(cè)試時(shí)發(fā)現(xiàn)。dojo的性能非常差,在賽揚(yáng)2G的電腦上,一個(gè)頁(yè)面顯示的時(shí)間竟然需要17秒。簡(jiǎn)直就是噩夢(mèng)。

    另外使用dojo的對(duì)話框時(shí)出現(xiàn)cpu占用100%而且一直不回落下來(lái)。

    頁(yè)面載入完成的時(shí)候,它有將整個(gè)頁(yè)面重新刷新一次,又需要花費(fèi)額外的5到8s時(shí)間,不僅花費(fèi)更多的時(shí)間,而且嚴(yán)重影響客戶體驗(yàn)。

     

    還有開(kāi)發(fā)過(guò)程中碰到的無(wú)數(shù)問(wèn)題,雖然一個(gè)一個(gè)被解決,但是無(wú)疑是一次一次痛苦的煎熬。

     

    最后,在性能面前,我被dojo徹底打敗,如此的速度是任何客戶都無(wú)法忍受的,客戶不可能為了這個(gè)系統(tǒng)全部升級(jí)電腦cpu。而且還有很多未知的問(wèn)題可能還沒(méi)有被發(fā)覺(jué),不如內(nèi)存泄露,可能導(dǎo)致資源耗盡,內(nèi)存耗盡。cpu 的占用可能在使用時(shí)間長(zhǎng)了之后越來(lái)越高,等等,這些都是我擔(dān)心的問(wèn)題。

     

    使用Ajax或者說(shuō)Rich client,一定要謹(jǐn)慎啊。使用新的技術(shù)和框架,一定要謹(jǐn)慎,這是我的教訓(xùn),希望給同行們一個(gè)參考。

    posted @ 2008-06-04 11:32 vesung 閱讀(2103) | 評(píng)論 (2)編輯 收藏

    看兩段代碼:
    import java.util.ArrayList;   
    import java.util.List;   
      
    public class TailRecursionTest {   
        
    public static void main(String[] args) {   
            TailRecursionTest t 
    = new TailRecursionTest();   
            
    for (int i = 0; i < 10000; i++)   
                t.a(
    0);   
        }
       
      
        
    public void a(int j) {   
            j
    ++;   
            List list 
    = new ArrayList<Integer>(100000);   
            
    // 對(duì)list進(jìn)行處理   
        }
       
    }

    沒(méi)啥特殊的,僅僅是為了測(cè)試,我們將a方法調(diào)用10000次,a方法創(chuàng)建一個(gè)有100000個(gè)元素的list的局部變量。
    第二個(gè)程序:
    import java.util.ArrayList;   
    import java.util.List;   
      
    public class TailRecursionTest2 {   
        
    public static void main(String[] args) {   
            TailRecursionTest2 t 
    = new TailRecursionTest2();   
            t.a(
    0);   
        }
       
      
        
    public void a(int j) {   
            System.out.println(j);   
            j
    ++;   
            
    if (j == 10000)   
                
    return;   
            List list 
    = new ArrayList<Integer>(100000);   
            
    // 對(duì)list進(jìn)行處理   
            a(j);   
        }
       
    }
      

    也沒(méi)啥特殊的,就是將循環(huán)換成了遞歸,a方法做的事情沒(méi)變。兩個(gè)都跑一下,程序1順利結(jié)束,程序2出問(wèn)題了,啥問(wèn)題?如下:
    161  
    162  
    163  
    164  
    165  
    Exception in thread 
    "main" java.lang.OutOfMemoryError: Java heap space   
        at java.util.ArrayList.
    <init>(Unknown Source)   
        at TailRecursionTest2.a(TailRecursionTest2.java:
    17)   
        at TailRecursionTest2.a(TailRecursionTest2.java:
    20)   
        at TailRecursionTest2.a(TailRecursionTest2.java:
    20)   
        at TailRecursionTest2.a(TailRecursionTest2.java:
    20)   
        at TailRecursionTest2.a(TailRecursionTest2.java:
    20

    我倒,才運(yùn)行166次了,heap就滿了。問(wèn)題在哪呢?oh,yep,你肯定想到了,是不是重復(fù)創(chuàng)建list這個(gè)大集合引起的呢?它不是局部變量嗎?怎么也會(huì)溢出?是的,list是局部變量,在a的方法棧里引用著,指向heap上的大對(duì)象,更關(guān)鍵的問(wèn)題在于,java是沒(méi)有尾遞歸優(yōu)化的,遞歸方法是不會(huì)使用同一個(gè)棧幀,每一次遞歸調(diào)用,都將壓入新的棧幀,并且這個(gè)棧幀上又new了一個(gè)list變量,引用著heap上新的一個(gè)大集合。隨著棧深度的增加, jvm里維持著一條長(zhǎng)長(zhǎng)的方法調(diào)用軌跡以便你能回來(lái),在方法沒(méi)有返回之前,這些list變量一直被各自的棧幀引用著,不能被GC,你說(shuō),能不OOM嗎?

        也許,你想到了個(gè)補(bǔ)救方法來(lái)挽救程序2,就是每次在處理完list后,我把它設(shè)置為null,不讓棧幀繼續(xù)引用著它,咱編寫(xiě)對(duì)gc友好的代碼,這不就行了,試試:


    import java.util.ArrayList;   
    import java.util.List;   
      
    public class TailRecursionTest2 {   
        
    public static void main(String[] args) {   
            TailRecursionTest2 t 
    = new TailRecursionTest2();   
            t.a(
    0);   
        }
       
      
        
    public void a(int j) {   
            System.out.println(j);   
            j
    ++;   
            
    if (j == 10000)   
                
    return;   
            List list 
    = new ArrayList<Integer>(100000);   
            
    // 對(duì)list進(jìn)行處理   
            list = null;  //gc友好   
            a(j);   
        }
       
    }
     

    得意洋洋,我跑一下看看,這次跑到4000多次,但是:
       
    4289  
    4290  
    4291  
    4292  
    java.lang.StackOverflowError   
        at sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop(Unknown Source)   
        at sun.nio.cs.ext.DoubleByteEncoder.encodeLoop(Unknown Source)   
        at java.nio.charset.CharsetEncoder.encode(Unknown Source) 

    總結(jié):在java里,遞歸最好咱還是別用,老老實(shí)實(shí)地while、for;就算遞歸了,最好遞歸方法不要new太大的對(duì)象,除非你能確定遞歸的深度不是那么大,否則OOM和堆棧溢出的陰影將籠罩著你。
    posted @ 2008-06-03 09:14 vesung 閱讀(1567) | 評(píng)論 (0)編輯 收藏

    先看下面表格:

    作用域
    當(dāng)前類 同一package 子孫類
    其他package
    public √   
    √   
    √   
    √   
    protected
    √   
    √   
    √   
      × 
    default √   
    √   
      × 
      × 
    private √   
      × 
      × 
      × 

    不寫(xiě)時(shí)默認(rèn)為default

    我們先看類:

    public class  Test 可以在任何地方訪問(wèn),無(wú)論是否為當(dāng)前package
    class Test 只允許當(dāng)前的package使用,不允許其它package使用
    class 不與許prirvate和protected ,所以不討論了

    我們?cè)倏捶椒?br /> private 的只允許類自己使用,子類都不可見(jiàn)。但允許inner類調(diào)用,因?yàn)閕nner類屬于他自己。

    class Test 里面的方法
      public 和default和protected 方法,允許同包的訪問(wèn),因?yàn)轭愂莇efault的,所以方法不可能大于它

    public class Test 里面的方法
      private 只允許自己內(nèi)部訪問(wèn)
     default 只允許同包的訪問(wèn)
      protected 只允許同包和子類訪問(wèn)
      public 可以任意訪問(wèn)
    posted @ 2008-06-02 09:12 vesung 閱讀(880) | 評(píng)論 (0)編輯 收藏

         摘要:   默認(rèn)的序列化機(jī)制并不難操縱。然而,假若有特殊要求又該怎么辦呢?我們可能有特殊的安全問(wèn)題,不希望對(duì)象的某一部分序列化;或者某一個(gè)子對(duì)象完全不必序列化,因?yàn)閷?duì)象恢復(fù)以后,那一部分需要重新創(chuàng)建。 此時(shí),通過(guò)實(shí)現(xiàn)Externalizable接口,用它代替Serializable接口,便可控制序列化的具體過(guò)程。這個(gè)Externalizable接口擴(kuò)展了Serializable,并增添了兩個(gè)...  閱讀全文
    posted @ 2008-05-28 12:00 vesung 閱讀(678) | 評(píng)論 (0)編輯 收藏

    JNDI是J2EE中一個(gè)很重要的標(biāo)準(zhǔn),通常我們是在EJB編程中用到, 
    Tomcat4.0中提供了在JSP和Servelt中直接使用JNDI的方法,下面談一下在Tomcat4.0中配置和使用JNDI的方法 
    (以通過(guò)JNDI連接數(shù)據(jù)庫(kù)為例) 
    假設(shè)使用的數(shù)據(jù)庫(kù)是mysql,實(shí)驗(yàn)例子在TOMCAT_HOME/webapps/DBTest目錄中 

    A.將mysql的JDBC連接庫(kù)mm.mysql-2.0.9-bin.jar放入TOMCAT_HOME/common/lib中 

    B.配置TOMCAT_HOME/conf/serer.xml文件在<Service>;段中加入一個(gè)Context: 
    <Context path="/DBTest" docBase="DBTest" 
    debug="5" reloadable="true" crossContext="true"> 
    </Context> 
    這是DBTest的根路徑,這是為了在DBTest中使用做準(zhǔn)備. 

    C.在上面加入的<Context>;段加入 
    <Resource name="jdbc/TestDB" 
    auth="Container" 
    type="javax.sql.DataSource"/> 

    <ResourceParams name="jdbc/TestDB">
    <parameter> 
    <name>;factory</name> 
    <value>;org.apache.commons.dbcp.BasicDataSourceFactory</value> 
    </parameter> 

    <!-- Maximum number of dB connections in pool. Make sure you 
    configure your mysqld max_connections large enough to handle 
    all of your db connections. Set to 0 for no limit. 
    --> 
    <parameter>
    <name>;maxActive</name>
    <value>;100</value>
    </parameter>

    <!-- Maximum number of idle dB connections to retain in pool. 
    Set to 0 for no limit. 
    -->
    <parameter> 
    <name>;maxIdle</name> 
    <value>;30</value> 
    </parameter> 

    <!-- Maximum time to wait for a dB connection to become available 
    in ms, in this example 10 seconds. An Exception is thrown if 
    this timeout is exceeded. Set to -1 to wait indefinitely. 
    --> 
    <parameter> 
    <name>;maxWait</name> 
    <value>;10000</value> 
    </parameter> 

    <!-- MySQL dB username and password for dB connections --> 
    <parameter> 
    <name>;username</name>; 
    <value>;test</value> 
    </parameter> 
    <parameter> 
    <name>;password</name> 
    <value>;test</value> 
    </parameter> 

    <!-- Class name for mm.mysql JDBC driver -->; 
    <parameter>; 
    <name>;driverClassName</name>; 
    <value>;org.gjt.mm.mysql.Driver</value> 
    </parameter> 

    <!-- The JDBC connection url for connecting to your MySQL dB.--> 
    <parameter> 
    <name>;url</name> 
    <value>;jdbc:mysql://localhost:3306/test</value> 
    </parameter> 
    </ResourceParams> 

    這里每一個(gè)小段都有英文注解,是Tomcat提供的,我們可以將按照Sample加入,主要修改的是driverClassName, 
    url,和用戶帳號(hào);需要強(qiáng)調(diào)的是"jdbc/TestDB"就是JDNI要查找的Name.

    在web.xml中加入 
    <resource-ref> 
    <description>;DB Connection</description> 
    <res-ref-name>;jdbc/TestDB</res-ref-name> 
    <res-type>;javax.sql.DataSource</res-type> 
    <res-auth>;Container</res-auth> 
    </resource-ref> 
    這里的jdbc/TestDb要和C中Resource段的name匹配 

    posted @ 2008-04-25 09:02 vesung 閱讀(432) | 評(píng)論 (0)編輯 收藏

    一、DataSource接口是一個(gè)更好的連接數(shù)據(jù)源的方法:
      JDBC1.0是原來(lái)是用DriverManager類來(lái)產(chǎn)生一個(gè)對(duì)數(shù)據(jù)源的連接。JDBC2.0用一種替代的方法,使用DataSource的實(shí)現(xiàn),代碼變的更小巧精致,也更容易控制。
      一個(gè)DataSource對(duì)象代表了一個(gè)真正的數(shù)據(jù)源。根據(jù)DataSource的實(shí)現(xiàn)方法,數(shù)據(jù)源既可以是從關(guān)系數(shù)據(jù)庫(kù),也電子表格,還可以是一個(gè)表格形式的文件。當(dāng)一個(gè)DataSource對(duì)象注冊(cè)到名字服務(wù)中,應(yīng)用程序就可以通過(guò)名字服務(wù)獲得DataSource對(duì)象,并用它來(lái)產(chǎn)生一個(gè)與DataSource代表的數(shù)據(jù)源之間的連接。
      關(guān)于數(shù)據(jù)源的信息和如何來(lái)定位數(shù)據(jù)源,例如數(shù)據(jù)庫(kù)服務(wù)器的名字,在哪臺(tái)機(jī)器上,端口號(hào)等等,都包含在DataSource對(duì)象的屬性里面去了。這樣,對(duì)應(yīng)用程序的設(shè)計(jì)來(lái)說(shuō)是更方便了,因?yàn)椴⒉恍枰残缘陌羊?qū)動(dòng)的名字寫(xiě)死到程序里面去。通常驅(qū)動(dòng)名字中都包含了驅(qū)動(dòng)提供商的名字,而在DriverManager類中通常是這么做的。如果數(shù)據(jù)源要移植到另一個(gè)數(shù)據(jù)庫(kù)驅(qū)動(dòng)中,代碼也很容易做修改。所需要做的修改只是更改DataSource的相關(guān)的屬性。而使用DataSource對(duì)象的代碼不需要做任何改動(dòng)。
      由系統(tǒng)管理員或者有相應(yīng)權(quán)限的人來(lái)配置DataSource對(duì)象。配置DataSource,包括設(shè)定DataSource的屬性,然后將它注冊(cè)到JNDI名字服務(wù)中去。在注冊(cè)DataSource對(duì)象的的過(guò)程中,系統(tǒng)管理員需要把DataSource對(duì)象和一個(gè)邏輯名字關(guān)聯(lián)起來(lái)。名字可以是任意的,通常取成能代表數(shù)據(jù)源并且容易記住的名字。在下面的例子中,名字起為:InventoryDB,按照慣例,邏輯名字通常都在jdbc的子上下文中。這樣,邏輯名字的全名就是:jdbc/ InventoryDB。
      一旦配置好了數(shù)據(jù)源對(duì)象,應(yīng)用程序設(shè)計(jì)者就可以用它來(lái)產(chǎn)生一個(gè)與數(shù)據(jù)源的連接。下面的代碼片段示例了如何用JNDI上下文獲得一個(gè)一個(gè)數(shù)據(jù)源對(duì)象,然后如何用數(shù)據(jù)源對(duì)象產(chǎn)生一個(gè)與數(shù)據(jù)源的連接。開(kāi)始的兩行用的是JNDI API,第三行用的才是JDBC的API:
       Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/InventoryDB");Connection con = ds.getConnection("myPassword", "myUserName");
      在一個(gè)基本的DataSource實(shí)現(xiàn)中,DataSource.getConnection方法返回的Connection對(duì)象和用DriverManager.getConnection方法返回的Connection對(duì)象是一樣的。因?yàn)镈ataSource提供的方便性,我們推薦使用DataSource對(duì)象來(lái)得到一個(gè)Connection對(duì)象。我們希望所以的基于JDBC2.0技術(shù)的數(shù)據(jù)庫(kù)驅(qū)動(dòng)都包含一個(gè)基本的DataSource的實(shí)現(xiàn),這樣就可以在應(yīng)用程序中很容易的使用它。
      對(duì)于普通的應(yīng)用程序設(shè)計(jì)者,是否使用DataSource對(duì)象只是一個(gè)選擇問(wèn)題。但是,對(duì)于那些需要用的連接池或者分布式的事務(wù)的應(yīng)用程序設(shè)計(jì)者來(lái)說(shuō),就必須使用DataSource對(duì)象來(lái)獲得Connection,原因在下面我們會(huì)提到。
       二、Connection pooling(連接池):
      連接池是這么一種機(jī)制,當(dāng)應(yīng)用程序關(guān)閉一個(gè)Connection的時(shí)候,這個(gè)連接被回收,而不是被destroy,因?yàn)榻⒁粋€(gè)連接是一個(gè)很費(fèi)資源的操作。如果能把回收的連接重新利用,會(huì)減少新創(chuàng)建連接的數(shù)目,顯著的提高運(yùn)行的性能。
      假設(shè)應(yīng)用程序需要建立到一個(gè)名字為EmpolyeeDB的DataSource的連接。使用連接池得到連接的代碼如下:
       Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");Connection con = ds.getConnection("myPassword", "myUserName");除了邏輯名字以外,我們發(fā)現(xiàn)其代碼和上面舉的例子的代碼是一樣的。邏輯名字不同,就可以連接到不同的數(shù)據(jù)庫(kù)。DataSource對(duì)象的getConnection方法返回的Connection是否是一個(gè)連接池中的連接完全取決于DataSource對(duì)象的實(shí)現(xiàn)方法。如果DataSource對(duì)象實(shí)現(xiàn)與一個(gè)支持連接池的中間層的服務(wù)器一起工作,DataSource對(duì)象就會(huì)自動(dòng)的返回連接池中的連接,這個(gè)連接也是可以重復(fù)利用的。
      是否使用連接池獲得一個(gè)連接,在應(yīng)用程序的代碼上是看不出不同的。在使用這個(gè)Connection連接上也沒(méi)有什么不一樣的地方,唯一的不同是在java的finally語(yǔ)句塊中來(lái)關(guān)閉一個(gè)連接。在finally中關(guān)閉連接是一個(gè)好的編程習(xí)慣。這樣,即使方法拋出異常,Connection也會(huì)被關(guān)閉并回收到連接池中去。代碼應(yīng)該如下所示:
      try{…
      }catch(){…
      }finally{ if(con!=null)con.close();}
      三、分布式事務(wù):
      獲得一個(gè)用來(lái)支持分布式事務(wù)的連接與獲得連接池中的連接是很相似的。同樣,不同之處在于DataSource的實(shí)現(xiàn)上的不同,而不是在應(yīng)用程序中獲得連接的方式上有什么不同。假設(shè)DataSource的實(shí)現(xiàn)可以與支持分布式事務(wù)中間層服務(wù)器一起工作,得到連接的代碼還是如下所示:
       Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB"); Connection con = ds.getConnection("myPassword", "myUserName");由于性能上的原因,如果一個(gè)DataSource能夠支持分布式的事務(wù),它同樣也可以支持連接池管理。
      從應(yīng)用程序設(shè)計(jì)者的觀點(diǎn)來(lái)看。是否支持分布式的事務(wù)的連接對(duì)它來(lái)說(shuō)沒(méi)什么不同,唯一的不同是在事務(wù)的邊界上(開(kāi)始一個(gè)事務(wù)的地方和結(jié)束一個(gè)事務(wù)的地方),開(kāi)始一個(gè)事務(wù)或者結(jié)束一個(gè)事務(wù)都是由事務(wù)服務(wù)器來(lái)控制的。應(yīng)用程序不應(yīng)該做任何可能妨礙服務(wù)的事情。應(yīng)用程序不能夠直接調(diào)用事務(wù)提交commit或者回滾rollback操作,也不能夠使用事務(wù)的自動(dòng)提交模式auto-commit mode(在數(shù)據(jù)庫(kù)操作完成的時(shí)候自動(dòng)的調(diào)用commit或者rollback)。 
     
    在一個(gè)連接參與了分布式事務(wù)的時(shí)候,下面的代碼是你不能做的(con表示支持分布式事務(wù)的連接Connection)。
      con.commit();或者con.rollback();或者con.setAutoCommit(true);對(duì)于通常的Connection來(lái)說(shuō),缺省的是auto-commit模式。而對(duì)于支持分布式事務(wù)的Connection來(lái)說(shuō),缺省不是auto-commit模式。注意,即使Connection是支持事務(wù)的,它也可以用于沒(méi)有事務(wù)的情況。關(guān)于事務(wù)邊界的限制只是是對(duì)分布式事務(wù)的情況下才成立的。
      配置支持連接池的DataSource的時(shí)候,涉及到配置ConnectionPoolDataSource對(duì)象,這個(gè)對(duì)象是三層體系結(jié)構(gòu)中的中間層來(lái)管理連接池的。同樣的,在配置支持分布式事務(wù)的時(shí)候,需要配置XADataSource,XADataSource是中間層用來(lái)管理分布式事物的對(duì)象。ConnectionPoolDataSource和XADataSource是由驅(qū)動(dòng)提供商提供的,對(duì)應(yīng)用程序的設(shè)計(jì)者來(lái)說(shuō)是透明的。和基本的DataSource一樣,系統(tǒng)管理員來(lái)配置ConnectionPoolDataSource和XADataSource對(duì)象。
      四、結(jié)果集(RowSet接口):
      結(jié)果集對(duì)象是一行行數(shù)據(jù)的容器。根據(jù)其目的,可以通過(guò)多種方法實(shí)現(xiàn)。RowSet及其相關(guān)的接口與JDBC2.0的標(biāo)準(zhǔn)擴(kuò)展API有點(diǎn)不同,他們并不是驅(qū)動(dòng)的一部分,RowSet是在驅(qū)動(dòng)的上層實(shí)現(xiàn)的,可以由其它的任何人來(lái)實(shí)現(xiàn)他們。
      任何類型的rowset都實(shí)現(xiàn)了RowSet接口,RowSet接口擴(kuò)展了ResultSet接口。這樣RowSet對(duì)象就有了ResultSet對(duì)象所有的功能。能夠通過(guò)getXXX方法得到數(shù)據(jù)庫(kù)中的某列值,通過(guò)updateXXX方法可以修改某列值,可以移動(dòng)光標(biāo),是當(dāng)前行變?yōu)榱硪恍小?
      當(dāng)然,我們更感興趣的是RowSet接口提供的新的功能。作為一個(gè)JavaBean組件,RowSet對(duì)象可以增加或者刪除一個(gè)listener(監(jiān)聽(tīng)者),可以get或者set其屬性值,這些屬性中,有一個(gè)是字符串,表示一個(gè)對(duì)數(shù)據(jù)庫(kù)Query請(qǐng)求,RowSet接口定義了設(shè)定參數(shù)的方法,也提供了執(zhí)行這個(gè)請(qǐng)求的方法。這意味著RowSet對(duì)象能夠執(zhí)行查詢請(qǐng)求,可以根據(jù)它產(chǎn)生的結(jié)果集進(jìn)行計(jì)算。同樣,RowSet也可以根據(jù)任何表格數(shù)據(jù)源進(jìn)行計(jì)算,所以,它不局限于關(guān)系數(shù)據(jù)庫(kù)。
      從數(shù)據(jù)源得到數(shù)據(jù)之后,RowSet對(duì)象可以和數(shù)據(jù)源斷開(kāi)連接,rowset也可以被序列化。這樣,RowSet就可以通過(guò)網(wǎng)絡(luò)傳遞給瘦客戶端。
      RowSet可以被重新連接到數(shù)據(jù)源,這樣,做的修改就可以存回到數(shù)據(jù)源中去。如果產(chǎn)生了一個(gè)listener,當(dāng)RowSet的當(dāng)前行移動(dòng),或者數(shù)據(jù)被修改的時(shí)候,監(jiān)聽(tīng)者就會(huì)收到通知。例如,圖形用戶界面組件可以注冊(cè)成為監(jiān)聽(tīng)者,當(dāng)RowSet更改的時(shí)候,圖形用戶界面接到通知,就可以修改界面,來(lái)符合它所表示的RowSet。
      根據(jù)不同的需要,RowSet接口可以通過(guò)多種方法來(lái)實(shí)現(xiàn)。Java software已經(jīng)寫(xiě)了一個(gè)CachedRowSet實(shí)現(xiàn),從http://developer.java.sun.com/developer/earlyAccess/crs/index.html中可以得到這個(gè)實(shí)現(xiàn)。
      與CachedRowSet類不樣的是,JDBCRowSet類總是保持一個(gè)和數(shù)據(jù)源的連接。這樣,在ResultSet外圍簡(jiǎn)單到加了一層,是基于JDBC技術(shù)的驅(qū)動(dòng)看起來(lái)象是一個(gè)簡(jiǎn)單的JavaBean組件一樣。

      總結(jié):JDBC2.0標(biāo)準(zhǔn)擴(kuò)展API通過(guò)見(jiàn)DataSource注冊(cè)到JNDI名字服務(wù)上,將JDBC技術(shù)擴(kuò)展為一個(gè)全新的概念。使應(yīng)用程序的代碼更加精巧,易于控制。新的API支持了連接池,支持分布式的事務(wù)。最后,還使java應(yīng)用程序可以在網(wǎng)絡(luò)上傳播結(jié)果集,是不可以滾動(dòng)的ResultSet變成了可以滾動(dòng)的RowSet。
    posted @ 2008-04-21 08:58 vesung 閱讀(3257) | 評(píng)論 (0)編輯 收藏

    JDBC 2.0 API被劃分為兩部分:JDBC 2.0核心API和JDBC 2.0標(biāo)準(zhǔn)擴(kuò)展API。核心API在java.sql里面。這是原來(lái)的版本就實(shí)現(xiàn)了的基本的功能。標(biāo)準(zhǔn)擴(kuò)展API在javax.sql里面。由JDBC2.0規(guī)范新規(guī)定的一些接口在這里面。當(dāng)然,JDBC2.0也對(duì)原來(lái)版本的java.sql核心做了一些改動(dòng)。不過(guò)不是很大。原來(lái)JDBC1.0的程序可以不加修改的在JDBC2.0上運(yùn)行。這是Java的一貫的良好的作風(fēng)。最新的JDBC包可以從sun公司的網(wǎng)站上下載。 
      JDBC2.0的擴(kuò)展API增加了一些數(shù)據(jù)訪問(wèn)和數(shù)據(jù)源訪問(wèn)的重大的功能。這中間有一些是主要用來(lái)做企業(yè)計(jì)算的。用JDBC2.0的新的擴(kuò)展包,JDBC提供了一個(gè)從JAVA2平臺(tái)的通用的數(shù)據(jù)訪問(wèn)的方法。
      首先,我們來(lái)看看JDBC標(biāo)準(zhǔn)擴(kuò)展的API怎樣來(lái)和JDBC2.0結(jié)合在一起的。JDBC2.0包括兩個(gè)包:
      1、 java.sql包,個(gè)包里面是JDBC2.0的核心API。它包括了原來(lái)的JDBC API(JDBC 1.0版本),再加上一些新的2.0版本的API。這個(gè)包在Java 2 Platform SDK里面有。
      2、 javax.sql包,這里面是JDBC2.0的標(biāo)準(zhǔn)擴(kuò)展API。這個(gè)包是一個(gè)全新的,在Java 2 Platform SDK, Enterprise Edition里面單獨(dú)提供。
      JDBC2.0的核心API包括了JDBC1.0的API,并在此基礎(chǔ)上增加了一些功能,對(duì)某些性能做了增強(qiáng)。使java語(yǔ)言在數(shù)據(jù)庫(kù)計(jì)算的前端提供了統(tǒng)一的數(shù)據(jù)訪問(wèn)方法,效率也得到了提高。
      JDBC是向后兼容的,JDBC1.0的程序可以不加修改的運(yùn)行在JDBC2.0上。但是,假如程序中用到了JDBC2.0的新特性,就必須要運(yùn)行在JDBC2.0版本上。
      概括的來(lái)說(shuō),JDBC核心API的新特性在兩個(gè)方面做了工作。一個(gè)是支持一些新的功能,另一個(gè)就是支持SQL3的數(shù)據(jù)類型。
      1、 在支持新功能方面:包括結(jié)果集可以向后滾動(dòng),批量的更新數(shù)據(jù)。另外,還提供了UNICODE字符集的字符流操作。
      2、 在支持SQL3的數(shù)據(jù)類型方面:包括新的SQL3數(shù)據(jù)類型,增加了對(duì)持久性對(duì)象的存貯。
      為了對(duì)數(shù)據(jù)的存取,操作更加方便,JDBC的新特性是應(yīng)用程序的設(shè)計(jì)更容易了。例如:數(shù)據(jù)塊的操作能夠顯著的提高數(shù)據(jù)庫(kù)訪問(wèn)的性能。新增加的BLOB, CLOB,和數(shù)組接口能夠是應(yīng)用程序操作大塊的數(shù)據(jù)類型,而不必客戶端在存貯之前進(jìn)行其它的處理。這樣,就顯著的提高了內(nèi)存的使用效率。
       下面我們來(lái)介紹JDBC2.0的標(biāo)準(zhǔn)擴(kuò)展API。標(biāo)準(zhǔn)擴(kuò)展API分為如下幾個(gè)方面:
      1、 DataSource接口:和Java名字目錄服務(wù)(JNDI)一起工作的數(shù)據(jù)源接口。它提供了對(duì)數(shù) 吹囊恢指玫牧臃椒ā?br>;  2、 Connection pooling(連接池):可以重復(fù)使用連接,而不是對(duì)每個(gè)請(qǐng)求都使用一個(gè)新的連接。
      3、 Distrubute transaction(分布式的事務(wù)):在一個(gè)事務(wù)中涉及到了多個(gè)數(shù)據(jù)庫(kù)服務(wù)器。
      4、 Rowsets:JavaBean組件包含了結(jié)果集,主要用來(lái)將數(shù)據(jù)傳給瘦客戶,或者提供一個(gè)可以滾動(dòng)的結(jié)果集。
    posted @ 2008-04-10 11:29 vesung 閱讀(714) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 免费在线观看视频网站| 免费看一级做a爰片久久| 日韩精品亚洲aⅴ在线影院| 国产.亚洲.欧洲在线| 国产99视频精品免费专区| 国产精品成人四虎免费视频| 亚洲综合网美国十次| 两个人看的www高清免费视频| 四虎永久免费网站免费观看| 亚洲一区二区三区91| 久久国产免费观看精品| 免费在线视频一区| 久久亚洲国产最新网站| 最近中文字幕大全中文字幕免费| 中文字幕专区在线亚洲| 18禁亚洲深夜福利人口| 性色av无码免费一区二区三区| 亚洲国产高清人在线| 香蕉免费一级视频在线观看| 四虎永久在线精品免费观看地址 | 久久不见久久见免费影院www日本 久久WWW免费人成—看片 | 国产亚洲精品拍拍拍拍拍| 亚洲丶国产丶欧美一区二区三区| 亚洲精品视频免费在线观看| 亚洲av成人无码久久精品| 香蕉免费一级视频在线观看| 亚洲国产高清在线一区二区三区 | 无人视频免费观看免费视频| 免费无码又爽又刺激毛片| 亚洲人成网站色在线观看| 亚洲免费福利视频| 亚洲人成网址在线观看| 日韩av无码免费播放| 国产午夜亚洲精品国产成人小说| 国产成人 亚洲欧洲| 国产精品冒白浆免费视频| 亚洲综合色婷婷在线观看| 91免费资源网站入口| 亚洲国产模特在线播放| 国产91色综合久久免费分享| 亚洲欧洲国产精品你懂的|