1.如果你在堅(jiān)持做某件事,其實(shí)你很脆弱,你在強(qiáng)迫自己做一件事,因?yàn)槟阈睦镉幸粋€(gè)度,此時(shí)這個(gè)度大于這件需要堅(jiān)持的事,如果有某件事物干擾,超越了這個(gè)度呢?就出現(xiàn)所謂的堅(jiān)持不下去了。
2.如果你習(xí)慣于做某件事,這時(shí)候潛意識(shí)里無(wú)理由就要做這件事,自動(dòng),條件反射,基本上不會(huì)不爽,可是,如果有意識(shí)覺(jué)得某樣?xùn)|西超越這個(gè)習(xí)慣,這個(gè)習(xí)慣就被打破了,所以還是度的問(wèn)題。
3.如果你已經(jīng)形成某種信仰,真正的堅(jiān)信不移,你就可怕了,你的度是無(wú)窮大,給定一個(gè)任意大的理由,卻總存在一個(gè)更大的理由,去執(zhí)行自己的信仰,毫不動(dòng)搖。
所以,信仰>習(xí)慣>堅(jiān)持。
……
傳說(shuō),看客們有70%會(huì)相信以上論調(diào),5%會(huì)因此改變自己,只有若干人會(huì)建立自己的信仰。
?? A DO:
?? 1.好好工作
?? 2.以結(jié)婚為目的找一個(gè)女朋友,解決個(gè)人問(wèn)題。
?? 3.多運(yùn)動(dòng),成為一個(gè)“肌肉男”。
?? 濤哥:
?? 1.租一個(gè)大大的房子,大家來(lái)廣州好好落腳。
?? 2.好好掙錢(qián),為成家做準(zhǔn)備。
?? 3.還債。
?? 濤嫂:
?? 1.掙錢(qián)。
?? 2.掙錢(qián)。
?? 3.還是掙錢(qián)。
?? 韓老大:
?? 1.吃遍公司附近的餐館。
?? 2.還Banner的¥735.00元。
???3.半年內(nèi)保持單身。
?? 老毛:
?? 1.找一女朋友解決單身問(wèn)題,首當(dāng)其沖。
?? 2.繼續(xù)彩票事業(yè),多買(mǎi)多賺,以500W和LAMBORGHINI為目標(biāo)。
?? 3.任勞任怨,踏實(shí)工作。
澳門(mén)仔自歸大陸后,身形愈發(fā)消瘦,思循古法于入冬時(shí)加以補(bǔ)養(yǎng)。【注意身形愈發(fā)消瘦不是去了澳門(mén)才造成的,沒(méi)看到我天天堅(jiān)持跑步啊,鍛煉結(jié)果Keep Fit,知不知啊】小三川之味,已去數(shù)次,漸厭之,眾人遂奔大巴適。為犒此仔拔毛之舉,夜敲此篇“老毛”,為RICA人物列傳開(kāi)刀之作【很榮幸啊,看來(lái)錢(qián)沒(méi)有白花啊,雖然錢(qián)也是從萬(wàn)惡的
Casino
拿來(lái)的,但誰(shuí)知下次會(huì)不會(huì)再還回去呢】。
??? 吾與此猥物同床異枕二載有余,甚悉之。【這話(huà)說(shuō)的,我是和你對(duì)腳,不是同床。反正我是沒(méi)有gay傾向,至于你有沒(méi)有我就不知啦】老毛悄然行至身后,吾不待轉(zhuǎn)首即感猥瑣之氣鋪天蓋地,料定必是此物,老毛訝之?!緦?duì)我如此之關(guān)切,更加證明你的取向有問(wèn)題,以后注意和我保持距離】
??? 此君好戴一寵物圈于項(xiàng),名曰健身,實(shí)未見(jiàn)效,【帶鈦白項(xiàng)圈好處有二:1.防止腰肌勞損,知不知腰對(duì)男人的重要性啊。2.美觀,引領(lǐng)時(shí)尚之風(fēng),君不見(jiàn)劉德華也開(kāi)始學(xué)樣了嘛?!糠从凶璐竽X供養(yǎng)之嫌,何以為證?近日老毛言語(yǔ)迥異于常。濤哥、阿杜皆不堪其擾,存滅其肉體而后快之意。老毛以寡敵眾,慷慨應(yīng)對(duì),屢除其自生大規(guī)模殺傷化學(xué)武器保險(xiǎn),置于寢室上風(fēng)處,隨即頹勢(shì)立轉(zhuǎn)。【我有這么殘忍嘛,要怪就怪安踏不透氣,無(wú)心之作?!坑喔`以為此乃老毛漸歸本性之兆。
??? 老毛長(zhǎng)于言辯,眼光敏銳,領(lǐng)風(fēng)氣之先(數(shù)度拉吾下水),思維極為跳躍,擅傷女仔之心(略去數(shù)萬(wàn)言。。。),而討大媽歡心?!痉戳朔戳耍瑥膩?lái)都是我被別人挫傷?!棵湍?span lang="EN-US">CALL之“猥瑣毛”,頗為傳神。【保留申辯的權(quán)利】此仔將混跡于珠海某著名CM公司,余甚憂(yōu)之。澳門(mén)場(chǎng)暗備此仔諸多劣跡,若這廝任職CM毛總,無(wú)間道恐將由其主演【雖然我玩了5次,大部分是有掙,誰(shuí)知?jiǎng)e人是不是小餌釣大魚(yú)】。。。
PS:覓兔肉于巴適,半餉而不可得,痛憾之~
【感謝韓老大為我研究生三年做了個(gè)簡(jiǎn)要的總結(jié),雖然大部分不是好話(huà),弄得我都不好到處貼??偸菫槲艺砹讼滤悸?,開(kāi)始寫(xiě)自序了!】
二十歲之前相信的很多東西,后來(lái)一件一件變成不相信。
曾經(jīng)相信過(guò)愛(ài)國(guó),后來(lái)知道“國(guó)”的定義有問(wèn)題,通常那循循善誘要你愛(ài)國(guó)的人所定義的“國(guó)”,不一定可愛(ài),不一定值得愛(ài),而且更可能值得推翻。
曾經(jīng)相信過(guò)歷史,后來(lái)知道,原來(lái)歷史的一半是編造。前朝史永遠(yuǎn)是后朝人在寫(xiě),后朝人永遠(yuǎn)在否定前朝,他的后朝又來(lái)否定他,但是負(fù)負(fù)不一定得正,只是累積漸進(jìn)的扭曲變形移位,使真相永遠(yuǎn)掩蓋,無(wú)法復(fù)原。說(shuō)“不容青史盡成灰”,表達(dá)的正是,不錯(cuò),青史往往是要成灰的。指鹿為馬,也往往是可以得逞和勝利的。
曾經(jīng)相信過(guò)文明的力量,后來(lái)知道,原來(lái)人的愚昧和野蠻不因文明的進(jìn)展而消失,只是愚昧野蠻有很多不同的面貌:純樸的農(nóng)民工人、深沉的知識(shí)分子、自信的政治領(lǐng)袖、替天行道的王師,都可能有不同形式的巨大愚昧和巨大野蠻,而且野蠻和文明之間,竟然只有極其細(xì)微、隨時(shí)可以被抹掉的一線(xiàn)之隔。
曾經(jīng)相信過(guò)正義,后來(lái)知道,原來(lái)同時(shí)完全可以存在兩種正義,而且彼此抵觸,冰火不容。選擇其中之一,正義同時(shí)就意味著不正義。而且,你絕對(duì)看不出,某些人在某一個(gè)特定的時(shí)機(jī)熱烈主張某一個(gè)特定的正義,其中隱藏著深不可測(cè)的不正義。
曾經(jīng)相信過(guò)理想主義者,后來(lái)知道,理想主義者往往經(jīng)不起權(quán)力的測(cè)試:一掌有權(quán)力,他或者變成當(dāng)初自己誓死反對(duì)的“邪惡”,或者,他在現(xiàn)實(shí)的場(chǎng)域里不堪一擊,一下就被弄權(quán)者拉下馬來(lái),完全沒(méi)有機(jī)會(huì)去實(shí)現(xiàn)他的理想。理想主義者要有品格,才能不被權(quán)力腐化;理想主義者要有能力,才能將理想轉(zhuǎn)化為實(shí)踐??墒抢硐胫髁x者兼具品格及能力者,幾希。
曾經(jīng)相信過(guò)愛(ài)情,后來(lái)知道,原來(lái)愛(ài)情必須轉(zhuǎn)化為親情才可能持久,但是轉(zhuǎn)化為親情的愛(ài)情,猶如化入杯水中的冰塊---它還是冰塊嗎?
曾經(jīng)相信過(guò)??菔癄€作為永恒不滅的表征,后來(lái)知道,原來(lái)海其實(shí)很容易枯,石,原來(lái)很容易爛。雨水,很可能不再來(lái),滄海,不會(huì)再成桑田。原來(lái),自己腳下所踩的地球,很容易被毀滅。??菔癄€的永恒,原來(lái)不存在。
二十歲之前相信的很多東西,有些其實(shí)到今天也還相信。
譬如國(guó)也許不可愛(ài),但是土地和人可以愛(ài)。譬如史也許不能信,但是對(duì)于真相的追求可以無(wú)止盡。譬如文明也許脆弱不堪,但是除文明外我們其實(shí)別無(wú)依靠。譬如正義也許極為可疑,但是在乎正義比不在乎要安全。譬如理想主義者也許成就不了大事大業(yè),但是沒(méi)有他們社會(huì)一定不一樣。譬如愛(ài)情總是幻滅的多,但是螢火蟲(chóng)在夜里發(fā)光從來(lái)就不是為了保持光。譬如海枯石爛的永恒也許不存在,但是如果一粒沙里有一個(gè)無(wú)窮的宇宙,一剎那里想必也有一個(gè)不變不移的時(shí)間。
那么,有沒(méi)有什么,是我二十歲前不相信的,現(xiàn)在卻信了呢?
有的,不過(guò)都是些最平凡的老生常談。曾經(jīng)不相信“性格決定命運(yùn)”,現(xiàn)在相信了。曾經(jīng)不相信“色即是空”,現(xiàn)在相信了。曾經(jīng)不相信“船到橋頭自然直”,現(xiàn)在有點(diǎn)信了。曾經(jīng)不相信無(wú)法實(shí)證的事情,現(xiàn)在也還沒(méi)準(zhǔn)備相信,但是,有些無(wú)關(guān)實(shí)證的感覺(jué),我明白了,譬如李叔同圓寂前最后的手書(shū):“君子之交,其淡如水,執(zhí)象而求,咫尺千里。問(wèn)余何適,廓爾忘言,華枝春滿(mǎn),天心月圓?!?/p>
相信與不相信之間,彷佛還有令人沉吟的深度。
8.異常,如果對(duì)try{}catch(exception o){}的所有catch情況都考慮到了的話(huà),調(diào)用者就不需要添加catch或throw exception啦
9.文件流: 分為字節(jié)流( 帶Input)和字符流(帶reader)
????????????? 例如FileInputStream??? 例如FileReader
?????????? 字符流不依賴(lài)於編碼,全部采用unicode編碼
?????????? 如果需要支持國(guó)際化的話(huà)就需要采用直接流啦 。
?????????? 示例:? FileInputStream is=new FileInputStream(f);
?????????????????? InputStreamReader r=new InputSteamReader(is,"utf-8");
? 另外可以使用System.getProperty("file.endcoding")來(lái)獲得系統(tǒng)的默認(rèn)編碼
10,數(shù)組和矢量Vector比較? 遍歷Vector比較慢,因?yàn)閂ector是線(xiàn)程安全的,獲取值時(shí)采用了同步化,解決方法在遍歷是toArray()
??? 例外ArrayList具有vector的動(dòng)態(tài)增加長(zhǎng)度的特點(diǎn),但ArrayList是非同步的矢量。
11.在循環(huán)體內(nèi)鏈接字符串,使用StringBuffer效率更高;其他情況下使用+。
為什么會(huì)業(yè)務(wù)邏輯層使用if else,其實(shí)使用者的目的也是為了重用,但是這是面向過(guò)程編程的重用,程序員只看到代碼重用,因?yàn)樗吹絠f else幾種情況下大部分代碼都是重復(fù)的,只有個(gè)別不同,因此使用if else可以避免重復(fù)代碼,并且認(rèn)為這是模板Template模式。
他范的錯(cuò)誤是:程序員只從代碼運(yùn)行順序這個(gè)方向來(lái)看待它的代碼,這種思維類(lèi)似水管或串行電路,水沿著水管流動(dòng)(代碼運(yùn)行次序),當(dāng)遇到幾個(gè)分管(子管),就分到這幾個(gè)分管子在流動(dòng),這里就相當(dāng)于碰到代碼的if else處了。
而使用OO,則首先打破這個(gè)代碼由上向下順序等同于運(yùn)行時(shí)的先后循序這個(gè)規(guī)律,代碼結(jié)構(gòu)不由執(zhí)行循序決定,由什么決定呢?由OO設(shè)計(jì);設(shè)計(jì)模式會(huì)取代這些if else,但是最后總是由一個(gè)Service等總類(lèi)按照運(yùn)行順序組裝這些OO模塊,只有一處,這處可包含事務(wù),一般就是Service,EJB中是Session bean。
一旦需求變化,我們更多的可能是Service中各個(gè)OO模塊,甚至是只改動(dòng)Service中的OO模塊執(zhí)行順序就能符合需求。
這里我們也看到OO分離的思路,將以前過(guò)程語(yǔ)言的一個(gè)Main函數(shù)徹底分解,將運(yùn)行順序與代碼其他邏輯分離開(kāi)來(lái),而不是象面向過(guò)程那樣混亂在一起。所以有人感慨,OO也是要順序的,這是肯定的,關(guān)鍵是運(yùn)行順序要單獨(dú)分離出來(lái)。
是否有if else可以看出你有沒(méi)有將運(yùn)行順序分離到家。
設(shè)計(jì)模式的切入口
經(jīng)常有人反映,設(shè)計(jì)模式是不錯(cuò),但是我很難用到,其實(shí)如果你使用if else來(lái)寫(xiě)代碼時(shí)(除顯示控制以外),就是在寫(xiě)業(yè)務(wù)邏輯,只不過(guò)使用簡(jiǎn)單的判斷語(yǔ)句來(lái)作為現(xiàn)實(shí)情況的替代者。
還是以大家熟悉的論壇帖子為例子,如ForumMessage是一個(gè)模型,但是實(shí)際中帖子分兩種性質(zhì):主題貼(第一個(gè)根貼)和回帖(回以前帖子的帖子),這里有一個(gè)樸素的解決方案:
建立一個(gè)ForumMessage,然后在ForumMessage加入isTopic這樣判斷語(yǔ)句,注意,你這里一個(gè)簡(jiǎn)單屬性的判斷引入,可能導(dǎo)致你的程序其他地方到處存在if else 的判斷。
如果我們改用另外一種分析實(shí)現(xiàn)思路,以對(duì)象化概念看待,實(shí)際中有主題貼和回帖,就是兩種對(duì)象,但是這兩種對(duì)象大部分是一致的,因此,我將ForumMessage設(shè)為表達(dá)主題貼;然后創(chuàng)建一個(gè)繼承ForumMessage的子類(lèi)ForumMessageReply作為回帖,這樣,我在程序地方,如Service中,我已經(jīng)確定這個(gè)Model是回帖了,我就直接下溯為ForumMessageReply即可,這個(gè)有點(diǎn)類(lèi)似向Collection放入對(duì)象和取出時(shí)的強(qiáng)制類(lèi)型轉(zhuǎn)換。通過(guò)這個(gè)手段我消滅了以后程序中if else的判斷語(yǔ)句出現(xiàn)可能。
從這里體現(xiàn)了,如果分析方向錯(cuò)誤,也會(huì)導(dǎo)致誤用模式。
討論設(shè)計(jì)模式舉例,不能沒(méi)有業(yè)務(wù)上下文場(chǎng)景的案例,否則無(wú)法決定是否該用模式,下面舉兩個(gè)對(duì)比的例子:
第一. 這個(gè)帖子中舉例的第一個(gè)代碼案例是沒(méi)有上下文的,文中只說(shuō)明有一段代碼:
main() {
if(case A){ //do with strategy A }else(case B){ //do with strategy B }else(case C){ //do with strategy C } } | ? |
這段代碼只是純粹的代碼,沒(méi)有業(yè)務(wù)功能,所以,在這種情況下,我們就很難確定使用什么模式,就是一定用策略模式等,也逃不過(guò)還是使用if else的命運(yùn),設(shè)計(jì)模式不是魔法,不能將一段毫無(wú)意義的代碼變得簡(jiǎn)單了,只能將其體現(xiàn)的業(yè)務(wù)功能更加容易可拓展了。
第二.在這個(gè)帖子中,作者舉了一個(gè)PacketParser業(yè)務(wù)案例,這段代碼是體現(xiàn)業(yè)務(wù)功能的,是一個(gè)數(shù)據(jù)包的分析,作者也比較了各種模式使用的不同,所以我們還是使用動(dòng)態(tài)代理模式或Command模式來(lái)消滅那些可能存在的if else
由以上兩個(gè)案例表明:業(yè)務(wù)邏輯是我們使用設(shè)計(jì)模式的切入點(diǎn),而在分解業(yè)務(wù)邏輯時(shí),我們習(xí)慣則可能使用if else來(lái)實(shí)現(xiàn),當(dāng)你有這種企圖或者已經(jīng)實(shí)現(xiàn)代碼了,那么就應(yīng)該考慮是否需要重構(gòu)Refactoring了。
if else替代者
那么實(shí)戰(zhàn)中,哪些設(shè)計(jì)模式可以替代if else呢?其實(shí)GoF設(shè)計(jì)模式都可以用來(lái)替代if else,我們分別描述如下:
? public class Order{ private int status; //說(shuō)明: //status=1 表示訂貨但為查看 ; //status=2 表示已經(jīng)查看未處理; //status=3 表示已經(jīng)處理未付款 //status=4 表示已經(jīng)付款未發(fā)貨 //status=5 表示已經(jīng)發(fā)貨 } |
OO設(shè)計(jì)的總結(jié)
還有一種偽模式,雖然使用了狀態(tài)等模式,但是在模式內(nèi)部實(shí)質(zhì)還是使用if else或switch進(jìn)行狀態(tài)切換或重要條件判斷,那么無(wú)疑說(shuō)明還需要進(jìn)一步努力。更重要的是,不能以模式自居,而且出書(shū)示人。
真正掌握面向?qū)ο筮@些思想是一件困難的事情,目前有各種屬于揪著自己頭發(fā)向上拔的解說(shuō),都是誤人子弟的,所以我覺(jué)得初學(xué)者讀Thinking in Java(Java編程思想)是沒(méi)有用,它試圖從語(yǔ)言層次來(lái)講OO編程思想,非常失敗,作為語(yǔ)言參考書(shū)可以,但是作為Java體現(xiàn)的OO思想的學(xué)習(xí)資料,就錯(cuò)了。
OO編程思想是一種方法論,方法論如果沒(méi)有應(yīng)用比較,是無(wú)法體會(huì)這個(gè)方法論的特點(diǎn)的,禪是古代一個(gè)方法論,悟禪是靠挑水砍柴這些應(yīng)用才能體會(huì)。
那么OO思想靠什么應(yīng)用能夠體會(huì)到了?是GoF設(shè)計(jì)模式,GoF設(shè)計(jì)模式是等于軟件人員的挑水砍柴等基本活,所以,如果一個(gè)程序員連基本活都不會(huì),他何以自居OO程序員?從事OO專(zhuān)業(yè)設(shè)計(jì)編程這個(gè)工作,如果不掌握設(shè)計(jì)模式基本功,就象一個(gè)做和尚的人不愿意挑水砍柴,他何以立足這個(gè)行業(yè)?早就被師傅趕下山。
最后總結(jié):將if else用在小地方還可以,如簡(jiǎn)單的數(shù)值判斷;但是如果按照你的傳統(tǒng)習(xí)慣思維,在實(shí)現(xiàn)業(yè)務(wù)功能時(shí)也使用if else,那么說(shuō)明你的思維可能需要重塑,你的編程經(jīng)驗(yàn)越豐富,傳統(tǒng)過(guò)程思維模式就容易根深蒂固,想靠自己改變很困難;建議接受專(zhuān)業(yè)頭腦風(fēng)暴培訓(xùn)。
用一句話(huà)總結(jié):如果你做了不少系統(tǒng),很久沒(méi)有使用if else了,那么說(shuō)明你可能真正進(jìn)入OO設(shè)計(jì)的境地了。(這是本人自己發(fā)明的實(shí)戰(zhàn)性的衡量考核標(biāo)準(zhǔn))。
1. 常用快捷鍵
(1)Ctrl+Space
說(shuō)明:內(nèi)容助理。提供對(duì)方法,變量,參數(shù),javadoc等得提示,應(yīng)運(yùn)在多種場(chǎng)合,總之需要提示的時(shí)候可先按此快捷鍵。
注:避免輸入法的切換設(shè)置與此設(shè)置沖突
(2)Ctrl+Shift+Space
說(shuō)明:變量提示
(3)Ctrl+/
說(shuō)明:添加/消除//注釋,在eclipse2.0中,消除注釋為Ctrl+\
(4)Ctrl+Shift+/
說(shuō)明:添加/* */注釋
(5)Ctrl+Shift+\
說(shuō)明:消除/* */注釋
(6)Ctrl+Shift+F
說(shuō)明:自動(dòng)格式化代碼
(7)Ctrl+1
說(shuō)明:批量修改源代碼中的變量名,此外還可用在catch塊上.
(8)Ctril+F6
說(shuō)明:界面切換
(9)Ctril+Shift+M
說(shuō)明:查找所需要得包
(10)Ctril+Shift+O
說(shuō)明:自動(dòng)引入所需要得包
(11)Ctrl+Alt+S
說(shuō)明:源代碼得快捷菜單。其中的Generate getters and setters 和 Surround with try/catch
block比較常用.建議把它們添加為快捷鍵.快捷鍵設(shè)置在windows->preferences->Workbench->Keys
2. 快捷鍵列表
編輯
作用域 功能 快捷鍵
全局 查找并替換 Ctrl+F
文本編輯器 查找上一個(gè) Ctrl+Shift+K
文本編輯器 查找下一個(gè) Ctrl+K
全局 撤銷(xiāo) Ctrl+Z
全局 復(fù)制 Ctrl+C
全局 恢復(fù)上一個(gè)選擇 Alt+Shift+↓
全局 剪切 Ctrl+X
全局 快速修正 Ctrl1+1
全局 內(nèi)容輔助 Alt+/
全局 全部選中 Ctrl+A
全局 刪除 Delete
全局 上下文信息 Alt+?Alt+Shift+?Ctrl+Shift+Space
Java編輯器 顯示工具提示描述 F2
Java編輯器 選擇封裝元素 Alt+Shift+↑
Java編輯器 選擇上一個(gè)元素 Alt+Shift+←
Java編輯器 選擇下一個(gè)元素 Alt+Shift+→
文本編輯器 增量查找 Ctrl+J
文本編輯器 增量逆向查找 Ctrl+Shift+J
全局 粘貼 Ctrl+V
全局 重做 Ctrl+Y
查看
作用域 功能 快捷鍵
全局 放大 Ctrl+=
全局 縮小 Ctrl+-
窗口
作用域 功能 快捷鍵
全局 激活編輯器 F12
全局 切換編輯器 Ctrl+Shift+W
全局 上一個(gè)編輯器 Ctrl+Shift+F6
全局 上一個(gè)視圖 Ctrl+Shift+F7
全局 上一個(gè)透視圖 Ctrl+Shift+F8
全局 下一個(gè)編輯器 Ctrl+F6
全局 下一個(gè)視圖 Ctrl+F7
全局 下一個(gè)透視圖 Ctrl+F8
文本編輯器 顯示標(biāo)尺上下文菜單 Ctrl+W
全局 顯示視圖菜單 Ctrl+F10
全局 顯示系統(tǒng)菜單 Alt+-
導(dǎo)航
作用域 功能 快捷鍵
Java編輯器 打開(kāi)結(jié)構(gòu) Ctrl+F3
全局 打開(kāi)類(lèi)型 Ctrl+Shift+T
全局 打開(kāi)類(lèi)型層次結(jié)構(gòu) F4
全局 打開(kāi)聲明 F3
全局 打開(kāi)外部javadoc Shift+F2
全局 打開(kāi)資源 Ctrl+Shift+R
全局 后退歷史記錄 Alt+←
全局 前進(jìn)歷史記錄 Alt+→
全局 上一個(gè) Ctrl+,
全局 下一個(gè) Ctrl+.
Java編輯器 顯示大綱 Ctrl+O
全局 在層次結(jié)構(gòu)中打開(kāi)類(lèi)型 Ctrl+Shift+H
全局 轉(zhuǎn)至匹配的括號(hào) Ctrl+Shift+P
全局 轉(zhuǎn)至上一個(gè)編輯位置 Ctrl+Q
Java編輯器 轉(zhuǎn)至上一個(gè)成員 Ctrl+Shift+↑
Java編輯器 轉(zhuǎn)至下一個(gè)成員 Ctrl+Shift+↓
文本編輯器 轉(zhuǎn)至行 Ctrl+L
搜索
作用域 功能 快捷鍵
全局 出現(xiàn)在文件中 Ctrl+Shift+U
全局 打開(kāi)搜索對(duì)話(huà)框 Ctrl+H
全局 工作區(qū)中的聲明 Ctrl+G
全局 工作區(qū)中的引用 Ctrl+Shift+G
文本編輯
作用域 功能 快捷鍵
文本編輯器 改寫(xiě)切換 Insert
文本編輯器 上滾行 Ctrl+↑
文本編輯器 下滾行 Ctrl+↓
文件
作用域 功能 快捷鍵
全局 保存 Ctrl+X Ctrl+S
全局 打印 Ctrl+P
全局 關(guān)閉 Ctrl+F4
全局 全部保存 Ctrl+Shift+S
全局 全部關(guān)閉 Ctrl+Shift+F4
全局 屬性 Alt+Enter
全局 新建 Ctrl+N
項(xiàng)目
作用域 功能 快捷鍵
全局 全部構(gòu)建 Ctrl+B
源代碼
作用域 功能 快捷鍵
Java編輯器 格式化 Ctrl+Shift+F
Java編輯器 取消注釋 Ctrl+\
Java編輯器 注釋 Ctrl+/
Java編輯器 添加導(dǎo)入 Ctrl+Shift+M
Java編輯器 組織導(dǎo)入 Ctrl+Shift+O
Java編輯器 使用try/catch塊來(lái)包圍 未設(shè)置,太常用了,所以在這里列出,建議自己設(shè)置。也可以使用Ctrl+1自動(dòng)修正。
運(yùn)行
作用域 功能 快捷鍵
全局 單步返回 F7
全局 單步跳過(guò) F6
全局 單步跳入 F5
全局 單步跳入選擇 Ctrl+F5
全局 調(diào)試上次啟動(dòng) F11
全局 繼續(xù) F8
全局 使用過(guò)濾器單步執(zhí)行 Shift+F5
全局 添加/去除斷點(diǎn) Ctrl+Shift+B
全局 顯示 Ctrl+D
全局 運(yùn)行上次啟動(dòng) Ctrl+F11
全局 運(yùn)行至行 Ctrl+R
全局 執(zhí)行 Ctrl+U
重構(gòu)
作用域 功能 快捷鍵
全局 撤銷(xiāo)重構(gòu) Alt+Shift+Z
全局 抽取方法 Alt+Shift+M
全局 抽取局部變量 Alt+Shift+L
全局 內(nèi)聯(lián) Alt+Shift+I
全局 移動(dòng) Alt+Shift+V
全局 重命名 Alt+Shift+R
全局 重做 Alt+Shift+Y
以上內(nèi)容為轉(zhuǎn)載~下面內(nèi)容為原創(chuàng)!
今天在做客戶(hù)端程序的自動(dòng)更新,簡(jiǎn)單描述一下,就是從服務(wù)器上將更新包下載下來(lái),然后在本地解壓縮,最后刪掉~(yú)功能很簡(jiǎn)單~
但是問(wèn)題出在使用JAVA的ZIP模塊做文件的解壓縮不是想象的那么簡(jiǎn)單,資源需要釋放,一個(gè)不小心就沒(méi)有辦法刪除掉原有ZIP文件了~資源的占用確實(shí)是個(gè)大問(wèn)題,但是好在,客戶(hù)端程序更新完是要重啟的,一切都煙消云散了~對(duì)于刪除不掉ZIP文件的問(wèn)題,我也流氓一下~用DEL硬刪除~此處一定要注意!
Process process = Runtime.getRuntime().exec("cmd /c del f:\\aaa.doc");
這樣的調(diào)用是沒(méi)有問(wèn)題~
Process process = Runtime.getRuntime().exec("del f:\\aaa.doc");
這樣寫(xiě)是不可能對(duì)的~
記錄一下,警告一下后人!
Ref from:http://m.tkk7.com/leeguannan/archive/2007/11/29/164044.html
SetCharacterEncodingFilter:
package com.util.filters;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.UnavailableException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SetCharacterEncodingFilter
??? implements Filter {
? protected String encoding = null;
? protected FilterConfig filterConfig = null;
? protected boolean ignore = true;
? public void destroy() {
??? this.encoding = null;
??? this.filterConfig = null;
? }
? public void doFilter(ServletRequest request, ServletResponse response,
?????????????????????? FilterChain chain) throws IOException, ServletException {
??? // Conditionally select and set the character encoding to be used
?? request.setCharacterEncoding("GBK");
??? // Pass control on to the next filter
??? chain.doFilter(request, response);
? }
? public void init(FilterConfig filterConfig) throws ServletException {
??? this.filterConfig = filterConfig;
??? this.encoding = filterConfig.getInitParameter("encoding");
??? String value = filterConfig.getInitParameter("ignore");
??? if (value == null) {
????? this.ignore = true;
??? }
??? else if (value.equalsIgnoreCase("true")) {
????? this.ignore = true;
??? }
??? else if (value.equalsIgnoreCase("yes")) {
????? this.ignore = true;
??? }
??? else {
????? this.ignore = false;
??? }
? }
? protected String selectEncoding(ServletRequest request) {
??? return (this.encoding);
? }
}
2.解決GET方式出現(xiàn)亂碼的方案
tomcat的server.xml中
<Connector connectionTimeout="20000" maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="8080" redirectPort="8443" uRIEncoding="UTF-8" useBodyEncodingForURI="true">
</Connector>
注意其中的useBodyEncodingForURI="true"這句是是解決問(wèn)題的關(guān)鍵,但缺省情況下沒(méi)有,自己加進(jìn)去。
然后再用Filter方案解決 解決GET的問(wèn)題
3.亂碼字符轉(zhuǎn)換
byte[] bytes = str.getBytes("ISO8859-1");
??? String dept=new String(bytes);
AJAX
在用XMLHttpRequest發(fā)送請(qǐng)求時(shí)如用post方式傳送數(shù)據(jù),容易出現(xiàn)中文亂碼問(wèn)題!
在Ajax中,默認(rèn)的編碼方式是UTF-8,所以在服務(wù)器端用request.setCharacterEncoding("UTF-8");(對(duì)于java言,其它語(yǔ)言可能類(lèi)似方法)設(shè)置編碼即可解決大部份的編碼問(wèn)題!
?對(duì)于服務(wù)器端返回的XML文件在用responseXML讀取時(shí)也要注意編碼問(wèn)題!
以下是正確的處理方法:
response.setCharacterEncoding("UTF-8");-----(1)
PrintWriter out=response.getWriter();------(2)
out.println("返回內(nèi)容");
如上所示,如果1、2的先后順序發(fā)生變化就會(huì)產(chǎn)生亂碼!
在jsp向頁(yè)面輸出圖片的時(shí)候,使用response.getOutputStream()會(huì)有這樣的提示:java.lang.IllegalStateException:getOutputStream() has already been called for this response,會(huì)拋出Exception
//檢查是否是一個(gè)文件上傳請(qǐng)求
boolean isMultipart = FileUpload.isMultipartContent(request);
現(xiàn)在我們就可以準(zhǔn)備解析這個(gè)請(qǐng)求到一個(gè)備選的選項(xiàng)了。解析的結(jié)果是一個(gè)文件選項(xiàng)的List,每個(gè)這樣的選項(xiàng)都實(shí)現(xiàn)了FileItem接口,處理這些選項(xiàng)將在下面得到討論。
最簡(jiǎn)單的情況
最簡(jiǎn)單的使用場(chǎng)景可以參照下面:
在這種情景下處理這樣一個(gè)請(qǐng)求并不是很簡(jiǎn)單的:
//創(chuàng)建一個(gè)新的文件上傳句柄
DiskFileUpload upload = new DiskFileUpload();
//解析請(qǐng)求
List /* FileItem */ items = upload.parseRequest(request);
這就是所有我們需要做的,真的!
解析的結(jié)果是一個(gè)文件項(xiàng)目的List,每一個(gè)都實(shí)現(xiàn)了FileItem接口。處理這些項(xiàng)目將在下面討論。
練習(xí)更多的控制
如果你的使用情景非常接近最簡(jiǎn)單的使用方式,在上文中可以看到,但是你需要更多的控制臨界的大小和臨時(shí)文件的駐留地址,你可以使用DiskFileUpload類(lèi)的方法來(lái)自定義這些動(dòng)作,就像這樣:
//創(chuàng)建一個(gè)新的文件上傳句柄
DiskFileUpload upload = new DiskFileUpload();
//設(shè)置上傳參數(shù)
upload.setSizeThrehold(最大內(nèi)存大小);
upload.setSizeMax(最大請(qǐng)求大小);
upload.setRepositoryPath(臨時(shí)目錄);
//解析請(qǐng)求
List /* FileItem */ items = upload.parseRequest(request);
當(dāng)然,每個(gè)配置方法都是獨(dú)立于其它的,但是如果你想一次就配置它們,你可以使用可選的parseRequest()方法,像這樣:
// 建立一個(gè)新的文件上傳句柄
DiskFileUpload upload = new DiskFileUpload();
// 解析請(qǐng)求
List /* FileItem */ items = upload.parseRequest(request,
??????? 內(nèi)存大小, 允許上傳的最大文件, 臨時(shí)目錄);
如果你想更多地控制請(qǐng)求的解析,比如把上傳選項(xiàng)存儲(chǔ)到其它地方,例如,存到數(shù)據(jù)庫(kù)中-你可以參照自定義FileUpload。
處理上傳選項(xiàng)
一旦解析過(guò)程完畢,你就可以獲得一個(gè)文件選項(xiàng)的List,以便進(jìn)一步處理。在大多數(shù)情況下,你將會(huì)根據(jù)規(guī)則的表單域來(lái)不同地處理文件的上傳。所以你可能以這樣的方式來(lái)處理:
// 處理上傳的選項(xiàng)
Iterator iter = items.iterator();
while (iter.hasNext()) {
??? FileItem item = (FileItem) iter.next();
??? if (item.isFormField()) {
??????? processFormField(item);
??? } else {
??????? processUploadedFile(item);
??? }
}
對(duì)于一個(gè)規(guī)則的表單域來(lái)說(shuō),你對(duì)它感興趣的可能就只有它的名字以及它的字符串值。你也會(huì)想到,處理它們是簡(jiǎn)單的:
//處理一個(gè)規(guī)則表單域
if (item.isFormField()) {
??? String name = item.getFieldName();
??? String value = item.getString();
??? ...
}
而對(duì)于一個(gè)文件的上傳,在你處理它的內(nèi)容之前,可以有好多令你想知道的不同的東西,這里有一個(gè)采用了一些你可能感興趣的方法的例子
// 處理一個(gè)文件上傳
if (!item.isFormField()) {
??? String fieldName = item.getFieldName();
??? String fileName = item.getName();
??? String contentType = item.getContentType();
??? boolean isInMemory = item.isInMemory();
??? long sizeInBytes = item.getSize();
??? ...
}
對(duì)于這些上傳的文件,你一般不想通過(guò)內(nèi)存來(lái)存取它們,除非它們很小,或者你沒(méi)有其它好的方法,更進(jìn)一步,你想將內(nèi)容當(dāng)作文件流來(lái)處理,或者將整個(gè)文件寫(xiě)到最終的地址。FileUpload提供了簡(jiǎn)單的方法來(lái)完成這些 操作。
// 處理一個(gè)文件上傳的情況
if (writeToFile) {
??? File uploadedFile = new File(...);
??? item.write(uploadedFile);
} else {
??? InputStream uploadedStream = item.getInputStream();
??? ...
??? uploadedStream.close();
}
注意到,在默認(rèn)的FileUpload的實(shí)現(xiàn)中,write()方法將嘗試把文件改名以將它保存到特定的地點(diǎn),如果數(shù)據(jù)已經(jīng)在臨時(shí)文件中了,如果重命名失敗,實(shí)際的復(fù)制文件就完成了(?),在其它原因看來(lái),或者數(shù)據(jù)已經(jīng)在內(nèi)存中了。如果你的確需要在內(nèi)存中取上傳的數(shù)據(jù),你只需簡(jiǎn)單的調(diào)用get()方法來(lái)把它當(dāng)作一個(gè)字符數(shù)組來(lái)獲得。
// 在內(nèi)存中處理一個(gè)上傳的文件
byte[] data = item.get();
...
和殺毒軟件的相互作用
當(dāng)web容器在運(yùn)行時(shí),而殺毒軟件又同時(shí)運(yùn)行在同樣的系統(tǒng)上,這種情況下在應(yīng)用中使用FileUpload容易導(dǎo)致一些很難預(yù)料的事情.這部分將描述一些你可能要遇到的情況,我們會(huì)提供一些方法來(lái)處理它們。默認(rèn)的FileUpload實(shí)現(xiàn)將會(huì)使超過(guò)它在內(nèi)存中大小的上傳的選項(xiàng)寫(xiě)入到磁盤(pán)。而當(dāng)這樣的文件關(guān)閉后,任何系統(tǒng)中的殺毒軟件都會(huì)被喚醒,然后去檢查它,然后會(huì)潛在地隔離這個(gè)文件--就是說(shuō),將它移動(dòng)到一個(gè)不產(chǎn)生問(wèn)題的特定地方。這樣一來(lái),對(duì)開(kāi)發(fā)者來(lái)說(shuō)當(dāng)然是一個(gè)意外,因?yàn)閯倓偵蟼鞯奈募⒉荒鼙惶幚砹恕牧硪环矫鎭?lái)說(shuō),小于設(shè)定的內(nèi)存大小的那些上傳的文件將被保持在內(nèi)存中,這樣一來(lái),將不會(huì)被殺毒軟件所檢測(cè)到,這樣就有可能使病毒以某種方式駐留在了系統(tǒng)中了(雖然如果一旦它被寫(xiě)入到磁盤(pán),殺毒軟件就會(huì)定位并檢測(cè)到它)。一個(gè)通用的解決方法是在系統(tǒng)中專(zhuān)門(mén)設(shè)置一個(gè)目錄來(lái)存放這些上傳的文件,然后配置殺毒軟件忽略這個(gè)目錄。這樣將確保上傳的文件在系統(tǒng)中不被隔離,但是這樣就把掃描病毒的責(zé)任交給了應(yīng)用程序的開(kāi)發(fā)者了。掃描這些上傳的文件的任務(wù)可以在外部的處理中實(shí)現(xiàn)。這樣可以將干凈的文件移動(dòng)到一個(gè)“改進(jìn)”過(guò)的地方,或者也可以把殺毒集成到應(yīng)用中去。至于怎么將外部處理或集成病毒掃描到一個(gè)
應(yīng)用,這個(gè)已經(jīng)超出了本文檔的討論范圍。
下一步是什么
希望這個(gè)頁(yè)面能提供給你一個(gè)好的意見(jiàn),讓你在你自己的應(yīng)用中能使用FileUpload。更多關(guān)于這里介紹的方法,以及其它可用的方法,你可以參照api文檔。這里介紹的用法已經(jīng)可以滿(mǎn)足大多數(shù)的文件上傳的需要了,當(dāng)然,如果你還有更多的復(fù)雜的需求,使用它的靈活的自定義配置的能力,F(xiàn)ileUpload一定可以能夠幫助你。
另一個(gè)實(shí)例:
commons.fileupload實(shí)現(xiàn)文件的上傳,代碼如下:
<%!
?//服務(wù)器端保存上傳文件的路徑
??? String saveDirectory = "g:\\upload\\";
??? // 臨時(shí)路徑 一旦文件大小超過(guò)getSizeThreshold()的值時(shí)數(shù)據(jù)存放在硬盤(pán)的目錄
??? String tmpDirectory = "g:\\upload\\tmp\\";
??? // 最多只允許在內(nèi)存中存儲(chǔ)的數(shù)據(jù)大小,單位:字節(jié)
??? int maxPostSize = 1024 * 1024;
%>
<%
??? // 文件內(nèi)容?
??? String FileDescription = null;
??? // 文件名(包括路徑)
??? String FileName = null;
??? // 文件大小
??? long FileSize = 0;
??? // 文件類(lèi)型
??? String ContentType = null;
%>
<%
?? DiskFileUpload fu = new DiskFileUpload();
??? // 設(shè)置允許用戶(hù)上傳文件大小,單位:字節(jié)
?? fu.setSizeMax(200*1024*1024);
??? // 設(shè)置最多只允許在內(nèi)存中存儲(chǔ)的數(shù)據(jù),單位:字節(jié)
?? fu.setSizeThreshold(maxPostSize);
??? // 設(shè)置一旦文件大小超過(guò)getSizeThreshold()的值時(shí)數(shù)據(jù)存放在硬盤(pán)的目錄
?? fu.setRepositoryPath("g:\\upload\\tmp\\");
??? //開(kāi)始讀取上傳信息 得到所有文件
?? try{
????? List fileItems = fu.parseRequest(request);
???? }catch(FileUploadException e){
???????? //這里異常產(chǎn)生的原因可能是用戶(hù)上傳文件超過(guò)限制、不明類(lèi)型的文件等
???????? //自己處理的代碼
???? }
%>
<%
?? // 依次處理每個(gè)上傳的文件
?? Iterator iter = fileItems.iterator();
?? while (iter.hasNext()) {
???? FileItem item = (FileItem) iter.next();
?????? //忽略其他不是文件域的所有表單信息
???? if (!item.isFormField()) {
?????? String name = item.getName();
?????? long size = item.getSize();
?????? String? contentType = item.getContentType();
???? if((name==null||name.equals("")) && size==0)
?????? continue;
%>
<%
?? //保存上傳的文件到指定的目錄
? String[] names=StringUtils.split(name,"\\");? //對(duì)原來(lái)帶路徑的文件名進(jìn)行分割
?? name = names[names.length-1];
?? item.write(new File(saveDirectory+ name));
? }
}
%>
?下面是其簡(jiǎn)單的使用場(chǎng)景:
?A、上傳項(xiàng)目只要足夠小,就應(yīng)該保留在內(nèi)存里。
?B、較大的項(xiàng)目應(yīng)該被寫(xiě)在硬盤(pán)的臨時(shí)文件上。
?C、非常大的上傳請(qǐng)求應(yīng)該避免。
?D、限制項(xiàng)目在內(nèi)存中所占的空間,限制最大的上傳請(qǐng)求,并且設(shè)定臨時(shí)文件的位置。
?
?可以根據(jù)具體使用用servlet來(lái)重寫(xiě),具體參數(shù)配置可以統(tǒng)一放置到一配置文件
?
?文件的下載用servlet實(shí)現(xiàn)
????? public void doGet(HttpServletRequest request,
?????????????????????? HttpServletResponse response)
???? {
??????? ?String aFilePath = null;??? //要下載的文件路徑
???????? String aFileName = null;??? //要下載的文件名
???????? FileInputStream in = null;? //輸入流
???????? ServletOutputStream out = null;? //輸出流
???????? try
???{
???????? ?
???????????? aFilePath = getFilePath(request);
???????????? aFileName = getFileName(request);
???????????? response.setContentType(getContentType(aFileName) + "; charset=UTF-8");
???????????? response.setHeader("Content-disposition", "attachment; filename=" + aFileName);
???????????? in = new? FileInputStream(aFilePath + aFileName); //讀入文件
??????????? out = response.getOutputStream();
??????????? out.flush();
?????????? ?int aRead = 0;
?????????? while((aRead = in.read()) != -1 & in != null)
?????? ?{
???????????? out.write(aRead);
???????? }
?????????? out.flush();
????? }
?????? catch(Throwable e)
???? {
???? log.error("FileDownload doGet() IO error!",e);
????? }
???????? finally
???????? {
???????????? try
???????????? {
???????????????? in.close();
???????????????? out.close();
???????????? }
???????????? catch(Throwable e)
???????????? {
???????????? ?log.error("FileDownload doGet() IO close error!",e);
???????????? }
???????? }
???? }
<%@ page contentType="image/jpeg" import="java.awt.*,
java.awt.image.*,java.util.*,javax.imageio.*" %>
<%!
Color getRandColor(int fc,int bc){//給定范圍獲得隨機(jī)顏色
??????? Random random = new Random();
??????? if(fc>255) fc=255;
??????? if(bc>255) bc=255;
??????? int r=fc+random.nextInt(bc-fc);
??????? int g=fc+random.nextInt(bc-fc);
??????? int b=fc+random.nextInt(bc-fc);
??????? return new Color(r,g,b);
??????? }
%>
<%
//設(shè)置頁(yè)面不緩存
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
// 在內(nèi)存中創(chuàng)建圖象
int width=60, height=20;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 獲取圖形上下文
Graphics g = image.getGraphics();
//生成隨機(jī)類(lèi)
Random random = new Random();
// 設(shè)定背景色
g.setColor(getRandColor(200,250));
g.fillRect(0, 0, width, height);
//設(shè)定字體
g.setFont(new Font("Times New Roman",Font.PLAIN,18));
//畫(huà)邊框
//g.setColor(new Color());
//g.drawRect(0,0,width-1,height-1);
// 隨機(jī)產(chǎn)生155條干擾線(xiàn),使圖象中的認(rèn)證碼不易被其它程序探測(cè)到
g.setColor(getRandColor(160,200));
for (int i=0;i<155;i++)
{
?int x = random.nextInt(width);
?int y = random.nextInt(height);
??????? int xl = random.nextInt(12);
??????? int yl = random.nextInt(12);
?g.drawLine(x,y,x+xl,y+yl);
}
// 取隨機(jī)產(chǎn)生的認(rèn)證碼(4位數(shù)字)
String sRand="";
for (int i=0;i<4;i++){
??? String rand=String.valueOf(random.nextInt(10));
??? sRand+=rand;
??? // 將認(rèn)證碼顯示到圖象中
??? g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
//調(diào)用函數(shù)出來(lái)的顏色相同,可能是因?yàn)榉N子太接近,所以只能直接生成
??? g.drawString(rand,13*i+6,16);
}
// 將認(rèn)證碼存入SESSION
session.setAttribute("rand",sRand);
// 圖象生效
g.dispose();
// 輸出圖象到頁(yè)面
ImageIO.write(image, "JPEG", response.getOutputStream());
%>
使用驗(yàn)證碼圖片的文件a.jsp
<%@ page contentType="text/html;charset=gb2312" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>認(rèn)證碼輸入頁(yè)面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</head>
<body>
<form method=post action="check.jsp">
<table>
<tr>
<td align=left>系統(tǒng)產(chǎn)生的認(rèn)證碼:</td>
<td><img border=0 src="image.jsp"></td>
</tr>
<tr>
<td align=left>輸入上面的認(rèn)證碼:</td>
<td><input type=text name=rand maxlength=4 value=""></td>
</tr>
<tr>
<td colspan=2 align=center><input type=submit value="提交檢測(cè)"></td>
</tr>
</form>
</body>
</html>
驗(yàn)證的頁(yè)面check.jsp
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<html>
<head>
<title>認(rèn)證碼驗(yàn)證頁(yè)面</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
</head>
<body>
<%
?String rand = (String)session.getAttribute("rand");
?String input = request.getParameter("rand");
%>
系統(tǒng)產(chǎn)生的認(rèn)證碼為: <%= rand %><br>
您輸入的認(rèn)證碼為: <%= input %><br>
<br>
<%
? if (rand.equals(input)) {
%>
<font color=green>輸入相同,認(rèn)證成功!</font>
<%
? } else {
%>
<font color=red>輸入不同,認(rèn)證失敗!</font>
<%
? }
%>
</body>
</html>