先簡單回顧下sql語言的幾種語言: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ù)操作語言。
dcl即data control language,數(shù)據(jù)控制語言,平時基本用不到,如commit,savepoint,rollback,set transaction。
所以區(qū)別主要在:
1。xml背景
格式良好的(web-fromed)xml可以不需要文檔類型定義(DTD),只要滿足基本的xml格式規(guī)范就可以認(rèn)為是格式良好的xml文檔。但是格式標(biāo)準(zhǔn),只能說明元素、標(biāo)簽、格式是合法的,并不能說明元素是有意義的,或者說規(guī)范的。
有效的xml文檔,首先要求是格式良好的文檔,同時遵守相應(yīng)的DTD文件約束。
2。xml解析
xml文檔解析的大致使用過程如下圖:
由xml解析器解析和操作指定的xml文檔,然后提供接口供應(yīng)用程序使用。如果解析器不同,那么提供的接口就有可能不同。慶幸的是,目前所有的xml解析器對兩套標(biāo)準(zhǔn)的api提供了支持,這兩套標(biāo)準(zhǔn)api就是dom和sax。
dom:即document object model,文檔對象模型,它是w3c組織推薦的處理xml的標(biāo)準(zhǔn)接口。dom是基于xml文檔結(jié)構(gòu)樹的解析。
sax:即simple api for xml,它是非官方的、xml社區(qū)事實上的標(biāo)準(zhǔn)。sax是基于事件流的解析。
dom和sax只是定義了一些接口以及某些接口的缺省實現(xiàn),應(yīng)用程序要想利用dom或sax訪問xml文檔,還需要真正實現(xiàn)dom或sax接口的xml解析器。apache的xerces是一個使用非常廣泛的解析器,它實現(xiàn)了dom和sax的調(diào)用接口,并提供了多種語言的實現(xiàn)版本。
3。java語言對xml文檔的解析
首先介紹jaxp:
基于dom或sax提供的api接口,使用相應(yīng)的解析器實現(xiàn)類我們已經(jīng)可以對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解析器的變化對代碼的影響,java提供了一套標(biāo)準(zhǔn)的處理xml文件的接口(實際上是一些抽象的工廠類),使得java開發(fā)人員以一種標(biāo)準(zhǔn)的方式對xml進(jìn)行編程,即jaxp(java api for xml processing)。jaxp沒有提供解析xml的新方法,只是在解析器之上封裝一個抽象層。在jdk1.6的文檔中,我們可以看到j(luò)avax.xml,org.w3c.dom,org.xml.sax包及其子包都屬于jaxp的部分。jaxp由接口、抽象類和一些輔助類組成,符合jaxp規(guī)范的解析器實現(xiàn)其中的接口和抽象類,開發(fā)時只需要使用jaxp的api編程,底層的解析器對開發(fā)者時透明的,可以隨意的切換。
那么jaxp出現(xiàn)后,java應(yīng)用程序處理xml文檔的過程就如下圖:
那實際采用哪種解析器的jaxp實現(xiàn),可以通過系統(tǒng)屬性、properties文件等方式來配置。
下面具體介紹幾種java解析xml的方法:
3.1 DOM方式(jaxp)
在javax.xml.parsers包中,定義了dom的抽象工廠類DocumentBuilderFactory,在這個類中有一個靜態(tài)的方法newInstance(),通過它產(chǎn)生一個DocumentBuilderFactory的實例。前面提到過jaxp編程,解析器提供商必須繼承該抽象類產(chǎn)生一個具體的解析器工廠,然后由這個工廠類實例出一個解析器對象,再通過該解析器對象處理xml文檔。那么這個newInstance方法就是用來產(chǎn)生一個具體的解析器工廠類實例,查找生成解析器工廠類實例的方式可參考jdk文檔。
在獲取到解析器工廠類實例類之后,就可以調(diào)用newDocumentBuilder()方法創(chuàng)建一個dom解析器實例;dom解析器實例就可以調(diào)用parser()方法獲取整個xml問答的Document對象。
3 .2 SAX方式(jaxp)
sax是基于事件驅(qū)動的api,sax解析xml文檔時會向事件處理器發(fā)送不同的事件。sax解析器接口和事件處理器接口都在org.xml.sax包中定義。XMLReader即為sax定義的解析器接口,由解析器提供商實現(xiàn)該借口,應(yīng)用程序需要做的是編寫一個事件處理器。可以通過XMLReader的setContentHandler()方法來設(shè)置一個事件處理器的實例。
與dom類似,jaxp也為sax解析器提供了抽象工廠類SAXParserFactory類,sax解析器工廠類的實例與dom解析器工廠類的實例類似,都是通過newInstance()方法來創(chuàng)建,不同的是SAXParserFactory的newInstance()方法查找的工廠類屬性是:javax.xml.parsers.SAXParserFactory。同樣,獲取sax解析器實例的方法,可以通過調(diào)用newSAXParser()。
使用SAXParser和XMLReader都可以用來對xml文檔進(jìn)行解析,前者只是對后者又一次的包裝。
3.3 JDOM
dom被設(shè)計用于完成幾乎所有的xml操作任務(wù),同時又是與語言無關(guān)的,這就導(dǎo)致dom的api龐大而且復(fù)雜。為了使java程序員更方便地處理xml文檔,兩位國外的java技術(shù)專家創(chuàng)建了jdom。用developerworks上的一句話,“延續(xù)開源社群有需要就創(chuàng)建工具的歷史傳統(tǒng),Java 技術(shù)專家 Jason Hunter 和 Brett McLaughlin 締造了 JDOM”。所以可以認(rèn)為,jdom是一種專門用于java語言解析xml文檔的開放源代碼框架。
jdom也使用對象樹來表示xml文檔,底層使用sax解析器分析xml文檔,形成jdom樹。
3.4 DOM4J
同jdom一樣,dom4j也是應(yīng)用于java平臺,提供簡單、靈活的處理xml文檔的開發(fā)源代碼庫。很有意思的是,dom4j是由早期開發(fā)jdom的人分離出來而后獨立開發(fā)的,(利益或意見不和?呵呵)與jdom相比,dom4j提供了更好的靈活性。從網(wǎng)上的評論可以看出,dom4j從性能、功能、易用性上都優(yōu)于jdom,可以作為解析xml文件的首選。(看來后來分離出的那撥人選擇還是正確的!)流行的hibernate,jaxm都采用了dom4j處理xml文件。
dom4j也使用sax解析器來分析xml文檔,形成dom4j樹;它也提供了用于大文檔的基于事件的處理模型。
所以可以看出,jdom和dom4j只是開源社區(qū)產(chǎn)生出來的方便地解析xml的框架或工具,并沒有創(chuàng)造新的xml解析方式。如果拿
拿以上四種解析xml的方法比較,用孫鑫老師的話,如果你需要頻繁更換解析器就是jaxp方式,否則推薦使用dom4j。
lsof -i :port,使用lsof -i :port就能看見所指定端口運行的程序,同時還有當(dāng)前連接。
OAuth通過應(yīng)用和微博授權(quán)頁面之間的跳轉(zhuǎn)來進(jìn)行授權(quán). 其步驟為
access token不用每次都去取,可以把它保存下來,供下次使用.這樣性能更高.
快捷鍵(Windows) |
快捷鍵(Mac) |
描述 |
Ctrl+N | Command+N | 建立新工作簿 |
Ctrl+O | Command+O | 開啟工作簿 |
Ctrl+S | Command+S | 儲存目前工作簿 |
Ctrl+Shift+S | Command+Shift+S | 儲存全部工作簿 |
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 | 選擇同層級主題 |
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 | 簡報演示 |
F6 | F6 | 下鑽 |
Shift+F6 | Shift+F6 | 上鑽 |
F7 | F7 | 智慧擷取圖面 |
+ | + | 展開目前分支 |
- | - | 收縮目前分支 |
* | * | 展開所有分支 |
/ | / | 收縮所有分支 |
Alt+Up | Alt+Up | 向前移動 |
Alt+Down | Alt+Down | 向後移動 |
Ctrl+T | Command+T | 建立新心智圖 |
Ctrl+1,2,3,4,5,6 | Command+1,2,3,4,5,6 | 快速添加優(yōu)先等級圖標(biāo) |
Esc | Esc | 關(guān)閉跳出的備註對話框 / 取消擷圖 |
Ctrl+滑鼠滾輪 | Command+滑鼠滾輪 | 放大縮小目前的圖面 |
3.Unicode big endian編碼與上一個選項相對應(yīng)。我在下一節(jié)會解釋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
/*給創(chuàng)建bitmap index分配的內(nèi)存空間參數(shù),以加速建索引*/
show parameter create_bit;
/*改變索引的存儲參數(shù)*/
alter index index_name pctfree 30 storage(initial 200k next 200k);
/*給索引手工分配一個分區(qū)*/
alter index index_name allocate extent (size 200k datafile '$ORACLE/oradata/..');
/*釋放索引中沒用的空間*/
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;
/*重建索引時,不鎖表*/
alter index index_name rebuild online;
/*給索引整理碎片*/
alter index index_name COALESCE;
/*分析索引,事實上是更新統(tǒng)計的過程*/
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);
/*不效驗老數(shù)據(jù),只約束新的數(shù)據(jù)[enable/disable:約束/不約束新數(shù)據(jù);novalidate/validate:不對/對老數(shù)據(jù)進(jìn)行驗證]*/
alter table table_name add constraint constraint_name check(column_name like 'B%') enable/disable novalidate/validate;
/*修改約束條件,延時驗證,commit時驗證*/
alter table table_name modify constraint constraint_name initially deferred;
/*修改約束條件,立即驗證*/
alter table table_name modify constraint constraint_name initially immediate;
alter session set constraints=deferred/immediate;
/*drop一個有外鍵的主鍵表,帶cascade constraints參數(shù)級聯(lián)刪除*/
drop table table_name cascade constraints;
/*當(dāng)truncate外鍵表時,先將外鍵設(shè)為無效,再truncate;*/
truncate table table_name;
/*設(shè)約束條件無效*/
alter table table_name disable constraint constraint_name;
alter table table_name enable novalidate constraint constraint_name;
簡潔實用,謝謝http://wfly2004.blog.163.com/blog/static/11764272010629114155174/
http://hi.baidu.com/zhangcheng1/blog/item/54deb0cc9ab69d1701e9281e.html
4. vi替換文件中所有“abc”為“def”命令:
%s/abc/def/g 其中%表示替換所有行,g表示替換每一行所有匹配的字符串
技巧:慢慢發(fā)現(xiàn)很多軟件的快捷鍵都是相似的,用得多了,你就不用費腦子記了,這個很不錯。
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)紅叉時,鼠標(biāo)放置在該行,使用這個快捷鍵迅速彈出錯誤提示
9. ctrl+shift+c:注釋xml里配置
SecureCRT中常用的快捷鍵:
1. ctrl+tab:標(biāo)簽直接的切換;
2. alt+1/2/3..:切換至第n個標(biāo)簽;
Chrome必會快捷鍵 bravo chrome! i like so much!
1. ctrl+t:新建標(biāo)簽;ctrl+n:新開窗口
2. ctrl+w:關(guān)閉當(dāng)前標(biāo)簽頁
3. ctrl+tab:切換到下個標(biāo)簽;ctrl+shift+tab:切換到上一個標(biāo)簽
4. ctrl+1/2/../8:切換至指定標(biāo)簽
5. f6:聚焦鼠標(biāo)至地址欄,這個各個瀏覽器都一樣。
more:http://news.xinhuanet.com/internet/2008-09/07/content_9822978.htm
existing: 新建標(biāo)簽打開后,你會看到8個最近訪問的網(wǎng)站,首先,可以用tab切換,另外,它們的位置可以拖拽、可以刪改,還不讓你興奮嗎?
解決辦法還是很簡單:將wsdlURL后面的”?wsdl”去掉即可:
Service serviceModel = new ObjectServiceFactory().create(MyService.class);
MyService service = (MyService) new XFireProxyFactory().create(serviceModel,
“http://localhost:8080/ninthDemo/services/myService“);
使用mvn clean情況一下編譯好的文件,重新mvn jetty:run就好了。
其中http/s proxy, socks proxy屬一類,作為代理服務(wù)器,它們類似一種網(wǎng)絡(luò)訪問的中介,每次我們訪問一個web網(wǎng)站時,實際上時先去訪問代理服務(wù)器,再由代理服務(wù)器訪問目標(biāo)網(wǎng)站。而且這樣是匿名,也就是說被請求的網(wǎng)站并不知道你的原始的訪問地點在哪里。網(wǎng)上流傳的gappproxy翻墻就是一個典型的例子,在gae上建立一個代理服務(wù)器fetchserver后,然后在本機開啟gappproxy的代理程序,每次訪問任何網(wǎng)站時,其實是把請求發(fā)給代理服務(wù)器,然后由代理服務(wù)器去請求目標(biāo)網(wǎng)站,因為gae都是在美國的服務(wù)器,同時目前訪問gae還是ok的,所以整個過程都是沒問題的。(我們知道GFW是通過黑名單來過濾訪問指定網(wǎng)站的數(shù)據(jù)包,如果把gae服務(wù)器也納入黑名單,那就杯具了。)
如果只是網(wǎng)上沖浪或者通過瀏覽器使用的活動,那樣的話http/s proxy就可以了,像GAE中的gappproxy就是其中的一個例子。如果你需要做更多的事情,而不僅僅是websurf,那樣就需要使用socks proxy,它能更靈活地為你提供除了網(wǎng)頁瀏覽其他的一些功能。那VPN又是什么呢?VPN,Virtual private Network,中文名是“虛擬專用網(wǎng)絡(luò)”。一個簡單的解釋就是,在公共網(wǎng)絡(luò)中建立的兩點之間的專用的虛擬隧道。也可以理解為虛擬出來的企業(yè)內(nèi)部專線。安全通信是通過加密來保證的,加密算法運用運用于你的實時通信中,保證在公用的網(wǎng)絡(luò)中兩點之間的數(shù)據(jù)通信不被其他人截取或訪問,也就是說,在兩點之間建立了一個專用的“隧道”。
相比較來看,proxy server有很多的免費的解決方案,它也能提供匿名的web browsing。但是,安全性就差很多,你和代理服務(wù)器之間的通訊是完全透明的。(SSL proxy可以進(jìn)行適當(dāng)?shù)谋Wo(hù)),與VPN相比,代理的速率也比較低。VPN比http/s proxy和socks proxy的安全性就高很多了。VPN需要更多的硬件和軟件來支持,所以它是需要付費的。當(dāng)然它的速率也是最高。除此之外,VPN加密本臺機器上的所有網(wǎng)絡(luò)通信,包括你的browsing,email,voip,chat等所有網(wǎng)絡(luò)傳輸。而不像http/s proxy只對你的瀏覽器訪問web網(wǎng)站做代理。
以上文字參考:
2. 習(xí)得并精通一種技能
具備學(xué)習(xí)能力的人通常都很自信,反過來也一樣,真正自信的人通常是因為相信自己的學(xué)習(xí)能力。所以面對挑戰(zhàn)的時候他們不會怕,不會心虛,因為他們知道“大不了去學(xué)么”。自學(xué)能力的基礎(chǔ)是耐心,而習(xí)得任何一種技能都會讓人更加懂得耐心的重要,并且同時因為具備耐心與學(xué)習(xí)能力而更加自信。只要花時間真正精通了一種技能,那么學(xué)會其他一種技能的時候就會變得更輕松——這是良性循環(huán)。
--遇到枯燥,不好玩的東西,能夠靜下心來,耐心地去學(xué)習(xí)、去體會,這個應(yīng)該是學(xué)習(xí)能力強和弱的差別之處吧。
--久而久之,學(xué)習(xí)快的人,會將這種經(jīng)驗不斷推廣,一門通,樣樣通。而在一方面沒有成就的人,會慢慢產(chǎn)生了厭煩的情緒,在拒絕學(xué)習(xí)的同時,也就表現(xiàn)出在這個方面的自卑了。
3. 相信積累的力量
再大的石頭也無法阻擋種子發(fā)芽,只因為種子一旦開始發(fā)芽,那細(xì)胞的分裂盡管速度不快但卻不見天日永不終止。滴水可以穿石的道理誰都懂但又好像誰都不相信—— 處于起點的人就好像是一粒細(xì)胞或者一滴水,但大多數(shù)人卻誤以為或者希望自己在起點上就強大鋒利猶如一束激光,但這不現(xiàn)實。要通過學(xué)習(xí)培養(yǎng)耐心,運用耐心去等待長期積累之后可以獲得的難以想象的好處與力量。
--如果在某一方面學(xué)習(xí)的時候,就是不順利,或者就是理解不好的時候,這個時候,就是需要堅持的時候了。
--記得自己學(xué)游泳,換氣總是不好,曾一度覺得我這輩子都學(xué)不會游泳了。但是總覺得好玩,雖然每次游都被會游的伙伴笑話,還不敢去深水呀?但也是當(dāng)個玩笑聽了。后來,終于有一次,自己突然地發(fā)現(xiàn),換氣換得很自然了,鼓足了勇氣去深水區(qū)游了一趟,那一天自己感覺到很開心,自信得很多。
--任何事物的學(xué)習(xí)應(yīng)該都有個“竅”,當(dāng)一次,兩次,三次不理解時候,不需要急躁,明白看來這個東西不是那么簡單的,需要以后更多的閱讀或?qū)嵺`才來理解透徹。
4. 了解自己的局限
沒有人無所不能。就算擁有真正強大學(xué)習(xí)能力的人也無法做到無所不能——因為時間不夠。有些領(lǐng)域確實必需天分。在自己確實不擅長的地方該自卑就要自卑——這沒有什么不好意思的。該自卑的時候不自卑,就多了一個心理負(fù)擔(dān)——并且還是永遠(yuǎn)擺脫不掉的負(fù)擔(dān),最終,肯定會拖累自信。凡事兒做得好必然容易自信,做得不好就很難自信,但是還沒上陣呢,就背著一個又一個的包袱,能走多遠(yuǎn)?能做多好?
--哎呀,這個東西實在跟我不投緣,這樣的話會讓自己輕松很多。(當(dāng)然,這樣的話要在你堅持努力嘗試多次之后說了才有用)
5. 凡事兒都要提前做足功課
大聲說話也好,穿著正式也罷,最多只能讓一個人“顯得”自信,而非真正自信。“坐在第一排”可能是因為近視,“快速走路”往往是因為時間觀念不強——這些都與自信沒關(guān)系。做任何事情,提前做足了功課,想不自信都難。自信不等于自以為是,自以為是的人最終都會被現(xiàn)實砸爛。中國人說“成事在天,謀事在人”,西方人說“上帝的歸上帝,凱撒的歸凱撒”,某個層面上都是一回事兒:不要理會運氣(該來的時候它自然會來),重要的是專心做好功課。
--查看線上錯誤日志的方法,會了嗎?還不趕緊去找?
從此一發(fā)不可收拾,我繼續(xù)研究了J2EE的部分,又發(fā)現(xiàn)這是一個我根本不能理解的方向(曾經(jīng)有半年停滯不前),為什么只有接口沒有實現(xiàn)啊!后來由于一直使用Tomcat、Derby等軟件突然發(fā)現(xiàn):哦!原來J2EE僅僅是一個標(biāo)準(zhǔn),只是一個架構(gòu)。真正的實現(xiàn)是不同提供商提供的。
接著我研究了MOM4J、OpenJMS、Mocki、HSQLD……發(fā)現(xiàn)這些就是J2EE的實現(xiàn)啊!原來軟件竟會如此復(fù)雜,竟會如此做….規(guī)范和實現(xiàn)又是如何成為一體的呢?通過上面的研究發(fā)現(xiàn):原來J2EE后面竟然有太多太多理念、太多太多的相似!這些相似就是其背后的理念――設(shè)計模式!(很幸運,在我學(xué)java的時候,我一般學(xué)java的一個方向就會讀一些關(guān)于設(shè)計模式的書!很幸運,到能領(lǐng)略一點的時候能真正知道這是為什么!)其實模式就是一種思維方式、就是一種理念……模式是要運用到程序中的,只有從真正的項目中才能領(lǐng)會模式的含義……
學(xué)得越多,發(fā)現(xiàn)懂得越少!在學(xué)習(xí)過程中發(fā)現(xiàn)一些很有用,很值得學(xué)習(xí)的開源項目,今天在此推薦給大家。
一、JavaServlet和JSP方向
很多人都是從Servlet和JSP步入J2EE的。它就是J2EE的表現(xiàn)層,用于向客戶呈現(xiàn)服務(wù)器上的內(nèi)容。J2EE很重要的方面。不羅嗦了!大家都知道的!下面就開始推薦吧!
1. Jakarta Tomcat
Apache基金會提供的免費的開源的Serlvet容器,它是的Jakarta項目中的一個核心項目,由Apache、Sun和其它一些公司(都是IT界的大鱷哦)及個人共同開發(fā)而成,全世界絕大部分Servlet和Jsp的容器都是使用它哦!由于Sun的參與和支持,最新的Servlet和Jsp規(guī)范總能在Tomcat中得到體現(xiàn)。
不過它是一個非常非常全的Serlvet容器,全部源碼可能有4000頁,對于初學(xué)者或者一般的老手可能還是比較大了!在你有能力時推薦研究!下載地址:http://jakarta.apache.org/tomcat/index.html
下面推薦兩個小一點的吧!
2. Jetty
Jetty是一個開放源碼的HTTP服務(wù)器和Java serverlet容器。源代碼只有1000頁左右,很值得研究。有興趣可以去http://jetty.mortbay.com/下載看看。我曾經(jīng)翻了一下,只是目前沒有時間。(都化在博客上了,等博客基本定型,且內(nèi)容完整了,再干我熱衷的事件吧!)
3. Jigsaw
Jigsaw是W3C開發(fā)的HTTP,基于Java 的服務(wù)器,提供了未來 Web 技術(shù)發(fā)展的藍(lán)圖。W3C知道吧!(太有名氣了,很多標(biāo)準(zhǔn)都是它制訂的!有空經(jīng)常去看看吧!)下載網(wǎng)址:http://www.w3.org/Jigsaw代碼僅僅1000頁左右。
4. Jo!
Jo!是一個純Java的實現(xiàn)了Servlet API 2.2, JSP 1.1, 和HTTP/1.1的Web服務(wù)器。它的特性包括支持servlet tag,支持SSI,高級線程管理,虛擬主機,數(shù)據(jù)緩存,自動壓縮text或HTML文件進(jìn)行傳輸,國際化支持,自動重新加載Servlet、Jsp,自動重新加載web工程文件(WARs),支持WAR熱部署和一個Swing控制臺。jo!可以被用做jboss和jakarta avalon-phoenix的web容器。下載地址http://www.tagtraum.com/ 。我極力推薦大家在研究Tomcat之前研究該軟件,主要是其比Tomcat小多了,且開發(fā)者提供比較全的手冊。該方向研究這兩個也就可以了!
二、JDBC方向
很多人都喜歡JDBC,數(shù)據(jù)庫嗎!很深奧的東西,一聽就可以糊弄人。其實等你真正研究了數(shù)據(jù)庫的實現(xiàn)后發(fā)現(xiàn),接口其實真的太簡單,太完美了!要想設(shè)計如此優(yōu)秀的框架還是需要學(xué)習(xí)的。下面就推薦幾個數(shù)據(jù)庫的實現(xiàn)吧!
1. Hypersonic SQL
Hypersonic SQL開源數(shù)據(jù)庫方向比較流行的純Java開發(fā)的關(guān)系型數(shù)據(jù)庫。好像不是JDBC兼容的,JDBC的很多高級的特性都沒有支持,不過幸好支持ANSI-92 標(biāo)準(zhǔn) SQL語法。我推薦它主要是它的代碼比較少1600頁左右,如此小的數(shù)據(jù)庫值得研究,而且他占的空間很小,大約只有160K,擁有快速的數(shù)據(jù)庫引擎。推薦你的第一個開源數(shù)據(jù)庫。下載地址:http://hsqldb.sourceforge.net/。
2. Mckoi DataBase
McKoiDB 和Hypersonic SQL差不多,它是GPL 的license的純Java開發(fā)的數(shù)據(jù)庫。他的 JDBC Driver 是使用 JDBC version 3 的 Specifaction。 他也是遵循 SQL-92 的標(biāo)準(zhǔn),也盡量支持新的 SQL 特色, 并且支持 Transaction 的功能。兩個可以選一個吧!下載地址:http://mckoi.com/database/。
3. Apache Derby
學(xué)Java的數(shù)據(jù)庫我建議使用Apache Derby ,研究數(shù)據(jù)庫想成為一個數(shù)據(jù)庫的高手我建議你先研究Apache Derby。Apache Derby是一個高質(zhì)量的、純 Java開發(fā)的嵌入式關(guān)系數(shù)據(jù)庫引擎,IBM® 將其捐獻(xiàn)給Apache開放源碼社區(qū),同時IBM的產(chǎn)品CloudSpace是它對應(yīng)的產(chǎn)品。Derby是基于文件系統(tǒng),具有高度的可移植性,并且是輕量級的,這使得它非常便于發(fā)布。主要是沒有商業(yè)用戶的很好的界面,沒有其太多的功能。不過對于我們使用數(shù)據(jù)庫、研究數(shù)據(jù)庫還是極其有用的。對于中小型的企業(yè)說老實話你也不要用什么Oracle、SqlServer了,用Derby就可以了,何況是開源的呢!只要能發(fā)揮其長處也不容易啊!下載地址:http://incubator.apache.org/derby。
不過在沒有足夠的能力前,不要試圖讀懂它!注釋和源代碼15000頁左右,我一年的閱讀量!能讀下來并且能真正領(lǐng)會它,絕對高手!你能讀完Derby的源代碼只有兩種可能:1.你成為頂尖的高手――至少是數(shù)據(jù)庫這部分; 2.你瘋了。選擇吧!!!!作為我自己我先選擇Hypersonic SQL這樣的數(shù)據(jù)庫先研究,能過這一關(guān),再繼續(xù)研究Derby!不就是一年的閱讀量嗎!我可以化3年去研究如何做一個數(shù)據(jù)庫其實還是很值得的!有的人搞IT一輩子自己什么都沒有做,也根本沒有研究別人的東西!
作為一個IT落后于別國若干年的、從事IT的下游產(chǎn)業(yè)“外包”的國家的IT從業(yè)人員,我認(rèn)為還是先研究別人的優(yōu)秀的東西比較好!可以先研究別人的,然后消化,學(xué)為己用!一心閉門造車實在遺憾!
三、JMS方向
JMS可能對大家來說是一個比較陌生的方向!其實JMS是一個比較容易理解,容易上手的方向。主要是Java消息服務(wù),API也是相當(dāng)簡單的。不過在企業(yè)應(yīng)用中相當(dāng)廣泛。下面就介紹幾個吧!
1. MOM4J
MOM4J是一個完全實現(xiàn)JMS1.1規(guī)范的消息中間件并且向下兼容JMS1.0與1.02。它提供了自己的消息處理存儲使它獨立于關(guān)系數(shù)據(jù)與語言,它的客戶端可以用任何語言開發(fā)。它可以算是一個小麻雀,很全實現(xiàn)也比較簡單!它包含一個命名服務(wù)器,一個消息服務(wù)器,同時提供自己的持續(xù)層。設(shè)計也相當(dāng)?shù)那擅睿耆貌僮飨到y(tǒng)中文件系統(tǒng)設(shè)計的觀念。代碼也很少,250頁左右,最近我在寫該實現(xiàn)的源代碼閱讀方面的書,希望明年年中能與大家見面!下載地址:http://mom4j.sourceforge.net/index.html。
2. OpenJMS
OpenJMS是一個開源的Java Message Service API 1.0.2 規(guī)范的實現(xiàn),它包含有以下特性:
1. 它既支持點到點(point-to-point)(PTP)模型和發(fā)布/訂閱(Pub/Sub)模型。
2. 支持同步與異步消息發(fā)送 。
3. JDBC持久性管理使用數(shù)據(jù)庫表來存儲消息 。
4. 可視化管理界面。
5. Applet支持。
6. 能夠與Jakarta Tomcat這樣的Servlet容器結(jié)合。
7. 支持RMI, TCP, HTTP 與SSL協(xié)議。
8. 客戶端驗證 。
9. 提供可靠消息傳輸、事務(wù)和消息過濾。
很好的JMS方向的開源項目!我目前也在研究它的源代碼!學(xué)習(xí)它可以順便研究JNDI的實現(xiàn)、以及網(wǎng)絡(luò)通信的細(xì)節(jié)。這是我JMS方向研究的第二個開源項目。代碼量1600頁左右吧!下載地址:http://openjms.sourceforge.net/index.html
3. ActiveMQ
ActiveMQ是一個開放源碼基于Apache 2.0 licenced 發(fā)布并實現(xiàn)了JMS 1.1。它能夠與Geronimo,輕量級容器和任Java應(yīng)用程序無縫的給合。主要是Apache的可以任意的使用和發(fā)布哦!個人比較喜歡Apache的源代碼!下載地址:http://activemq.codehaus.org/
4. JORAM
JORAM一個類似于openJMS分布在ObjectWeb之下的JMS消息中間件。ObjectWeb的產(chǎn)品也是非常值得研究的!下面我還會給大家另外一個ObjectWeb的產(chǎn)品。下載地址:http://joram.objectweb.org/
我個人推薦:OpenJMS和ActiveMQ!
四、EJB方向
EJB一個比較“高級”的方向。Sun公司曾經(jīng)以此在分布式計算領(lǐng)域重拳出擊。不過自從出現(xiàn)了Spring、Hibernation……后似乎沒落了!這個方向單獨開源的也比較少,主要EJB是和JNDI、JDBC、JMS、JTS、JTA結(jié)合在一起的是以很少有單獨的。下面推薦兩個不過好像也要下載其它類庫。
1. EasyBeans
ObjectWeb的一個新的項目,一個輕量級的EJB3容器,雖然還沒有正式發(fā)布,但是已經(jīng)可以從它們的subversion倉庫中檢出代碼。代碼量比較小600頁左右,熟讀它可以對網(wǎng)絡(luò)編程、架構(gòu)、RMI、容器的狀態(tài)設(shè)計比較了解了!即學(xué)會EJB又能學(xué)習(xí)其它設(shè)計方法何樂而不為哦!下載地址:http://easybeans.objectweb.org/
2. OpenEJB
OpenEJB是一個預(yù)生成的、自包含的、可移植的EJB容器系統(tǒng),可以被插入到任意的服務(wù)器環(huán)境,包括應(yīng)用程序服務(wù)器,Web服務(wù)器,J2EE平臺, CORBA ORB和數(shù)據(jù)庫等等。OpenEJB 被用于 Apple的WebObjects。聽起來很好,我目前沒有研究過。不知道我就不推薦了。下載地址:http://www.openejb.org/
五、J2EE容器
上面談了這么多,都是J2EE的各個方向的。其實J2EE是一個規(guī)范,J2EE的產(chǎn)品一般要求專業(yè)提供商必須提供它們的實現(xiàn)。這些實現(xiàn)本身就是J2EE容器。市場上流行的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è)級市場日益增長的需求,Jboss公司從2003年開始就推出了24*7、專業(yè)級產(chǎn)品支持服務(wù)。同時,為拓展Jboss的企業(yè)級市場,Jboss公司還簽訂了許多渠道合作伙伴。比如,Jboss公司同HP、Novell、Computer Associates、Unisys等都是合作伙伴。
在2004年6月,Jboss公司宣布,Jboss應(yīng)用服務(wù)器通過了Sun公司的J2EE認(rèn)證。這是Jboss應(yīng)用服務(wù)器發(fā)展史上至今為止最重要的里程碑。與此同時,Jboss一直在緊跟最新的J2EE規(guī)范,而且在某些技術(shù)領(lǐng)域引領(lǐng)J2EE規(guī)范的開發(fā)。因此,無論在商業(yè)領(lǐng)域,還是在開源社區(qū),Jboss成為了第一個通過J2EE 1.4認(rèn)證的主流應(yīng)用服務(wù)器。現(xiàn)在,Jboss應(yīng)用服務(wù)器已經(jīng)真正發(fā)展成具有企業(yè)強度(即,支持關(guān)鍵級任務(wù)的應(yīng)用)的應(yīng)用服務(wù)器。
Jboss 4.0作為J2EE認(rèn)證的重要成果之一,已經(jīng)于2004年9月順利發(fā)布了。同時,Jboss 4.0還提供了Jboss AOP(Aspect-Oriented Programming,面向方面編程)組件。近來,AOP吸引了大量開發(fā)者的關(guān)注。它提供的新的編程模式使得用戶能夠?qū)⒎矫?比如,事務(wù))從底層業(yè)務(wù)邏輯中分離出來,從而能夠縮短軟件開發(fā)周期。用戶能夠單獨使用Jboss AOP,即能夠在Jboss應(yīng)用服務(wù)器外部使用它。或者,用戶也可以在應(yīng)用服務(wù)器環(huán)境中使用它。Jboss AOP 1.0已經(jīng)在2004年10月發(fā)布了。 很有名吧!可以下載一個用一下,下載地址:http://www.jboss.org/
關(guān)于JBoss的使用資料也非常多,甚至比商業(yè)軟件的還多。有機會研究吧!
2. JOnAS
JOnAS是一個開放源代碼的J2EE實現(xiàn),在ObjectWeb協(xié)會中開發(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 軟件基金會的開放源碼J2EE服務(wù)器,它集成了眾多先進(jìn)技術(shù)和設(shè)計理念。 這些技術(shù)和理念大多源自獨立的項目,配置和部署模型也各不相同。 Geronimo能將這些項目和方法的配置及部署完全整合到一個統(tǒng)一、易用的模型中。作為符合J2EE標(biāo)準(zhǔn)的服務(wù)器,Geronimo提供了豐富的功能集和無責(zé)任 Apache 許可,具備“立即部署”式J2EE 1.4容器的各種優(yōu)點,其中包括:
1. 符合J2EE1.4標(biāo)準(zhǔn)的服務(wù)器 。
2. 預(yù)集成的開放源碼項目 。
3. 統(tǒng)一的集成模型 。
4. 可伸縮性、可管理性和配置管理功能。
我一直比較推薦Apache的產(chǎn)品。主要是可以任意自由地使用。下載地址:http://incubator.apache.org/projects/geronimo/
六、其它
講了這么多大家可能很厭煩了!是不是很多很多啊!其實不然,我們不會的太多太多了!不會的太多太多了。不管你是不是J2EE高手,還是J2SE高手,有些東西你要絕對很精明的。例如:1.Java的Collections Framework就是java的數(shù)據(jù)結(jié)構(gòu)了,不僅要吃透它,還要能按照需要擴展它,利用其思想創(chuàng)建一個自己的數(shù)據(jù)結(jié)構(gòu)。2.網(wǎng)絡(luò)編程肯定要會吧,現(xiàn)在以及以后很多程序都是不在同一臺機器上的,不會網(wǎng)絡(luò)怎么行哦!3.IO肯定要會的吧!你的程序難道不用輸入輸出數(shù)據(jù)啊!整個IO包加NIO也有600多頁的源代碼哦!4.JDBC你要會吧!數(shù)據(jù)庫都不會,在你的企業(yè)應(yīng)用中你的數(shù)據(jù)又保存到哪里啊!文件中――太落后了吧!典型的沒有學(xué)過J2EE。盡管數(shù)據(jù)庫背后也是采用文件保存的。5.Serverlet、JSp你要是做網(wǎng)頁做網(wǎng)站,肯定要做到。問你一個簡單的問題,網(wǎng)頁中如何實現(xiàn)分頁啊!有具體方法的就在本文章后發(fā)言吧!6. Ant要會吧!java語言中發(fā)布的工具,類似與c中的make工具。7.JUnit用過吧!單元測試軟件。你不要啊!你的軟件就沒有bug!你牛!(建議大家研究研究其源代碼,很有用的框架,包含大量的設(shè)計模式,源代碼不到100頁!看了只能感嘆――高手就是高手)細(xì)心的朋友可以看到在你使用的很多IDE工具中都有JUnit哦!就是它。
一切的一切才剛剛開始!有興趣,有需要你可以研究數(shù)據(jù)庫連接池的框架,如:C3P0、Jakarta DBCP、 DBPool….可以研究J2EE框架Spring……. Web框架Struts……持久層框架Hibernate…..甚至開發(fā)工具Eclipse…..Sun領(lǐng)導(dǎo)的點對點通信的JXTA…..報表工具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,一個XML解析的著名的開源 項目)
不管怎么樣我還是建議從基本的做起,學(xué)精J2SE,熟讀它的源碼,準(zhǔn)確了解其設(shè)計理念,然后分頭擊破J2EE――一口吃不成一個胖子!不要貪多貪廣!腳踏實地就可以了!
摘自CSDN:《J2EE值得學(xué)習(xí)的開源項目》
2、命令:必須熟悉JDK帶的一些常用命令及其常用選項,命令至少需要熟悉:appletviewer、 HtmlConverter、jar、 java、javac、javadoc、javap、javaw、native2ascii、serialver,如果這些命令你沒有全部使用過,那么你對java實際上還很不了解。
3、工具:必須至少熟練使用一種IDE的開發(fā)工具,例如Eclipse、Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者Workshop,包括進(jìn)行工程管理、常用選項的設(shè)置、插件的安裝配置以及進(jìn)行調(diào)試。
4、API:Java的核心API是非常龐大的,但是有一些內(nèi)容筆者認(rèn)為是必須熟悉的,否則不可能熟練的運用Java,包括:
◆java.lang包下的80%以上的類的功能的靈活運用。
◆java.util包下的80%以上的類的靈活運用,特別是集合類體系、規(guī)則表達(dá)式、zip、以及時間、隨機數(shù)、屬性、資源和Timer.
◆java.io包下的60%以上的類的使用,理解IO體系的基于管道模型的設(shè)計思路以及常用IO類的特性和使用場合。
◆java.math包下的100%的內(nèi)容。
◆java.net包下的60%以上的內(nèi)容,對各個類的功能比較熟悉。
◆java.text包下的60%以上的內(nèi)容,特別是各種格式化類。
◆熟練運用JDBC. 8)、java.security包下40%以上的內(nèi)容,如果對于安全沒有接觸的話根本就不可能掌握java.
◆AWT的基本內(nèi)容,包括各種組件事件、監(jiān)聽器、布局管理器、常用組件、打印。
◆Swing的基本內(nèi)容,和AWT的要求類似。
◆XML處理,熟悉SAX、DOM以及JDOM的優(yōu)缺點并且能夠使用其中的一種完成XML的解析及內(nèi)容處理。
5、測試:必須熟悉使用junit編寫測試用例完成代碼的自動測試。
6、管理:必須熟悉使用ant完成工程管理的常用任務(wù),例如工程編譯、生成javadoc、生成jar、版本控制、自動測試。
7、排錯:應(yīng)該可以根據(jù)異常信息比較快速的定位問題的原因和大致位置。
8、思想:必須掌握OOP的主要要求,這樣使用Java開發(fā)的系統(tǒng)才能是真正的Java系統(tǒng)。
9、規(guī)范:編寫的代碼必須符合流行的編碼規(guī)范,例如類名首字母大寫,成員和方法名首字母小寫,方法名的第一個單詞一般是動詞,包名全部小寫等,這樣程序的可讀性才比較好。
10、博學(xué):掌握J(rèn)2EE 、Oracle 、WebLogic、Jboss、Spring、Struts、Hibernate 等流行技術(shù),掌握軟件架構(gòu)設(shè)計思想、搜索引擎優(yōu)化、緩存系統(tǒng)設(shè)計、網(wǎng)站負(fù)載均衡、系統(tǒng)性能調(diào)優(yōu)等實用技術(shù)。
摘錄自CSDN:《一個java程序員的10項技能》
講了這么多概念,舉個例子,把它們串起來,還是以“AOP學(xué)習(xí)筆記一”里面的“安全性檢查”為例:
我們把“安全性檢查”作為一個方面,
那么實現(xiàn)安全性檢查的攔截器就是一種增強,
方法businessMethod1,businessMethod2,businessMethod3就是連接點,
但是只有businessMethod1和businessMethod2需要增強,所以需要一個切入點,使其只匹配前兩個方法。
當(dāng)我們的業(yè)務(wù)對象和攔截器都配置到spring之后,spring會在運行時織入,并且生成一個AOP代理。
這個AOP代理將是一個JDK動態(tài)代理,將在完成安全性檢查之后,調(diào)用目標(biāo)對象。
上面是安全性檢查的例子,我們希望檢查用戶是否有權(quán)限執(zhí)行某個方法,如果沒有就拋出異常。我們把安全檢查的工作放在一個方法中實現(xiàn),但是這個仍無法避免一行重復(fù)代碼的編寫。另外,當(dāng)開發(fā)者添加一個新的業(yè)務(wù)方法時,它完全有可能忘記調(diào)用安全檢查的方法,從而破壞了應(yīng)用程序的安全性。為了在方法執(zhí)行的過程中識別出“應(yīng)該調(diào)用安全性檢查”的那一點,我們需要用一種高全新的方式來看待程序結(jié)構(gòu),而OO的層次模型無法提供這種新的視角。對于這個問題,繼承愛莫能助,“安全性檢查”在這里是一個具有橫切性的問題,需要進(jìn)行安全性檢查的方法都是彼此獨立的,無法從某個通用的方法繼承下去。
AOP的目標(biāo)就是將橫切型crosscutting的問題以一種更加通用的方式模塊化,從而提升程序的模塊化程度。在AOP中,我們可以單獨編寫“安全性檢查”的代碼,并將其包裝為一個方面aspect。(方面的概念出現(xiàn)嘍!)然后,我們可以告訴AOP實現(xiàn)產(chǎn)品如何在運行時將方面織入到程序流程之中,具體的實現(xiàn)策略,請看下篇AOP的實現(xiàn)策略。