2007年4月10日
#
---轉(zhuǎn)自網(wǎng)絡(luò)
運行cmd regedit msconfig提示找不到文件
作者: 笑嘻嘻
今天我同學(xué)的電腦,開始運行“cmd regedit msconfig” 這三個命令都不行 ,提示"找不到文件"??墒俏募髅髟诎?。
直接運行system32目錄下的cmd也不行,照樣提示"找不到文件"。把cmd改名為cmd1就能夠運行
我的處理過程:
開始我懷疑是中病毒了,是病毒程序在監(jiān)聽哪個程序標(biāo)題為“cmd”,發(fā)現(xiàn)就結(jié)束。
首先用卡巴掃了一下啟動項,沒發(fā)現(xiàn)病毒。又用冰刃查了一下啟動項,進(jìn)程,都沒問題。
想了想會不會中了rootkit 級的馬兒,可用冰刃仔細(xì)看了看內(nèi)核,沒有顯示紅色的阿,剛才殺毒軟件也沒報,是的可能性就不怎么大了。
那會不會是這個文件遭病毒感染了,我最討厭感染型的蠕蟲病毒了。我從我自己的電腦上把才cmd.exe拷貝過來了,用軟件比較了下(光看大小不行的),一樣的。
Hash.zip (28.61 KB , 下載:6次)
----------------------------------------------------------------------------
文件: C:WINDOWSsystem32cmd.exe
大小: 470528 字節(jié)
文件版本: 5.1.2600.2180 (xpsp_sp2_rtm.040803-2158)
修改時間: 2005年12月15日, 8:00:00
MD5: 722A247ACB86960A708528120759266D
SHA1: A859B7173FB0B1786BE07B01F779725EDF9043E7
CRC32: 15544920
-----------------------------------------------------------------------------
后來經(jīng)過詢問前幾天中過病毒,會不會是上次病毒修改了注冊表什么地方,雖然病毒是被殺了,但是修改的地方仍然沒有改過來的呢。結(jié)果證明,這個判斷是正確的。
具體處理方法:
用冰刃的修改注冊表,或者將windeows目錄下的regedit.exe修改一下名字,比如叫regedit1.exe,修改注冊表。
將HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionImage File Execution Options 里面的
cmd.exe
msconfig.exe
regedit.exe
regedit32.exe
刪除就可以了。
典型的 映像劫持。
這只是處理病毒后遺癥,具體的處理病毒的方法沒有寫,因為有很多病毒都會造成這種狀況,具體病毒具體對待。
--轉(zhuǎn)自
做共享軟件是有利可圖的,這是真的,1999年3月以前我還不信,可是經(jīng)過一年多的
研究和實踐下來,我已經(jīng)每月能賺4萬多美金了,比某些大公司總裁還多。但是,
我敢說,80%以上的共享軟件作者并不成功,實際上,他們遠(yuǎn)遠(yuǎn)沒有賺到他們本來可以
賺到的收入。
軟件共享發(fā)行銷售(先試后買)是一種市場營銷手段,和其他所有市場營銷手段一樣,
是有學(xué)問的,要想通過軟件共享發(fā)行獲得成功,就必須掌握這些學(xué)問。
今天,我來貼上第一篇技術(shù)文章,收錢的辦法
在幾年以前,Internet還沒有流行的時候,共享軟件的作者只能靠從郵件中收到用戶的支票和現(xiàn)金的方法來賺錢,而用戶寄出支票后,還要等上一周或更多的時間得到來自作者的注冊碼。注意,當(dāng)以下幾種情況發(fā)生時,軟件作者的生意就做不成了:
1)用戶的支票本剛好用完,等他買回新支票本時,消費沖動已經(jīng)沒有了
2)用戶的郵票剛好用完,他還不得不去一趟郵局買郵票,轉(zhuǎn)念一想,這軟件我也不是
非買不可,算了
3)用戶無法忍受要等好多天才能拿到注冊碼
一句話,太不方便了
現(xiàn)在好了,有了Internet,有了電子商務(wù),用戶可以在最想買你的軟件的一剎那間,迅速的用他的信用卡在網(wǎng)上買下你的軟件,連后悔的時間都沒有,共享軟件發(fā)財?shù)娜兆拥絹順贰?
那么,如何在網(wǎng)上收取信用卡呢?
如果你擁有一個公司,在美國銀行有信用卡商號帳戶,又購買了銀行的GATEWAY軟件,在自己的網(wǎng)站上開發(fā)了信用卡收費系統(tǒng)當(dāng)然很好,但對于廣大共享軟件作者來說,這很不現(xiàn)實.有簡單的辦法,就是找一家信用卡收款代理公司,讓他們替你收款,你只要每個月等他們給你寄一張總額的支票(他們會提取一定比例的傭金)就行了.
這樣的代理公司網(wǎng)站有:
WWW.QWERKS.COM 提成 15-20% (服務(wù)極好,是我的服務(wù)商)
WWW.Shareit.COM
WWW.REGNOW.COM
WWW.REGSOFT.COM
WWW.Kagi.com
對于咱們國內(nèi)的共享軟件作者,還要做的一件事就是去中國銀行開個戶頭(北京中行的活期一本通就很好用),如果你打算讓信用卡公司把錢電匯給你,你還要知道銀行的英文名字,地址,帳戶名,
帳號,轉(zhuǎn)帳的SWIFT Code(可以從銀行職員那里問到)
到信用卡代理公司的網(wǎng)站上開戶非常簡單,通常確認(rèn)它們的一個在線協(xié)議,填入一些個人信息和產(chǎn)品信息,幾分鐘就OK了
這里面有一個值得注意的地方,就是,當(dāng)用戶付了款后,注冊碼怎么給的問題,你可以選擇由你來給(每收到一份訂單,他們會給你發(fā)一封email,包含用戶資料和email),由你生成注冊碼email給用戶,也可以把注冊碼生成代碼給信用卡公司,讓他們編到他們的系統(tǒng)里去,用戶來了訂單后自動發(fā)出注冊碼,也可以由你一次性生成幾百個注冊碼給他們,他們每收到一份訂單時用掉一個注冊碼。
我個人的意見是,這幾個信用卡服務(wù)商信譽都非常好,一次給他們幾百個注冊碼是最簡單的辦法,對服務(wù)商來說操作簡單,對用戶來說快,交完錢馬上就得到注冊碼了
當(dāng)你完成作者和產(chǎn)品在信用卡服務(wù)商那里的登記后,就會得到一個URL連接,你把這個連接加到你的主頁上面,標(biāo)上一個“Buy Now”,用戶點這里就可以用信用卡付款了,當(dāng)然,你也可以把這個連接做到你的軟件界面里去,這樣用戶在試用你的軟件時,隨時想買都可以點擊這個連接上網(wǎng)購買
具體實例可以參考我的網(wǎng)站和軟件
http://www.zy2000.com
MP3 CD Maker
對于一些Internet軟件,如斷點續(xù)傳的下載軟件,還有另外一種賺錢方法,就是對用戶免費,而在軟件界面上登一個banner廣告賺取廣告費。最有名的廣告代理商是
www.radiate.com
他的廣告付費是每CPM 2-5美元,也就是說,如果一天里有10萬個用戶使用了你的軟件一次的話,你就得到200-500美元。這家公司聲稱,著名的下載工具軟件Gozilla!落戶Radiate后,每月從Radiate那里賺到22萬美元,我們著名的NetAnt是不是該趕快行動了?
我們也不反對用戶用支票和現(xiàn)金購買軟件,事實上,信用卡服務(wù)商都提供支票和現(xiàn)金收款業(yè)務(wù),我們可以在網(wǎng)頁中提供信用卡服務(wù)商的地址和服務(wù)熱線電話,具體例子可以參考我的網(wǎng)頁中 FAQ 一頁的內(nèi)容
1 .from
1.1單表查詢
from eg.cat as cat.其中,cat只是一個別名,為了用其他子語句的時候書寫簡單
1.2多表查詢
from eg.Cat,eg.Dog
from eg.Cat as cat,eg.Dog as dog
2 join相關(guān)
(inner) join
left (outer) join
right (outer) join
full join
HQL同樣對SQL中的這些特性支持
下面插播一個小話題,關(guān)于上邊的那些特性,我一直都沒怎么用,今天既然說到這里,就想
把上邊的幾個特性的用法說一下,也算對自己的一個補充:
假設(shè)有兩個表:部門、員工,下面列舉一些數(shù)據(jù):
員工(Employee):
ID Name DepNo
001 Jplateau 01
002 Jony 01
003 Camel 02
部門(Department):
ID Name
01 研發(fā)部
02 營銷部
在Hibernate中我們操縱的都是對象,所以我們操縱的是部門類和員工類
1).(inner) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee join Department as department on employee.DepNo=
department.ID (注意到條件語句我用on 沒有用where)
那么執(zhí)行結(jié)果是什么呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研發(fā)部
002 Jony 01 研發(fā)部
2).left (outer) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee left join Department as department on employee.DepNo=
department.ID
那么執(zhí)行結(jié)果又該是什么呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研發(fā)部
002 Jony 01 研發(fā)部
003 Camel null null
{就是說此時我要已第一個表的記錄多少為準(zhǔn),第二個表中沒有相應(yīng)紀(jì)錄的時候填充null}
3). right (outer) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee right join Department as department on employee.DepNo=
department.ID
那么執(zhí)行結(jié)果又該是什么呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研發(fā)部
002 Jony 01 研發(fā)部
null null 02 營銷部
{就是說此時我要已第二個表的記錄多少為準(zhǔn),第一個表中沒有相應(yīng)紀(jì)錄的時候填充null}
3 大小寫敏感
4。select語句
就是要確定你要從查詢中返回哪些對象或者哪些對象的屬性。寫幾個例子吧:
select employee form Employee as employee
select employee form Employee as employee where employee.Name like 'J%'
select employee.Name form Employee as employee where employee.Name like 'J%'
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee right join Department as department on employee.DepNo=
department.ID
select elements(employee.Name) from Employee as employee
(不明白elements到底是做什么用的?望給于說明)
等等
5。數(shù)學(xué)函數(shù)
JDO目前好像還不支持此類特性。
avg(...), sum(...), min(...), max(...)
count(*)
count(...), count(distinct ...), count(all...)
其用法和SQL基本相同
select distinct employee.name from Employee as employee
select count(distinct employee.name),count(employee) from Employee as employee
6。polymorphism (暫時不知道如何解釋?)
from com.test.Animal as animal
不光得到所有Animal得實例,而且可以得到所有Animal的子類(如果我們定義了一個子類Cat)
一個比較極端的例子
from java.lang.Object as o
可以得到所有持久類的實例
7。where語句
定義查詢語句的條件,舉幾個例子吧:
from Employee as employee where employee.Name='Jplateau'
from Employee as employee where employee.Name like 'J%'
from Employee as employee where employee.Name like '%u'
在where語句中“=”不光可以比較對象的屬性,也可以比較對象,如:
select animal from com.test.Animal as animal where animal.name=dog
8。表達(dá)式
在SQL語句中大部分的表達(dá)式在HQL中都可以使用:
mathematical operators +, -, *, /
binary comparison operators =, >=, <=, <>, !=, like
logical operations and, or, not
string concatenation ||
SQL scalar functions like upper() and lower()
Parentheses ( ) indicate grouping
in, between, is null
JDBC IN parameters ?
named parameters :name, :start_date, :x1 (這種應(yīng)該是另一種"?"的變通解決方法)
SQL literals 'foo', 69, '1970-01-01 10:00:01.0'
Java public static final constants eg.Color.TABBY
其他不必解釋了,在這里我只想對查詢中的參數(shù)問題說明一下:
大家知道在SQL中進(jìn)行傳遞參數(shù)進(jìn)行查詢的時候,我們通常用PreparedStatement,在語句中寫一大堆的“?”,
在hql中也可以用這種方法,如:
List mates = sess.find(
"select employee.name from Employee as employee " +
"where employee.Name=? ",
name,
Hibernate.STRING
);
(說明:上面利用Session里的find方法,在hibernate的api Session中重載了很多find方法,它可以滿足你多種形式的查詢)
上邊是一個參數(shù)的情形,這種情況下緊接著引入?yún)?shù)和定義參數(shù)的類型,當(dāng)為多個參數(shù),調(diào)用另一個find方法,它的后兩個
參數(shù)都是數(shù)組的形式。
還有另外一種方法來解決上邊的問題,JDO也有這樣的方法,不過和hibernate的表現(xiàn)形式上有差別,但他們兩個骨子里卻是
一樣的,如:
Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");
q.setString("name", "Jplateau");
//當(dāng)有多個參數(shù)的時候在此逐一定義
Iterator employees = q.iterate();
9。order 語句
和sql語句沒什么差別,如:
select employee.name from Employee as employee where employee.Name like 'J%' order by employee.ID desc (或者asc)
10。group by 語句
同樣和sql語句沒什么差別,如:
select employee.name,employee.DepNo from Employee as employee group by employee.DepNo
select foo.id, avg( elements(foo.names) ), max( indices(foo.names) ) from eg.Foo foo group by foo.id
{Note: You may use the elements and indices constructs inside a select clause, even on databases with no subselects.}
誰幫我解釋一下上邊兩句,謝過!
11。子查詢
hibernate同樣支持子查詢,寫幾個例子:
from eg.Cat as fatcat where fatcat.weight > ( select avg(cat.weight) from eg.DomesticCat cat )
-轉(zhuǎn)載
下面是作者對設(shè)計模式的理解并自以為所對應(yīng)的實例
一 : 單例模式(Singleton)
賬本類:1 單一實例 2 給多個對象共享 3 自己創(chuàng)建。網(wǎng)頁計數(shù)器
二:策略模式(Strategy)
使用QQ泡MM時使用外掛 客戶端 :ME 抽象類: 外掛 具體:策略(圖片,笑話,名人名言)
圖書銷售算法(不同書本折扣的算法)
三:原型模式(Prototype)
復(fù)印技術(shù): 1 不是同一個對象 2 屬同類
短消息(轉(zhuǎn)發(fā)) 1-n個MM
四:門面模式(Façade)
Facade典型應(yīng)用就是數(shù)據(jù)庫JDBC的應(yīng)用和Session的應(yīng)用
ME---àMM---à(father,mum,sister,brother)
五:備忘錄模式(Memento)
備份系統(tǒng)時使用
GHOST
六 : 命令模式(Command)
MM(客戶端)--àME(請求者)--à命令角色--à(具體命令)-à代理處(接收者)--àMM
上網(wǎng) IE 輸入 http地址 發(fā)送命令
七: 解釋器(Interpreter)
編譯原理之編譯器
文言文注釋:一段文言文,將它翻譯成白話文
八:調(diào)停者模式(Mediator)
法院和原告,被告的關(guān)系
九:責(zé)任鏈模式(CHAIN OF RESPONSIBLEITY)
喝酒時通過成語接龍決定誰喝酒(馬到成功-功不可沒-沒完沒了)
十:工廠模式(Factory)
水果園—〉(葡萄園,蘋果園)--〉(葡萄,蘋果)(各自生產(chǎn))
十一:抽象工廠模式(Abstract Factory)
女媧造人---〉(陰,陽)--〉(人,獸)----〉(男人,女人,公獸,母獸)(人和獸屬于不同的產(chǎn)品類)
十二:建造模式(Builder)
汽車制造
十三:合成模式(Composite)
windows的目錄樹(文件系統(tǒng))
十四:裝飾模式(DECORATOR)
在visio中文件可以使用背景進(jìn)行裝飾
變廢為寶
十五:設(shè)計模式之Adapter(適配器)
充電器(手機(jī)和220V電壓)
jdbc-odbc橋
十六:橋梁模式(Bridge)
jdbc驅(qū)動程序
十七:代理模式(Proxy)
用代理服務(wù)器連接出網(wǎng)
銷售代理(廠商)律師代理(客戶)
foxmail
槍手
十八:享元模式(Flyweight)
字體的26個字母和各自的斜體等
十九:狀態(tài)模式(State)
人心情不同時表現(xiàn)不同有不同的行為
編鐘
登錄login logout
二十:觀察者模式(Observer)
公司郵件系統(tǒng)everyone@sina.com的應(yīng)用。當(dāng)公司員工向這個郵箱發(fā)郵件時會發(fā)給公司的每一個員工。如果設(shè)置了Outlook則會及時收到通知。
接收到短消息
二十一:模板方法模式(Template)
使用網(wǎng)頁設(shè)計時使用的模板架構(gòu)網(wǎng)頁(骨架) 算法的各個邏輯系統(tǒng)
二十二:訪問者模式(Visitor)
電腦銷售系統(tǒng): 訪問者(自己)---〉電腦配置系統(tǒng)(主板,CPU,內(nèi)存。。。。。。)
二十三:迭代子模式(Iterator)
查詢數(shù)據(jù)庫,返回結(jié)果集(map, list, set)
下面的參考文獻(xiàn)是讀書筆記的全部參考文獻(xiàn)。這里不一定用到的。
參考文獻(xiàn):
http://blog.csdn.net/airhand/
http://blog.csdn.net/bloom121/
http://blog.csdn.net/laurecn/
http://blog.csdn.net/legendinfo/
http://www-128.ibm.com/developerworks/cn/java/l-struts1-1/
《Design Patterns》
《Java與模式》
《設(shè)計模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1227902
摘要: 事件源對象 event.srcElement.tagName event.srcElement.type
捕獲釋放 event.srcElement.setCapture(); event.srcElement.releaseCapture();
事件按鍵 event.keyCode event.shiftKey event.altKey event....
閱讀全文
轉(zhuǎn)自 IBM 劉武東,謝謝作者的辛勤勞動!
前言
Jive是一個開放的Java源代碼項目。其目標(biāo)是建設(shè)一個開放結(jié)構(gòu)的,強壯的,易于擴(kuò)展的基于JSP的論壇。在其設(shè)計目標(biāo)的指導(dǎo)下,其結(jié)構(gòu)設(shè)計得非常得好,融合了很多新的觀念,比如Design Pattern,可更換的Skin,可插入Plug等等。詳細(xì)解讀其源代碼對于理解這些新的設(shè)計上的概念是很有裨益的。如果你對Design Pattern和Java語言有一定的了解,但是還是會時常迷惑于其中的話,不妨研究研究Jive源代碼,一定會對其中的很多概念有更深入的理解。這篇文章源于我的Jive源代碼研究筆記,希望能夠提綱挈領(lǐng),帶領(lǐng)大家進(jìn)入到這個美好的世界。當(dāng)然,如果沒有時間仔細(xì)地看源代碼的話,看看這篇文章,我想也是會有一些幫助的。
再開始之前,需要指出的是,Jive中對Design Pattern的應(yīng)用,并沒有拘禮與GOF書中所給出的實現(xiàn)方法,而是有許多變通的地方。一方面,我想是由于具體的實際需要,另一方面,我想這也是設(shè)計觀念進(jìn)化的結(jié)果吧。因而,這些變通的地方,將是我講解的重點。
整體結(jié)構(gòu)概敘
基于一個OO的設(shè)計原則:面向接口編程,而不是針對實現(xiàn)編程。Jive在設(shè)計的時候,把其大部分的基本對象都設(shè)計為接口或者抽象類。在Jive中,基本的接口有Forum,F(xiàn)orumMessage,F(xiàn)orumThread,Group,User,Authorization和Query。我們可以很容易的從這些接口的名字來知道他們的功用,下面的類圖給出了這些類之間的一些靜態(tài)關(guān)系:
圖1:Jive整體關(guān)系
你可能會有疑問,為什么會都是接口呢?這是基于擴(kuò)展性考慮的。在Jive給出的實現(xiàn)中,所有的這些接口,F(xiàn)orum,F(xiàn)orumMessage,User等等,都使用數(shù)據(jù)庫來實現(xiàn)的,一條消息,或者一個用戶對應(yīng)于數(shù)據(jù)庫中的一條消息Jive使用了DbForum,DbForumMessage,DbUser等類來實現(xiàn)這些接口,通過JDBC來操作數(shù)據(jù)庫,使之作為論壇的底層支撐。
然而,有時候,或許我們并不想使用數(shù)據(jù)庫,比如我們想只是使用文件系統(tǒng)來作為論壇的底層支撐,這時候,我們需要做的只是編碼實現(xiàn)了Forum等等接口的諸如FileFroum,F(xiàn)ileForumMessage等對象,然后嵌入Jive中即可,原有的任何代碼都可以不用改變?。。∵@就是面向接口編程的威力了!
下面來看看具體的設(shè)計和編碼。
AbstractFactory模式和可擴(kuò)展性
如果要實現(xiàn)較好的可擴(kuò)展性,AbstractFactory模式確實是一件利器。如上面所說,如果要創(chuàng)建的Forum接口的不同實現(xiàn),而又不想更改代碼的話,就需要用到抽象工廠了。再Jive中,AuthorizationFactory類是一個抽象類,用來創(chuàng)建Authorization對象。這是一個抽象工廠,可以通過不同的子類來創(chuàng)建不同的Authorization對象。這個工廠的實現(xiàn)方法是:
在AuthorizationFactory中使用一個private static變量factory,用來引用具體的抽象工廠的實例:
private static AuthorizationFactory factory = null;
用一個private static的String,來指明具體的抽象工廠的子類類名:
private static String className ="com.coolservlets.forum.database.DbAuthorizationFactory";
然后是用一個private static的loadAuthorizationFactory方法來給這個factory變量賦值,生成具體的抽象工廠類:
private static void loadAuthorizationFactory() {
if (factory == null) {
synchronized(className) {
if (factory == null) {
String classNameProp = PropertyManager.getProperty(
"AuthorizationFactory.className"
);
if (classNameProp != null) {
className = classNameProp;
}
try {
Class c = Class.forName(className);
factory = (AuthorizationFactory)c.newInstance();
}
catch (Exception e) {
System.err.println("Exception loading class: " + e);
e.printStackTrace();
}
}
}
}
}
|
在static的getAuthorization方法返回一個Authorization的過程中,先初始化工廠類factory變量,然后用factory的createAuthorization方法來創(chuàng)建:
public static Authorization getAuthorization(String username,
String password) throws UnauthorizedException
{
loadAuthorizationFactory();
return factory.createAuthorization(username, password);
}
|
不同的子類有不同的createAuthorization方法的實現(xiàn)。比如在DbAuthorizationFactory這個AuthorizationFactory的數(shù)據(jù)庫實現(xiàn)子類中,createAuthorization方法是這樣實現(xiàn)的:
public Authorization createAuthorization(String username, String password)
throws UnauthorizedException
{
if (username == null || password == null) {
throw new UnauthorizedException();
}
password = StringUtils.hash(password);
int userID = 0;
Connection con = null;
PreparedStatement pstmt = null;
try {
con = DbConnectionManager.getConnection();
pstmt = con.prepareStatement(AUTHORIZE);
pstmt.setString(1, username);
pstmt.setString(2, password);
ResultSet rs = pstmt.executeQuery();
if (!rs.next()) {
throw new UnauthorizedException();
}
userID = rs.getInt(1);
}
catch( SQLException sqle ) {
System.err.println("Exception in DbAuthorizationFactory:" + sqle);
sqle.printStackTrace();
throw new UnauthorizedException();
}
finally {
try { pstmt.close(); }
catch (Exception e) { e.printStackTrace(); }
try { con.close(); }
catch (Exception e) { e.printStackTrace(); }
}
return new DbAuthorization(userID);
}
|
在這個類中,可以看到抽象類和具體的子類之間的關(guān)系,它們是如何協(xié)作的,又是如何劃分抽象方法和非抽象方法的,這都是值得注意的地方。一般的,抽象方法需要子類來實現(xiàn),而抽象類中的非抽象方法應(yīng)該所有子類所能夠共享的,或者可是說,是定義在抽象方法之上的較高層的方法。這確實是一個抽象工廠的好例子!雖然實現(xiàn)的方法已經(jīng)和GOF中給出的實現(xiàn)相差較遠(yuǎn)了,但思想沒變,這兒的實現(xiàn),也確實是要巧妙的些。
還有就是靜態(tài)方法的使用,使得這個類看起來有些Singleton的意味。這使得對于AbstractFactory的創(chuàng)建變得簡單。
下面的類圖給出了這個AbstractFactory的實現(xiàn)的總體情況:
圖2:AbstractFactory模式的實現(xiàn)類圖
在AuthorizationFactory中定義的其它方法,涉及到具體的如何創(chuàng)建Authorization,都是作為abstract方法出現(xiàn),具體實現(xiàn)留給子類來完成。
這樣,在需要生成一個Authorization的時候,只需要調(diào)用AuthorizationFactory的靜態(tài)方法getAuthorization就可以了,由子類實現(xiàn)了具體的細(xì)節(jié)。
其它的,如同上面講到的,在創(chuàng)建Forum的時候用的ForumFactory,具有同上面一樣的實現(xiàn),這就是模式之所以稱為模式的所在了。
Proxy模式和權(quán)限控制
Proxy模式的功能有很多,比如遠(yuǎn)程代理,用來給遠(yuǎn)程對象提供一個本地代表;虛代理,用來為創(chuàng)建開大開銷的對象提供緩沖,等等。在Jive中使用的是保護(hù)代理,為被保護(hù)的對象提供權(quán)限控制。
我們都知道在一個論壇中,權(quán)限的控制是必須的,否則論壇就很可能會被搞得一團(tuán)糟。Jive中引入Proxy對象,Authorization接口以及權(quán)限描敘屬類來提供對論壇的保護(hù)。
以ForumFactory為例,一個額外的ForumFactoryProxy來處理權(quán)限認(rèn)證的工作,它為某一個ForumFactory提供了一個代理,保證只有授權(quán)的用戶才能夠存取ForumFactory的某些操作。實際上ForumFactory在這兒不僅僅只是一個生成Forum的類的,它更像是一個Forum的管理類。提供了添加,刪除,枚舉等等一系列的功能,而有些功能不是什么樣的人都可以使用的,因而引入了另外的一個代理類來處理權(quán)限的問題。
當(dāng)然,代理類需要繼承ForumFactory,以使方法簽名一致: ForumFactoryProxy extends ForumFactory
在它的構(gòu)造方法中,就提供了一個ForumFactory對象,這是需要被代理的對象;一個Authorization對象,提供用戶信息;還有一個ForumPermissions,提供認(rèn)證信息:
public ForumFactoryProxy(ForumFactory factory, Authorization authorization,
ForumPermissions permissions)
{
this.factory = factory;
this.authorization = authorization;
this.permissions = permissions;
}
|
一般的代理過程都是這樣的,在訪問某個方法之前,必須接受權(quán)限的檢查,以createForum為例:
public Forum createForum(String name, String description)
throws UnauthorizedException, ForumAlreadyExistsException
{
if (permissions.get(ForumPermissions.SYSTEM_ADMIN)) {
Forum newForum = factory.createForum(name, description);
return new ForumProxy(newForum, authorization, permissions);
}
else {
throw new UnauthorizedException();
}
}
|
下面給出這個模式的類圖:
圖3:Proxy模式的類圖
這個模式的實現(xiàn)基本上和GOF中所給出的實現(xiàn)一致。在Jive中,幾乎所有的接口,F(xiàn)orum,F(xiàn)orumMessage,F(xiàn)orumThread等等,都會有一個相應(yīng)的Proxy對象來進(jìn)行權(quán)限控制。而在創(chuàng)建具體的對象的時候,都是用相應(yīng)的Proxy對象來代替原有的對象返回的。例如在ForumFactory的getInstance()方法中需要返回一個Forum的時候,Jive是這樣做的:
public static ForumFactory getInstance(Authorization authorization) {
......
ForumFactoryProxy proxy = new ForumFactoryProxy(factory,authorization, factory.getPermissions(authorization));
return proxy;
}
|
因而,所有被創(chuàng)建的對象實際上都是Proxy對象,抽象工廠保證了沒有權(quán)限驗證的對象根本不會客戶所得到,它們只會在Proxy的內(nèi)部扮演角色,而永遠(yuǎn)不會被外部對象所存取,這樣,就從根本上保證了論壇的安全。
Decorator模式和過濾器
一般的在OO設(shè)計中,而外功能的添加是通過繼承來實現(xiàn)的,但是繼承有的時候不夠靈活,而且當(dāng)功能的組合很多的時候,繼承的子類就會成幾何級數(shù)增長,使得類多的難以控制。正是基于這樣的考慮,Decorator模式得以誕生。
Decorator模式相當(dāng)于封裝了某個特定的操作,當(dāng)某個對象需要這個操作的時候,加上這個Decorator即可。并且,多個Decorator還可以組合,以提供更多的功能。
在Jive中,Decorator模式應(yīng)用在一些過濾器(Filter)中。Filter提供對ForumMessage對象內(nèi)容的重新構(gòu)造。比如,當(dāng)一個ForumMessage對象流過一個名為FilterCodeHighlight的過濾器后,存在于消息中的所有Java源代碼文本,會被重新構(gòu)造為具有語法高亮顯示的消息。在比如,當(dāng)經(jīng)過了語法高亮修飾的消息再流過一個名為FilterHtml的過濾器后,消息中的HTML片斷會被注釋可以在HTML內(nèi)部顯示文本,這樣就防止了用戶輸入了HTML控制標(biāo)簽后,使得頁面顯示不正常的問題。
Jive中,所有的過濾器繼承于一個抽象類ForumMessageFilter,而ForumMessageFilter又實現(xiàn)了ForumMessage接口。也就是說,每一個過濾器實際上也是一個ForumMessage對象。
ForumMessageFilter中還封裝一個ForumMessage對象。進(jìn)行過濾的方法很簡單,使用的是getBody(),比如在FilterCodeHighlight這個類中:
public String getBody() {
return highlightCode(message.getBody());
}
|
highlightCode是一個private方法,實施具體的過濾的細(xì)節(jié)。getBody()方法實際上是定義在ForumMessage接口中的,當(dāng)調(diào)用過濾器的getBody()方法時,就能夠得到結(jié)構(gòu)重整后的ForumMessage對象了。這個對象可以被其他客戶引用,也可以在傳遞給另外的過濾器,實施進(jìn)一步的操作。
在實現(xiàn)一個具體的消息的過濾的時候,在Forum中有addForumMessageFilter(),applyFilters()方法,用來實現(xiàn)對過濾器的應(yīng)用。
對一個Forum,使用addForumMessageFilter()方法添加一個Filter的時候,并沒有指定一個具體的Message,而只是一個規(guī)則(Filter中封裝了過濾規(guī)則),然后applyFilter()方法中,實施這些規(guī)則:
public ForumMessage applyFilters(ForumMessage message) {
//Loop through filters and apply them
for (int i=0; i < filters.length; i++) {
message = filters[i].clone(message);
}
return message;
}
|
過濾器的clone()方法,為過濾器復(fù)制消息體。這個方法的使用,分離了在過濾器中對于消息體和過濾規(guī)則的初始化過程,這也是一個值得借鑒的技巧!
下面給出Decorator模式的類圖:
圖4:Decorator模式的類圖
我們可以看到Decorator模式實際上和Proxy模式是很相近的,但是它們代表兩個不同的功能含義。Proxy模式提供一個對象的控制,而Decorator模式則是為對象提供額外的功能。
Iterator模式和論壇的瀏覽erator模式用來分離數(shù)據(jù)結(jié)構(gòu)和遍歷算法,降低兩者之間的耦合度,以使得同一個數(shù)據(jù)結(jié)構(gòu)用不同的算法遍歷時,仍能夠具有相同的接口,另一方面,Iterator模式使得當(dāng)改換遍歷算法后,不需要更改程序的代碼。
在Java的JDK中本身就定義有一個Iterator接口,在Iterator接口中僅僅定義了三個方法,hasNext()判斷是否遍歷完最后一個元素,next()方法返回要遍歷的數(shù)據(jù)結(jié)構(gòu)中一個對象,remove()則刪除當(dāng)前對象。Jive中使用IteratorProxy抽象類繼承了這一接口。這兒Proxy的含義和上面一樣,也就是說,這個IteratorProxy出了會實現(xiàn)Iterator的遍歷功能外,還會有代理權(quán)限控制的功能。
對于論壇中的基本對象Forum,F(xiàn)orumThread,F(xiàn)orumMessage,Group,User都有相應(yīng)的遍歷器。比如對應(yīng)于Forum接口有ForumIteratorProxy對象。這個ForumIteratorProxy遍歷器就相當(dāng)于一個封裝了一系列Forum對象的集合類,通過定義好的接口hasNext()和next()可以方便的遍歷這個集合,而并不需要知道是如何遍歷這個集合的。遍歷的算法可能很簡單,也可能很復(fù)雜,但是對于外部的客戶而言,這并沒有任何的區(qū)別。
而對于論壇中具體的遍歷方法,這取決于具體的實現(xiàn),在Jive中給出的是數(shù)據(jù)庫的實現(xiàn)。
我們就以MessageIteratorProxy為例,來講解Iterator模式的用法。
DbThreadIterator對象實現(xiàn)了Iterator接口,是對于一個Thread中所有Message的遍歷器,我們來看看它是如何實現(xiàn)的。
hasNext()判斷在這個Thread中是不是還有下一條Message:
public boolean hasNext() {
if (currentIndex+1 >= messages.length) {
return false;
}
return true;
}
|
next()方法從數(shù)據(jù)庫中取出與在這個Thread中的下一條Message:
public Object next() throws java.util.NoSuchElementException {
ForumMessage message = null;
if (nextMessage != null) {
message = nextMessage;
nextMessage = null;
}
else {
message = getNextMessage();
if (message == null) {
throw new java.util.NoSuchElementException();
}
}
return message;
}
|
這樣,通過對數(shù)據(jù)庫的操作,DbThreadIterator實現(xiàn)了對一個Thread中所有Message遍歷的方法。
再ForumThread接口中有messages()方法,返回在這個Thread中的所有Message的一個遍歷器(Iterator),實際上也就是返回了一個Message的集合:
public Iterator messages();
在DbForumThread中實現(xiàn)了這個方法:
public Iterator messages() {return new DbThreadIterator(this);}
從DbForumThread的messages()方法中所返回的就是這個Thread中所有Message的一個遍歷器,通過這個遍歷器,我們就可以訪問Thread中的所有的Message了。當(dāng)然,事情還沒有完,由于權(quán)限的問題,我們還需要構(gòu)造這個遍歷器的Proxy對象,然后通過這個Proxy對象來訪問遍歷器。
下面的類圖給出了在Jive中Iterator模式的實現(xiàn)方法:
圖5:Jive中Iterator模式的實現(xiàn)
在Jive中,因為在一個Thread之下,Message是按樹形結(jié)構(gòu)組織的,因而,當(dāng)需要層級表示一個Thread中的Message之間的關(guān)系的時候,僅僅用上面講到的線性的Iterator是不夠的。這時候,對Iterator的概念進(jìn)行推廣,就引入了TreeWalker接口。
顧名思義,TreeWalker提供了遍歷一個樹和存取樹上節(jié)點的方法:
public interface TreeWalker {
public ForumMessage getRoot();
public ForumMessage getChild(ForumMessage parent, int index);
public int getChildCount(ForumMessage parent);
public int getRecursiveChildCount(ForumMessage parent);
public int getIndexOfChild(ForumMessage parent, ForumMessage child);
public boolean isLeaf(ForumMessage node);
|
TreeWalker只是Iterator的簡單推廣,并沒有Iterator應(yīng)用的那么廣泛,而且,也可以很容易的在TreeWalker上面在套一層Iterator的借口,讓它在某些情況下行使Iterator的職責(zé)。這兒就不再多討論了。
再此,Jive設(shè)計中所有涉及到的設(shè)計模式的地方,基本上都講完了,看完了之后,是不是對設(shè)計模式有了更進(jìn)一步的了解了呢?
下一部分的內(nèi)容,將會涉及到具體的編碼,深入到JSP的內(nèi)部,我們將會看到Jive中是如何實現(xiàn)可更換的Skin的,還會涉及Tag Library的一些內(nèi)容。好了,這次就到這兒了。下次再見。
轉(zhuǎn)載自http://hi.baidu.com/ahunspun/blog/item/0069084e9882a0cbd0c86a66.html
一. Input和Output
1. stream代表的是任何有能力產(chǎn)出數(shù)據(jù)的數(shù)據(jù)源,或是任何有能力接收數(shù)據(jù)的接收源。在Java的IO中,所有的stream(包括Input和Out
stream)都包括兩種類型:
1.1 以字節(jié)為導(dǎo)向的stream
以字節(jié)為導(dǎo)向的stream,表示以字節(jié)為單位從stream中讀取或往stream中寫入信息。以字節(jié)為導(dǎo)向的stream包括下面幾種類型:
1) inputstream:
1) ByteArrayInputStream:把內(nèi)存中的一個緩沖區(qū)作為InputStream使用
2) StringBufferInputStream:把一個String對象作為InputStream
3) FileInputStream:把一個文件作為InputStream,實現(xiàn)對文件的讀取操作
4) PipedInputStream:實現(xiàn)了pipe的概念,主要在線程中使用
5) SequenceInputStream:把多個InputStream合并為一個InputStream
2) Outputstream
1) ByteArrayOutputStream:把信息存入內(nèi)存中的一個緩沖區(qū)中
2) FileOutputStream:把信息存入文件中
3) PipedOutputStream:實現(xiàn)了pipe的概念,主要在線程中使用
4) SequenceOutputStream:把多個OutStream合并為一個OutStream
1.2 以Unicode字符為導(dǎo)向的stream
以Unicode字符為導(dǎo)向的stream,表示以Unicode字符為單位從stream中讀取或往stream中寫入信息。以Unicode字符為導(dǎo)向的stream包括下面幾
種類型:
1) Input Stream
1) CharArrayReader:與ByteArrayInputStream對應(yīng)
2) StringReader:與StringBufferInputStream對應(yīng)
3) FileReader:與FileInputStream對應(yīng)
4) PipedReader:與PipedInputStream對應(yīng)
2) Out Stream
1) CharArrayWrite:與ByteArrayOutputStream對應(yīng)
2) StringWrite:無與之對應(yīng)的以字節(jié)為導(dǎo)向的stream
3) FileWrite:與FileOutputStream對應(yīng)
4) PipedWrite:與PipedOutputStream對應(yīng)
以字符為導(dǎo)向的stream基本上對有與之相對應(yīng)的以字節(jié)為導(dǎo)向的stream。兩個對應(yīng)類實現(xiàn)的功能相同,字是在操作時的導(dǎo)向不同。如
CharArrayReader:和ByteArrayInputStream的作用都是把內(nèi)存中的一個緩沖區(qū)作為InputStream使用,所不同的是前者每次從內(nèi)存中讀取一個
字節(jié)的信息,而后者每次從內(nèi)存中讀取一個字符。
1.3 兩種不現(xiàn)導(dǎo)向的stream之間的轉(zhuǎn)換
InputStreamReader和OutputStreamReader:把一個以字節(jié)為導(dǎo)向的stream轉(zhuǎn)換成一個以字符為導(dǎo)向的stream。
2. stream添加屬性
2.1 “為stream添加屬性”的作用
運用上面介紹的Java中操作IO的API,我們就可完成我們想完成的任何操作了。但通過FilterInputStream和FilterOutStream的子類,我們可以
為stream添加屬性。下面以一個例子來說明這種功能的作用。
如果我們要往一個文件中寫入數(shù)據(jù),我們可以這樣操作:
FileOutStream fs = new FileOutStream(“test.txt”);
然后就可以通過產(chǎn)生的fs對象調(diào)用write()函數(shù)來往test.txt文件中寫入數(shù)據(jù)了。但是,如果我們想實現(xiàn)“先把要寫入文件的數(shù)據(jù)先緩存到內(nèi)存
中,再把緩存中的數(shù)據(jù)寫入文件中”的功能時,上面的API就沒有一個能滿足我們的需求了。但是通過FilterInputStream和FilterOutStream的
子類,為FileOutStream添加我們所需要的功能。
2.2 FilterInputStream的各種類型
2.2.1 用于封裝以字節(jié)為導(dǎo)向的InputStream
1) DataInputStream:從stream中讀取基本類型(int、char等)數(shù)據(jù)。
2) BufferedInputStream:使用緩沖區(qū)
3) LineNumberInputStream:會記錄input stream內(nèi)的行數(shù),然后可以調(diào)用getLineNumber()和setLineNumber(int)
4) PushbackInputStream:很少用到,一般用于編譯器開發(fā)
2.2.2 用于封裝以字符為導(dǎo)向的InputStream
1) 沒有與DataInputStream對應(yīng)的類。除非在要使用readLine()時改用BufferedReader,否則使用DataInputStream
2) BufferedReader:與BufferedInputStream對應(yīng)
3) LineNumberReader:與LineNumberInputStream對應(yīng)
4) PushBackReader:與PushbackInputStream對應(yīng)
2.3 FilterOutStream的各種類型
2.2.3 用于封裝以字節(jié)為導(dǎo)向的OutputStream
1) DataIOutStream:往stream中輸出基本類型(int、char等)數(shù)據(jù)。
2) BufferedOutStream:使用緩沖區(qū)
3) PrintStream:產(chǎn)生格式化輸出
2.2.4 用于封裝以字符為導(dǎo)向的OutputStream
1) BufferedWrite:與對應(yīng)
2) PrintWrite:與對應(yīng)
3. RandomAccessFile
1) 可通過RandomAccessFile對象完成對文件的讀寫操作
2) 在產(chǎn)生一個對象時,可指明要打開的文件的性質(zhì):r,只讀;w,只寫;rw可讀寫
3) 可以直接跳到文件中指定的位置
4. I/O應(yīng)用的一個例子
import java.io.*;
public class TestIO{
public static void main(String[] args)
throws IOException{
//1.以行為單位從一個文件讀取數(shù)據(jù)
BufferedReader in =
new BufferedReader(
new FileReader("F:\\nepalon\\TestIO.java"));
String s, s2 = new String();
while((s = in.readLine()) != null)
s2 += s + "\n";
in.close();
//1b. 接收鍵盤的輸入
BufferedReader stdin =
new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Enter a line:");
System.out.println(stdin.readLine());
//2. 從一個String對象中讀取數(shù)據(jù)
StringReader in2 = new StringReader(s2);
int c;
while((c = in2.read()) != -1)
System.out.println((char)c);
in2.close();
//3. 從內(nèi)存取出格式化輸入
try{
DataInputStream in3 =
new DataInputStream(
new ByteArrayInputStream(s2.getBytes()));
while(true)
System.out.println((char)in3.readByte());
}
catch(EOFException e){
System.out.println("End of stream");
}
//4. 輸出到文件
try{
BufferedReader in4 =
new BufferedReader(
new StringReader(s2));
PrintWriter out1 =
new PrintWriter(
new BufferedWriter(
new FileWriter("F:\\nepalon\\ TestIO.out")));
int lineCount = 1;
while((s = in4.readLine()) != null)
out1.println(lineCount++ + ":" + s);
out1.close();
in4.close();
}
catch(EOFException ex){
System.out.println("End of stream");
}
//5. 數(shù)據(jù)的存儲和恢復(fù)
try{
DataOutputStream out2 =
new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("F:\\nepalon\\ Data.txt")));
out2.writeDouble(3.1415926);
out2.writeChars("\nThas was pi:writeChars\n");
out2.writeBytes("Thas was pi:writeByte\n");
out2.close();
DataInputStream in5 =
new DataInputStream(
new BufferedInputStream(
new FileInputStream("F:\\nepalon\\ Data.txt")));
BufferedReader in5br =
new BufferedReader(
new InputStreamReader(in5));
System.out.println(in5.readDouble());
System.out.println(in5br.readLine());
System.out.println(in5br.readLine());
}
catch(EOFException e){
System.out.println("End of stream");
}
//6. 通過RandomAccessFile操作文件
RandomAccessFile rf =
new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
for(int i=0; i<10; i++)
rf.writeDouble(i*1.414);
rf.close();
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + ":" + rf.readDouble());
rf.close();
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
rf.seek(5*8);
rf.writeDouble(47.0001);
rf.close();
rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + ":" + rf.readDouble());
rf.close();
}
}
關(guān)于代碼的解釋(以區(qū)為單位):
1區(qū)中,當(dāng)讀取文件時,先把文件內(nèi)容讀到緩存中,當(dāng)調(diào)用in.readLine()時,再從緩存中以字符的方式讀取數(shù)據(jù)(以下簡稱“緩存字節(jié)讀取方
式”)。
1b區(qū)中,由于想以緩存字節(jié)讀取方式從標(biāo)準(zhǔn)IO(鍵盤)中讀取數(shù)據(jù),所以要先把標(biāo)準(zhǔn)IO(System.in)轉(zhuǎn)換成字符導(dǎo)向的stream,再進(jìn)行
BufferedReader封裝。
2區(qū)中,要以字符的形式從一個String對象中讀取數(shù)據(jù),所以要產(chǎn)生一個StringReader類型的stream。
4區(qū)中,對String對象s2讀取數(shù)據(jù)時,先把對象中的數(shù)據(jù)存入緩存中,再從緩沖中進(jìn)行讀取;對TestIO.out文件進(jìn)行操作時,先把格式化后的信
息輸出到緩存中,再把緩存中的信息輸出到文件中。
5區(qū)中,對Data.txt文件進(jìn)行輸出時,是先把基本類型的數(shù)據(jù)輸出屋緩存中,再把緩存中的數(shù)據(jù)輸出到文件中;對文件進(jìn)行讀取操作時,先把文
件中的數(shù)據(jù)讀取到緩存中,再從緩存中以基本類型的形式進(jìn)行讀取。注意in5.readDouble()這一行。因為寫入第一個writeDouble(),所以為了
正確顯示。也要以基本類型的形式進(jìn)行讀取。
6區(qū)是通過RandomAccessFile類對文件進(jìn)行操作。
摘要: 感謝ryang的勞動!
Java實現(xiàn)通用線程池
線程池通俗的描述就是預(yù)先創(chuàng)建若干空閑線程,等到需要用多線程去處理事務(wù)的時候去喚醒某些空閑線程執(zhí)行處理任務(wù),這樣就省去了頻繁創(chuàng)建線程的時間,因為頻繁創(chuàng)建線程是要耗費大量的CPU資源的。如果一個應(yīng)用程序需要頻繁地處理大量并發(fā)事務(wù),不斷的創(chuàng)建銷毀線程往往會大大地降低系統(tǒng)的效率,這時候線程池就派上用場了。 &...
閱讀全文
虛擬機(jī)加載類的途徑:
1、Dog dog = new Dog();
這個動作會導(dǎo)致常量池的解析,Dog類被隱式裝載。
如果當(dāng)前ClassLoader無法找到Dog,則拋出NoClassDefFoundError。
2、Class clazz = Class.forName(“Dog”);
Object dog =clazz.newInstance();
通過反射加載類型,并創(chuàng)建對象實例
如果無法找到Dog,則拋出ClassNotFoundException。
3、Class clazz = classLoader.loadClass(“Dog”);
Object dog =clazz.newInstance();
通過反射加載類型,并創(chuàng)建對象實例
如果無法找到Dog,則拋出ClassNotFoundException。
那么,1和2和3究竟有什么區(qū)別呢?分別用于什么情況呢?
1和2使用的類加載器是相同的,都是當(dāng)前類加載器。(即:this.getClass.getClassLoader)。
3由用戶指定類加載器。
如果需要在當(dāng)前類路徑以外尋找類,則只能采用第3種方式。第3種方式加載的類與當(dāng)前類分屬不同的命名空間。
當(dāng)前類加載器命名空間對其不可見。當(dāng)然,如果被加載類的超類對于當(dāng)前類命名空間可見的話,則可以進(jìn)行強制轉(zhuǎn)型。
第1和第2種情況區(qū)別不大。如果,Dog類在編譯時無法得到,則使用第2種方式。
另外,第1種和第2種都會導(dǎo)致類被初始化,即:執(zhí)行類的靜態(tài)初始化語句,而第3種情況不會。
另外注意,第1種拋出Error,第2、3種拋出Exception,它們分屬于不同的異常/錯誤分支。
JAVA 方面
1 面向?qū)ο蟮奶卣饔心男┓矫?br>2 String 是最基本的數(shù)據(jù)類型嗎?
3 int 和 Integer 有什么區(qū)別
4 String 和StringBuffer 的區(qū)別
5 運行時異常與一般異常有何異同?
異常表示程序運行過程中可能出現(xiàn)的非正常狀態(tài),運行時異常表示虛擬機(jī)的通常
操作中可能遇到的異常,是一種常見運行錯誤。java 編譯器要求方法必須聲明拋
出可能發(fā)生的非運行時異常,但是并不要求必須聲明拋出未被捕獲的運行時異
常。
6 說出一些常用的類,包,接口,請各舉5 個
7 說出ArrayList,Vector, LinkedList 的存儲性能和特性
ArrayList 和Vector 都是使用數(shù)組方式存儲數(shù)據(jù),此數(shù)組元素數(shù)大于實際存儲的
數(shù)據(jù)以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉
及數(shù)組元素移動等內(nèi)存操作,所以索引數(shù)據(jù)快而插入數(shù)據(jù)慢,Vector 由于使用了
synchronized 方法(線程安全),通常性能上較ArrayList 差,而LinkedList 使用
雙向鏈表實現(xiàn)存儲,按序號索引數(shù)據(jù)需要進(jìn)行前向或后向遍歷,但是插入數(shù)據(jù)時
只需要記錄本項的前后項即可,所以插入速度較快。
8 設(shè)計4 個線程,其中兩個線程每次對j 增加1,另外兩個線程對j 每次減少1。
寫出程序。
以下程序使用內(nèi)部類實現(xiàn)線程,對j 增減的時候沒有考慮順序問題。
public class ThreadTest1{
private int j;
public static void main(String args[]){
ThreadTest1 tt=new ThreadTest1();
Inc inc=tt.new Inc();
Dec dec=tt.new Dec();
for(int i=0;i<2;i++){
Thread t=new Thread(inc);
t.start();
t=new Thread(dec);
t.start();
}
}
private synchronized void inc(){
j++;
System.out.println(Thread.currentThread().getName()+"-inc:"+j);
}
private synchronized void dec(){
j--;
System.out.println(Thread.currentThread().getName()+"-dec:"+j);
}
class Inc implements Runnable{
public void run(){
for(int i=0;i<100;i++){
inc();
}
}
}
class Dec implements Runnable{
public void run(){
for(int i=0;i<100;i++){
dec();
}
}
}
}
9.JSP 的內(nèi)置對象及方法。
request request 表示HttpServletRequest 對象。它包含了有關(guān)瀏覽器請求的信息,并且提
供了幾個用于獲取cookie, header, 和session 數(shù)據(jù)的有用的方法。
response response 表示HttpServletResponse 對象,并提供了幾個用于設(shè)置送回 瀏覽器的
響應(yīng)的方法(如cookies,頭信息等)
out out 對象是javax.jsp.JspWriter 的一個實例,并提供了幾個方法使你能用于向瀏覽器回
送輸出結(jié)果。
pageContext pageContext 表示一個javax.servlet.jsp.PageContext 對象。它是用于方便存
取各種范圍的名字空間、servlet 相關(guān)的對象的API,并且包裝了通用的servlet 相關(guān)功能的
方法。
session session 表示一個請求的javax.servlet.http.HttpSession 對象。Session 可以存貯用
戶的狀態(tài)信息
application applicaton 表示一個javax.servle.ServletContext 對象。這有助于查找有關(guān)
servlet 引擎和servlet 環(huán)境的信息
config config 表示一個javax.servlet.ServletConfig 對象。該對象用于存取servlet 實例的初
始化參數(shù)。
page page 表示從該頁面產(chǎn)生的一個servlet 實例
10.用socket 通訊寫出客戶端和服務(wù)器端的通訊,要求客戶發(fā)送數(shù)據(jù)后能夠回顯
相同的數(shù)據(jù)。
參見課程中socket 通訊例子。
11 說出Servlet 的生命周期,并說出Servlet 和CGI 的區(qū)別。
Servlet 被服務(wù)器實例化后,容器運行其init 方法,請求到達(dá)時運行其service 方
法,service 方法自動派遣運行與請求對應(yīng)的doXXX 方法(doGet,doPost)等,
當(dāng)服務(wù)器決定將實例銷毀的時候調(diào)用其destroy 方法。
與cgi 的區(qū)別在于servlet 處于服務(wù)器進(jìn)程中,它通過多線程方式運行其service
方法,一個實例可以服務(wù)于多個請求,并且其實例一般不會銷毀,而CGI 對每
個請求都產(chǎn)生新的進(jìn)程,服務(wù)完成后就銷毀,所以效率上低于servlet。
12.EJB 是基于哪些技術(shù)實現(xiàn)的?并說出SessionBean 和EntityBean 的區(qū)別,
StatefulBean 和StatelessBean 的區(qū)別。
13.EJB 包括(SessionBean,EntityBean)說出他們的生命周期,及如何管理事務(wù)
的?
14.說出數(shù)據(jù)連接池的工作機(jī)制是什么?
15 同步和異步有和異同,在什么情況下分別使用他們?舉例說明。
16 應(yīng)用服務(wù)器有那些?
17 你所知道的集合類都有哪些?主要方法?
18 給你一個:驅(qū)動程序A,數(shù)據(jù)源名稱為B,用戶名稱為C,密碼為D,數(shù)據(jù)庫表為T,
請用JDBC 檢索出表T 的所有數(shù)據(jù)。
19.說出在JSP 頁面里是怎么分頁的?
頁面需要保存以下參數(shù):
總行數(shù):根據(jù)sql 語句得到總行數(shù)
每頁顯示行數(shù):設(shè)定值
當(dāng)前頁數(shù):請求參數(shù)
頁面根據(jù)當(dāng)前頁數(shù)和每頁行數(shù)計算出當(dāng)前頁第一行行數(shù),定位結(jié)果集到此行,對
結(jié)果集取出每頁顯示行數(shù)的行即可。
數(shù)據(jù)庫方面:
1. 存儲過程和函數(shù)的區(qū)別
存儲過程是用戶定義的一系列sql 語句的集合,涉及特定表或其它對象
的任務(wù),用戶可以調(diào)用存儲過程,而函數(shù)通常是數(shù)據(jù)庫已定義的方法,
它接收參數(shù)并返回某種類型的值并且不涉及特定用戶表。
2. 事務(wù)是什么?
事務(wù)是作為一個邏輯單元執(zhí)行的一系列操作,一個邏輯工作單元必須有四個
屬性,稱為 ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才能成
為一個事務(wù):
原子性
事務(wù)必須是原子工作單元;對于其數(shù)據(jù)修改,要么全都執(zhí)行,要么全都不執(zhí)行。
一致性
事務(wù)在完成時,必須使所有的數(shù)據(jù)都保持一致狀態(tài)。在相關(guān)數(shù)據(jù)庫中,所有規(guī)則
都必須應(yīng)用于事務(wù)的修改,以保持所有數(shù)據(jù)的完整性。事務(wù)結(jié)束時,所有的內(nèi)部
數(shù)據(jù)結(jié)構(gòu)(如 B 樹索引或雙向鏈表)都必須是正確的。
隔離性
由并發(fā)事務(wù)所作的修改必須與任何其它并發(fā)事務(wù)所作的修改隔離。事務(wù)查看數(shù)據(jù)
時數(shù)據(jù)所處的狀態(tài),要么是另一并發(fā)事務(wù)修改它之前的狀態(tài),要么是另一事務(wù)修
改它之后的狀態(tài),事務(wù)不會查看中間狀態(tài)的數(shù)據(jù)。這稱為可串行性,因為它能夠
重新裝載起始數(shù)據(jù),并且重播一系列事務(wù),以使數(shù)據(jù)結(jié)束時的狀態(tài)與原始事務(wù)執(zhí)
行的狀態(tài)相同。
持久性
事務(wù)完成之后,它對于系統(tǒng)的影響是永久性的。該修改即使出現(xiàn)系統(tǒng)故障也將一
直保持。
3. 游標(biāo)的作用?如何知道游標(biāo)已經(jīng)到了最后?
游標(biāo)用于定位結(jié)果集的行,通過判斷全局變量@@FETCH_STATUS 可以判
斷是否到了最后,通常此變量不等于0 表示出錯或到了最后。
4. 觸發(fā)器分為事前觸發(fā)和事后觸發(fā),這兩種觸發(fā)有和區(qū)別。語句級觸發(fā)和
行級觸發(fā)有何區(qū)別。
事前觸發(fā)器運行于觸發(fā)事件發(fā)生之前,而事后觸發(fā)器運行于觸發(fā)事件發(fā)
生之后。通常事前觸發(fā)器可以獲取事件之前和新的字段值。
語句級觸發(fā)器可以在語句執(zhí)行前或后執(zhí)行,而行級觸發(fā)在觸發(fā)器所影響
的每一行觸發(fā)一次。
http://www.zhuicha.com/zhuicha/onlineHB/linuxcmd/ 此網(wǎng)站列舉了常用命令
文件傳輸
備份壓縮
文件管理
磁盤管理
磁盤維護(hù)
系統(tǒng)設(shè)置
系統(tǒng)管理
文檔編輯
網(wǎng)絡(luò)通訊
電子郵件與新聞組
X WINDOWS SYSTEM