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

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

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

    posts - 8, comments - 13, trackbacks - 0, articles - 43
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    2011年5月22日

    先簡(jiǎn)單回顧下sql語(yǔ)言的幾種語(yǔ)言:ddl,dml,dcl,它們分別是:

    ddl即data definition language,例如常用的:create,alter,drop,truncate,grant,revoke,comment;

    dml即data manipulation language,我們經(jīng)常使用的:select,insert,update,delete等都是數(shù)據(jù)操作語(yǔ)言。

    dcl即data control language,數(shù)據(jù)控制語(yǔ)言,平時(shí)基本用不到,如commit,savepoint,rollback,set transaction。

     

    所以區(qū)別主要在:

    • delete是dml語(yǔ)句,這個(gè)操作使用放在rollback segement里,事務(wù)提交后才生效,是可以回滾的;truncate是ddl語(yǔ)句,它不在rollback segement里的,事務(wù)自動(dòng)提交,操作立即生效,沒(méi)有回滾一說(shuō),除非自身失敗;
    • 還有一個(gè)關(guān)鍵,雖然truncate是數(shù)據(jù)定義語(yǔ)言,但是truncate和delete操作一樣,都只刪除數(shù)據(jù)不刪除表結(jié)構(gòu),兩者的主要區(qū)別在于,truncate操作是沒(méi)有備份的,所以它執(zhí)行速度比delete快;而另一個(gè)ddl語(yǔ)句drop,將刪除的是結(jié)構(gòu)包括被依賴的觸發(fā)器,索引,約束,依賴該表的存儲(chǔ)過(guò)程會(huì)被保留。剛才又搜索了下truncate和drop操作之后數(shù)據(jù)也還是可以找回來(lái)的:http://dbsnake.com/2010/06/truncate-drop-recovery.html

    posted @ 2011-05-22 12:12 kangaroo 閱讀(292) | 評(píng)論 (0)編輯 收藏

    1。xml背景

    格式良好的(web-fromed)xml可以不需要文檔類型定義(DTD),只要滿足基本的xml格式規(guī)范就可以認(rèn)為是格式良好的xml文檔。但是格式標(biāo)準(zhǔn),只能說(shuō)明元素、標(biāo)簽、格式是合法的,并不能說(shuō)明元素是有意義的,或者說(shuō)規(guī)范的。

    有效的xml文檔,首先要求是格式良好的文檔,同時(shí)遵守相應(yīng)的DTD文件約束。

    2。xml解析

    xml文檔解析的大致使用過(guò)程如下圖:

     

     

     

    由xml解析器解析和操作指定的xml文檔,然后提供接口供應(yīng)用程序使用。如果解析器不同,那么提供的接口就有可能不同。慶幸的是,目前所有的xml解析器對(duì)兩套標(biāo)準(zhǔn)的api提供了支持,這兩套標(biāo)準(zhǔn)api就是dom和sax。

    dom:即document object model,文檔對(duì)象模型,它是w3c組織推薦的處理xml的標(biāo)準(zhǔn)接口。dom是基于xml文檔結(jié)構(gòu)樹的解析。

    sax:即simple api for xml,它是非官方的、xml社區(qū)事實(shí)上的標(biāo)準(zhǔn)。sax是基于事件流的解析。

    dom和sax只是定義了一些接口以及某些接口的缺省實(shí)現(xiàn),應(yīng)用程序要想利用dom或sax訪問(wèn)xml文檔,還需要真正實(shí)現(xiàn)dom或sax接口的xml解析器。apache的xerces是一個(gè)使用非常廣泛的解析器,它實(shí)現(xiàn)了dom和sax的調(diào)用接口,并提供了多種語(yǔ)言的實(shí)現(xiàn)版本。

    3。java語(yǔ)言對(duì)xml文檔的解析

    首先介紹jaxp:

    基于dom或sax提供的api接口,使用相應(yīng)的解析器實(shí)現(xiàn)類我們已經(jīng)可以對(duì)xml進(jìn)行解析處理了。如下所示:

    org.xml.sax.XMLReader sp=new org.apache.xerces.parser.SAXParser();

    FileInputStream fis=new FileInputStream(“hello.xml”);

    InputSource is=new InputSource(fis);

    sp.setContentHandler(new MyConentHandler());

    sp.parse(is);

    為了屏蔽xml解析器的變化對(duì)代碼的影響,java提供了一套標(biāo)準(zhǔn)的處理xml文件的接口(實(shí)際上是一些抽象的工廠類),使得java開發(fā)人員以一種標(biāo)準(zhǔn)的方式對(duì)xml進(jìn)行編程,即jaxp(java api for xml processing)。jaxp沒(méi)有提供解析xml的新方法,只是在解析器之上封裝一個(gè)抽象層。在jdk1.6的文檔中,我們可以看到j(luò)avax.xml,org.w3c.dom,org.xml.sax包及其子包都屬于jaxp的部分。jaxp由接口、抽象類和一些輔助類組成,符合jaxp規(guī)范的解析器實(shí)現(xiàn)其中的接口和抽象類,開發(fā)時(shí)只需要使用jaxp的api編程,底層的解析器對(duì)開發(fā)者時(shí)透明的,可以隨意的切換。

    那么jaxp出現(xiàn)后,java應(yīng)用程序處理xml文檔的過(guò)程就如下圖:

     

    那實(shí)際采用哪種解析器的jaxp實(shí)現(xiàn),可以通過(guò)系統(tǒng)屬性、properties文件等方式來(lái)配置。

    下面具體介紹幾種java解析xml的方法:

    3.1 DOM方式(jaxp)

    在javax.xml.parsers包中,定義了dom的抽象工廠類DocumentBuilderFactory,在這個(gè)類中有一個(gè)靜態(tài)的方法newInstance(),通過(guò)它產(chǎn)生一個(gè)DocumentBuilderFactory的實(shí)例。前面提到過(guò)jaxp編程,解析器提供商必須繼承該抽象類產(chǎn)生一個(gè)具體的解析器工廠,然后由這個(gè)工廠類實(shí)例出一個(gè)解析器對(duì)象,再通過(guò)該解析器對(duì)象處理xml文檔。那么這個(gè)newInstance方法就是用來(lái)產(chǎn)生一個(gè)具體的解析器工廠類實(shí)例,查找生成解析器工廠類實(shí)例的方式可參考jdk文檔。

    在獲取到解析器工廠類實(shí)例類之后,就可以調(diào)用newDocumentBuilder()方法創(chuàng)建一個(gè)dom解析器實(shí)例;dom解析器實(shí)例就可以調(diào)用parser()方法獲取整個(gè)xml問(wèn)答的Document對(duì)象。

    3 .2 SAX方式(jaxp)

    sax是基于事件驅(qū)動(dòng)的api,sax解析xml文檔時(shí)會(huì)向事件處理器發(fā)送不同的事件。sax解析器接口和事件處理器接口都在org.xml.sax包中定義。XMLReader即為sax定義的解析器接口,由解析器提供商實(shí)現(xiàn)該借口,應(yīng)用程序需要做的是編寫一個(gè)事件處理器。可以通過(guò)XMLReader的setContentHandler()方法來(lái)設(shè)置一個(gè)事件處理器的實(shí)例。

    與dom類似,jaxp也為sax解析器提供了抽象工廠類SAXParserFactory類,sax解析器工廠類的實(shí)例與dom解析器工廠類的實(shí)例類似,都是通過(guò)newInstance()方法來(lái)創(chuàng)建,不同的是SAXParserFactory的newInstance()方法查找的工廠類屬性是:javax.xml.parsers.SAXParserFactory。同樣,獲取sax解析器實(shí)例的方法,可以通過(guò)調(diào)用newSAXParser()。

    使用SAXParser和XMLReader都可以用來(lái)對(duì)xml文檔進(jìn)行解析,前者只是對(duì)后者又一次的包裝。

    3.3 JDOM

    dom被設(shè)計(jì)用于完成幾乎所有的xml操作任務(wù),同時(shí)又是與語(yǔ)言無(wú)關(guān)的,這就導(dǎo)致dom的api龐大而且復(fù)雜。為了使java程序員更方便地處理xml文檔,兩位國(guó)外的java技術(shù)專家創(chuàng)建了jdom。用developerworks上的一句話,“延續(xù)開源社群有需要就創(chuàng)建工具的歷史傳統(tǒng),Java 技術(shù)專家 Jason Hunter 和 Brett McLaughlin 締造了 JDOM”。所以可以認(rèn)為,jdom是一種專門用于java語(yǔ)言解析xml文檔的開放源代碼框架。

    jdom也使用對(duì)象樹來(lái)表示xml文檔,底層使用sax解析器分析xml文檔,形成jdom樹。

    3.4 DOM4J

    同jdom一樣,dom4j也是應(yīng)用于java平臺(tái),提供簡(jiǎn)單、靈活的處理xml文檔的開發(fā)源代碼庫(kù)。很有意思的是,dom4j是由早期開發(fā)jdom的人分離出來(lái)而后獨(dú)立開發(fā)的,(利益或意見不和?呵呵)與jdom相比,dom4j提供了更好的靈活性。從網(wǎng)上的評(píng)論可以看出,dom4j從性能、功能、易用性上都優(yōu)于jdom,可以作為解析xml文件的首選。(看來(lái)后來(lái)分離出的那撥人選擇還是正確的!)流行的hibernate,jaxm都采用了dom4j處理xml文件。

    dom4j也使用sax解析器來(lái)分析xml文檔,形成dom4j樹;它也提供了用于大文檔的基于事件的處理模型。

    所以可以看出,jdom和dom4j只是開源社區(qū)產(chǎn)生出來(lái)的方便地解析xml的框架或工具,并沒(méi)有創(chuàng)造新的xml解析方式。如果拿

    拿以上四種解析xml的方法比較,用孫鑫老師的話,如果你需要頻繁更換解析器就是jaxp方式,否則推薦使用dom4j。

    posted @ 2011-05-22 11:25 kangaroo 閱讀(743) | 評(píng)論 (0)編輯 收藏

    2011年4月24日

    netstat -an 查詢所有連接和監(jiān)聽端口

    lsof -i :port,使用lsof -i :port就能看見所指定端口運(yùn)行的程序,同時(shí)還有當(dāng)前連接。 


    posted @ 2011-04-24 15:10 kangaroo 閱讀(254) | 評(píng)論 (0)編輯 收藏

    2011年4月23日

    OAuth通過(guò)應(yīng)用和微博授權(quán)頁(yè)面之間的跳轉(zhuǎn)來(lái)進(jìn)行授權(quán). 其步驟為

    1. 應(yīng)用向微博平臺(tái)發(fā)起請(qǐng)求,獲得一個(gè)臨時(shí)的oauth_token,和oauth_token_secret(A),這套key被稱為request token.
    2. 應(yīng)用將用戶轉(zhuǎn)向到微博授權(quán)頁(yè)面,同時(shí)帶上這個(gè)token和一個(gè)回調(diào)頁(yè)面地址
    3. 用戶在微博上同意授權(quán)后,會(huì)生成oauth_verifier(B),并在轉(zhuǎn)向到回調(diào)頁(yè)面是帶上這個(gè)值.
    4. 應(yīng)用通過(guò)$_REQUEST得到oauth_verifier,再加上之前(A)處的oauth_token和oauth_token_secret,向微博發(fā)起最后一次請(qǐng)求.
    5. 微博平臺(tái)驗(yàn)證無(wú)誤后,發(fā)給應(yīng)用另外一套o(hù)auth_token和oauth_token_secret(C),這套key被成為access token.
    6. 拿到access token意味著應(yīng)用已經(jīng)獲得了授權(quán).之后應(yīng)用就可以通過(guò)access token獲取和發(fā)送微博了.

    access token不用每次都去取,可以把它保存下來(lái),供下次使用.這樣性能更高.

    posted @ 2011-04-23 19:57 kangaroo 閱讀(611) | 評(píng)論 (0)編輯 收藏

    2011年4月20日

    pwd

    posted @ 2011-04-20 21:08 kangaroo 閱讀(429) | 評(píng)論 (0)編輯 收藏

    2011年4月18日

    sudo mysqld_safe 
    sudo mysqladmin shutdown

    posted @ 2011-04-18 22:24 kangaroo 閱讀(1244) | 評(píng)論 (0)編輯 收藏

    2011年3月31日

    ll 命令查詢出來(lái)的文件大小 單位是byte,
    要想方便的查看出大小,使用“ll -h”

    posted @ 2011-03-31 19:05 kangaroo 閱讀(339) | 評(píng)論 (0)編輯 收藏

    2011年3月29日

    ctrl+shift+j:類似firebug的功能,開發(fā)時(shí)很實(shí)用
    如果覺(jué)得太過(guò)復(fù)雜,可以使用firebug for chrome的插件,快捷F12,相當(dāng)方便!

    posted @ 2011-03-29 22:31 kangaroo 閱讀(285) | 評(píng)論 (0)編輯 收藏

    2011年2月17日

    自動(dòng)換行:ctrl+shift+w

    posted @ 2011-02-17 11:47 kangaroo 閱讀(232) | 評(píng)論 (0)編輯 收藏

    2011年1月10日

    XMind 快捷鍵

    快捷鍵(Windows)

    快捷鍵(Mac)

    描述

    Ctrl+N Command+N 建立新工作簿
    Ctrl+O Command+O 開啟工作簿
    Ctrl+S Command+S 儲(chǔ)存目前工作簿
    Ctrl+Shift+S Command+Shift+S 儲(chǔ)存全部工作簿
    Ctrl+W Command+W 關(guān)閉目前工作簿
    Ctrl+Shift+W Command+Shift+W 關(guān)閉全部工作簿
    Ctrl+P Command+P 列印
    Ctrl+Z Command+Z 復(fù)原
    Ctrl+Y Command+Y 重做
    Ctrl+X Command+X 剪切
    Ctrl+C Command+C 複製
    Ctrl+V Command+V 貼上
    Delete Delete 刪除
    Ctrl+Home Command+Home 返回中心主題
    Ctrl+A Command+A 選擇全部主題
    Ctrl+Shift+A Command+Shift+A 選擇同層級(jí)主題
    Ctrl+Alt+A Command+Alt+A 選擇子主題
    Ctrl+F Command+F 尋找/取代
    Ctrl++ Command++ 放大
    Ctrl+- Command+- 縮小
    Ctrl+= Command+= 正常大小
    Ctrl+] Command+] 插入摘要
    Alt+Enter Alt+Enter 屬性內(nèi)容
    Enter Enter 插入主題
    Tab Tab 插入子主題
    Shift+Enter Shift+Enter 在目前主題前插入主題
    Ctrl+Enter Command+Enter 插入目前主題父主題
    Ctrl+Shift+L Command+Shift+L 快捷鍵助手
    Ctrl+I Ctrl+I 插入圖片
    Ctrl+Shift+H Command+Shift+H 插入超連結(jié)
    Ctrl+B Command+B 添加外框
    Ctrl+L Command+L 添加關(guān)連
    F2 F2 編輯主題
    F3 F3 添加/編輯標(biāo)籤
    F4 F4 添加/編輯備註
    F5 F5 簡(jiǎn)報(bào)演示
    F6 F6 下鑽
    Shift+F6 Shift+F6 上鑽
    F7 F7 智慧擷取圖面
    + + 展開目前分支
    - - 收縮目前分支
    * * 展開所有分支
    / / 收縮所有分支
    Alt+Up Alt+Up 向前移動(dòng)
    Alt+Down Alt+Down 向後移動(dòng)
    Ctrl+T Command+T 建立新心智圖
    Ctrl+1,2,3,4,5,6 Command+1,2,3,4,5,6 快速添加優(yōu)先等級(jí)圖標(biāo)
    Esc Esc 關(guān)閉跳出的備註對(duì)話框 / 取消擷圖
    Ctrl+滑鼠滾輪 Command+滑鼠滾輪 放大縮小目前的圖面

    posted @ 2011-01-10 09:55 kangaroo 閱讀(5620) | 評(píng)論 (0)編輯 收藏

    2010年12月17日

    ASCII是最初的計(jì)算機(jī)指定的一套符號(hào)編碼,使用一個(gè)字節(jié)其中的7位,128個(gè)數(shù)值代表不同字符,對(duì)于英語(yǔ)這個(gè)已經(jīng)是足夠,
    但是對(duì)于其他國(guó)家的語(yǔ)言,卻遠(yuǎn)遠(yuǎn)不夠,如漢語(yǔ),日語(yǔ),韓語(yǔ),所以就出現(xiàn)了非ASCII的字符編碼,如gbk2312,gbk的漢字編碼。這些非ascii的編碼都是兼容ascii128個(gè)符號(hào)編碼的。

    ------------------------------------------------------------------------------------------------------------------------------------------------------

    UNICODE首先只是一個(gè)字符集,它的出現(xiàn)就是因?yàn)楦鱾€(gè)國(guó)家出臺(tái)自己的語(yǔ)言編碼,為了統(tǒng)一這些所有語(yǔ)言,可以理解unicode是涵蓋各個(gè)國(guó)家字符的集合,現(xiàn)在的規(guī)模可以容納100多萬(wàn)個(gè)符號(hào)。需要說(shuō)明的是,定長(zhǎng)編碼便于計(jì)算機(jī)處理(注意GB2312/GBK不是定長(zhǎng)編碼),而unicode又可以用來(lái)表示所有字符,所以在很多軟件內(nèi)部是使用unicode編碼來(lái)處理的,比如java。
    unicode只是一個(gè)符號(hào)集,只規(guī)定了符號(hào)的二進(jìn)制代碼,卻沒(méi)有規(guī)定這個(gè)二進(jìn)制代碼應(yīng)該如何存儲(chǔ),即編碼方式,常見的有utf-8和utf-16。
    (如果unicode規(guī)定,每個(gè)符號(hào)用三個(gè)字節(jié)表示,那么英文字母只占用一個(gè)字節(jié),就浪費(fèi)很多存儲(chǔ)空間。)
    UTF-8就是一種變長(zhǎng)的編碼方式,它使用1~4個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度。


    我們常用的記事本功能,在"save as"的時(shí)候,可以選擇不同的編碼方式,里面有四個(gè)選擇:ansi,unicode,unicode big endian,utf-8:
    1.ANSI是默認(rèn)的編碼方式。對(duì)于英文文件是ASCII編碼,對(duì)于簡(jiǎn)體中文文件是GB2312編碼(只針對(duì)Windows簡(jiǎn)體中文版,如果是繁體中文版會(huì)采用Big5碼)。
    2.Unicode編碼指的是UCS-2編碼方式,即直接用兩個(gè)字節(jié)存入字符的Unicode碼。這個(gè)選項(xiàng)用的little endian格式。

    3.Unicode big endian編碼與上一個(gè)選項(xiàng)相對(duì)應(yīng)。我在下一節(jié)會(huì)解釋little endian和big endian的涵義。

    4.UTF-8編碼,也就是上一節(jié)談到的編碼方法。



    參考:

    http://www.cnblogs.com/pony/archive/2009/02/05/1384323.html
    http://blog.chinaunix.net/u1/56156/showart_2245355.html
    http://liaoshaoyao.javaeye.com/blog/667056

    posted @ 2010-12-17 10:50 kangaroo 閱讀(1234) | 評(píng)論 (0)編輯 收藏

    2010年12月16日

    MD5是一種摘要生成算法,本來(lái)不能用于簽名,但是在待簽名數(shù)據(jù)之后加上一串私密內(nèi)容,即散列碼,就可以用于簽名了。但是md5只能做到防篡改的功能,不能做到防抵賴,因?yàn)檫@串私密內(nèi)容雙方是都知道的。

    DSA和RSA是一種非對(duì)稱加密算發(fā),簽名密鑰分為公鑰和私鑰。私鑰用于加密,公鑰用于驗(yàn)證簽名。使用這種算法的簽名即起到防篡改的功能,又起到防抵賴的作用。因?yàn)樗借€只有簽名者自己獨(dú)有。

    posted @ 2010-12-16 11:43 kangaroo 閱讀(4970) | 評(píng)論 (1)編輯 收藏

    2010年12月14日

    /*給創(chuàng)建bitmap index分配的內(nèi)存空間參數(shù),以加速建索引*/

    show parameter create_bit;

    /*改變索引的存儲(chǔ)參數(shù)*/

    alter index index_name pctfree 30 storage(initial 200k next 200k);

    /*給索引手工分配一個(gè)分區(qū)*/

    alter index index_name allocate extent (size 200k datafile '$ORACLE/oradata/..');

    /*釋放索引中沒(méi)用的空間*/

    alter index index_name deallocate unused;

    /*索引重建*/

    alter index index_name rebuild tablespace tablespace_name;

    /*普通索引和反轉(zhuǎn)索引的互換*/

    alter index index_name rebuild tablespace tablespace_name reverse;

    /*重建索引時(shí),不鎖表*/

    alter index index_name rebuild online;

    /*給索引整理碎片*/

    alter index index_name COALESCE;

    /*分析索引,事實(shí)上是更新統(tǒng)計(jì)的過(guò)程*/

    analyze index index_name validate structure;

    desc index_state;

    drop index index_name;

    alter index index_name monitoring usage;-----監(jiān)視索引是否被用到

    alter index index_name nomonitoring usage;----取消監(jiān)視

    /*有關(guān)索引信息的視圖*/

    select * from dba_indexes/dba_ind_columns/dbs_ind_eXPressions/v$object_usage;

    ########## 數(shù)據(jù)完整性的治理(Maintaining data integrity) ##########

    alter table table_name drop constraint constraint_name;----drop 約束

    alter table table_name add constraint constraint_name primary key(column_name1,column_name2);-----創(chuàng)建主鍵

    alter table table_name add constraint constraint_name unique(column_name1,column_name2);---創(chuàng)建唯一約束

    /*創(chuàng)建外鍵約束*/

    alter table table_name add constraint constraint_name foreign key(column_name1) references table_name(column_name1);

    /*不效驗(yàn)老數(shù)據(jù),只約束新的數(shù)據(jù)[enable/disable:約束/不約束新數(shù)據(jù);novalidate/validate:不對(duì)/對(duì)老數(shù)據(jù)進(jìn)行驗(yàn)證]*/

    alter table table_name add constraint constraint_name check(column_name like 'B%') enable/disable novalidate/validate;

    /*修改約束條件,延時(shí)驗(yàn)證,commit時(shí)驗(yàn)證*/

    alter table table_name modify constraint constraint_name initially deferred;

    /*修改約束條件,立即驗(yàn)證*/

    alter table table_name modify constraint constraint_name initially immediate;

    alter session set constraints=deferred/immediate;

    /*drop一個(gè)有外鍵的主鍵表,帶cascade constraints參數(shù)級(jí)聯(lián)刪除*/

    drop table table_name cascade constraints;

    /*當(dāng)truncate外鍵表時(shí),先將外鍵設(shè)為無(wú)效,再truncate;*/

    truncate table table_name;

    /*設(shè)約束條件無(wú)效*/

    alter table table_name disable constraint constraint_name;

    alter table table_name enable novalidate constraint constraint_name;


    簡(jiǎn)潔實(shí)用,謝謝http://wfly2004.blog.163.com/blog/static/11764272010629114155174/

    http://hi.baidu.com/zhangcheng1/blog/item/54deb0cc9ab69d1701e9281e.html

    posted @ 2010-12-14 17:45 kangaroo 閱讀(10050) | 評(píng)論 (0)編輯 收藏

    2010年12月12日


    找到一份比較清楚的文章:
    同事寫過(guò)的記錄數(shù)組的用法,很棒!
    |grep ","|awk -F ","  '{print $10}'| awk -F ":" '{hist[$1]++} END{for(i in hist) printf "%s %d\n", i, hist[i]}'

    posted @ 2010-12-12 20:44 kangaroo 閱讀(983) | 評(píng)論 (0)編輯 收藏

    早上去博庫(kù)看了一會(huì)PHP+Mysql核心開發(fā)的書,研一的時(shí)候就是這本書搞定的課程設(shè)計(jì)。
    php,服務(wù)器端腳本語(yǔ)言。每次請(qǐng)求之后,先由web服務(wù)器解釋執(zhí)行后,在以html輸出到客戶端。
    相對(duì)于java sverlet容器的tomcat,php的編譯引擎可以嵌入到apache或iis這類web服務(wù)器中。

    posted @ 2010-12-12 15:57 kangaroo 閱讀(277) | 評(píng)論 (0)編輯 收藏

    2010年10月12日

    今天在使用淘寶openapi做試驗(yàn),通過(guò)nick查詢用戶的其他公開信息,在eclipse中java application運(yùn)行測(cè)試類沒(méi)有問(wèn)題,但是放在web工程中就不行了,jetty啟動(dòng)工程后報(bào)錯(cuò):一些taobao.api中的類如DefaultTaobaoClient,UserGetRequest不存在。

     
    研究一下發(fā)現(xiàn),因?yàn)樵趀clipse里面,淘寶api的jar包是以第三方j(luò)ar的形式導(dǎo)入進(jìn)來(lái)的,所以在eclipse中訪問(wèn)是沒(méi)有問(wèn)題的,但是如果是web工程打包時(shí),是不包括第三方j(luò)ar包的,所以結(jié)果是,不論是jetty還是tomcat中啟動(dòng)都會(huì)出現(xiàn)第三方j(luò)ar的類無(wú)法找到的錯(cuò)誤。

    解決的辦法是,將這些第三方j(luò)ar包install到本地maven庫(kù),命令如:
    mvn install:install-file -Dfile=E:/08_library/taobao_sdk/taobao-sdk-java/taobao-sdk-java.jar -DgroupId=tanlun.taobao.openapi -DartifactId=taobaosdk -Dversion=0.2 -Dpackaging=jar
    之后在web工程的pom.xml文件中加入對(duì)該jar的依賴,這樣重新mvn eclipse:eclipse,之后再mvn jetty:run就沒(méi)有問(wèn)題了。

    posted @ 2010-10-12 16:09 kangaroo 閱讀(1652) | 評(píng)論 (0)編輯 收藏

    2010年10月9日

    簡(jiǎn)單的說(shuō),jvm的堆是存放對(duì)象的地方,棧存放的是基本數(shù)據(jù)類型和對(duì)象的引用。jvm棧是運(yùn)行時(shí)的單位,jvm堆是存儲(chǔ)的單位。java中每個(gè)線程都有一個(gè)棧與之對(duì)應(yīng),這個(gè)很容易理解,每一個(gè)線程都有其特殊的執(zhí)行流程邏輯,因此需要一個(gè)獨(dú)立的線程棧與之對(duì)應(yīng)。jvm棧因?yàn)槭沁\(yùn)行時(shí)單位,所以里面存儲(chǔ)的信息都是跟當(dāng)前線程相關(guān)的東西,如局部變量、運(yùn)行時(shí)狀態(tài),返回值等。而jvm堆是真正存放數(shù)據(jù)的地方,多個(gè)jvm棧可以共享堆中的數(shù)據(jù)。
    jvm堆和棧分離的好處,從軟件設(shè)計(jì)的角度看,棧代表處理邏輯,堆代表數(shù)據(jù),分而治之,邏輯更加清楚。因?yàn)槎阎械膬?nèi)容可以被共享,節(jié)省了空間。從面向?qū)ο蟮慕嵌龋瑢?duì)象的屬性,即數(shù)據(jù),被存放在堆中,而對(duì)象中的方法,則是運(yùn)行邏輯,存放在棧中。
    平時(shí)我們?cè)趀clipse啟動(dòng)程序,我們可以通過(guò)-Xms,-Xmx來(lái)設(shè)置大小,其實(shí)是在設(shè)置初始堆空間,和最大堆空間的大小。

    posted @ 2010-10-09 17:19 kangaroo 閱讀(550) | 評(píng)論 (0)編輯 收藏

    2010年9月25日

    本想就OAUTH進(jìn)行一下流程分析,看到原網(wǎng)站的內(nèi)容已經(jīng)足夠簡(jiǎn)明,請(qǐng)?jiān)L問(wèn):
    然后看下中文的:

    明白了OAUTH的工作原理之后,我就在想,現(xiàn)在原有的webservice的方式,不是也可以實(shí)現(xiàn)不同網(wǎng)站之間通過(guò)api的形式來(lái)資源共享嗎,那OAUTH又有什么好處了。
    看了一些文章之后,我的認(rèn)識(shí)可能是,在跨語(yǔ)言的webservice調(diào)用時(shí),實(shí)現(xiàn)細(xì)節(jié)上還是有很多差異,特別是復(fù)雜的對(duì)象類型。
    轉(zhuǎn)換成REST方式的服務(wù)之后,對(duì)服務(wù)的發(fā)布者和使用者來(lái)說(shuō)都是輕量級(jí)的。
    那OAUTH正是在REST基礎(chǔ)上api的安全校驗(yàn)和授權(quán)的一種方式。

    posted @ 2010-09-25 16:00 kangaroo 閱讀(1177) | 評(píng)論 (0)編輯 收藏

    spring給我們提供了非常簡(jiǎn)便的線程池管理的包裝類ThreadPoolTaskExecutor,本地啟動(dòng)一個(gè)為異步任務(wù)創(chuàng)建線程池的方法:
     
    1<bean id="threadPoolTaskExecutor"
    2        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    3        <property name="corePoolSize" value="5" />
    4        <property name="maxPoolSize" value="10" />
    5        <property name="queueCapacity" value="25" />
    6    </bean>
    corePoolSize:默認(rèn)開啟線程數(shù);maxPoolSize:最大線程數(shù);queueCapacity:緩沖任務(wù)隊(duì)列的長(zhǎng)度;
    創(chuàng)建線程的方式:
    1threadPoolTaskExecutor.execute(new Runnable() {
    2                public void run() {
    3                   //異步任務(wù)
    4                }
    5            });

    posted @ 2010-09-25 11:29 kangaroo 閱讀(7954) | 評(píng)論 (0)編輯 收藏

    2010年9月9日

    本地起tomcat之后,配置服務(wù)器也可以使用https協(xié)議訪問(wèn)的方式是方便:

    1. 創(chuàng)建證書
        進(jìn)入到你的jre/bin文件夾下,鍵入“keytool -genkey -alias tomcat -keyalg RSA -keystore c:/.keystore”,默認(rèn)將把證書保存在你的C盤根目錄下。在申請(qǐng)的過(guò)程中密碼請(qǐng)?zhí)顚?#8220;changeit”,這是tomcat的默認(rèn)密碼。
    2. 修改server.xml
        進(jìn)入到你的$CATALINA_HOME/conf/server.xml,打開后尋找:
    <!-- Define a SSL HTTP/1.1 Connector on port 8443 -->
        
    <!--
        <Connector port="8443" maxHttpHeaderSize="8192"
                   maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups="false" disableUploadTimeout="true"
                   acceptCount="100" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS" />
    -->
        修改如下:
    <!-- Define a SSL HTTP/1.1 Connector on port 8443 -->
        
        
    <Connector port="8443" maxHttpHeaderSize="8192"
                   maxThreads
    ="150" minSpareThreads="25" maxSpareThreads="75"
                   enableLookups
    ="false" disableUploadTimeout="true"
                   acceptCount
    ="100" scheme="https" secure="true"
                   clientAuth
    ="false" sslProtocol="TLS" keystoreFile="c:\.keystore"/>
    3. 重啟你的tomcat,使用端口8443訪問(wèn)即可。

    posted @ 2010-09-09 10:45 kangaroo 閱讀(684) | 評(píng)論 (0)編輯 收藏

    2010年9月5日

    剛開始的時(shí)候經(jīng)常會(huì)把這兩類的方法搞混了,慢慢接觸多了,一定要弄清楚了。
    (1)管理線程的方法
    start:不用多說(shuō),啟動(dòng)一個(gè)線程的方法。調(diào)用該方法后,線程即進(jìn)入可運(yùn)行狀態(tài),也就是進(jìn)入可運(yùn)行的線程池了。
    sleep:線程休眠,將一個(gè)運(yùn)行時(shí)的線程,將其狀態(tài)變?yōu)榭蛇\(yùn)行狀態(tài),然后加入到和其他處于可運(yùn)行狀態(tài)下的線程搶奪運(yùn)行機(jī)會(huì)。換句話說(shuō),sleep的時(shí)間是該線程不執(zhí)行的最短時(shí)間。
    yield:使得當(dāng)前線程進(jìn)入可運(yùn)行狀態(tài),以允許具有相同狀態(tài)優(yōu)先級(jí)的其他線程獲得運(yùn)行機(jī)會(huì)。但是不保證,剛進(jìn)入可運(yùn)行狀態(tài),又被選中進(jìn)入運(yùn)行狀態(tài)。
    join:非靜態(tài)方法join,有點(diǎn)搶線程的意思。一旦某個(gè)線程實(shí)例t調(diào)用join方法,則當(dāng)前線程變?yōu)榭蛇\(yùn)行狀態(tài),直到線程t運(yùn)行完畢為止。
    (2)線程間協(xié)作的方法

    posted @ 2010-09-05 23:06 kangaroo 閱讀(528) | 評(píng)論 (0)編輯 收藏

    在平時(shí)開發(fā)中,我們經(jīng)常采用HashMap來(lái)作為本地緩存的一種實(shí)現(xiàn)方式,將一些如系統(tǒng)變量等數(shù)據(jù)量比較少的參數(shù)保存在HashMap中,并將其作為單例類的一個(gè)屬性。在系統(tǒng)運(yùn)行中,使用到這些緩存數(shù)據(jù),都可以直接從該單例中獲取該屬性集合。但是,最近發(fā)現(xiàn),HashMap并不是線程安全的,如果你的單例類沒(méi)有做代碼同步或?qū)ο箧i的控制,就可能出現(xiàn)異常。

    首先看下在多線程的訪問(wèn)下,非現(xiàn)場(chǎng)安全的HashMap的表現(xiàn)如何,在網(wǎng)上看了一些資料,自己也做了一下測(cè)試:

     1public class MainClass {
     2    
     3    public static final HashMap<String, String> firstHashMap=new HashMap<String, String>();
     4    
     5    public static void main(String[] args) throws InterruptedException {
     6        
     7        //線程一
     8        Thread t1=new Thread(){
     9            public void run() {
    10                for(int i=0;i<25;i++){
    11                    firstHashMap.put(String.valueOf(i), String.valueOf(i));
    12                }

    13            }

    14        }
    ;
    15        
    16        //線程二
    17        Thread t2=new Thread(){
    18            public void run() {
    19                for(int j=25;j<50;j++){
    20                    firstHashMap.put(String.valueOf(j), String.valueOf(j));
    21                }

    22            }

    23        }
    ;
    24        
    25        t1.start();
    26        t2.start();
    27        
    28        //主線程休眠1秒鐘,以便t1和t2兩個(gè)線程將firstHashMap填裝完畢。
    29        Thread.currentThread().sleep(1000);
    30        
    31        for(int l=0;l<50;l++){
    32            //如果key和value不同,說(shuō)明在兩個(gè)線程put的過(guò)程中出現(xiàn)異常。
    33            if(!String.valueOf(l).equals(firstHashMap.get(String.valueOf(l)))){
    34                System.err.println(String.valueOf(l)+":"+firstHashMap.get(String.valueOf(l)));
    35            }

    36        }

    37        
    38    }

    39
    40}

    上面的代碼在多次執(zhí)行后,發(fā)現(xiàn)表現(xiàn)很不穩(wěn)定,有時(shí)沒(méi)有異常文案打出,有時(shí)則有個(gè)異常出現(xiàn):


    為什么會(huì)出現(xiàn)這種情況,主要看下HashMap的實(shí)現(xiàn):
     1public V put(K key, V value) {
     2    if (key == null)
     3        return putForNullKey(value);
     4        int hash = hash(key.hashCode());
     5        int i = indexFor(hash, table.length);
     6        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
     7            Object k;
     8            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
     9                V oldValue = e.value;
    10                e.value = value;
    11                e.recordAccess(this);
    12                return oldValue;
    13            }

    14        }

    15
    16        modCount++;
    17        addEntry(hash, key, value, i);
    18        return null;
    19    }

    我覺(jué)得問(wèn)題主要出現(xiàn)在方法addEntry,繼續(xù)看:
    1void addEntry(int hash, K key, V value, int bucketIndex) {
    2    Entry<K,V> e = table[bucketIndex];
    3        table[bucketIndex] = new Entry<K,V>(hash, key, value, e);
    4        if (size++ >= threshold)
    5            resize(2 * table.length);
    6    }

    從代碼中,可以看到,如果發(fā)現(xiàn)哈希表的大小超過(guò)閥值threshold,就會(huì)調(diào)用resize方法,擴(kuò)大容量為原來(lái)的兩倍,而擴(kuò)大容量的做法是新建一個(gè)Entry[]:
     1void resize(int newCapacity) {
     2        Entry[] oldTable = table;
     3        int oldCapacity = oldTable.length;
     4        if (oldCapacity == MAXIMUM_CAPACITY) {
     5            threshold = Integer.MAX_VALUE;
     6            return;
     7        }

     8
     9        Entry[] newTable = new Entry[newCapacity];
    10        transfer(newTable);
    11        table = newTable;
    12        threshold = (int)(newCapacity * loadFactor);
    13    }

    一般我們聲明HashMap時(shí),使用的都是默認(rèn)的構(gòu)造方法:HashMap<K,V>,看了代碼你會(huì)發(fā)現(xiàn),它還有其它的構(gòu)造方法:HashMap(int initialCapacity, float loadFactor),其中參數(shù)initialCapacity為初始容量,loadFactor為加載因子,而之前我們看到的threshold = (int)(capacity * loadFactor); 如果在默認(rèn)情況下,一個(gè)HashMap的容量為16,加載因子為0.75,那么閥值就是12,所以在往HashMap中put的值到達(dá)12時(shí),它將自動(dòng)擴(kuò)容兩倍,如果兩個(gè)線程同時(shí)遇到HashMap的大小達(dá)到12的倍數(shù)時(shí),就很有可能會(huì)出現(xiàn)在將oldTable轉(zhuǎn)移到newTable的過(guò)程中遇到問(wèn)題,從而導(dǎo)致最終的HashMap的值存儲(chǔ)異常。

    JDK1.0引入了第一個(gè)關(guān)聯(lián)的集合類HashTable,它是線程安全的。HashTable的所有方法都是同步的。
    JDK2.0引入了HashMap,它提供了一個(gè)不同步的基類和一個(gè)同步的包裝器synchronizedMap。synchronizedMap被稱為有條件的線程安全類。
    JDK5.0util.concurrent包中引入對(duì)Map線程安全的實(shí)現(xiàn)ConcurrentHashMap,比起synchronizedMap,它提供了更高的靈活性。同時(shí)進(jìn)行的讀和寫操作都可以并發(fā)地執(zhí)行。

    所以在開始的測(cè)試中,如果我們采用ConcurrentHashMap,它的表現(xiàn)就很穩(wěn)定,所以以后如果使用Map實(shí)現(xiàn)本地緩存,為了提高并發(fā)時(shí)的穩(wěn)定性,還是建議使用ConcurrentHashMap。


    ====================================================================

    另外,還有一個(gè)我們經(jīng)常使用的ArrayList也是非線程安全的,網(wǎng)上看到的有一個(gè)解釋是這樣:
    一個(gè) ArrayList 類,在添加一個(gè)元素的時(shí)候,它可能會(huì)有兩步來(lái)完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。
    在單線程運(yùn)行的情況下,如果 Size = 0,添加一個(gè)元素后,此元素在位置 0,而且 Size=1;
    而如果是在多線程情況下,比如有兩個(gè)線程,線程 A 先將元素存放在位置 0。但是此時(shí) CPU 調(diào)度線程A暫停,線程 B 得到運(yùn)行的機(jī)會(huì)。線程B也將元素放在位置0,(因?yàn)閟ize還未增長(zhǎng)),完了之后,兩個(gè)線程都是size++,結(jié)果size變成2,而只有items[0]有元素。
    util.concurrent包也提供了一個(gè)線程安全的ArrayList替代者CopyOnWriteArrayList。
    
    

    posted @ 2010-09-05 17:12 kangaroo 閱讀(12196) | 評(píng)論 (5)編輯 收藏

    2010年8月17日

    基本:
    1. find -name #filename#:按文件名在本目錄下的所有文件里查找指定名字的文件,可用正則。
    2. more #filename#:更方面的查看文件的命令。進(jìn)入后命令,"d":向下滾動(dòng);"b":向上滾動(dòng)。
    3. vi #filename#:一般的文件編輯命令。進(jìn)入后命令
        "/abc":查找"abc",所有匹配"abc"的地方都會(huì)高亮顯示。

    4. vi替換文件中所有“abc”為“def”命令:

       %s/abc/def/g 其中%表示替換所有行,g表示替換每一行所有匹配的字符串

    技巧:
    1. ll -t:按修改時(shí)間的先后排序文件。

    posted @ 2010-08-17 13:53 kangaroo 閱讀(580) | 評(píng)論 (0)編輯 收藏

    2010年8月6日

    持續(xù)記錄下自己遇到的java編碼技巧:

    1. java.util.List.addAll(Collection<? extends String> c)

    public static void main(String[] args) {

            List
    <String> firstList = new ArrayList<String>();
            firstList.add(
    "a");
            firstList.add(
    "b");
            firstList.add(
    "c");

            List
    <String> secondList = new ArrayList<String>();
            secondList.addAll(firstList);

            
    for (String s : secondList) {
                System.out.println(s);
            }

        }

    posted @ 2010-08-06 19:15 kangaroo 閱讀(339) | 評(píng)論 (0)編輯 收藏

    2010年8月3日

    1. 前言
    2. webservice的由來(lái)
    3. java領(lǐng)域可用于實(shí)現(xiàn)遠(yuǎn)程通訊的開源框架或library
    4. 基于XFire的webservice的本地實(shí)現(xiàn)


    附件下載:
    (1)http://www.tkk7.com/Files/lukangping/webservice.pdf
    (2)......

    posted @ 2010-08-03 19:22 kangaroo 閱讀(250) | 評(píng)論 (0)編輯 收藏

    2010年8月1日

    記得在當(dāng)時(shí)學(xué)習(xí)uml總是不好分清聚合與組合的關(guān)系,找工作時(shí)特地復(fù)習(xí)了這塊的內(nèi)容,結(jié)果正巧被面試官問(wèn)道,這兩天又在搞這塊的內(nèi)容,對(duì)聚合與組合有了更清楚的了解:

    聚合:表示兩個(gè)對(duì)象之間是整體和部分的關(guān)系,部分的生命周期可以超越整體。如電腦和鼠標(biāo),就可以用一下圖形表示:



    組合:表示兩個(gè)對(duì)象之間是整體和部分的強(qiáng)關(guān)系,部分的生命周期不能超越整體,或者說(shuō)不能脫離整體而存在。組合關(guān)系的“部分”,是不能在整體之間進(jìn)行共享的。如人和眼睛的關(guān)系:

    不過(guò),如果你要說(shuō),眼睛可以移植,是不是說(shuō)可以脫離人而存在,它們就不是組合關(guān)系了?其實(shí),UML中對(duì)象的關(guān)系都是在相應(yīng)的軟件環(huán)境或?qū)嶋H場(chǎng)景下定義的,這里區(qū)別聚合和組合的關(guān)系,關(guān)鍵還是在于它們之中整體和部分的關(guān)系強(qiáng)、弱,以及它們之間的依附關(guān)系。如果剛才說(shuō)眼睛可以移植給別人,那你也可以把它認(rèn)為是聚合,這都要結(jié)合實(shí)際場(chǎng)景來(lái)說(shuō)明。

    另外兩個(gè)比較重要的關(guān)系是關(guān)聯(lián)和依賴:
    關(guān)聯(lián):簡(jiǎn)單的可以認(rèn)為,如果一個(gè)類作為了另外一個(gè)類的屬性,那一定是關(guān)聯(lián)關(guān)系。但你要知道,聚合是一種特殊的關(guān)聯(lián),而組合又是一種特殊的聚合。一般的關(guān)聯(lián)我們認(rèn)為是平級(jí)的、無(wú)整體部分關(guān)系的,如朋友關(guān)系。

    依賴:對(duì)象之間的臨時(shí)關(guān)系,臨時(shí)性體現(xiàn)在不超越方法的周期。簡(jiǎn)單的說(shuō),在方法使用到的,如參數(shù)類,就一定是依賴關(guān)系。

    最后想說(shuō)一句,實(shí)際工作中,我并沒(méi)有發(fā)現(xiàn)區(qū)分這四種關(guān)系有多么大的用處,也許自己還沒(méi)有碰到,只是覺(jué)得可能每個(gè)學(xué)習(xí)它的同學(xué)總想把它搞清楚,但實(shí)際工作中作用并不明顯。

    posted @ 2010-08-01 14:17 kangaroo 閱讀(27099) | 評(píng)論 (5)編輯 收藏

    打開visio想創(chuàng)建一個(gè)類圖,卻發(fā)現(xiàn)沒(méi)有找到UML Model Diagram,從網(wǎng)上看到可以在UML Static Structure里找到“Class”,但是發(fā)現(xiàn)使用起來(lái)很不方便,甚至不好增加類名,就在網(wǎng)上搜索一下,中文的沒(méi)有提到,就搜索了一下“uml model diagram  template download”,在
    http://softwarestencils.com/uml/index.html#Visio2007
    找到了需要的template,然后解壓到"C:\Documents and Settings\<user name>\My Documents\My Shapes",重新啟動(dòng)Visio,默認(rèn)的快速創(chuàng)建頁(yè)面就有UML Model Diagram。That is it!

    posted @ 2010-08-01 13:41 kangaroo 閱讀(2245) | 評(píng)論 (1)編輯 收藏

    2010年7月29日

    同標(biāo)題,持續(xù)記錄一些eclipse的高級(jí)快捷鍵,提高你的“專業(yè)性”,成為快捷鍵達(dá)人:

    慢慢發(fā)現(xiàn)很多軟件的快捷鍵都是相似的,用得多了,你就不用費(fèi)腦子記了,這個(gè)很不錯(cuò)。

    1. ctrl+滾輪:加快瀏覽速度;
    2. ctrl+w:關(guān)閉當(dāng)前的Editor;
    3. ctrl+e:顯示隱藏的Editor;
    4. ctrl+f6:切換editor;
    5. ctrl+f7:切換view;
    6. ctrl+f8:切換perspectives;
    7. ctrl+shift+x:小寫變大寫;ctrl+shift+y:大寫變小寫
    8. ctrl+1:出現(xiàn)紅叉時(shí),鼠標(biāo)放置在該行,使用這個(gè)快捷鍵迅速?gòu)棾鲥e(cuò)誤提示

    9. ctrl+shift+c:注釋xml里配置

    SecureCRT中常用的快捷鍵:

    1. ctrl+tab:標(biāo)簽直接的切換;
    2. alt+1/2/3..:切換至第n個(gè)標(biāo)簽;


    Chrome必會(huì)快捷鍵 bravo chrome! i like so much!
    1. ctrl+t:新建標(biāo)簽;ctrl+n:新開窗口
    2. ctrl+w:關(guān)閉當(dāng)前標(biāo)簽頁(yè)
    3. ctrl+tab:切換到下個(gè)標(biāo)簽;ctrl+shift+tab:切換到上一個(gè)標(biāo)簽
    4. ctrl+1/2/../8:切換至指定標(biāo)簽
    5. f6:聚焦鼠標(biāo)至地址欄,這個(gè)各個(gè)瀏覽器都一樣。

    more:http://news.xinhuanet.com/internet/2008-09/07/content_9822978.htm
    existing: 新建標(biāo)簽打開后,你會(huì)看到8個(gè)最近訪問(wèn)的網(wǎng)站,首先,可以用tab切換,另外,它們的位置可以拖拽、可以刪改,還不讓你興奮嗎?


    posted @ 2010-07-29 14:09 kangaroo 閱讀(2124) | 評(píng)論 (0)編輯 收藏

    2010年7月28日

    Exception in thread “main” org.codehaus.xfire.XFireRuntimeException: Could not  invoke service.. Nested exception is org.codehaus.xfire.fault.XFireFault: There must be a method name element.

    解決辦法還是很簡(jiǎn)單:將wsdlURL后面的”?wsdl”去掉即可:

    Service serviceModel = new ObjectServiceFactory().create(MyService.class);
    MyService service = (MyService) new XFireProxyFactory().create(serviceModel,
                “http://localhost:8080/ninthDemo/services/myService“);

    posted @ 2010-07-28 13:25 kangaroo 閱讀(858) | 評(píng)論 (0)編輯 收藏

    2010-07-19 16:17:42.670::WARN:  failed HandlerCollection@7f8922
    java.lang.UnsupportedClassVersionError: Bad version number in .class file

    使用mvn clean情況一下編譯好的文件,重新mvn jetty:run就好了。

    posted @ 2010-07-28 13:24 kangaroo 閱讀(420) | 評(píng)論 (0)編輯 收藏

    通常我們聽到的代理大致有三類:http/s proxy, socks proxy and VPN (實(shí)際上不是代理)。

    其中http/s proxy, socks proxy屬一類,作為代理服務(wù)器,它們類似一種網(wǎng)絡(luò)訪問(wèn)的中介,每次我們?cè)L問(wèn)一個(gè)web網(wǎng)站時(shí),實(shí)際上時(shí)先去訪問(wèn)代理服務(wù)器,再由代理服務(wù)器訪問(wèn)目標(biāo)網(wǎng)站。而且這樣是匿名,也就是說(shuō)被請(qǐng)求的網(wǎng)站并不知道你的原始的訪問(wèn)地點(diǎn)在哪里。網(wǎng)上流傳的gappproxy翻墻就是一個(gè)典型的例子,在gae上建立一個(gè)代理服務(wù)器fetchserver后,然后在本機(jī)開啟gappproxy的代理程序,每次訪問(wèn)任何網(wǎng)站時(shí),其實(shí)是把請(qǐng)求發(fā)給代理服務(wù)器,然后由代理服務(wù)器去請(qǐng)求目標(biāo)網(wǎng)站,因?yàn)間ae都是在美國(guó)的服務(wù)器,同時(shí)目前訪問(wèn)gae還是ok的,所以整個(gè)過(guò)程都是沒(méi)問(wèn)題的。(我們知道GFW是通過(guò)黑名單來(lái)過(guò)濾訪問(wèn)指定網(wǎng)站的數(shù)據(jù)包,如果把gae服務(wù)器也納入黑名單,那就杯具了。)

    如果只是網(wǎng)上沖浪或者通過(guò)瀏覽器使用的活動(dòng),那樣的話http/s proxy就可以了,像GAE中的gappproxy就是其中的一個(gè)例子。如果你需要做更多的事情,而不僅僅是websurf,那樣就需要使用socks proxy,它能更靈活地為你提供除了網(wǎng)頁(yè)瀏覽其他的一些功能。那VPN又是什么呢?VPN,Virtual private Network,中文名是“虛擬專用網(wǎng)絡(luò)”。一個(gè)簡(jiǎn)單的解釋就是,在公共網(wǎng)絡(luò)中建立的兩點(diǎn)之間的專用的虛擬隧道。也可以理解為虛擬出來(lái)的企業(yè)內(nèi)部專線。安全通信是通過(guò)加密來(lái)保證的,加密算法運(yùn)用運(yùn)用于你的實(shí)時(shí)通信中,保證在公用的網(wǎng)絡(luò)中兩點(diǎn)之間的數(shù)據(jù)通信不被其他人截取或訪問(wèn),也就是說(shuō),在兩點(diǎn)之間建立了一個(gè)專用的“隧道”。

    相比較來(lái)看,proxy server有很多的免費(fèi)的解決方案,它也能提供匿名的web browsing。但是,安全性就差很多,你和代理服務(wù)器之間的通訊是完全透明的。(SSL proxy可以進(jìn)行適當(dāng)?shù)谋Wo(hù)),與VPN相比,代理的速率也比較低。VPN比http/s proxy和socks proxy的安全性就高很多了。VPN需要更多的硬件和軟件來(lái)支持,所以它是需要付費(fèi)的。當(dāng)然它的速率也是最高。除此之外,VPN加密本臺(tái)機(jī)器上的所有網(wǎng)絡(luò)通信,包括你的browsing,email,voip,chat等所有網(wǎng)絡(luò)傳輸。而不像http/s proxy只對(duì)你的瀏覽器訪問(wèn)web網(wǎng)站做代理。

    以上文字參考:

    《Proxy vs VPN… Who wins?》

    《what is a VPN service?》

    posted @ 2010-07-28 13:23 kangaroo 閱讀(2648) | 評(píng)論 (0)編輯 收藏

    2010年7月27日

    blogjava的博客半年前玩的,后來(lái)忙了就忘了,發(fā)現(xiàn)有些內(nèi)容之前寫下的,現(xiàn)在都不認(rèn)識(shí),學(xué)到的知識(shí)沒(méi)有延續(xù),所以今天特意整理一下文章分類,慢慢使得自己在技術(shù)方面的積累不斷的形成體系。

    posted @ 2010-07-27 22:53 kangaroo 閱讀(225) | 評(píng)論 (0)編輯 收藏

    2009年11月1日

    Pure Pleasure - Reborn © 2008 - 轉(zhuǎn)載本文時(shí)請(qǐng)保留此鏈接。

    1. 培養(yǎng)耐心

    自信確實(shí)需要培養(yǎng),所謂的“培養(yǎng)”,即是說(shuō)并非朝夕可達(dá)。所以,培養(yǎng)自信的最重要前提就是要具備耐心,如若缺乏耐心就要培養(yǎng)耐心。沒(méi)有耐心的話就什么都做不成,更別提什么“自信了”。有所成就,就會(huì)伴隨著自信的增長(zhǎng),而一事無(wú)成的人穿得再整齊也只不過(guò)草包一個(gè)。

    2. 習(xí)得并精通一種技能

    具備學(xué)習(xí)能力的人通常都很自信,反過(guò)來(lái)也一樣,真正自信的人通常是因?yàn)橄嘈抛约旱膶W(xué)習(xí)能力。所以面對(duì)挑戰(zhàn)的時(shí)候他們不會(huì)怕,不會(huì)心虛,因?yàn)樗麄冎?#8220;大不了去學(xué)么”。自學(xué)能力的基礎(chǔ)是耐心,而習(xí)得任何一種技能都會(huì)讓人更加懂得耐心的重要,并且同時(shí)因?yàn)榫邆淠托呐c學(xué)習(xí)能力而更加自信。只要花時(shí)間真正精通了一種技能,那么學(xué)會(huì)其他一種技能的時(shí)候就會(huì)變得更輕松——這是良性循環(huán)。

    --遇到枯燥,不好玩的東西,能夠靜下心來(lái),耐心地去學(xué)習(xí)、去體會(huì),這個(gè)應(yīng)該是學(xué)習(xí)能力強(qiáng)和弱的差別之處吧。
    --久而久之,學(xué)習(xí)快的人,會(huì)將這種經(jīng)驗(yàn)不斷推廣,一門通,樣樣通。而在一方面沒(méi)有成就的人,會(huì)慢慢產(chǎn)生了厭煩的情緒,在拒絕學(xué)習(xí)的同時(shí),也就表現(xiàn)出在這個(gè)方面的自卑了。

    3. 相信積累的力量
    再大的石頭也無(wú)法阻擋種子發(fā)芽,只因?yàn)榉N子一旦開始發(fā)芽,那細(xì)胞的分裂盡管速度不快但卻不見天日永不終止。滴水可以穿石的道理誰(shuí)都懂但又好像誰(shuí)都不相信—— 處于起點(diǎn)的人就好像是一粒細(xì)胞或者一滴水,但大多數(shù)人卻誤以為或者希望自己在起點(diǎn)上就強(qiáng)大鋒利猶如一束激光,但這不現(xiàn)實(shí)。要通過(guò)學(xué)習(xí)培養(yǎng)耐心,運(yùn)用耐心去等待長(zhǎng)期積累之后可以獲得的難以想象的好處與力量。


    --如果在某一方面學(xué)習(xí)的時(shí)候,就是不順利,或者就是理解不好的時(shí)候,這個(gè)時(shí)候,就是需要堅(jiān)持的時(shí)候了。
    --記得自己學(xué)游泳,換氣總是不好,曾一度覺(jué)得我這輩子都學(xué)不會(huì)游泳了。但是總覺(jué)得好玩,雖然每次游都被會(huì)游的伙伴笑話,還不敢去深水呀?但也是當(dāng)個(gè)玩笑聽了。后來(lái),終于有一次,自己突然地發(fā)現(xiàn),換氣換得很自然了,鼓足了勇氣去深水區(qū)游了一趟,那一天自己感覺(jué)到很開心,自信得很多。
    --任何事物的學(xué)習(xí)應(yīng)該都有個(gè)“竅”,當(dāng)一次,兩次,三次不理解時(shí)候,不需要急躁,明白看來(lái)這個(gè)東西不是那么簡(jiǎn)單的,需要以后更多的閱讀或?qū)嵺`才來(lái)理解透徹。

    4. 了解自己的局限

    沒(méi)有人無(wú)所不能。就算擁有真正強(qiáng)大學(xué)習(xí)能力的人也無(wú)法做到無(wú)所不能——因?yàn)闀r(shí)間不夠。有些領(lǐng)域確實(shí)必需天分。在自己確實(shí)不擅長(zhǎng)的地方該自卑就要自卑——這沒(méi)有什么不好意思的。該自卑的時(shí)候不自卑,就多了一個(gè)心理負(fù)擔(dān)——并且還是永遠(yuǎn)擺脫不掉的負(fù)擔(dān),最終,肯定會(huì)拖累自信。凡事兒做得好必然容易自信,做得不好就很難自信,但是還沒(méi)上陣呢,就背著一個(gè)又一個(gè)的包袱,能走多遠(yuǎn)?能做多好?

    --哎呀,這個(gè)東西實(shí)在跟我不投緣,這樣的話會(huì)讓自己輕松很多。(當(dāng)然,這樣的話要在你堅(jiān)持努力嘗試多次之后說(shuō)了才有用)

    5. 凡事兒都要提前做足功課

    大聲說(shuō)話也好,穿著正式也罷,最多只能讓一個(gè)人“顯得”自信,而非真正自信。“坐在第一排”可能是因?yàn)榻暎?#8220;快速走路”往往是因?yàn)闀r(shí)間觀念不強(qiáng)——這些都與自信沒(méi)關(guān)系。做任何事情,提前做足了功課,想不自信都難。自信不等于自以為是,自以為是的人最終都會(huì)被現(xiàn)實(shí)砸爛。中國(guó)人說(shuō)“成事在天,謀事在人”,西方人說(shuō)“上帝的歸上帝,凱撒的歸凱撒”,某個(gè)層面上都是一回事兒:不要理會(huì)運(yùn)氣(該來(lái)的時(shí)候它自然會(huì)來(lái)),重要的是專心做好功課。

    --查看線上錯(cuò)誤日志的方法,會(huì)了嗎?還不趕緊去找?

    posted @ 2009-11-01 12:17 kangaroo 閱讀(458) | 評(píng)論 (0)編輯 收藏

    iBatis是一個(gè)中層的框架,它比jdbc的層次高一些(可以說(shuō),iBatis就是以XML的形式描述的jdbc代碼,它擁有許多jdbc所沒(méi)有的架構(gòu)級(jí)的優(yōu)點(diǎn)),但是對(duì)于對(duì)象/關(guān)系映射工具,層次又要低一些。

    1. 釋放數(shù)據(jù)庫(kù)資源
    使用jdbc時(shí),很容易犯的錯(cuò)誤就是獲取資源之后忘記正確地釋放它們。雖然垃圾收集進(jìn)程最終可以釋放掉這些資源,但是這種做法非常耗時(shí),并且無(wú)法得到保證。如果對(duì)象沒(méi)有別真正釋放,那應(yīng)用程序最終將會(huì)因?yàn)楹谋M了資源而崩潰。iBATIS框架能幫助管理這些資源,從而減輕應(yīng)用程序?qū)﹂_發(fā)人員們的負(fù)擔(dān)

    2. SQL注入
    如果某個(gè)應(yīng)用程序使用字符串拼接的方式來(lái)創(chuàng)建SQL語(yǔ)句,但是沒(méi)有正確地對(duì)參數(shù)進(jìn)行轉(zhuǎn)義,那么惡意的用戶就可以通過(guò)傳遞一些特殊的參數(shù)來(lái)改變查詢?cè)镜囊鈭D。
    例如:select * from product where id = 5.
    如果5是用戶傳遞過(guò)來(lái)的參數(shù),拼接到 id = 之后的。那么用戶就可以輸入"5 or 1 = 1",從而改變了整個(gè)SQL語(yǔ)句的意圖。如果用戶更壞一些,輸入"5;delete from orders",結(jié)果就是你的訂單表被清空了。
    由于ibatis使用了preparedStatement,而PreparedStatement是不會(huì)受到此類攻擊影響的,所以使用ibatis可以使得你對(duì)應(yīng)用程序的保護(hù)變得更加容易。

    3. 降低復(fù)雜度

    posted @ 2009-11-01 11:28 kangaroo 閱讀(535) | 評(píng)論 (1)編輯 收藏

    2009年8月26日

    1. 發(fā)現(xiàn)你上司的性格和脾氣,向他的性格和行為方式靠攏。
    2. 如果上司對(duì)下面的人有什么小小的要求和幫助,作為下屬你一定要非常非常重視,這個(gè)很重要!

    posted @ 2009-08-26 09:21 kangaroo 閱讀(275) | 評(píng)論 (0)編輯 收藏

    2009年8月15日

    這篇文章寫在我研究J2SE、J2EE近三年后。前3年我研究了J2SE的Swing、Applet、Net、RMI、Collections、IO、JNI……研究了J2EE的JDBC、Sevlet、JSP、JNDI…..不久我發(fā)現(xiàn)這些好像太浮淺了:首先,我發(fā)現(xiàn)自己知道的僅僅是java提供的大量的API,根本不能很好地使用它; 其次,我根本就沒(méi)有學(xué)到任何有助于寫程序的知識(shí),此時(shí)我也只不過(guò)能寫個(gè)幾頁(yè)的小程序。出于這個(gè)幼稚的想法我研究了JDK中Collections、Logger、IO…..的源代碼,發(fā)現(xiàn)這個(gè)世界真的很神奇,竟然有如此的高手――利用java語(yǔ)言最最基本的語(yǔ)法,創(chuàng)造了這些優(yōu)秀的Framework。

    從此一發(fā)不可收拾,我繼續(xù)研究了J2EE的部分,又發(fā)現(xiàn)這是一個(gè)我根本不能理解的方向(曾經(jīng)有半年停滯不前),為什么只有接口沒(méi)有實(shí)現(xiàn)啊!后來(lái)由于一直使用Tomcat、Derby等軟件突然發(fā)現(xiàn):哦!原來(lái)J2EE僅僅是一個(gè)標(biāo)準(zhǔn),只是一個(gè)架構(gòu)。真正的實(shí)現(xiàn)是不同提供商提供的。

    接著我研究了MOM4J、OpenJMS、Mocki、HSQLD……發(fā)現(xiàn)這些就是J2EE的實(shí)現(xiàn)啊!原來(lái)軟件竟會(huì)如此復(fù)雜,竟會(huì)如此做….規(guī)范和實(shí)現(xiàn)又是如何成為一體的呢?通過(guò)上面的研究發(fā)現(xiàn):原來(lái)J2EE后面竟然有太多太多理念、太多太多的相似!這些相似就是其背后的理念――設(shè)計(jì)模式!(很幸運(yùn),在我學(xué)java的時(shí)候,我一般學(xué)java的一個(gè)方向就會(huì)讀一些關(guān)于設(shè)計(jì)模式的書!很幸運(yùn),到能領(lǐng)略一點(diǎn)的時(shí)候能真正知道這是為什么!)其實(shí)模式就是一種思維方式、就是一種理念……模式是要運(yùn)用到程序中的,只有從真正的項(xiàng)目中才能領(lǐng)會(huì)模式的含義……
    學(xué)得越多,發(fā)現(xiàn)懂得越少!在學(xué)習(xí)過(guò)程中發(fā)現(xiàn)一些很有用,很值得學(xué)習(xí)的開源項(xiàng)目,今天在此推薦給大家。

    一、JavaServlet和JSP方向

    很多人都是從Servlet和JSP步入J2EE的。它就是J2EE的表現(xiàn)層,用于向客戶呈現(xiàn)服務(wù)器上的內(nèi)容。J2EE很重要的方面。不羅嗦了!大家都知道的!下面就開始推薦吧!

    1. Jakarta Tomcat

    Apache基金會(huì)提供的免費(fèi)的開源的Serlvet容器,它是的Jakarta項(xiàng)目中的一個(gè)核心項(xiàng)目,由Apache、Sun和其它一些公司(都是IT界的大鱷哦)及個(gè)人共同開發(fā)而成,全世界絕大部分Servlet和Jsp的容器都是使用它哦!由于Sun的參與和支持,最新的Servlet和Jsp規(guī)范總能在Tomcat中得到體現(xiàn)。

    不過(guò)它是一個(gè)非常非常全的Serlvet容器,全部源碼可能有4000頁(yè),對(duì)于初學(xué)者或者一般的老手可能還是比較大了!在你有能力時(shí)推薦研究!下載地址:http://jakarta.apache.org/tomcat/index.html

    下面推薦兩個(gè)小一點(diǎn)的吧!

    2. Jetty

    Jetty是一個(gè)開放源碼的HTTP服務(wù)器和Java serverlet容器。源代碼只有1000頁(yè)左右,很值得研究。有興趣可以去http://jetty.mortbay.com/下載看看。我曾經(jīng)翻了一下,只是目前沒(méi)有時(shí)間。(都化在博客上了,等博客基本定型,且內(nèi)容完整了,再干我熱衷的事件吧!)

    3. Jigsaw

    Jigsaw是W3C開發(fā)的HTTP,基于Java 的服務(wù)器,提供了未來(lái) Web 技術(shù)發(fā)展的藍(lán)圖。W3C知道吧!(太有名氣了,很多標(biāo)準(zhǔn)都是它制訂的!有空經(jīng)常去看看吧!)下載網(wǎng)址:http://www.w3.org/Jigsaw代碼僅僅1000頁(yè)左右。

    4. Jo!

    Jo!是一個(gè)純Java的實(shí)現(xiàn)了Servlet API 2.2, JSP 1.1, 和HTTP/1.1的Web服務(wù)器。它的特性包括支持servlet tag,支持SSI,高級(jí)線程管理,虛擬主機(jī),數(shù)據(jù)緩存,自動(dòng)壓縮text或HTML文件進(jìn)行傳輸,國(guó)際化支持,自動(dòng)重新加載Servlet、Jsp,自動(dòng)重新加載web工程文件(WARs),支持WAR熱部署和一個(gè)Swing控制臺(tái)。jo!可以被用做jboss和jakarta avalon-phoenix的web容器。下載地址http://www.tagtraum.com/ 。我極力推薦大家在研究Tomcat之前研究該軟件,主要是其比Tomcat小多了,且開發(fā)者提供比較全的手冊(cè)。該方向研究這兩個(gè)也就可以了!

    二、JDBC方向

    很多人都喜歡JDBC,數(shù)據(jù)庫(kù)嗎!很深?yuàn)W的東西,一聽就可以糊弄人。其實(shí)等你真正研究了數(shù)據(jù)庫(kù)的實(shí)現(xiàn)后發(fā)現(xiàn),接口其實(shí)真的太簡(jiǎn)單,太完美了!要想設(shè)計(jì)如此優(yōu)秀的框架還是需要學(xué)習(xí)的。下面就推薦幾個(gè)數(shù)據(jù)庫(kù)的實(shí)現(xiàn)吧!

    1. Hypersonic SQL

    Hypersonic SQL開源數(shù)據(jù)庫(kù)方向比較流行的純Java開發(fā)的關(guān)系型數(shù)據(jù)庫(kù)。好像不是JDBC兼容的,JDBC的很多高級(jí)的特性都沒(méi)有支持,不過(guò)幸好支持ANSI-92 標(biāo)準(zhǔn) SQL語(yǔ)法。我推薦它主要是它的代碼比較少1600頁(yè)左右,如此小的數(shù)據(jù)庫(kù)值得研究,而且他占的空間很小,大約只有160K,擁有快速的數(shù)據(jù)庫(kù)引擎。推薦你的第一個(gè)開源數(shù)據(jù)庫(kù)。下載地址:http://hsqldb.sourceforge.net/。

    2. Mckoi DataBase

    McKoiDB 和Hypersonic SQL差不多,它是GPL 的license的純Java開發(fā)的數(shù)據(jù)庫(kù)。他的 JDBC Driver 是使用 JDBC version 3 的 Specifaction。 他也是遵循 SQL-92 的標(biāo)準(zhǔn),也盡量支持新的 SQL 特色, 并且支持 Transaction 的功能。兩個(gè)可以選一個(gè)吧!下載地址:http://mckoi.com/database/。

    3. Apache Derby

    學(xué)Java的數(shù)據(jù)庫(kù)我建議使用Apache Derby ,研究數(shù)據(jù)庫(kù)想成為一個(gè)數(shù)據(jù)庫(kù)的高手我建議你先研究Apache Derby。Apache Derby是一個(gè)高質(zhì)量的、純 Java開發(fā)的嵌入式關(guān)系數(shù)據(jù)庫(kù)引擎,IBM® 將其捐獻(xiàn)給Apache開放源碼社區(qū),同時(shí)IBM的產(chǎn)品CloudSpace是它對(duì)應(yīng)的產(chǎn)品。Derby是基于文件系統(tǒng),具有高度的可移植性,并且是輕量級(jí)的,這使得它非常便于發(fā)布。主要是沒(méi)有商業(yè)用戶的很好的界面,沒(méi)有其太多的功能。不過(guò)對(duì)于我們使用數(shù)據(jù)庫(kù)、研究數(shù)據(jù)庫(kù)還是極其有用的。對(duì)于中小型的企業(yè)說(shuō)老實(shí)話你也不要用什么Oracle、SqlServer了,用Derby就可以了,何況是開源的呢!只要能發(fā)揮其長(zhǎng)處也不容易啊!下載地址:http://incubator.apache.org/derby。

    不過(guò)在沒(méi)有足夠的能力前,不要試圖讀懂它!注釋和源代碼15000頁(yè)左右,我一年的閱讀量!能讀下來(lái)并且能真正領(lǐng)會(huì)它,絕對(duì)高手!你能讀完Derby的源代碼只有兩種可能:1.你成為頂尖的高手――至少是數(shù)據(jù)庫(kù)這部分; 2.你瘋了。選擇吧!!!!作為我自己我先選擇Hypersonic SQL這樣的數(shù)據(jù)庫(kù)先研究,能過(guò)這一關(guān),再繼續(xù)研究Derby!不就是一年的閱讀量嗎!我可以化3年去研究如何做一個(gè)數(shù)據(jù)庫(kù)其實(shí)還是很值得的!有的人搞IT一輩子自己什么都沒(méi)有做,也根本沒(méi)有研究別人的東西!

    作為一個(gè)IT落后于別國(guó)若干年的、從事IT的下游產(chǎn)業(yè)“外包”的國(guó)家的IT從業(yè)人員,我認(rèn)為還是先研究別人的優(yōu)秀的東西比較好!可以先研究別人的,然后消化,學(xué)為己用!一心閉門造車實(shí)在遺憾!

    三、JMS方向

    JMS可能對(duì)大家來(lái)說(shuō)是一個(gè)比較陌生的方向!其實(shí)JMS是一個(gè)比較容易理解,容易上手的方向。主要是Java消息服務(wù),API也是相當(dāng)簡(jiǎn)單的。不過(guò)在企業(yè)應(yīng)用中相當(dāng)廣泛。下面就介紹幾個(gè)吧!

    1. MOM4J

    MOM4J是一個(gè)完全實(shí)現(xiàn)JMS1.1規(guī)范的消息中間件并且向下兼容JMS1.0與1.02。它提供了自己的消息處理存儲(chǔ)使它獨(dú)立于關(guān)系數(shù)據(jù)與語(yǔ)言,它的客戶端可以用任何語(yǔ)言開發(fā)。它可以算是一個(gè)小麻雀,很全實(shí)現(xiàn)也比較簡(jiǎn)單!它包含一個(gè)命名服務(wù)器,一個(gè)消息服務(wù)器,同時(shí)提供自己的持續(xù)層。設(shè)計(jì)也相當(dāng)?shù)那擅睿耆貌僮飨到y(tǒng)中文件系統(tǒng)設(shè)計(jì)的觀念。代碼也很少,250頁(yè)左右,最近我在寫該實(shí)現(xiàn)的源代碼閱讀方面的書,希望明年年中能與大家見面!下載地址:http://mom4j.sourceforge.net/index.html。

    2. OpenJMS

    OpenJMS是一個(gè)開源的Java Message Service API 1.0.2 規(guī)范的實(shí)現(xiàn),它包含有以下特性:
    1. 它既支持點(diǎn)到點(diǎn)(point-to-point)(PTP)模型和發(fā)布/訂閱(Pub/Sub)模型。

    2. 支持同步與異步消息發(fā)送 。

    3. JDBC持久性管理使用數(shù)據(jù)庫(kù)表來(lái)存儲(chǔ)消息 。

    4. 可視化管理界面。

    5. Applet支持。

    6. 能夠與Jakarta Tomcat這樣的Servlet容器結(jié)合。

    7. 支持RMI, TCP, HTTP 與SSL協(xié)議。

    8. 客戶端驗(yàn)證 。

    9. 提供可靠消息傳輸、事務(wù)和消息過(guò)濾。

    很好的JMS方向的開源項(xiàng)目!我目前也在研究它的源代碼!學(xué)習(xí)它可以順便研究JNDI的實(shí)現(xiàn)、以及網(wǎng)絡(luò)通信的細(xì)節(jié)。這是我JMS方向研究的第二個(gè)開源項(xiàng)目。代碼量1600頁(yè)左右吧!下載地址:http://openjms.sourceforge.net/index.html

    3. ActiveMQ

    ActiveMQ是一個(gè)開放源碼基于Apache 2.0 licenced 發(fā)布并實(shí)現(xiàn)了JMS 1.1。它能夠與Geronimo,輕量級(jí)容器和任Java應(yīng)用程序無(wú)縫的給合。主要是Apache的可以任意的使用和發(fā)布哦!個(gè)人比較喜歡Apache的源代碼!下載地址:http://activemq.codehaus.org/

    4. JORAM

    JORAM一個(gè)類似于openJMS分布在ObjectWeb之下的JMS消息中間件。ObjectWeb的產(chǎn)品也是非常值得研究的!下面我還會(huì)給大家另外一個(gè)ObjectWeb的產(chǎn)品。下載地址:http://joram.objectweb.org/

    我個(gè)人推薦:OpenJMS和ActiveMQ!

    四、EJB方向

    EJB一個(gè)比較“高級(jí)”的方向。Sun公司曾經(jīng)以此在分布式計(jì)算領(lǐng)域重拳出擊。不過(guò)自從出現(xiàn)了Spring、Hibernation……后似乎沒(méi)落了!這個(gè)方向單獨(dú)開源的也比較少,主要EJB是和JNDI、JDBC、JMS、JTS、JTA結(jié)合在一起的是以很少有單獨(dú)的。下面推薦兩個(gè)不過(guò)好像也要下載其它類庫(kù)。

    1. EasyBeans

    ObjectWeb的一個(gè)新的項(xiàng)目,一個(gè)輕量級(jí)的EJB3容器,雖然還沒(méi)有正式發(fā)布,但是已經(jīng)可以從它們的subversion倉(cāng)庫(kù)中檢出代碼。代碼量比較小600頁(yè)左右,熟讀它可以對(duì)網(wǎng)絡(luò)編程、架構(gòu)、RMI、容器的狀態(tài)設(shè)計(jì)比較了解了!即學(xué)會(huì)EJB又能學(xué)習(xí)其它設(shè)計(jì)方法何樂(lè)而不為哦!下載地址:http://easybeans.objectweb.org/
    2. OpenEJB

    OpenEJB是一個(gè)預(yù)生成的、自包含的、可移植的EJB容器系統(tǒng),可以被插入到任意的服務(wù)器環(huán)境,包括應(yīng)用程序服務(wù)器,Web服務(wù)器,J2EE平臺(tái), CORBA ORB和數(shù)據(jù)庫(kù)等等。OpenEJB 被用于 Apple的WebObjects。聽起來(lái)很好,我目前沒(méi)有研究過(guò)。不知道我就不推薦了。下載地址:http://www.openejb.org/

    五、J2EE容器

    上面談了這么多,都是J2EE的各個(gè)方向的。其實(shí)J2EE是一個(gè)規(guī)范,J2EE的產(chǎn)品一般要求專業(yè)提供商必須提供它們的實(shí)現(xiàn)。這些實(shí)現(xiàn)本身就是J2EE容器。市場(chǎng)上流行的J2EE容器很多,在開源領(lǐng)域流行的只有很少,很少。其中最著名的是JBoss。

    1. JBoss

    在J2EE應(yīng)用服務(wù)器領(lǐng)域,Jboss是發(fā)展最為迅速的應(yīng)用服務(wù)器。由于Jboss遵循商業(yè)友好的LGPL授權(quán)分發(fā),并且由開源社區(qū)開發(fā),這使得Jboss廣為流行。另外,Jboss應(yīng)用服務(wù)器還具有許多優(yōu)秀的特質(zhì)。

    其一,它將具有革命性的JMX微內(nèi)核服務(wù)作為其總線結(jié)構(gòu);

    其二,它本身就是面向服務(wù)的架構(gòu)(Service-Oriented Architecture,SOA);

    其三,它還具有統(tǒng)一的類裝載器,從而能夠?qū)崿F(xiàn)應(yīng)用的熱部署和熱卸載能力。因此,它是高度模塊化的和松耦合的。Jboss用戶的積極反饋告訴我們,Jboss應(yīng)用服務(wù)器是健壯的、高質(zhì)量的,而且還具有良好的性能。為滿足企業(yè)級(jí)市場(chǎng)日益增長(zhǎng)的需求,Jboss公司從2003年開始就推出了24*7、專業(yè)級(jí)產(chǎn)品支持服務(wù)。同時(shí),為拓展Jboss的企業(yè)級(jí)市場(chǎng),Jboss公司還簽訂了許多渠道合作伙伴。比如,Jboss公司同HP、Novell、Computer Associates、Unisys等都是合作伙伴。

    在2004年6月,Jboss公司宣布,Jboss應(yīng)用服務(wù)器通過(guò)了Sun公司的J2EE認(rèn)證。這是Jboss應(yīng)用服務(wù)器發(fā)展史上至今為止最重要的里程碑。與此同時(shí),Jboss一直在緊跟最新的J2EE規(guī)范,而且在某些技術(shù)領(lǐng)域引領(lǐng)J2EE規(guī)范的開發(fā)。因此,無(wú)論在商業(yè)領(lǐng)域,還是在開源社區(qū),Jboss成為了第一個(gè)通過(guò)J2EE 1.4認(rèn)證的主流應(yīng)用服務(wù)器。現(xiàn)在,Jboss應(yīng)用服務(wù)器已經(jīng)真正發(fā)展成具有企業(yè)強(qiáng)度(即,支持關(guān)鍵級(jí)任務(wù)的應(yīng)用)的應(yīng)用服務(wù)器。

    Jboss 4.0作為J2EE認(rèn)證的重要成果之一,已經(jīng)于2004年9月順利發(fā)布了。同時(shí),Jboss 4.0還提供了Jboss AOP(Aspect-Oriented Programming,面向方面編程)組件。近來(lái),AOP吸引了大量開發(fā)者的關(guān)注。它提供的新的編程模式使得用戶能夠?qū)⒎矫?比如,事務(wù))從底層業(yè)務(wù)邏輯中分離出來(lái),從而能夠縮短軟件開發(fā)周期。用戶能夠單獨(dú)使用Jboss AOP,即能夠在Jboss應(yīng)用服務(wù)器外部使用它。或者,用戶也可以在應(yīng)用服務(wù)器環(huán)境中使用它。Jboss AOP 1.0已經(jīng)在2004年10月發(fā)布了。 很有名吧!可以下載一個(gè)用一下,下載地址:http://www.jboss.org/

    關(guān)于JBoss的使用資料也非常多,甚至比商業(yè)軟件的還多。有機(jī)會(huì)研究吧!

    2. JOnAS

    JOnAS是一個(gè)開放源代碼的J2EE實(shí)現(xiàn),在ObjectWeb協(xié)會(huì)中開發(fā)。整合了Tomcat或Jetty成為它的Web容器,以確保符合Servlet 2.3和JSP 1.2規(guī)范。JOnAS服務(wù)器依賴或?qū)崿F(xiàn)以下的Java API:JCA、JDBC、JTA 、JMS、JMX、JNDI、JAAS、JavaMail 。下載地址:http://jonas.objectweb.org/
    3.Apache Geronimo

    Apache Geronimo 是 Apache 軟件基金會(huì)的開放源碼J2EE服務(wù)器,它集成了眾多先進(jìn)技術(shù)和設(shè)計(jì)理念。 這些技術(shù)和理念大多源自獨(dú)立的項(xiàng)目,配置和部署模型也各不相同。 Geronimo能將這些項(xiàng)目和方法的配置及部署完全整合到一個(gè)統(tǒng)一、易用的模型中。作為符合J2EE標(biāo)準(zhǔn)的服務(wù)器,Geronimo提供了豐富的功能集和無(wú)責(zé)任 Apache 許可,具備“立即部署”式J2EE 1.4容器的各種優(yōu)點(diǎn),其中包括:

    1. 符合J2EE1.4標(biāo)準(zhǔn)的服務(wù)器 。

    2. 預(yù)集成的開放源碼項(xiàng)目 。

    3. 統(tǒng)一的集成模型 。

    4. 可伸縮性、可管理性和配置管理功能。

    我一直比較推薦Apache的產(chǎn)品。主要是可以任意自由地使用。下載地址:http://incubator.apache.org/projects/geronimo/

    六、其它

    講了這么多大家可能很厭煩了!是不是很多很多啊!其實(shí)不然,我們不會(huì)的太多太多了!不會(huì)的太多太多了。不管你是不是J2EE高手,還是J2SE高手,有些東西你要絕對(duì)很精明的。例如:1.Java的Collections Framework就是java的數(shù)據(jù)結(jié)構(gòu)了,不僅要吃透它,還要能按照需要擴(kuò)展它,利用其思想創(chuàng)建一個(gè)自己的數(shù)據(jù)結(jié)構(gòu)。2.網(wǎng)絡(luò)編程肯定要會(huì)吧,現(xiàn)在以及以后很多程序都是不在同一臺(tái)機(jī)器上的,不會(huì)網(wǎng)絡(luò)怎么行哦!3.IO肯定要會(huì)的吧!你的程序難道不用輸入輸出數(shù)據(jù)啊!整個(gè)IO包加NIO也有600多頁(yè)的源代碼哦!4.JDBC你要會(huì)吧!數(shù)據(jù)庫(kù)都不會(huì),在你的企業(yè)應(yīng)用中你的數(shù)據(jù)又保存到哪里啊!文件中――太落后了吧!典型的沒(méi)有學(xué)過(guò)J2EE。盡管數(shù)據(jù)庫(kù)背后也是采用文件保存的。5.Serverlet、JSp你要是做網(wǎng)頁(yè)做網(wǎng)站,肯定要做到。問(wèn)你一個(gè)簡(jiǎn)單的問(wèn)題,網(wǎng)頁(yè)中如何實(shí)現(xiàn)分頁(yè)啊!有具體方法的就在本文章后發(fā)言吧!6. Ant要會(huì)吧!java語(yǔ)言中發(fā)布的工具,類似與c中的make工具。7.JUnit用過(guò)吧!單元測(cè)試軟件。你不要啊!你的軟件就沒(méi)有bug!你牛!(建議大家研究研究其源代碼,很有用的框架,包含大量的設(shè)計(jì)模式,源代碼不到100頁(yè)!看了只能感嘆――高手就是高手)細(xì)心的朋友可以看到在你使用的很多IDE工具中都有JUnit哦!就是它。

    一切的一切才剛剛開始!有興趣,有需要你可以研究數(shù)據(jù)庫(kù)連接池的框架,如:C3P0、Jakarta DBCP、 DBPool….可以研究J2EE框架Spring……. Web框架Struts……持久層框架Hibernate…..甚至開發(fā)工具Eclipse…..Sun領(lǐng)導(dǎo)的點(diǎn)對(duì)點(diǎn)通信的JXTA…..報(bào)表工具JFreeChart、JasperReports…..分布式網(wǎng)絡(luò)編程的CORBA、網(wǎng)絡(luò)通信的JGROUPS、XML解析的xerces…..(在不經(jīng)意間開源已經(jīng)步入你的電腦,不信啊!你JDK的安裝目錄jdk1.6.0 src com sun org apache就是Xerces,一個(gè)XML解析的著名的開源 項(xiàng)目)

    不管怎么樣我還是建議從基本的做起,學(xué)精J2SE,熟讀它的源碼,準(zhǔn)確了解其設(shè)計(jì)理念,然后分頭擊破J2EE――一口吃不成一個(gè)胖子!不要貪多貪廣!腳踏實(shí)地就可以了!

    摘自CSDN:《J2EE值得學(xué)習(xí)的開源項(xiàng)目》

    posted @ 2009-08-15 21:49 kangaroo 閱讀(285) | 評(píng)論 (0)編輯 收藏

    1、語(yǔ)法:必須比較熟悉,在寫代碼的時(shí)候IDE的編輯器對(duì)某一行報(bào)錯(cuò)應(yīng)該能夠根據(jù)報(bào)錯(cuò)信息知道是什么樣的語(yǔ)法錯(cuò)誤并且知道任何修正。

    2、命令:必須熟悉JDK帶的一些常用命令及其常用選項(xiàng),命令至少需要熟悉:appletviewer、 HtmlConverter、jar、 java、javac、javadoc、javap、javaw、native2ascii、serialver,如果這些命令你沒(méi)有全部使用過(guò),那么你對(duì)java實(shí)際上還很不了解。

    3、工具:必須至少熟練使用一種IDE的開發(fā)工具,例如Eclipse、Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者Workshop,包括進(jìn)行工程管理、常用選項(xiàng)的設(shè)置、插件的安裝配置以及進(jìn)行調(diào)試。

    4、API:Java的核心API是非常龐大的,但是有一些內(nèi)容筆者認(rèn)為是必須熟悉的,否則不可能熟練的運(yùn)用Java,包括:
    ◆java.lang包下的80%以上的類的功能的靈活運(yùn)用。

    ◆java.util包下的80%以上的類的靈活運(yùn)用,特別是集合類體系、規(guī)則表達(dá)式、zip、以及時(shí)間、隨機(jī)數(shù)、屬性、資源和Timer.

    ◆java.io包下的60%以上的類的使用,理解IO體系的基于管道模型的設(shè)計(jì)思路以及常用IO類的特性和使用場(chǎng)合。

    ◆java.math包下的100%的內(nèi)容。

    ◆java.net包下的60%以上的內(nèi)容,對(duì)各個(gè)類的功能比較熟悉。

    ◆java.text包下的60%以上的內(nèi)容,特別是各種格式化類。

    ◆熟練運(yùn)用JDBC. 8)、java.security包下40%以上的內(nèi)容,如果對(duì)于安全沒(méi)有接觸的話根本就不可能掌握java.

    ◆AWT的基本內(nèi)容,包括各種組件事件、監(jiān)聽器、布局管理器、常用組件、打印。

    ◆Swing的基本內(nèi)容,和AWT的要求類似。

    ◆XML處理,熟悉SAX、DOM以及JDOM的優(yōu)缺點(diǎn)并且能夠使用其中的一種完成XML的解析及內(nèi)容處理。

    5、測(cè)試:必須熟悉使用junit編寫測(cè)試用例完成代碼的自動(dòng)測(cè)試。

    6、管理:必須熟悉使用ant完成工程管理的常用任務(wù),例如工程編譯、生成javadoc、生成jar、版本控制、自動(dòng)測(cè)試。

    7、排錯(cuò):應(yīng)該可以根據(jù)異常信息比較快速的定位問(wèn)題的原因和大致位置。

    8、思想:必須掌握OOP的主要要求,這樣使用Java開發(fā)的系統(tǒng)才能是真正的Java系統(tǒng)。

    9、規(guī)范:編寫的代碼必須符合流行的編碼規(guī)范,例如類名首字母大寫,成員和方法名首字母小寫,方法名的第一個(gè)單詞一般是動(dòng)詞,包名全部小寫等,這樣程序的可讀性才比較好。

    10、博學(xué):掌握J(rèn)2EE 、Oracle 、WebLogic、Jboss、Spring、Struts、Hibernate 等流行技術(shù),掌握軟件架構(gòu)設(shè)計(jì)思想、搜索引擎優(yōu)化、緩存系統(tǒng)設(shè)計(jì)、網(wǎng)站負(fù)載均衡、系統(tǒng)性能調(diào)優(yōu)等實(shí)用技術(shù)。

    摘錄自CSDN:
    《一個(gè)java程序員的10項(xiàng)技能》

    posted @ 2009-08-15 21:40 kangaroo 閱讀(289) | 評(píng)論 (0)編輯 收藏

    2009年8月9日

    • 關(guān)注點(diǎn)concern:一個(gè)關(guān)注點(diǎn)可以是一個(gè)特定的問(wèn)題、概念、或是應(yīng)用程序的興趣區(qū)間。這是一個(gè)概念上的名詞,就是應(yīng)用程序必須達(dá)到的一個(gè)目標(biāo)。比如前面提到的安全性檢查,事務(wù)管理,性能檢測(cè)都是系統(tǒng)常見的關(guān)注點(diǎn)。
    • 橫切關(guān)注點(diǎn)crosscutting concern:如果一個(gè)關(guān)注點(diǎn)的實(shí)現(xiàn)代碼(哪怕就一句)散落在很多類或方法之中,我們就稱其為橫切關(guān)注點(diǎn)。
    • 方面aspect :一個(gè)方面是對(duì)一個(gè)橫切關(guān)注點(diǎn)的模塊化,它將原本散落在各處的用于實(shí)現(xiàn)這個(gè)關(guān)注點(diǎn)的代碼規(guī)整在一起。如果“關(guān)注點(diǎn)”是個(gè)概念上的名詞,“方面”就是實(shí)在的代碼。
    • 連接點(diǎn)join point:程序執(zhí)行過(guò)程中的一點(diǎn),例如:方法調(diào)用method invocation(對(duì)方法的調(diào)用)、字段訪問(wèn)field access(讀或?qū)懽侄危惓伋鰐hrows(特定的異常被拋出)
    • 增強(qiáng)advice:在特定連接點(diǎn)執(zhí)行的動(dòng)作。很多AOP框架都以攔截器interceptor的形式來(lái)表現(xiàn)增強(qiáng)。攔截器是一種增強(qiáng),還有別的形式的增強(qiáng)。所謂攔截器是這樣一個(gè)對(duì)象,當(dāng)連接點(diǎn)被調(diào)用時(shí),它會(huì)收到一個(gè)回調(diào)消息。增強(qiáng)的例子包括:在方法調(diào)用之前,進(jìn)行安全性的檢查;在執(zhí)行某個(gè)方法的連接點(diǎn)之前開啟事務(wù),在方法執(zhí)行完畢之后提交或回滾事務(wù)。
    • 切入點(diǎn):一組連接點(diǎn)的總稱,用于指定某個(gè)增強(qiáng)應(yīng)該在何時(shí)被調(diào)用。切入點(diǎn)常用正則表達(dá)式或別的通配符來(lái)描述。
    • 前增強(qiáng):在連接點(diǎn)調(diào)用之前,首先調(diào)用增強(qiáng)。
    • 后增強(qiáng):在連接點(diǎn)調(diào)用之后,再調(diào)用增強(qiáng)。
    • 環(huán)繞增強(qiáng):   
    • 攔截器:很多AOP框架(如Spring和JBoss4,但不包括AspectJ)用它來(lái)實(shí)現(xiàn)字段和方法的攔截。隨之而來(lái)就是在連接點(diǎn)處掛一個(gè)攔截器鏈。攔截只是一種AOP的實(shí)現(xiàn)策略,不是AOP的核心概念。
    • 目標(biāo)對(duì)象:位于攔截器鏈末端的對(duì)象實(shí)例。顯然這個(gè)概念只存在使用攔截器的AOP框架中。
    • AOP代理:被增強(qiáng)的對(duì)象引用。也就是,AOP增強(qiáng)將在其上執(zhí)行的這樣一個(gè)對(duì)象引用。和“攔截器”一樣,“AOP代理”只是對(duì)于使用攔截機(jī)制的AOP框架,而且是其立身之本。

    講了這么多概念,舉個(gè)例子,把它們串起來(lái),還是以“AOP學(xué)習(xí)筆記一”里面的“安全性檢查”為例:
    我們把“安全性檢查”作為一個(gè)方面
    那么實(shí)現(xiàn)安全性檢查的攔截器就是一種增強(qiáng)
    方法businessMethod1,businessMethod2,businessMethod3就是連接點(diǎn),
    但是只有businessMethod1和businessMethod2需要增強(qiáng),所以需要一個(gè)切入點(diǎn),使其只匹配前兩個(gè)方法。
    當(dāng)我們的業(yè)務(wù)對(duì)象和攔截器都配置到spring之后,spring會(huì)在運(yùn)行時(shí)織入,并且生成一個(gè)AOP代理
    這個(gè)AOP代理將是一個(gè)JDK動(dòng)態(tài)代理,將在完成安全性檢查之后,調(diào)用目標(biāo)對(duì)象

    posted @ 2009-08-09 00:35 kangaroo 閱讀(308) | 評(píng)論 (0)編輯 收藏

    2009年8月8日

    用于實(shí)現(xiàn)AOP技術(shù)的主要策略,按照功能由弱到強(qiáng)排列:
    -J2SE動(dòng)態(tài)代理
    -動(dòng)態(tài)字節(jié)碼生成
    -java代碼生成
    -使用定制的類加載期
    -語(yǔ)言擴(kuò)展

    1.J2SE動(dòng)態(tài)代理
    動(dòng)態(tài)代理是一種強(qiáng)大的語(yǔ)言結(jié)構(gòu),它使我們可以為一個(gè)或多個(gè)接口“憑空”地創(chuàng)建實(shí)現(xiàn)對(duì)象,而不需要預(yù)先有一個(gè)實(shí)現(xiàn)類。
    動(dòng)態(tài)代理最大的好處在于:這是一種標(biāo)準(zhǔn)的Java語(yǔ)言特性。除了AOP框架之外不需要第三方庫(kù),也不回受到應(yīng)用程序的任何影響。
    動(dòng)態(tài)代理的最大局限性在于:它只能針對(duì)接口進(jìn)行代理,不能針對(duì)類。一般情況下,這種限制不是壞事,因?yàn)锳OP主要針對(duì)業(yè)務(wù)對(duì)象,而業(yè)務(wù)對(duì)象通常是放在業(yè)務(wù)接口之后。
    動(dòng)態(tài)代理在java1.4和更高的版本性能表現(xiàn)地相對(duì)好,不過(guò),一旦使用動(dòng)態(tài)代理的實(shí)習(xí)策略,便不可避免地招致反射調(diào)用的開銷。

    2.動(dòng)態(tài)字節(jié)碼生成
    為了針對(duì)Java類提供代理,我們需要?jiǎng)討B(tài)代理之外的工具,就是動(dòng)態(tài)字節(jié)碼生成。應(yīng)該慶幸,Java的反射和類裝載機(jī)制都非常開發(fā),因此實(shí)現(xiàn)動(dòng)態(tài)字節(jié)碼生成庫(kù)并不復(fù)雜。
    在這方面,最流行的工具就是CGLIB(Code Generation Library)。在spring中,如果需要針對(duì)類(而不是接口)提供代理,就會(huì)用到CGLIB。它可以針對(duì)制定的類動(dòng)態(tài)生成一個(gè)子類,并覆蓋其中的方法,從而實(shí)現(xiàn)方法的攔截。CGLIB風(fēng)格的字節(jié)碼增強(qiáng)并應(yīng)用在Hibernate2.X版本中,并被證明是一種成熟的技術(shù)。Hibernate的成功表明,在應(yīng)用服務(wù)器環(huán)境下CGLIB沒(méi)有給最終用戶帶來(lái)任何困擾。
    不過(guò)CGLIB有個(gè)小問(wèn)題就是,因?yàn)樗峭ㄟ^(guò)生成類的子類來(lái)實(shí)現(xiàn)代理的,所以無(wú)法為final方法提供代理。

    3.java代碼生成
    逐漸退出流行。

    4.使用定制的類加載器

    5.語(yǔ)言擴(kuò)展
    AspectJ就對(duì)java進(jìn)行了擴(kuò)展,將AOP概念作為一等公民來(lái)對(duì)待。

    posted @ 2009-08-08 22:01 kangaroo 閱讀(282) | 評(píng)論 (0)編輯 收藏

    AOP,全稱Aspect Oriented Programming,面向方面的編程。那么就要問(wèn)了,什么是方面,為什么引入AOP?
    一般情況下,OOP能夠很好的避免代碼重復(fù)。具體繼承可以幫助我們?cè)诓煌愋椭g共享相同的行為;多態(tài)讓我們可以用同樣的方式處理不同類型的對(duì)象,將注意力集中在它們的共同之處。但是,有些時(shí)候,OOP也避免不了代碼的重復(fù),比如下面的例子:

    public class MyBusinessObject extends BusinessObject {
     
        
    public void businessMethod1() throws UnanthorizedException {
            doSecurityCheck();
        }


        
    public void businessMethod2() throws UnanthorizedException {
            doSecurityCheck();
        }

           
        
    public void businessMethod3(){
            
    //do not need check security.
        }



        
    protected void doSecurityCheck() throws UnanthorizedException {
            
    //implement the security check.
        }

    }


    上面是安全性檢查的例子,我們希望檢查用戶是否有權(quán)限執(zhí)行某個(gè)方法,如果沒(méi)有就拋出異常。我們把安全檢查的工作放在一個(gè)方法中實(shí)現(xiàn),但是這個(gè)仍無(wú)法避免一行重復(fù)代碼的編寫。另外,當(dāng)開發(fā)者添加一個(gè)新的業(yè)務(wù)方法時(shí),它完全有可能忘記調(diào)用安全檢查的方法,從而破壞了應(yīng)用程序的安全性。為了在方法執(zhí)行的過(guò)程中識(shí)別出“應(yīng)該調(diào)用安全性檢查”的那一點(diǎn),我們需要用一種高全新的方式來(lái)看待程序結(jié)構(gòu),而OO的層次模型無(wú)法提供這種新的視角。對(duì)于這個(gè)問(wèn)題,繼承愛莫能助,“安全性檢查”在這里是一個(gè)具有橫切性的問(wèn)題,需要進(jìn)行安全性檢查的方法都是彼此獨(dú)立的,無(wú)法從某個(gè)通用的方法繼承下去。
    AOP的目標(biāo)就是將橫切型crosscutting的問(wèn)題以一種更加通用的方式模塊化,從而提升程序的模塊化程度。在AOP中,我們可以單獨(dú)編寫“安全性檢查”的代碼,并將其包裝為一個(gè)方面aspect。(方面的概念出現(xiàn)嘍!)然后,我們可以告訴AOP實(shí)現(xiàn)產(chǎn)品如何在運(yùn)行時(shí)將方面織入到程序流程之中,具體的實(shí)現(xiàn)策略,請(qǐng)看下篇AOP的實(shí)現(xiàn)策略。


     

    posted @ 2009-08-08 21:55 kangaroo 閱讀(237) | 評(píng)論 (0)編輯 收藏

    主站蜘蛛池模板: 中文字幕视频在线免费观看| 亚洲精品国产美女久久久| 亚洲欧美国产精品专区久久| 1024免费福利永久观看网站| 亚洲色偷偷av男人的天堂| 在线免费观看你懂的| 亚洲黄色网址大全| 最近免费中文字幕mv电影| 4444亚洲国产成人精品| 18禁美女黄网站色大片免费观看 | 国产成人亚洲综合| 一级毛片高清免费播放| 国产av无码专区亚洲国产精品| jizz免费在线影视观看网站| 国产成人亚洲综合无码| 免费无码又爽又刺激高潮软件| 久久精品国产亚洲网站| 免费在线看黄的网站| 日韩亚洲Av人人夜夜澡人人爽| 在线a免费观看最新网站| 亚洲图片激情小说| 在线看片无码永久免费视频| 亚洲成年网站在线观看| 永久免费无码网站在线观看| 爱情岛亚洲论坛在线观看| 亚洲精品97久久中文字幕无码| 在线免费观看伊人三级电影| 久久亚洲精品成人777大小说| **一级一级毛片免费观看| 亚洲av成人综合网| 欧洲美熟女乱又伦免费视频| 精品亚洲成a人在线观看| 亚洲美女在线国产| 久久国产精品免费网站| 亚洲国产电影在线观看| 毛片免费全部播放一级| 国产成人亚洲精品91专区高清 | 亚洲一区AV无码少妇电影☆| 嫩草在线视频www免费观看| 亚洲国产美女视频| 免费黄色app网站|