亚洲成?Ⅴ人在线观看无码,亚洲最大免费视频网,亚洲中文字幕无码一区http://m.tkk7.com/mphome/zh-cnMon, 12 May 2025 07:26:58 GMTMon, 12 May 2025 07:26:58 GMT60培訓endinghttp://m.tkk7.com/mphome/archive/2009/09/11/294721.html昨夜人生昨夜人生Fri, 11 Sep 2009 06:04:00 GMThttp://m.tkk7.com/mphome/archive/2009/09/11/294721.htmlhttp://m.tkk7.com/mphome/comments/294721.htmlhttp://m.tkk7.com/mphome/archive/2009/09/11/294721.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/294721.htmlhttp://m.tkk7.com/mphome/services/trackbacks/294721.html?????? 爽還是有爽的地方,鼎培培訓幾乎就是休假去,吃得好睡的好還有保健按摩,哎腐敗啊。我們zh今年招的人少,到了鼎培才知道什么叫做弱勢群體啊,人家都是20多,30多人,我們就5個人,湊一桌麻將打都難。早上培訓,晚上人家安排唱K,聯誼,泡吧啊,我們就郁悶啦,訂場都定不到。不行啊,好歹有140快的消費卷不用豈不可惜。結果我們就跑得去保健,說起來還真丟人,洗腳,推拿,面膜,拔火罐我們一個都沒落下。我上次問推拿的師傅為什么保健這么難定,人家說有個zh公司的人天天來,在推拿的時候就有電話叫他去洗腳,洗腳的時候就有電話叫他去面膜,天天混在我們這里(PS:因為所有保健都是要預定的),這樣當然定不到啦。接下來人家問我是哪個公司,我那個汗啊,直接說我是省公司的,丟人的事還是攤到省公司去。
?????? 軍訓完后,人黑了一大圈本來就比較黑,現在遠看基本上就是一堆碳,五官什么幾乎不用考慮啦。上周回了趟廣州,和大家坐一桌吃飯,師妹對我旁邊的人說“我發現你白了好多哦”,我暈啊明顯是說我黑嘛,有資本當綠葉做襯托的工作啦。
?????? 終于下個星期要回部門歸隊啦,在商務吧這里真是閑的無聊,天天玩那個弱智到極點的游戲掙積分換飲料,我讀20多年書不是來干這個的,還是給我點事干吧,怎么說也得對得起每個月的工資啊,我這人還是比較厚道的。
??????






昨夜人生 2009-09-11 14:04 發表評論
]]>
紅樓夢http://m.tkk7.com/mphome/archive/2009/09/02/293647.html昨夜人生昨夜人生Wed, 02 Sep 2009 10:56:00 GMThttp://m.tkk7.com/mphome/archive/2009/09/02/293647.htmlhttp://m.tkk7.com/mphome/comments/293647.htmlhttp://m.tkk7.com/mphome/archive/2009/09/02/293647.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/293647.htmlhttp://m.tkk7.com/mphome/services/trackbacks/293647.html

經學家看見《易》
道學家看見淫
才子看見纏綿
革命家看見排滿
流言家看見宮闈秘事

昨夜人生 2009-09-02 18:56 發表評論
]]>
毛瓜瓜征婚記http://m.tkk7.com/mphome/archive/2009/08/09/290473.html昨夜人生昨夜人生Sun, 09 Aug 2009 15:26:00 GMThttp://m.tkk7.com/mphome/archive/2009/08/09/290473.htmlhttp://m.tkk7.com/mphome/comments/290473.htmlhttp://m.tkk7.com/mphome/archive/2009/08/09/290473.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/290473.htmlhttp://m.tkk7.com/mphome/services/trackbacks/290473.html閱讀全文

昨夜人生 2009-08-09 23:26 發表評論
]]>
強迫自己的三個程度:堅持,習慣,信仰http://m.tkk7.com/mphome/archive/2009/07/28/288820.html昨夜人生昨夜人生Tue, 28 Jul 2009 15:39:00 GMThttp://m.tkk7.com/mphome/archive/2009/07/28/288820.htmlhttp://m.tkk7.com/mphome/comments/288820.htmlhttp://m.tkk7.com/mphome/archive/2009/07/28/288820.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/288820.htmlhttp://m.tkk7.com/mphome/services/trackbacks/288820.html1.堅持,很費力。為什么要堅持?有點強迫的意思,因為要做些讓自己感到不爽抑或至少是不那么情愿的事,所以需要堅持。
2.習慣,習慣更像條件反射,形成了習慣,不需要理由就會想要去執行,這個輕松點。
3.信仰,可以為之不惜一切的玩意。這個比較強悍了,比如舍身炸碉堡,舍身堵搶眼,舍身當炸彈,舍身開飛機撞大樓之類的。可以說這個是極端了,有信仰的人,我們有時候叫他們英雄,有時候叫他們恐怖分子。

1.如果你在堅持做某件事,其實你很脆弱,你在強迫自己做一件事,因為你心里有一個度,此時這個度大于這件需要堅持的事,如果有某件事物干擾,超越了這個度呢?就出現所謂的堅持不下去了。
2.如果你習慣于做某件事,這時候潛意識里無理由就要做這件事,自動,條件反射,基本上不會不爽,可是,如果有意識覺得某樣東西超越這個習慣,這個習慣就被打破了,所以還是度的問題。
3.如果你已經形成某種信仰,真正的堅信不移,你就可怕了,你的度是無窮大,給定一個任意大的理由,卻總存在一個更大的理由,去執行自己的信仰,毫不動搖。

所以,信仰>習慣>堅持。
……

傳說,看客們有70%會相信以上論調,5%會因此改變自己,只有若干人會建立自己的信仰。



昨夜人生 2009-07-28 23:39 發表評論
]]>
感覺不再那么younghttp://m.tkk7.com/mphome/archive/2009/07/19/287375.html昨夜人生昨夜人生Sun, 19 Jul 2009 15:08:00 GMThttp://m.tkk7.com/mphome/archive/2009/07/19/287375.htmlhttp://m.tkk7.com/mphome/comments/287375.htmlhttp://m.tkk7.com/mphome/archive/2009/07/19/287375.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/287375.htmlhttp://m.tkk7.com/mphome/services/trackbacks/287375.html???????? 培訓的包括技術線和客戶線,一起加起來都有35個人。就我們去年實習留下來的5個人算老頭子啦,那些營銷經理,客戶經理都是20歲出頭,真是年輕啊。現在的20左右的同學說話真是雷人,碰到我旁邊的男的一上來就說“你看起來好老哦,多大啦”,那個牛啊,這說話直接把人家逼到墻角嘛,還沒完呢同樣也是跟去年一起實習的那個女的,上來直接就叫阿姨,有沒有搞錯人家還是靚女啦,說話也分個對象嘛。
?????????看到今年過來的10屆的實習生,就想起了去年我們實習的時候,喳喳眼一年就過去啦。感覺這屆來的整體上好像沒有我們去年來的那么強,今年男女分配很和諧嘛,一半男一半女,還是領導有水平。世界還真是小,我老叫成都的同學來我這實習,結果那頭豬沒機會過來,他同一個導師的跑過來啦,還有去年實習回家火車上碰上的軟件學院的師弟,一起聊了會天以后都沒怎么來往,今年也跑過來實習啦,還一眼就認出我來了,呵我有給他留下這么深的印象嘛,可惜不是個女的。
??????? 還有記得下一次歡迎新同事時,每個人先來三杯酒,雖然不知道以前有沒有哈(那些人說有估計是騙我的),反正我是喝了,這個傳統我一定記得發揚光大。
?????????
???????

昨夜人生 2009-07-19 23:08 發表評論
]]>
【轉】忽悠新解http://m.tkk7.com/mphome/archive/2009/07/11/286407.html昨夜人生昨夜人生Sat, 11 Jul 2009 15:25:00 GMThttp://m.tkk7.com/mphome/archive/2009/07/11/286407.htmlhttp://m.tkk7.com/mphome/comments/286407.htmlhttp://m.tkk7.com/mphome/archive/2009/07/11/286407.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/286407.htmlhttp://m.tkk7.com/mphome/services/trackbacks/286407.html政府忽悠百姓,叫政策;  
百姓忽悠政府,叫犯罪;  
領導忽悠百姓,叫號召;  
百姓忽悠領導,叫搗亂;  
領導忽悠領導,叫交易;  
百姓忽悠百姓,叫生意;  
男人忽悠女人,叫調戲;  
女人忽悠男人,叫勾引;

昨夜人生 2009-07-11 23:25 發表評論
]]>
上班一星期http://m.tkk7.com/mphome/archive/2009/07/11/286389.html昨夜人生昨夜人生Sat, 11 Jul 2009 11:27:00 GMThttp://m.tkk7.com/mphome/archive/2009/07/11/286389.htmlhttp://m.tkk7.com/mphome/comments/286389.htmlhttp://m.tkk7.com/mphome/archive/2009/07/11/286389.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/286389.htmlhttp://m.tkk7.com/mphome/services/trackbacks/286389.html?????????? 不得不罵罵學院那些吃飯不干正事的老師,發個派遣證唄,還紙張打印錯誤,弄得我晚報道一天,來了后才知道不只是少一天工資啊。早一天來前半年的超市卡,洗衣卡都有份,哎悔死!總體來說住宿條件還是不錯,現在一個人住原來寢室這么大的一個單間,有空調有熱水有木床,就是少了衣柜和洗衣機。空調那個質量好啊,搞得晚上冷得都可以洗熱水澡,不錯吧。當然也有麻煩事,第一天大早起來就開始修馬桶,問人家都說這個是獨立生活的第一課,看來我趕上得還真是及時啊。
?????????? 一來什么東西都不全,就得花錢買這個買那個,現在還真是窮,公司也不預支點工資給我,浪費那個錢給我們買這個保險那個保險,看得那個保險的賠償費都是10萬,20萬,弄得我都想搞個工傷直接去領錢得啦。
?????????????到zh不得不去去它的海濱浴場,特別是在天氣不好的時候去景色更好,海天一線。雖然水不是那么清澈,但對于我這種不常看海的人還是非常滿足的,我這人要求低嘛。海灘當然不能不提到游泳,我就只是去看看,雖然原來小時候還學過游泳,現在都不怎么愛游啦,一個是技巧差不多都忘了,二呢我有近視嘛,游泳又不能帶眼鏡,那人家能看我不能看別人,多吃虧啊,還是帶上眼鏡在旁邊看別人比較爽,嘿。
????????????第一個星期的工作基本是實習,斌哥直接把我弄到體驗館去了。真的是非常忙碌,第一天同事帶我走了幾遍體驗館,發些資料給我看,第二天就得要我帶來賓做講解,俗稱接客。要講解完體驗館基本要花一個半鐘頭的時間,這一個半時間內基本上是你一個人再說,對于才學過一天的人,難度還真是不小,但誰叫我是undergraduate呢,還好基本beyong my ability。本人口才還OK,學習能力也不錯,連續四天接客四次,而且接客對象的層次也逐步提升,由開始的學生,變成尊敬的vip客戶,某工業集團部長,到最后的地方文化部局長,效果還不錯,說不定我還真的是有導游的潛力。
???????????下星期就開始公司培訓,接下來應該是會很忙,每天寫總結,早上再做匯報,哎這套名堂公司最喜歡搞了,沒辦法只能自己調整習慣啦。先清空大腦,準備接受洗腦。

昨夜人生 2009-07-11 19:27 發表評論
]]>
開路走人啦http://m.tkk7.com/mphome/archive/2009/06/30/284692.html昨夜人生昨夜人生Mon, 29 Jun 2009 16:58:00 GMThttp://m.tkk7.com/mphome/archive/2009/06/30/284692.htmlhttp://m.tkk7.com/mphome/comments/284692.htmlhttp://m.tkk7.com/mphome/archive/2009/06/30/284692.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/284692.htmlhttp://m.tkk7.com/mphome/services/trackbacks/284692.html??????? 畢業前幾天精神基本處于恍惚狀態,大部分由于酒精過度的原因,發現喝多了竟然大腿都會生痛,嘿。畢業聚餐上實在太高興了,個人發言時基本上講什么都是不太記得啦,毫無條理性而且站著都是東到西歪的,丟臉啊!
?????? 最近聽到最多的話就是“一路走好”,不管是老師同學都這么講,嘿怎么聽著像送我上路的感覺,改改口氣啦"一路好走"一點歧義都沒有的。
?????? 寫不了頭好昏啊,總之祝720各位今天許的愿大家都實現。

?? A DO:
?? 1.好好工作
?? 2.以結婚為目的找一個女朋友,解決個人問題。
?? 3.多運動,成為一個“肌肉男”。
?? 濤哥:
?? 1.租一個大大的房子,大家來廣州好好落腳。
?? 2.好好掙錢,為成家做準備。
?? 3.還債。
?? 濤嫂:
?? 1.掙錢。
?? 2.掙錢。
?? 3.還是掙錢。
?? 韓老大:
?? 1.吃遍公司附近的餐館。
?? 2.還Banner的¥735.00元。
???3.半年內保持單身。
?? 老毛:
?? 1.找一女朋友解決單身問題,首當其沖。
?? 2.繼續彩票事業,多買多賺,以500W和LAMBORGHINI為目標。
?? 3.任勞任怨,踏實工作。



昨夜人生 2009-06-30 00:58 發表評論
]]>
哎,真郁悶http://m.tkk7.com/mphome/archive/2009/06/24/283956.html昨夜人生昨夜人生Wed, 24 Jun 2009 08:10:00 GMThttp://m.tkk7.com/mphome/archive/2009/06/24/283956.htmlhttp://m.tkk7.com/mphome/comments/283956.htmlhttp://m.tkk7.com/mphome/archive/2009/06/24/283956.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/283956.htmlhttp://m.tkk7.com/mphome/services/trackbacks/283956.html???????? 昨天打電話給先上班的同事了解情況,結果更讓我瘋狂,居然把我掉部門啦,現在換到的部門的業務我真是一點都不熟悉的,打個比方就是原來我是搞軟件的,現在弄得我去搞硬件,原因說是現在3G網建設緊張,某部門需求人員協調工作,老兄啊你們要調人也調個熟悉業務的過去啊,調我過去還是不是要花老長的時間培訓。
???????? 靜下心來分析一下,換部門對我應該說是有弊有利,好處在于:詳細了解通信知識,實踐操作基站,對以后的發展應該是有好處的,從經濟角度來看的話應該一年也會多一兩萬塊錢。敝處:什么都不懂要從頭開始學,上手要慢,工作可能會更辛苦。考,就不是學新東西嘛,老子也是從小學一直念過來的,怕個屁啊,學就學。
???????? 23號照了畢業照,天公不作美,照著照著就下大雨,搞得都沒怎么和導師照兩張(人家看著下雨就開著沃爾沃走人啦),廣東這邊照畢業照都是拉家里人一起過來的,這傳統還正不錯看上去挺溫馨的。 畢業算起來花費還真是不少,去了一趟鳳凰1200多,給導師買個zippo600元,吃飯估計又得500多吧。丟說的好錢嘛不是考省出來的,是考掙出來的,但問題是現在我也掙不出來啊,嘿嘿。
?????????? 7月1號走人,得趕緊把該辦的辦完,銷卡,領證,請人吃飯等,最好一個都不能少!
????

昨夜人生 2009-06-24 16:10 發表評論
]]>
鳳凰,張家界旅游http://m.tkk7.com/mphome/archive/2009/06/21/283463.html昨夜人生昨夜人生Sun, 21 Jun 2009 09:05:00 GMThttp://m.tkk7.com/mphome/archive/2009/06/21/283463.htmlhttp://m.tkk7.com/mphome/comments/283463.htmlhttp://m.tkk7.com/mphome/archive/2009/06/21/283463.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/283463.htmlhttp://m.tkk7.com/mphome/services/trackbacks/283463.html???????? 苗寨回來后,人也都走不動,旅館的老板還想介紹其他的苗寨叫我們去玩,當我們是白癡啊肯定不去啦。接下來就分開行動在古城里亂逛,古城說真的true heart是很漂亮。中間一條長長的漓江穿過,岸的兩旁都是一些古式的閣樓,要是情侶來意境就更好。晚上的古城就更加熱鬧,小攤小販啊都跑出來,10點過后古樓上的酒吧就響個不停,伴著微風喝著啤酒再看看旁邊路過的美女,一個字爽啊。反正覺得來景點游玩的美女就特別多,看一個是一個,還很多是幾個女人一起游玩的。
??????? 在古城待了兩天就覺得有些膩了,也不是我一個人有這種看法,大家都這么覺得,古城有一些商業開發過度啦。岸邊兩旁太多商品店,搞得有點像購物街,而且買的東西都非常的同質化,基本上賣的就是銀器,刀,襯衫,血耙鴨啦。小商販秉著宰一個是一個原則,亂開價,你要是想買的話可以40%就可以拿下。我就買了幾只血耙鴨回家,但后來去張家界車上太熱鴨好像都壞了,嘿嘿自己都沒吃全部送人啦,喔吼吼。
????????去張家界本來不是在我們的旅游計劃之內的,打算是在鳳凰多玩幾天再在回家的。結算一下總體花費大部分是花在路程上了,不去一趟張家界不是很劃不來,粗俗一點形容就是“人都自宮了,還能不練葵花寶典”。張家界之旅于是就在匆促之間決定下來。
????????有趣的是人家去張家界玩得開心是因為景點漂亮,心情愉悅等等之類,嘿我們不同我們去張家界玩也挺開心,但這種開心來自于和導游起哄,抬杠。學生嘛都沒什么錢,報了張家界旅游團,原來是440一位,我們講價搞成了320一位,心里還挺美。到了張家界玩了第一天,就發現不對勁了,到了一個景點還沒玩兩分鐘,導游就說時間不夠了趕緊拍照,要不下山沒飯吃了。開始我們還真以為是哦可能景點很多,時間確實比較緊,趕緊拍玩兩張照就走人。結果到了山下面,總共游玩時間3個鐘頭都不到,接下來導游就開始拉著我們去購物啦,還真是種類繁多啊,茶葉,洗腳,珠寶,涼果,牛肉,刀具等等。。。。一直搞到下午6點半,我考搞得老子火大發了。第二天游玩就不那么好說了,導游他說他的我們搞我們自己的,玩得慢點你還能剁我兩刀。做這個導游還真是要臉皮厚,當然購物點他還是要拖我們去,我們都不下車他就一個個來說,這本事哎我是服了。我們也不爽本來還欠旅行團1000多,正好導游也不知道,我們也裝傻,直到最后也沒給。
???????? 張家界嘛感覺是沒有鳳凰好玩,當然可能也是我們報的這個團的問題,旅游團變成了購物團,整個一個變形金剛。有些完全是在扯淡,10步一個景點,你說那些山有什么看的,他還硬給每個山取了個名字,什么八戒娶親啊,觀音送子啊等,我是一個都沒看出來,問導游人家說這個嘛“三分靠外形,七分靠想象”。景點照相也很有意思,基本上屬于流水線操作,大家一個一個上,“1,2,3好,下一個”,回來整理相片都搞得像照相館里出來的,背景一模一樣的。
????????? 玩完張家界我就直接回家,這里要強烈bs一下某幾個同學自己錢又不帶,都向我借錢弄得我回家的錢都不夠。轉到長沙本來計劃住一晚,在長沙逛逛再回南昌的,現在只能買凌晨4點的火車回家。晚上8點到的長沙,要坐到早上4點上火車,恩這個辛苦我記得,那幾個人都躲不掉。在長沙逛到12點就郁悶啦,還有4個多小時干嘛呢,天氣又熱跑到24小時KFC躲涼去,買了杯可樂,找靠窗一坐。這世界上還真什么人都有,旁邊的一個阿哥,咚咚的跑過來要跟我聊天,聊就聊北。我想我跟你不熟,聊天的內容基本上就是我說說廣東的發展啊,你說說湖南好玩的地方啊等等。那位阿哥不接我話茬,直接就聊他的感情問題,而且聊的內容非常細致,我塞這人這么open的,估計是憋屈太久啦,這種事找熟人說不太好。回南昌后,他還給我打過電話匯報事情進展,哎這種真性情男人難得啊,祝好運吧!
????????? 好不容易回趟家,把本科同學約出來聚聚,4年啊大家都變化不少啊,我還在學校里混著,慚愧慚愧。特別佩服慶銘老兄敢跳出來自己單干,這份激情沖勁自愧不如,感覺可能以后最有米的就要算這位老兄啦。"給自己一次機會",這句話反正我現在是不敢說。好累好累,跟寫論文樣的,就是廢話多。這天氣還真是熱,在宿舍都像洗桑拿,還是跑地鐵里去躲涼去。學校趕緊地發派遣證,我要去zh,我要空調!!
?????????
?
?????????









?????????
?????????
?????????

昨夜人生 2009-06-21 17:05 發表評論
]]>
畢業安排http://m.tkk7.com/mphome/archive/2009/06/09/281013.html昨夜人生昨夜人生Tue, 09 Jun 2009 13:48:00 GMThttp://m.tkk7.com/mphome/archive/2009/06/09/281013.htmlhttp://m.tkk7.com/mphome/comments/281013.htmlhttp://m.tkk7.com/mphome/archive/2009/06/09/281013.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/281013.htmlhttp://m.tkk7.com/mphome/services/trackbacks/281013.html???????? 明天所里的同學集體去湖南鳳凰旅行,大家興致還是挺濃的,唯一的缺憾就是女生太少,哎這種情況一次次在工科學生旁邊發生,慘啊。聽說苗族的mm還是很水靈的,就近解渴和她們湊合湊合。
??????? 看看玩完后時間夠不夠,還是回家一趟吧。以后上班時間就不太好安排了,再說還要向大姨夫問個事,白白浪費這么好個機會,怪不好意思,回去解釋解釋,再說有些事也不是我一個人弄說了算的。
??????? 23號回來后畢業照,,接下來就是請老師,所里同學大家一起吃飯,還有個校長捻絮儀式,學校還不錯這點學人家外國的辦得挺像模像樣的,就辛苦啦人家校長大人,一整天重復一套動作,握手,捻絮,發證書,微笑,擺pose,最后camera,估計今年得5000遍,換個體力不好的不搞慘才怪。還想看看有沒有機會請別人吃個飯,其實也不想怎么的,禮貌而已嘛。
??????? 畢業arrange差不多就這樣啦,很簡單也有些無聊,要問我讀研期間最大的遺憾是什么你就可以去換個問法“本科期間最大的遺憾是什么"因為答案都是一樣的,有時我也感到無語,按常理來說真的不至于啊。下次弄個面試版的調查,例如研究生期間做過最成功的一件事什么,最后悔的是什么,當然不會像面試時那么冠冕彈簧,盡量做到不虛偽,恩這個一定得做。
??????? 另外蘇打綠的那個小情歌還正難唱,嚴重懷疑那個叫青什么峰的是不是個男人。


昨夜人生 2009-06-09 21:48 發表評論
]]>
人物志http://m.tkk7.com/mphome/archive/2009/06/08/280585.html昨夜人生昨夜人生Mon, 08 Jun 2009 03:48:00 GMThttp://m.tkk7.com/mphome/archive/2009/06/08/280585.htmlhttp://m.tkk7.com/mphome/comments/280585.htmlhttp://m.tkk7.com/mphome/archive/2009/06/08/280585.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/280585.htmlhttp://m.tkk7.com/mphome/services/trackbacks/280585.html

澳門仔自歸大陸后,身形愈發消瘦,思循古法于入冬時加以補養。【注意身形愈發消瘦不是去了澳門才造成的,沒看到我天天堅持跑步啊,鍛煉結果Keep Fit,知不知啊】小三川之味,已去數次,漸厭之,眾人遂奔大巴適。為犒此仔拔毛之舉,夜敲此篇老毛,為RICA人物列傳開刀之作【很榮幸啊,看來錢沒有白花啊,雖然錢也是從萬惡的 Casino 拿來的,但誰知下次會不會再還回去呢】。
???
吾與此猥物同床異枕二載有余,甚悉之。【這話說的,我是和你對腳,不是同床。反正我是沒有gay傾向,至于你有沒有我就不知啦】老毛悄然行至身后,吾不待轉首即感猥瑣之氣鋪天蓋地,料定必是此物,老毛訝之。【對我如此之關切,更加證明你的取向有問題,以后注意和我保持距離】
???
此君好戴一寵物圈于項,名曰健身,實未見效,【帶鈦白項圈好處有二:1.防止腰肌勞損,知不知腰對男人的重要性啊。2.美觀,引領時尚之風,君不見劉德華也開始學樣了嘛。】反有阻大腦供養之嫌,何以為證?近日老毛言語迥異于常。濤哥、阿杜皆不堪其擾,存滅其肉體而后快之意。老毛以寡敵眾,慷慨應對,屢除其自生大規模殺傷化學武器保險,置于寢室上風處,隨即頹勢立轉。【我有這么殘忍嘛,要怪就怪安踏不透氣,無心之作。】余竊以為此乃老毛漸歸本性之兆。
???
老毛長于言辯,眼光敏銳,領風氣之先(數度拉吾下水),思維極為跳躍,擅傷女仔之心(略去數萬言。。。),而討大媽歡心。【反了反了,從來都是我被別人挫傷。】猛男CALL猥瑣毛,頗為傳神。【保留申辯的權利】此仔將混跡于珠海某著名CM公司,余甚憂之。澳門場暗備此仔諸多劣跡,若這廝任職CM毛總,無間道恐將由其主演【雖然我玩了5次,大部分是有掙,誰知別人是不是小餌釣大魚】。。。

PS:
覓兔肉于巴適,半餉而不可得,痛憾之~

【感謝韓老大為我研究生三年做了個簡要的總結,雖然大部分不是好話,弄得我都不好到處貼。總是為我整理了下思路,開始寫自序了!】



昨夜人生 2009-06-08 11:48 發表評論
]]>
今天真激動http://m.tkk7.com/mphome/archive/2008/05/27/203335.html昨夜人生昨夜人生Tue, 27 May 2008 13:50:00 GMThttp://m.tkk7.com/mphome/archive/2008/05/27/203335.html閱讀全文

昨夜人生 2008-05-27 21:50 發表評論
]]>
龍應臺:你應該學會不相信---你來看此花時(好文)http://m.tkk7.com/mphome/archive/2008/04/27/196492.html昨夜人生昨夜人生Sun, 27 Apr 2008 09:37:00 GMThttp://m.tkk7.com/mphome/archive/2008/04/27/196492.htmlhttp://m.tkk7.com/mphome/comments/196492.htmlhttp://m.tkk7.com/mphome/archive/2008/04/27/196492.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/196492.htmlhttp://m.tkk7.com/mphome/services/trackbacks/196492.html?

二十歲之前相信的很多東西,后來一件一件變成不相信。

曾經相信過愛國,后來知道“國”的定義有問題,通常那循循善誘要你愛國的人所定義的“國”,不一定可愛,不一定值得愛,而且更可能值得推翻。

曾經相信過歷史,后來知道,原來歷史的一半是編造。前朝史永遠是后朝人在寫,后朝人永遠在否定前朝,他的后朝又來否定他,但是負負不一定得正,只是累積漸進的扭曲變形移位,使真相永遠掩蓋,無法復原。說“不容青史盡成灰”,表達的正是,不錯,青史往往是要成灰的。指鹿為馬,也往往是可以得逞和勝利的。

曾經相信過文明的力量,后來知道,原來人的愚昧和野蠻不因文明的進展而消失,只是愚昧野蠻有很多不同的面貌:純樸的農民工人、深沉的知識分子、自信的政治領袖、替天行道的王師,都可能有不同形式的巨大愚昧和巨大野蠻,而且野蠻和文明之間,竟然只有極其細微、隨時可以被抹掉的一線之隔。

曾經相信過正義,后來知道,原來同時完全可以存在兩種正義,而且彼此抵觸,冰火不容。選擇其中之一,正義同時就意味著不正義。而且,你絕對看不出,某些人在某一個特定的時機熱烈主張某一個特定的正義,其中隱藏著深不可測的不正義。

曾經相信過理想主義者,后來知道,理想主義者往往經不起權力的測試:一掌有權力,他或者變成當初自己誓死反對的“邪惡”,或者,他在現實的場域里不堪一擊,一下就被弄權者拉下馬來,完全沒有機會去實現他的理想。理想主義者要有品格,才能不被權力腐化;理想主義者要有能力,才能將理想轉化為實踐。可是理想主義者兼具品格及能力者,幾希。

曾經相信過愛情,后來知道,原來愛情必須轉化為親情才可能持久,但是轉化為親情的愛情,猶如化入杯水中的冰塊---它還是冰塊嗎?

曾經相信過海枯石爛作為永恒不滅的表征,后來知道,原來海其實很容易枯,石,原來很容易爛。雨水,很可能不再來,滄海,不會再成桑田。原來,自己腳下所踩的地球,很容易被毀滅。海枯石爛的永恒,原來不存在。

二十歲之前相信的很多東西,有些其實到今天也還相信。

譬如國也許不可愛,但是土地和人可以愛。譬如史也許不能信,但是對于真相的追求可以無止盡。譬如文明也許脆弱不堪,但是除文明外我們其實別無依靠。譬如正義也許極為可疑,但是在乎正義比不在乎要安全。譬如理想主義者也許成就不了大事大業,但是沒有他們社會一定不一樣。譬如愛情總是幻滅的多,但是螢火蟲在夜里發光從來就不是為了保持光。譬如海枯石爛的永恒也許不存在,但是如果一粒沙里有一個無窮的宇宙,一剎那里想必也有一個不變不移的時間。

那么,有沒有什么,是我二十歲前不相信的,現在卻信了呢?

有的,不過都是些最平凡的老生常談。曾經不相信“性格決定命運”,現在相信了。曾經不相信“色即是空”,現在相信了。曾經不相信“船到橋頭自然直”,現在有點信了。曾經不相信無法實證的事情,現在也還沒準備相信,但是,有些無關實證的感覺,我明白了,譬如李叔同圓寂前最后的手書:“君子之交,其淡如水,執象而求,咫尺千里。問余何適,廓爾忘言,華枝春滿,天心月圓。”

相信與不相信之間,彷佛還有令人沉吟的深度。



昨夜人生 2008-04-27 17:37 發表評論
]]>
<java pitfalls 中文版>讀書筆記http://m.tkk7.com/mphome/archive/2008/03/03/183563.html昨夜人生昨夜人生Mon, 03 Mar 2008 13:32:00 GMThttp://m.tkk7.com/mphome/archive/2008/03/03/183563.htmlhttp://m.tkk7.com/mphome/comments/183563.htmlhttp://m.tkk7.com/mphome/archive/2008/03/03/183563.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/183563.htmlhttp://m.tkk7.com/mphome/services/trackbacks/183563.html1.父類的靜態方法和最終方法不能被覆蓋。
2.用靜態方法覆蓋實例方法是通不過編譯的
3.String 的intern函數是將該String放入JVM的常量池中,避免出現String類型的多處應用。
? 例如 b=a.intern();
?????? a==b 等于TRUE
4.訪問被覆蓋的方法,只能用super
5.只能通過傳遞數組來達到,基本數據類型數據引用的效果。
6.注意clone的深度,當要克隆一個對象時,若該對象的內部有對象,則需要將內部對象也clone,也就是主要寫clone對象。
?
?
7.若以對象作為hashmap的索引值,需要重寫該對象的equal,和hashcode函數。???????

8.異常,如果對try{}catch(exception o){}的所有catch情況都考慮到了的話,調用者就不需要添加catch或throw exception啦

9.文件流: 分為字節流( 帶Input)和字符流(帶reader)
????????????? 例如FileInputStream??? 例如FileReader
?????????? 字符流不依賴於編碼,全部采用unicode編碼
?????????? 如果需要支持國際化的話就需要采用直接流啦 。
?????????? 示例:? FileInputStream is=new FileInputStream(f);
?????????????????? InputStreamReader r=new InputSteamReader(is,"utf-8");

? 另外可以使用System.getProperty("file.endcoding")來獲得系統的默認編碼
10,數組和矢量Vector比較? 遍歷Vector比較慢,因為Vector是線程安全的,獲取值時采用了同步化,解決方法在遍歷是toArray()
??? 例外ArrayList具有vector的動態增加長度的特點,但ArrayList是非同步的矢量。
11.在循環體內鏈接字符串,使用StringBuffer效率更高;其他情況下使用+。



昨夜人生 2008-03-03 21:32 發表評論
]]>
軟件最大的追求是什么? (轉載)http://m.tkk7.com/mphome/archive/2008/02/25/181984.html昨夜人生昨夜人生Mon, 25 Feb 2008 06:11:00 GMThttp://m.tkk7.com/mphome/archive/2008/02/25/181984.htmlhttp://m.tkk7.com/mphome/comments/181984.htmlhttp://m.tkk7.com/mphome/archive/2008/02/25/181984.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/181984.htmlhttp://m.tkk7.com/mphome/services/trackbacks/181984.html前段時間讀了《軟件的最大追求是什么》,擊節叫好,深以為然,雖然該文章很多地方顯得有點極端。

如今的軟件系統越來越復雜,如果軟件的結構不好會影響軟件的可維護性,重構代碼是一件極其痛苦的事情。

關于軟件的復雜性問題,我做了一些思考:

1) Cyclomatic Complexity (圈復雜性 = number of decision points +1    其中number of decision points是指一個if else之類的條件判斷語句 (引自《軟件的最大追求是什么》)

if else 語句可以被行為模式/策略模式代替,不妨看下列的例子:

假設我們要根據條件判斷來完成不同的行為,用if else 是這樣寫的:

main() {

if(case A){

//do with strategy A

}else(case B){

//do with strategy B

}else(case C){

//do with strategy C

}

}



用策略模式則如下:

class runner{

do();

}



class A extends runner{

do(){

//do with strategy A

}

}



class B extends runner{

do(){

//do with strategy B

}

}



class C extends runner {

do(){

//do with strategy C

}

}



main(){

runner.do();

}



用了策略模式后main()中的語句的確簡單多了,再也看不到該死的if else了^_^酷~~~



可實際上是這樣簡單嗎???仔細研究一下上面的代碼就能看出問題出來,首先這兩段代碼中的A、B、C的實際意義是不一樣的:第一段代碼中ABC代表的是某一個邏輯條件的值而第二段中的ABC則是具體的類;第二段得到如此簡化的前提是它得到的邏輯條件就是一個類;如果得到的仍然只是一個邏輯條件,那么為了達到代碼簡化的效果,必須由另一個類(或方法)完成這種邏輯條件到具體類的轉換,會出現類似下列的代碼

class RunnerFactory{

runner getInstante(case){

if (case A) return new A();

else if (case B) return new B();

else if (case C) return new C(); } }



從測試的角度來說,兩者的測試分支都是3,復雜度相同,而第二種方法在很多的時候貌似還要測試借口的有效性。用策略模式還有一個缺點就是會使系統中的類的數量大大的增加,如上的例子,采用if else類的數量為1,而采用策略模式的類個數為5個或6個(主要取決于邏輯映射是否用單獨的類)。

如果邏輯判斷的條件有三個,每個邏輯條件有三種可能的話,用策略模式系統至少會增加10個新類;如果條件更多的話類的個數也會更多 這么看來GOF的策略模式還要它干嘛??

當然不是,策略模式在很多情況下是一種非常好的解決方案。

這還要從if else 語句造成程序復雜以至難以維護的真正原因說起。就我個人的感覺真正造成if else語句難以維護的原因是每一個邏輯分支中的處理語句過長。比如我現在工作中維護的代碼,常常一個條件下面的業務處理語句有兩三千行,每次我光確定某個邏輯分支的結束位置就要找半天,頭暈-_-!。如果是多層條件的話情況就更糟了。一個分支就一千多行,幾個分支上萬行自然很難維護。 if else 語句本質上是程序的流程控制語句,而分支中N長的代碼通常是業務處理語句。

行為模式/策略模式就是把流程判斷和業務處理進行了一次解耦,將業務邏輯封裝成一個個單獨的類。換句話說,行為模式/策略模式并不是不需要if else 語句(事實上該判斷的還是要判斷),只不過的換了地方或者是別的代碼幫你做了。另一方面,進行邏輯判斷的語句被集中起來而不是分散在程序的各個角落,有利于邏輯本身的維護。策略模式/行為模式還有一個明顯的好處就是如果新增加了一種狀態,我們只需要新增加一個策略類(同上的ABC)就可以了,避免了在程序中改動那些大段大段讓人厭煩的if else 語句。

所以對于你的程序來說到底是使用設計模式還是簡單的使用if else 關鍵在于你的程序是否復雜,有沒有必要將控制邏輯和業務邏輯進行解耦。當然如果你可以用別的方式實現解耦也是非常好的。



2) Response for Class(RFC) 當一個類和很多其他類存在依賴時,它就變得復雜甚至難以修改和維護,這樣,RFC值越大,表示你的系統味道越壞。(引自《軟件的最大追求是什么》)



復雜性是由類與類之間的依賴關系(dependency)造成的。

具體如下所示:

interface Runner;

class A implement runner{ do(){}; }



一個大型的系統中很多地方用到了runner接口,于是在很多地方出現了如下的相同代碼:

{

Runner r = new A();

r.do();

}



如果因為某種原因runner接口的實現類改為B,則在所有用到runner接口的地方代碼都要統統改為:

{

//Runner r = new A();

Runner r = new B(); r.do();

}



這些遍布系統各個角落的改動是繁瑣且容易出錯的。

于是出現了各種框架和模式,其中最著名的當然是IOC(Inversion of Control)反轉控制或者稱之為依賴型注射(Dependency Injection) 那些討厭的代碼變成了如下:

{

ApplicationContext ctx = new FileSystemXmlApplicationContext("spring.xml");

Runner r = (Runner)ctx.getBean("Runner");

r.do();

}



這樣我們就不需要對各個角落的代碼進行維護了,容器會自動的為我們選擇合適的類。

我到覺得維護的工作還是我們的,為了讓容器注射入合適的類,我們必須要維護一個叫Spring.xml的配置文件,或者如果你不喜歡配置文件這個東東的話(比如偶)就得自己寫一個注冊類,將依賴關系一一注冊進去。你還要為使用該接口的類定義一個以該接口為參數的構造函數或者該接口的setter方法,好讓容器可以將實現類順利的注射進來。

該做的還是要做,只不過換了一個地方做而已。但就是換了個地方,實現了對依賴關系的集中維護(又是集中),大大的改善了系統的結構,明確了不同職責單位之間的分工。呵呵,有時自己也極端的覺得設計的工作說到底就是解決代碼結構的問題^_^



IOC一直是和輕量級框架聯系在一起的。所謂的重量級框架EJB也有實現相同功能的解決方案:Service Locator Service Locator就是一個定位器,它維護了一個數據結構(比如一個表),通過這個定位器你可以準確的定位到你的接口想要的實現類,Service Locator同樣使你免去了改變接口實現類后的維護惡夢:

{

Runner r = (Runner)ServiceLocator.lookup("Runner");

r.do();

}



無論是IOC還是Service Locator都幫助你維護了類之間的依賴關系。那么是否我們在編程中一定要用呢,這又是個權衡的問題,IOC帶來了很多的好處,不過我個人認為它的代碼是讓人費解的(你根本不知道它做了什么),并且為了用它,一方面你要借助于容器,另一方面你要編寫配置文件,要為依賴型注射提供合適的途徑。

如果你的系統類之間的依賴型錯綜復雜,需求的變化常常導致實現類的變化,同時你又希望采用測試驅動的快速開發模式,IOC毫無疑問是一個完美的解決方案;如果你的系統不存在上述的問題,為什么不簡簡單單的在程序中寫死呢,何苦去維護一堆配置文件(我所在的開發部門貌似都比較痛恨配置文件這個東東)。Service Locator也有很多缺點,被罵的最多的就是沒法快速測試。

反轉控制,即轉換控制權。依賴關系控制權的轉換是對代碼結構的一次重構,重構的目標還是解耦,讓不同的職責代碼集中放到不同的地方,于是程序員可以更加專注的解決特定的問題,比如業務邏輯。

程序設計的發展就是對代碼結構的不斷調整,不斷解耦,讓特定的代碼解決特定的問題而不是什么都混在一起。從面向過程到面向對象難道不是這樣嗎,封裝的本質也是解耦。



在實際問題的解決當中,最重要的信條就是合適,要記住任何結構的改進都會付出代價,你的改進是否值得你為此付出的代價。比如當你做一個嵌入式程序的時候你首要考慮的自然是效率問題;而如果你做的是一個ERP產品,在系統設計的時候,光系統的可維護性問題就讓你不得不絞盡腦汁考慮一下代碼的結構。



一句話,只做最對的。

程序設計的最大追求就是在合適的地方做正確的事。

昨夜人生 2008-02-25 14:11 發表評論
]]>
利用方法名稱執行方法行為的源代碼http://m.tkk7.com/mphome/archive/2008/02/25/181951.html昨夜人生昨夜人生Mon, 25 Feb 2008 03:48:00 GMThttp://m.tkk7.com/mphome/archive/2008/02/25/181951.htmlhttp://m.tkk7.com/mphome/comments/181951.htmlhttp://m.tkk7.com/mphome/archive/2008/02/25/181951.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/181951.htmlhttp://m.tkk7.com/mphome/services/trackbacks/181951.html

public static void main(String[] args){

CommandLoader cl=new DefaultCommandLoader(new DefaultShowCommand());
cl.excute("executeShowList",null);
}
}

public interface CommandLoader {

void excute(String commandName,Object[] argument);
}


public class DefaultCommandLoader implements CommandLoader {


private ShowCommand showCommand;

private HashMap subCommandMap=new HashMap();

public DefaultCommandLoader(ShowCommand showCommand){
this.showCommand=showCommand;
init();
}


private void init() {

Method[] allMethod=this.showCommand.getClass().getMethods();
for(int i=0;i<allMethod.length;i++){
Method m=allMethod;
if(m.getName().startsWith("execute")){
subCommandMap.put(m.getName(), m);
}
}
}


public void excute(String commandName, Object[] argument) {

Method m=(Method) this.subCommandMap.get(commandName);

if(m==null){
throw new NullPointerException("not found command");
}
try{
m.invoke(this.showCommand,argument);
}
catch(Exception e){
throw new RuntimeException("Load command["+m.getName()+"error");
}
}
}

public interface ShowCommand {


public void executeShowList();

public void excuteShowString();

public void executeShowInteger();

public void executeShowLong();
}

public class DefaultShowCommand implements ShowCommand {

public void excuteShowString() {
System.out.println(String.class.getName());
}

public void executeShowInteger() {
System.out.println(Integer.class.getName());
}

public void executeShowList() {
System.out.println(List.class.getName());
}

public void executeShowLong() {
System.out.println(Long.class.getName());
}

}


昨夜人生 2008-02-25 11:48 發表評論
]]>
你還在用if else嗎?(轉載)http://m.tkk7.com/mphome/archive/2008/02/25/181927.html昨夜人生昨夜人生Mon, 25 Feb 2008 02:57:00 GMThttp://m.tkk7.com/mphome/archive/2008/02/25/181927.htmlhttp://m.tkk7.com/mphome/comments/181927.htmlhttp://m.tkk7.com/mphome/archive/2008/02/25/181927.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/181927.htmlhttp://m.tkk7.com/mphome/services/trackbacks/181927.html傳統思維習慣分析

  為什么會業務邏輯層使用if else,其實使用者的目的也是為了重用,但是這是面向過程編程的重用,程序員只看到代碼重用,因為他看到if else幾種情況下大部分代碼都是重復的,只有個別不同,因此使用if else可以避免重復代碼,并且認為這是模板Template模式。

  他范的錯誤是:程序員只從代碼運行順序這個方向來看待它的代碼,這種思維類似水管或串行電路,水沿著水管流動(代碼運行次序),當遇到幾個分管(子管),就分到這幾個分管子在流動,這里就相當于碰到代碼的if else處了。

  而使用OO,則首先打破這個代碼由上向下順序等同于運行時的先后循序這個規律,代碼結構不由執行循序決定,由什么決定呢?由OO設計;設計模式會取代這些if else,但是最后總是由一個Service等總類按照運行順序組裝這些OO模塊,只有一處,這處可包含事務,一般就是Service,EJB中是Session bean。

  一旦需求變化,我們更多的可能是Service中各個OO模塊,甚至是只改動Service中的OO模塊執行順序就能符合需求。

  這里我們也看到OO分離的思路,將以前過程語言的一個Main函數徹底分解,將運行順序與代碼其他邏輯分離開來,而不是象面向過程那樣混亂在一起。所以有人感慨,OO也是要順序的,這是肯定的,關鍵是運行順序要單獨分離出來。

  是否有if else可以看出你有沒有將運行順序分離到家。

設計模式的切入口

  經常有人反映,設計模式是不錯,但是我很難用到,其實如果你使用if else來寫代碼時(除顯示控制以外),就是在寫業務邏輯,只不過使用簡單的判斷語句來作為現實情況的替代者。

   還是以大家熟悉的論壇帖子為例子,如ForumMessage是一個模型,但是實際中帖子分兩種性質:主題貼(第一個根貼)和回帖(回以前帖子的帖子),這里有一個樸素的解決方案:
建立一個ForumMessage,然后在ForumMessage加入isTopic這樣判斷語句,注意,你這里一個簡單屬性的判斷引入,可能導致你的程序其他地方到處存在if else 的判斷。

  如果我們改用另外一種分析實現思路,以對象化概念看待,實際中有主題貼和回帖,就是兩種對象,但是這兩種對象大部分是一致的,因此,我將ForumMessage設為表達主題貼;然后創建一個繼承ForumMessage的子類ForumMessageReply作為回帖,這樣,我在程序地方,如Service中,我已經確定這個Model是回帖了,我就直接下溯為ForumMessageReply即可,這個有點類似向Collection放入對象和取出時的強制類型轉換。通過這個手段我消滅了以后程序中if else的判斷語句出現可能。

  從這里體現了,如果分析方向錯誤,也會導致誤用模式。

  討論設計模式舉例,不能沒有業務上下文場景的案例,否則無法決定是否該用模式,下面舉兩個對比的例子:

  第一. 這個帖子中舉例的第一個代碼案例是沒有上下文的,文中只說明有一段代碼:

main() {

if(case A){

//do with strategy A

}else(case B){

//do with strategy B

}else(case C){

//do with strategy C

}

}

?

  這段代碼只是純粹的代碼,沒有業務功能,所以,在這種情況下,我們就很難確定使用什么模式,就是一定用策略模式等,也逃不過還是使用if else的命運,設計模式不是魔法,不能將一段毫無意義的代碼變得簡單了,只能將其體現的業務功能更加容易可拓展了。

  第二.在這個帖子中,作者舉了一個PacketParser業務案例,這段代碼是體現業務功能的,是一個數據包的分析,作者也比較了各種模式使用的不同,所以我們還是使用動態代理模式或Command模式來消滅那些可能存在的if else

  由以上兩個案例表明:業務邏輯是我們使用設計模式的切入點,而在分解業務邏輯時,我們習慣則可能使用if else來實現,當你有這種企圖或者已經實現代碼了,那么就應該考慮是否需要重構Refactoring了。

if else替代者

  那么實戰中,哪些設計模式可以替代if else呢?其實GoF設計模式都可以用來替代if else,我們分別描述如下:

  • 狀態模式 
      當數據對象存在各種可能性的狀態,而且這種狀態將會影響到不同業務結果時,那么我們就應該考慮是否使用狀態模式,當然,使用狀態模式之前,你必須首先有內存狀態這個概念,而不是數據庫概念,因為在傳統的面向過程的/面向數據庫的系統中,你很難發現狀態的,從數據庫中讀取某個值,然后根據這個值進行代碼運行分流,這是很多初學者常干的事情。參考文章:狀態對象:數據庫的替代者
      使用傳統語言思維的情況還有:使用一個類整數變量標識狀態:

    ?

    public class Order{

    private int status;

    //說明:

    //status=1 表示訂貨但為查看 ;

    //status=2 表示已經查看未處理;

    //status=3 表示已經處理未付款

    //status=4 表示已經付款未發貨

    //status=5 表示已經發貨

    }


      上述類設計,無疑是將類作為傳統語言的函數來使用,這樣導致程序代碼中存在大量的if else。

  • 策略模式 
      當你面臨幾種算法或者公式選擇時,可以考慮策略模式,傳統過程語言情況是:從數據庫中讀取算法數值,數值1表示策略1,例如保存到數據庫;數值為2表示策略2,例如保存到XMl文件中。這里使用if else作為策略選擇的開關。

  • command模式 
      傳統過程的思維情況是:如果客戶端發出代號是1或"A",那么我調用A.java這個對象來處理;如果代號是2或"B",我就調用B.java來處理,通過if else來判斷客戶端發送過來的代碼,然后按事先約定的對應表,調用相應的類來處理。

  • MVC模式 
      MVC模式的傳統語言誤用和Command模式類似,在一個Action類中,使用if else進行前后臺調度,如果客戶端傳送什么命令;我就調用后臺什么結果;如果后臺處理什么結構,再決定推什么頁面,不過,現在我們使用Struts/JSF這樣MVC模式的框架實現者就不必范這種低級錯誤。

  • 職責鏈模式 
      職責鏈模式和Command模式是可選的,如果你實在不知道客戶端會發出什么代號;也沒有一個事先定義好的對照表,那么你只能編寫一個個類去碰運氣一樣打開這個包看一下就可以。與Command是不同在AOP vs Decorator一文中有分析。

  • 代理或動態代理模式 
      代理對象可以是符合某種條件的代表者,比如,權限檢驗,傳統面向過程思維是:當一個用戶登陸后,訪問某資源時,使用if else進行判斷,只有某種條件符合時,才能允許訪問,這樣權限判斷和業務數據邏輯混亂在一起,使用代理模式可以清晰分離,如果嫌不太好,使用動態代理,或者下面AOP等方式。

  • AOP或Decorator模式
      
      其實使用filter過濾器也可以替代我們業務中的if else,過濾器起到一種過濾和篩選作用,將符合本過濾器條件的對象攔截下來做某件事情,這就是一個過濾器的功能,多個過濾器組合在一起實際就是if else的組合。
      所以,如果你實在想不出什么辦法,可以使用過濾器,將過濾器看成防火墻就比較好理解,當客戶端有一個請求時,經過不同性質的防火墻,這個防火墻是攔截端口的;那個防火墻是安全檢查攔截等等。過濾器也如同紅藍白各種光濾鏡;紅色濾鏡只能將通過光線中的紅色攔截了;藍色濾鏡將光線中的藍色攔截下來,這實際上是對光線使用if else進行分解。


      如圖,通過一個個條件過濾器我們立體地實現了對信號的分離,如果你使用if else,說明你是將圖中的條件1/2/3/4合并在一起,在同一個地方實現條件判斷。
      需要深入了解過濾器的實現細節和微小區別,請參考文章:AOP vs Decorator

    OO設計的總結  

      還有一種偽模式,雖然使用了狀態等模式,但是在模式內部實質還是使用if else或switch進行狀態切換或重要條件判斷,那么無疑說明還需要進一步努力。更重要的是,不能以模式自居,而且出書示人。

      真正掌握面向對象這些思想是一件困難的事情,目前有各種屬于揪著自己頭發向上拔的解說,都是誤人子弟的,所以我覺得初學者讀Thinking in Java(Java編程思想)是沒有用,它試圖從語言層次來講OO編程思想,非常失敗,作為語言參考書可以,但是作為Java體現的OO思想的學習資料,就錯了。

      OO編程思想是一種方法論,方法論如果沒有應用比較,是無法體會這個方法論的特點的,禪是古代一個方法論,悟禪是靠挑水砍柴這些應用才能體會。

      那么OO思想靠什么應用能夠體會到了?是GoF設計模式,GoF設計模式是等于軟件人員的挑水砍柴等基本活,所以,如果一個程序員連基本活都不會,他何以自居OO程序員?從事OO專業設計編程這個工作,如果不掌握設計模式基本功,就象一個做和尚的人不愿意挑水砍柴,他何以立足這個行業?早就被師傅趕下山。

      最后總結:將if else用在小地方還可以,如簡單的數值判斷;但是如果按照你的傳統習慣思維,在實現業務功能時也使用if else,那么說明你的思維可能需要重塑,你的編程經驗越豐富,傳統過程思維模式就容易根深蒂固,想靠自己改變很困難;建議接受專業頭腦風暴培訓

      用一句話總結:如果你做了不少系統,很久沒有使用if else了,那么說明你可能真正進入OO設計的境地了。(這是本人自己發明的實戰性的衡量考核標準)。



  • 昨夜人生 2008-02-25 10:57 發表評論
    ]]>
    servlet的啟動順序http://m.tkk7.com/mphome/archive/2007/12/26/170636.html昨夜人生昨夜人生Wed, 26 Dec 2007 09:02:00 GMThttp://m.tkk7.com/mphome/archive/2007/12/26/170636.htmlhttp://m.tkk7.com/mphome/comments/170636.htmlhttp://m.tkk7.com/mphome/archive/2007/12/26/170636.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/170636.htmlhttp://m.tkk7.com/mphome/services/trackbacks/170636.html當一個web容器產生一個servlet實例時,它的基本順序如下:
    1、?servlet容器首先調用這個servlet的init()方法,它建會初始化一個資源給servlet使用。列如一個logger。這個init()方法在整個servlet的生存周期只會被調用一次。
    2、?init()方法初始化了一個對象,對象繼承了java.servlet.ServletConfig接口。這個對象使servlet能夠初始化那些被聲明在部署描述符的參數。ServletConfig也使servlet有權使用一個 javax.servlet.ServletContext 的對象,用這個對象servlet可以記錄信息,分派請求到其他的web組件上并且能夠使用在同一個應用上的其他web資源。
    3、?servlet容器調用這個servlet的service()方法去響應servlet的一些請求。根據HttpServlets,service()自動的調用合適的HTTP方法去處理請求通過調用servlet的doGet()或者doPost()方法。幾個例子,用戶發送了個Post請求這時servlet通過doPost()方法的執行來響應這個請求。
    4、?當調用兩個主要的HttpServlet的doPost(),doGet()方法,這個servlet容器將產生javax..servlet.http.HttpServletRequest和HttpServletResponse 的對象并且把它們作為參數傳到這些處理請求的方法中。
    ?
    5、?管理一個servlet的生命周期,或者決定這個servlet實例對request請求的處理,在java虛擬機上的存在時間。當一個servlet容器開始移除一個servlet的時候將調用servlet的destroy()方法,在這個方法中能夠釋放所有的資源,比如一個數據庫連接。


    昨夜人生 2007-12-26 17:02 發表評論
    ]]>
    jetty Servlet 技術http://m.tkk7.com/mphome/archive/2007/12/24/170153.html昨夜人生昨夜人生Mon, 24 Dec 2007 13:00:00 GMThttp://m.tkk7.com/mphome/archive/2007/12/24/170153.htmlhttp://m.tkk7.com/mphome/comments/170153.htmlhttp://m.tkk7.com/mphome/archive/2007/12/24/170153.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/170153.htmlhttp://m.tkk7.com/mphome/services/trackbacks/170153.html???????????? 1.將NIO概念加入到servlet中,(具體的技術還是不太)
    ???????????? 2.引入了continuation 機制。說白了就是將每個連接connection從servlet的suspend換到container的suspend,不在占用servlet的資源,此處需要考慮換入繼續執行的問題。用通俗的話來講就是給serlvet加入了記憶功能。
    ???????????? 3.Split buffers:使用改技術的前提是采用continuation,也就是在讀寫的時候加入緩存塊
    ???????????? 4.Delayed dispatch:好像這方面的改進作用不大,只是對那些request的請求一起到,在將其發送到servlet去處理。



    ????????????? 暫時看懂的就這么多

    昨夜人生 2007-12-24 21:00 發表評論
    ]]>
    12.21 開題報告http://m.tkk7.com/mphome/archive/2007/12/21/169419.html昨夜人生昨夜人生Fri, 21 Dec 2007 10:28:00 GMThttp://m.tkk7.com/mphome/archive/2007/12/21/169419.htmlhttp://m.tkk7.com/mphome/comments/169419.htmlhttp://m.tkk7.com/mphome/archive/2007/12/21/169419.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/169419.htmlhttp://m.tkk7.com/mphome/services/trackbacks/169419.html??????????????????????????????? JGroup
    ??????????????????????????????? XMPP COMETD

    昨夜人生 2007-12-21 18:28 發表評論
    ]]>
    數據庫master/slave模式http://m.tkk7.com/mphome/archive/2007/12/12/167327.html昨夜人生昨夜人生Wed, 12 Dec 2007 12:40:00 GMThttp://m.tkk7.com/mphome/archive/2007/12/12/167327.htmlhttp://m.tkk7.com/mphome/comments/167327.htmlhttp://m.tkk7.com/mphome/archive/2007/12/12/167327.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/167327.htmlhttp://m.tkk7.com/mphome/services/trackbacks/167327.html采用ReplicationConnection鏈接后,設置Connection.setReadOnly(true)時,讀寫可以從master,slave中任意讀寫。
    設置Connection.setReadOnly(false)只能從master中讀取。
    采用此方法可以做到只在master上更新數據,利用slave來讀取數據。
    詳細介紹
    http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-replication-connection.html




    昨夜人生 2007-12-12 20:40 發表評論
    ]]>
    java中double運算的問題http://m.tkk7.com/mphome/archive/2007/12/10/166783.html昨夜人生昨夜人生Mon, 10 Dec 2007 12:47:00 GMThttp://m.tkk7.com/mphome/archive/2007/12/10/166783.htmlhttp://m.tkk7.com/mphome/comments/166783.htmlhttp://m.tkk7.com/mphome/archive/2007/12/10/166783.html#Feedback1http://m.tkk7.com/mphome/comments/commentRss/166783.htmlhttp://m.tkk7.com/mphome/services/trackbacks/166783.htmldouble t1=34.0;
    double t2=2.55
    System.out.println(t1*t2);
    結果不等于 86.7

    解決方案 采用 java.math.BigDecimal
    此處有一個通用類

    1. import ?java.math.BigDecimal; ??
    2. ??
    3. /**?*/ /** ?
    4. *?由于Java的簡單類型不能夠精確的對浮點數進行運算,這個工具類提供精 ?
    5. *?確的浮點數運算,包括加減乘除和四舍五入。 ?
    6. */ ??
    7. ??
    8. public ? class ?Arith{ ??
    9. ??
    10. //默認除法運算精度 ??
    11. ??
    12. private ? static ? final ? int ?DEF_DIV_SCALE?=? 10 ; ??
    13. ??
    14. //這個類不能實例化 ??
    15. ??
    16. private ?Arith(){ ??
    17. ??
    18. } ??
    19. ??
    20. /**?*/ /** ?
    21. *?提供精確的加法運算。 ?
    22. *?@param?v1?被加數 ?
    23. *?@param?v2?加數 ?
    24. *?@return?兩個參數的和 ?
    25. */ ??
    26. ??
    27. public ? static ? double ?add( double ?v1, double ?v2){ ??
    28. ??
    29. BigDecimal?b1?=? new ?BigDecimal(Double.toString(v1)); ??
    30. ??
    31. BigDecimal?b2?=? new ?BigDecimal(Double.toString(v2)); ??
    32. ??
    33. return ?b1.add(b2).doubleValue(); ??
    34. ??
    35. } ??
    36. ??
    37. /**?*/ /** ?
    38. *?提供精確的減法運算。 ?
    39. *?@param?v1?被減數 ?
    40. *?@param?v2?減數 ?
    41. *?@return?兩個參數的差 ?
    42. */ ??
    43. ??
    44. public ? static ? double ?sub( double ?v1, double ?v2){ ??
    45. ??
    46. BigDecimal?b1?=? new ?BigDecimal(Double.toString(v1)); ??
    47. ??
    48. BigDecimal?b2?=? new ?BigDecimal(Double.toString(v2)); ??
    49. ??
    50. return ?b1.subtract(b2).doubleValue(); ??
    51. ??
    52. } ??
    53. ??
    54. /**?*/ /** ?
    55. *?提供精確的乘法運算。 ?
    56. *?@param?v1?被乘數 ?
    57. *?@param?v2?乘數 ?
    58. *?@return?兩個參數的積 ?
    59. */ ??
    60. ??
    61. public ? static ? double ?mul( double ?v1, double ?v2){ ??
    62. ??
    63. BigDecimal?b1?=? new ?BigDecimal(Double.toString(v1)); ??
    64. ??
    65. BigDecimal?b2?=? new ?BigDecimal(Double.toString(v2)); ??
    66. ??
    67. return ?b1.multiply(b2).doubleValue(); ??
    68. ??
    69. } ??
    70. ??
    71. /**?*/ /** ?
    72. *?提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 ?
    73. *?小數點以后10位,以后的數字四舍五入。 ?
    74. *?@param?v1?被除數 ?
    75. *?@param?v2?除數 ?
    76. *?@return?兩個參數的商 ?
    77. */ ??
    78. ??
    79. public ? static ? double ?div( double ?v1, double ?v2){ ??
    80. ??
    81. return ?div(v1,v2,DEF_DIV_SCALE); ??
    82. ??
    83. } ??
    84. ??
    85. /**?*/ /** ?
    86. *?提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指 ?
    87. *?定精度,以后的數字四舍五入。 ?
    88. *?@param?v1?被除數 ?
    89. *?@param?v2?除數 ?
    90. *?@param?scale?表示表示需要精確到小數點以后幾位。 ?
    91. *?@return?兩個參數的商 ?
    92. */ ??
    93. ??
    94. public ? static ? double ?div( double ?v1, double ?v2, int ?scale){ ??
    95. ??
    96. if (scale< 0 ){ ??
    97. ??
    98. throw ? new ?IllegalArgumentException( ??
    99. ??
    100. "The?scale?must?be?a?positive?integer?or?zero" ); ??
    101. ??
    102. } ??
    103. ??
    104. BigDecimal?b1?=? new ?BigDecimal(Double.toString(v1)); ??
    105. ??
    106. BigDecimal?b2?=? new ?BigDecimal(Double.toString(v2)); ??
    107. ??
    108. return ?b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); ??
    109. ??
    110. } ??
    111. ??
    112. /**?*/ /** ?
    113. *?提供精確的小數位四舍五入處理。 ?
    114. *?@param?v?需要四舍五入的數字 ?
    115. *?@param?scale?小數點后保留幾位 ?
    116. *?@return?四舍五入后的結果 ?
    117. */ ??
    118. ??
    119. public ? static ? double ?round( double ?v, int ?scale){ ??
    120. ??
    121. if (scale< 0 ){ ??
    122. ??
    123. throw ? new ?IllegalArgumentException( ??
    124. ??
    125. "The?scale?must?be?a?positive?integer?or?zero" ); ??
    126. ??
    127. } ??
    128. ??
    129. BigDecimal?b?=? new ?BigDecimal(Double.toString(v)); ??
    130. ??
    131. BigDecimal?one?=? new ?BigDecimal( "1" ); ??
    132. ??
    133. return ?b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); ??
    134. ??
    135. } ??
    136. ??
    137. } ??


    昨夜人生 2007-12-10 20:47 發表評論
    ]]>
    eclipse快捷鍵大全http://m.tkk7.com/mphome/archive/2007/12/03/165021.html昨夜人生昨夜人生Mon, 03 Dec 2007 14:05:00 GMThttp://m.tkk7.com/mphome/archive/2007/12/03/165021.htmlhttp://m.tkk7.com/mphome/comments/165021.htmlhttp://m.tkk7.com/mphome/archive/2007/12/03/165021.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/165021.htmlhttp://m.tkk7.com/mphome/services/trackbacks/165021.htmleclipse快捷鍵大全??????????????????????????????????????

    eclipse快捷鍵大全

    1. 常用快捷鍵
    (1)Ctrl+Space
    說明:內容助理。提供對方法,變量,參數,javadoc等得提示,應運在多種場合,總之需要提示的時候可先按此快捷鍵。
    注:避免輸入法的切換設置與此設置沖突

    (2)Ctrl+Shift+Space
    說明:變量提示
    (3)Ctrl+/
    說明:添加/消除//注釋,在eclipse2.0中,消除注釋為Ctrl+\

    (4)Ctrl+Shift+/
    說明:添加/* */注釋

    (5)Ctrl+Shift+\
    說明:消除/* */注釋

    (6)Ctrl+Shift+F
    說明:自動格式化代碼

    (7)Ctrl+1
    說明:批量修改源代碼中的變量名,此外還可用在catch塊上.

    (8)Ctril+F6
    說明:界面切換

    (9)Ctril+Shift+M
    說明:查找所需要得包

    (10)Ctril+Shift+O
    說明:自動引入所需要得包

    (11)Ctrl+Alt+S
    說明:源代碼得快捷菜單。其中的Generate getters and setters 和 Surround with try/catch
    block比較常用.建議把它們添加為快捷鍵.快捷鍵設置在windows->preferences->Workbench->Keys

    2. 快捷鍵列表

    編輯
    作用域 功能 快捷鍵
    全局 查找并替換 Ctrl+F
    文本編輯器 查找上一個 Ctrl+Shift+K
    文本編輯器 查找下一個 Ctrl+K
    全局 撤銷 Ctrl+Z
    全局 復制 Ctrl+C
    全局 恢復上一個選擇 Alt+Shift+↓
    全局 剪切 Ctrl+X
    全局 快速修正 Ctrl1+1
    全局 內容輔助 Alt+/
    全局 全部選中 Ctrl+A
    全局 刪除 Delete
    全局 上下文信息 Alt+?Alt+Shift+?Ctrl+Shift+Space
    Java編輯器 顯示工具提示描述 F2
    Java編輯器 選擇封裝元素 Alt+Shift+↑
    Java編輯器 選擇上一個元素 Alt+Shift+←
    Java編輯器 選擇下一個元素 Alt+Shift+→
    文本編輯器 增量查找 Ctrl+J
    文本編輯器 增量逆向查找 Ctrl+Shift+J
    全局 粘貼 Ctrl+V
    全局 重做 Ctrl+Y

    查看
    作用域 功能 快捷鍵
    全局 放大 Ctrl+=
    全局 縮小 Ctrl+-

    窗口
    作用域 功能 快捷鍵
    全局 激活編輯器 F12
    全局 切換編輯器 Ctrl+Shift+W
    全局 上一個編輯器 Ctrl+Shift+F6
    全局 上一個視圖 Ctrl+Shift+F7
    全局 上一個透視圖 Ctrl+Shift+F8
    全局 下一個編輯器 Ctrl+F6
    全局 下一個視圖 Ctrl+F7
    全局 下一個透視圖 Ctrl+F8
    文本編輯器 顯示標尺上下文菜單 Ctrl+W
    全局 顯示視圖菜單 Ctrl+F10
    全局 顯示系統菜單 Alt+-

    導航
    作用域 功能 快捷鍵
    Java編輯器 打開結構 Ctrl+F3
    全局 打開類型 Ctrl+Shift+T
    全局 打開類型層次結構 F4
    全局 打開聲明 F3
    全局 打開外部javadoc Shift+F2
    全局 打開資源 Ctrl+Shift+R
    全局 后退歷史記錄 Alt+←
    全局 前進歷史記錄 Alt+→
    全局 上一個 Ctrl+,
    全局 下一個 Ctrl+.
    Java編輯器 顯示大綱 Ctrl+O
    全局 在層次結構中打開類型 Ctrl+Shift+H
    全局 轉至匹配的括號 Ctrl+Shift+P
    全局 轉至上一個編輯位置 Ctrl+Q
    Java編輯器 轉至上一個成員 Ctrl+Shift+↑
    Java編輯器 轉至下一個成員 Ctrl+Shift+↓
    文本編輯器 轉至行 Ctrl+L

    搜索
    作用域 功能 快捷鍵
    全局 出現在文件中 Ctrl+Shift+U
    全局 打開搜索對話框 Ctrl+H
    全局 工作區中的聲明 Ctrl+G
    全局 工作區中的引用 Ctrl+Shift+G

    文本編輯
    作用域 功能 快捷鍵
    文本編輯器 改寫切換 Insert
    文本編輯器 上滾行 Ctrl+↑
    文本編輯器 下滾行 Ctrl+↓

    文件
    作用域 功能 快捷鍵
    全局 保存 Ctrl+X Ctrl+S
    全局 打印 Ctrl+P
    全局 關閉 Ctrl+F4
    全局 全部保存 Ctrl+Shift+S
    全局 全部關閉 Ctrl+Shift+F4
    全局 屬性 Alt+Enter
    全局 新建 Ctrl+N

    項目
    作用域 功能 快捷鍵
    全局 全部構建 Ctrl+B

    源代碼
    作用域 功能 快捷鍵
    Java編輯器 格式化 Ctrl+Shift+F
    Java編輯器 取消注釋 Ctrl+\
    Java編輯器 注釋 Ctrl+/
    Java編輯器 添加導入 Ctrl+Shift+M
    Java編輯器 組織導入 Ctrl+Shift+O
    Java編輯器 使用try/catch塊來包圍 未設置,太常用了,所以在這里列出,建議自己設置。也可以使用Ctrl+1自動修正。

    運行
    作用域 功能 快捷鍵
    全局 單步返回 F7
    全局 單步跳過 F6
    全局 單步跳入 F5
    全局 單步跳入選擇 Ctrl+F5
    全局 調試上次啟動 F11
    全局 繼續 F8
    全局 使用過濾器單步執行 Shift+F5
    全局 添加/去除斷點 Ctrl+Shift+B
    全局 顯示 Ctrl+D
    全局 運行上次啟動 Ctrl+F11
    全局 運行至行 Ctrl+R
    全局 執行 Ctrl+U

    重構
    作用域 功能 快捷鍵
    全局 撤銷重構 Alt+Shift+Z
    全局 抽取方法 Alt+Shift+M
    全局 抽取局部變量 Alt+Shift+L
    全局 內聯 Alt+Shift+I
    全局 移動 Alt+Shift+V
    全局 重命名 Alt+Shift+R
    全局 重做 Alt+Shift+Y



    昨夜人生 2007-12-03 22:05 發表評論
    ]]>
    轉載:JAVA如何調用DOS命令 http://m.tkk7.com/mphome/archive/2007/12/03/165019.html昨夜人生昨夜人生Mon, 03 Dec 2007 14:02:00 GMThttp://m.tkk7.com/mphome/archive/2007/12/03/165019.htmlhttp://m.tkk7.com/mphome/comments/165019.htmlhttp://m.tkk7.com/mphome/archive/2007/12/03/165019.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/165019.htmlhttp://m.tkk7.com/mphome/services/trackbacks/165019.html用Java編寫應用時,有時需要在程序中調用另一個現成的可執行程序或系統命令,這時可以通過組合使用Java提供的Runtime類和Process類的方法實現。下面是一種比較典型的程序模式:
    ...
    Process process = Runtime.getRuntime().exec(".\\p.exe");
    process.waitfor( );
    ...
    在上面的程序中,第一行的“.\\p.exe”是要執行的程序名,Runtime.getRuntime()返回當前應用程序的Runtime對象,該對象的exec()方法指示Java虛擬機創建一個子進程執行指定的可執行程序,并返回與該子進程對應的Process對象實例。通過Process可以控制該子進程的執行或獲取該子進程的信息。第二條語句的目的等待子進程完成再往下執行。
    但在windows平臺上,如果處理不當,有時并不能得到預期的結果。下面是筆者在實際編程中總結的幾種需要注意的情況:
    1、執行DOS的內部命令
    如果要執行一條DOS內部命令,有兩種方法。一種方法是把命令解釋器包含在exec()的參數中。例如,執行dir命令,在NT上, 可寫成exec("cmd.exe /c dir"),在windows 95/98下,可寫成“command.exe /c dir”,其中參數“/c”表示命令執行后關閉Dos立即關閉窗口。另一種方法是,把內部命令放在一個批命令my_dir.bat文件中,在Java程序中寫成exec("my_dir.bat")。如果僅僅寫成exec("dir"),Java虛擬機則會報運行時錯誤。前一種方法要保證程序的可移植性,需要在程序中讀取運行的操作系統平臺,以調用不同的命令解釋器。后一種方法則不需要做更多的處理。
    2、打開一個不可執行的文件
    打開一個不可執行的文件,但該文件存在關聯的應用程序,則可以有兩種方式。 以打開一個word文檔a.doc文件為例,Java中可以有以下兩種寫法:
    exec("start .\\a.doc");
    exec(" c:\\Program Files\\Microsoft Office\\office\\winword.exe .\\a.doc");
    顯然,前一種方法更為簡捷方便。
    3、執行一個有標準輸出的DOS可執行程序
    在windows平臺上,運行被調用程序的DOS窗口在程序執行完畢后往往并不會自動關閉,從而導致Java應用程序阻塞在waitfor( )。導致該現象的一個可能的原因是,該可執行程序的標準輸出比較多,而運行窗口的標準輸出緩沖區不夠大。解決的辦法是,利用Java提供的Process類提供的方法讓Java虛擬機截獲被調用程序的DOS運行窗口的標準輸出,在waitfor()命令之前讀出窗口的標準輸出緩沖區中的內容。一段典型的程序如下:
    ...
    String ls_1;
    Process process = Runtime.getRuntime().exec("cmd /c dir \\windows");
    BufferedReader bufferedReader = new BufferedReader( \
    new InputStreamReader(process.getInputStream());
    while ( (ls_1=bufferedReader.readLine()) != null)
    System.out.println(ls_1);

    process.waitfor( );
    ...

    以上內容為轉載~下面內容為原創!

    今天在做客戶端程序的自動更新,簡單描述一下,就是從服務器上將更新包下載下來,然后在本地解壓縮,最后刪掉~功能很簡單~

    但是問題出在使用JAVA的ZIP模塊做文件的解壓縮不是想象的那么簡單,資源需要釋放,一個不小心就沒有辦法刪除掉原有ZIP文件了~資源的占用確實是個大問題,但是好在,客戶端程序更新完是要重啟的,一切都煙消云散了~對于刪除不掉ZIP文件的問題,我也流氓一下~用DEL硬刪除~此處一定要注意!

    Process process = Runtime.getRuntime().exec("cmd /c del f:\\aaa.doc");
    這樣的調用是沒有問題~

    Process process = Runtime.getRuntime().exec("del f:\\aaa.doc");
    這樣寫是不可能對的~

    記錄一下,警告一下后人!


    Ref from:http://m.tkk7.com/leeguannan/archive/2007/11/29/164044.html



    昨夜人生 2007-12-03 22:02 發表評論
    ]]>
    11月12日http://m.tkk7.com/mphome/archive/2007/11/13/160072.html昨夜人生昨夜人生Mon, 12 Nov 2007 16:08:00 GMThttp://m.tkk7.com/mphome/archive/2007/11/13/160072.htmlhttp://m.tkk7.com/mphome/comments/160072.htmlhttp://m.tkk7.com/mphome/archive/2007/11/13/160072.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/160072.htmlhttp://m.tkk7.com/mphome/services/trackbacks/160072.html?????????晚上使用apache的ad壓力測試竟然把公司的網站給搞癱了,出乎意料.學了一招以后看誰不順眼,給他來一下。這個星期要請別人去吃大餐,,唉可憐的我的那點工資還有我的張學友演唱會門票。
    ????????

    昨夜人生 2007-11-13 00:08 發表評論
    ]]>
    菩提本無樹,明鏡亦非臺,本來無一物,何處惹塵埃http://m.tkk7.com/mphome/archive/2007/09/03/142464.html昨夜人生昨夜人生Mon, 03 Sep 2007 15:00:00 GMThttp://m.tkk7.com/mphome/archive/2007/09/03/142464.htmlhttp://m.tkk7.com/mphome/comments/142464.htmlhttp://m.tkk7.com/mphome/archive/2007/09/03/142464.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/142464.htmlhttp://m.tkk7.com/mphome/services/trackbacks/142464.html???? 9月3日是開學的第一天,很多新生都開始上課啦,怎么感覺現在的大一新生長得都比較成熟啊,看上去和大四的學生精神面貌,個頭都差不多。看著他們還真挺懷念都大學的時候,讀大學和讀研究生還真是區別很大。主要還是人開始考慮現實的東西比較多了。我還真挺佩服那些自由職業者,需要錢的時候就找分工作干兩個月,掙夠了錢繼續開始旅游或干自己想做的事,這還真不是普通人能做到的。
    ????

    昨夜人生 2007-09-03 23:00 發表評論
    ]]>
    師弟要來了,新的學年http://m.tkk7.com/mphome/archive/2007/08/31/141567.html昨夜人生昨夜人生Thu, 30 Aug 2007 16:02:00 GMThttp://m.tkk7.com/mphome/archive/2007/08/31/141567.htmlhttp://m.tkk7.com/mphome/comments/141567.htmlhttp://m.tkk7.com/mphome/archive/2007/08/31/141567.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/141567.htmlhttp://m.tkk7.com/mphome/services/trackbacks/141567.html???? 每天下班吃飯是一個大問題,要不食堂就是關門要不就沒菜,老吃方便面,太慘啦。回來的時候碰到女同學,問到她怎么解決吃飯時,她竟然說在寢室弄飯,太強啦。怎么我沒有分到和她一個寢室啊。呵呵,這是不可能的!!!
    ??? 項目需求開始看JBPM,看了一下午感覺還是挺簡單的,網上教程挺多,具體怎樣利用jbpm定制流程是搞清除啦,明天要開始結合strut來做做簡單的公文流轉看。
    ??? 晚上抽空看了《破綻》,發覺里面的女主角羅莎蒙派克(其實戲份很少的)挺漂亮的,是偶喜歡的類型,記錄一下。

    昨夜人生 2007-08-31 00:02 發表評論
    ]]>
    差距不是一日形成的http://m.tkk7.com/mphome/archive/2007/08/29/141100.html昨夜人生昨夜人生Wed, 29 Aug 2007 13:55:00 GMThttp://m.tkk7.com/mphome/archive/2007/08/29/141100.htmlhttp://m.tkk7.com/mphome/comments/141100.htmlhttp://m.tkk7.com/mphome/archive/2007/08/29/141100.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/141100.htmlhttp://m.tkk7.com/mphome/services/trackbacks/141100.html?????????? 最近老在寫文檔,為了畫流程圖到網上找寫素材時無意中逛到了幾個在微軟工作人的blog而且還都是做UI設計。牛人果然是不同,blog的風格非常獨特,從blog的字里行間中能體會出他們對工作的那份激情。看來在好的工作環境中對個人的提高是巨大的。
    ?????????? 還有件好玩的事,中午的我在廁所方便碰到同事,隨便聊起了上午股票的行情,聊得真起勁的時候,廁所的單間突然走出老總,我和同事都吃了一驚,但老總也沒說什么,看了我們一眼就走了。頓時我們無語,我到沒什么,反正是實習生,拿得錢又少,管他老總怎么想。可我感覺出來同事肯定要郁悶半天。咳,現在才感覺到實習生也是有好處的。
    ????????? 無意中翻看大學同學的QQ簽名,發現原來一個比較悶騷的室友的簽名非常有感覺,趕緊copy下來(不是為了誰,只是沒有緣故的傷感,這就像某些人見到一個和分手戀人很像的背影而潛然淚下。和軟弱無關).?有點懷疑是抄的,那天問問看。
    ?????????

    昨夜人生 2007-08-29 21:55 發表評論
    ]]>
    無聊的一天http://m.tkk7.com/mphome/archive/2007/08/26/139634.html昨夜人生昨夜人生Sun, 26 Aug 2007 14:08:00 GMThttp://m.tkk7.com/mphome/archive/2007/08/26/139634.htmlhttp://m.tkk7.com/mphome/comments/139634.htmlhttp://m.tkk7.com/mphome/archive/2007/08/26/139634.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/139634.htmlhttp://m.tkk7.com/mphome/services/trackbacks/139634.html??????????明天又開始上班,聽說移動的需求又加了不少,媽的又要修改標書,什么時候才能搞完啊 。老大,我是實習生不要叫我老寫文檔好 不好啊。
    ???????????為什么我老是對某件事不能專注下去,即時是玩游戲也很難有非常強的耐心通關,但在沒有開始卻興趣非常的強。我很懷疑是不是? 很少人會這樣。
    ????????? 公司要進新人啦,好像有女的哦,暗喜!!!要知道我們公司連做美工的都是男的,老總可能是看不過去啦,調節一下男女比例,雖然我也只是想看看,養眼而已。
    ?????????

    昨夜人生 2007-08-26 22:08 發表評論
    ]]>
    死灰復燃8.24http://m.tkk7.com/mphome/archive/2007/08/24/139129.html昨夜人生昨夜人生Fri, 24 Aug 2007 08:36:00 GMThttp://m.tkk7.com/mphome/archive/2007/08/24/139129.htmlhttp://m.tkk7.com/mphome/comments/139129.htmlhttp://m.tkk7.com/mphome/archive/2007/08/24/139129.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/139129.htmlhttp://m.tkk7.com/mphome/services/trackbacks/139129.html???????????? 8月24日,上班也有一個月啦,本以為剛來實習就可以立馬做項目,哪知道剛來開始就看文檔,看了一個星期后,又來寫投標書,大失所望啊。每天只好之間看看教程啦。
    ??????????? 今天主要將WAP程序設計看了一遍,畢竟下一個項目是有關WAP的,臨時抱佛腳吧。感覺WAP還是挺簡單的,只不過和HTML在標簽上有說區別。而且在給變量賦值在=前后竟然不能有空格,不知道那個傻子設計的,怪不得WAP發展的不是很好。
    ??????????? 最近正在看JBOSS和MySee,關于JBOSS還真不知道從那里下手,整體的設計理念是了解,但具體如何應用挺費解的。要好好象師兄請教一下。Mysee開源的東東,也已經看看很久啦 ,同志要加緊啊 。
    ??????????? 提醒:公司空調很冷,以后要記得帶長袖衣服。???
    ??????????????? 2007.8.24

    昨夜人生 2007-08-24 16:36 發表評論
    ]]>
    Tomcat 亂碼的最終解決方案http://m.tkk7.com/mphome/archive/2006/12/03/85107.html昨夜人生昨夜人生Sat, 02 Dec 2006 16:01:00 GMThttp://m.tkk7.com/mphome/archive/2006/12/03/85107.htmlhttp://m.tkk7.com/mphome/comments/85107.htmlhttp://m.tkk7.com/mphome/archive/2006/12/03/85107.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/85107.htmlhttp://m.tkk7.com/mphome/services/trackbacks/85107.html1.解決POST傳送亂碼的問題.
    <filter>
    ??? <filter-name>Set Character Encoding</filter-name>
    ??? <filter-class>com.util.filters.SetCharacterEncodingFilter</filter-class>
    ??? <init-param>
    ????? <param-name>encoding</param-name>
    ????? <param-value>UTF-8</param-value>
    ??? </init-param>
    ? </filter>
    ? <filter-mapping>
    ??? <filter-name>Set Character Encoding</filter-name>
    ??? <url-pattern>/*</url-pattern>
    ? </filter-mapping>

    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方式出現亂碼的方案


    tomcat的server.xml中
    <Connector connectionTimeout="20000" maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="8080" redirectPort="8443" uRIEncoding="UTF-8" useBodyEncodingForURI="true">
    </Connector>
    注意其中的useBodyEncodingForURI="true"這句是是解決問題的關鍵,但缺省情況下沒有,自己加進去。
    然后再用Filter方案解決 解決GET的問題

    3.亂碼字符轉換 
      byte[] bytes = str.getBytes("ISO8859-1");
    ??? String dept=new String(bytes);

    AJAX
    在用XMLHttpRequest發送請求時如用post方式傳送數據,容易出現中文亂碼問題!
    在Ajax中,默認的編碼方式是UTF-8,所以在服務器端用request.setCharacterEncoding("UTF-8");(對于java言,其它語言可能類似方法)設置編碼即可解決大部份的編碼問題!

    ?對于服務器端返回的XML文件在用responseXML讀取時也要注意編碼問題!

    以下是正確的處理方法:

    response.setCharacterEncoding("UTF-8");-----(1)
    PrintWriter out=response.getWriter();------(2)
    out.println("返回內容");

    如上所示,如果1、2的先后順序發生變化就會產生亂碼!



    昨夜人生 2006-12-03 00:01 發表評論
    ]]>
    我又來拉http://m.tkk7.com/mphome/archive/2006/11/29/84197.html昨夜人生昨夜人生Tue, 28 Nov 2006 16:49:00 GMThttp://m.tkk7.com/mphome/archive/2006/11/29/84197.htmlhttp://m.tkk7.com/mphome/comments/84197.htmlhttp://m.tkk7.com/mphome/archive/2006/11/29/84197.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/84197.htmlhttp://m.tkk7.com/mphome/services/trackbacks/84197.html   今天終于有一點想通了 ,路是自己選的,還是盡量將現在的路走好.將來的事留給明天吧.

       送一段比較現實的格言,只要有錢,年齡不是問題,身高不是距離.

       操作CSV文件有用的兩個類:CSVprinter,CsvDriver.

    ?getOutputStream() has already been called for this response問題的解決?????

    在jsp向頁面輸出圖片的時候,使用response.getOutputStream()會有這樣的提示:java.lang.IllegalStateException:getOutputStream() has already been called for this response,會拋出Exception

    原因一:
    ?JSP默認的輸出流為PrintWriter ,即<% %>以外的東西所默認的輸出方式,如果你嘗試在JSP中使用ServletOutputStream就會引起錯誤.要嘛直接改用Servlet輸出(復寫service方法),要嘛刪除除%><%中的任何東西(包括HTML標簽,空格,回車等東西)應該就可以。
    對于這樣的情況應該這樣來解決,刪除%><%之間的所有內容包括空格和換行符,最后也要消除空格和換行符,最好再加上一句response.reset()。
    原因二:
    ?????
    在J2EE的API參考里有這么個:

    ServletResponse的getWriter()方法里會拋出這個異常,

    IllegalStateException - if the getOutputStream method has already been called
    for this response object

    而它的getOutputStream()方法里會拋出這個異常.

    IllegalStateException - if the getOutputStream method has already been called for this response object

    并且兩者的函數申明里都有這么樣的一句
    Either this method or getOutputStream() may be called to write the body, not both.
    Either this method or getWriter() may be called to write the body, not both.

    ?以上說明也解釋了為什么在往頁面中寫入圖片的時候要使用如下循環格式
    OutputStream output=response.getOutputStream();
    ?while((len=in.read(b)) >0)
    ??{
    ??output.write(b,0,len); ?
    ??
    ??}
    ?output.flush();
    而不是把response.getOutputStream().write()放到循環體內


    昨夜人生 2006-11-29 00:49 發表評論
    ]]>
    點滴11月21日http://m.tkk7.com/mphome/archive/2006/11/21/82475.html昨夜人生昨夜人生Tue, 21 Nov 2006 03:25:00 GMThttp://m.tkk7.com/mphome/archive/2006/11/21/82475.htmlhttp://m.tkk7.com/mphome/comments/82475.htmlhttp://m.tkk7.com/mphome/archive/2006/11/21/82475.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/82475.htmlhttp://m.tkk7.com/mphome/services/trackbacks/82475.htmlString s="c:\\dir\\file.txt";
    System.out.println(s.split(\\\\));
    得到c:?? dir?? file.txt

    終于找到了一片好的AOP教程拉,以前看的教程都是一上來就講Spring關于AOP的支持,根本看不明白.

    我認為講Sping關于AOP的支持的話最好先學習一下ApestJ.個人建議,哈哈!

    貼上教程地址:http://www.easyjf.com/spring/spring2-aop.pdf



    昨夜人生 2006-11-21 11:25 發表評論
    ]]>
    記要http://m.tkk7.com/mphome/archive/2006/11/21/82407.html昨夜人生昨夜人生Mon, 20 Nov 2006 16:28:00 GMThttp://m.tkk7.com/mphome/archive/2006/11/21/82407.htmlhttp://m.tkk7.com/mphome/comments/82407.htmlhttp://m.tkk7.com/mphome/archive/2006/11/21/82407.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/82407.htmlhttp://m.tkk7.com/mphome/services/trackbacks/82407.htmljavascript判斷數字
    function isdigit(s)
    {
    var r,re;
    re = /\d*/i; //\d表示數字,*表示匹配多個數字
    r = s.match(re);
    return (r==s)?1:0;
    }

    request.getParameter("ss") 若ss不存在,值為null
    ??????????????????????????????????????? 若ss的value為空,返回值為""

    明天要看完AOP, 一定一定

    昨夜人生 2006-11-21 00:28 發表評論
    ]]>
    checkbox選取值的獲取http://m.tkk7.com/mphome/archive/2006/11/04/79008.html昨夜人生昨夜人生Fri, 03 Nov 2006 16:49:00 GMThttp://m.tkk7.com/mphome/archive/2006/11/04/79008.htmlhttp://m.tkk7.com/mphome/comments/79008.htmlhttp://m.tkk7.com/mphome/archive/2006/11/04/79008.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/79008.htmlhttp://m.tkk7.com/mphome/services/trackbacks/79008.html? ? ? <input ? type=checkbox ? name="a1" ? value="1">CPU ?
    ? ? ? <input ? type=checkbox ? name="a2" ? value="1">主板 ?
    ? ? ? <input ? type=checkbox ? name="a3" ? value="1">內存 ?
    ? 以名稱為依據的判斷: ?
    ? ? ? request.getParameter("a1")==null ?
    ? ?
    ? 二:名稱相同,值不同 ?
    ? ? ? <input ? type=checkbox ? name="a" ? value="1">CPU ?
    ? ? ? <input ? type=checkbox ? name="a" ? value="2">主板 ?
    ? ? ? <input ? type=checkbox ? name="a" ? value="3">內存 ?
    ? 以值為依據的判斷: ?
    ? ? ? String[] ? a ? = ? request.getParameterValues("a"); ?
    ? ? ? 看a數組中是否有相應的值。如果選中"CPU",則a[0]="1"??

    昨夜人生 2006-11-04 00:49 發表評論
    ]]>
    commons-fileupload用戶指南(轉)http://m.tkk7.com/mphome/archive/2006/11/03/78984.html昨夜人生昨夜人生Fri, 03 Nov 2006 12:51:00 GMThttp://m.tkk7.com/mphome/archive/2006/11/03/78984.htmlhttp://m.tkk7.com/mphome/comments/78984.htmlhttp://m.tkk7.com/mphome/archive/2006/11/03/78984.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/78984.htmlhttp://m.tkk7.com/mphome/services/trackbacks/78984.html根據你的應用需求,fileupload可以有許多不同的使用方式。在最簡單的情況下,你可以調用一個簡單的方法來解析servlet請求,然后在他們提交到你的應用時處理表單列表。在其它規模的終端上,你也可能決定將fileupload進行自定義,以完全控制個別表單項存儲的方法。比如,你或許會將內容流化來保存到數據中。
    在這里。我們將要描述fileupload的基本使用方法,然后解釋一些更簡單的,以及最常用的使用模式。fileupload的個性化在這里得到了描述。

    它怎么工作

    一個文件上傳請求由有序表單項的列表組成,這些表單是根據RFC1867來編碼的,是在html中基于表單的文件上傳。fileupload能解析這樣一個請求然后向你的應用提供一個單獨的上傳表單項的列表。每一個這樣的表單項實現了FileItem接口,而不需要考慮它潛在的實現方式。每個文件的表單項擁有一系列可能對你的應用有用的屬性,比如,每個項目都有一個名字和文件類型,你就可以提供一個InputStream來取它的數據。從另一方面說,你可能需要對這些選項進行不同的處理,這個可以根據對這個選項是不是一個規則的表單項來判斷,即可以根據這個數據是否來源于普通的文本框或者一個簡單的html表單域,還是一個能被上傳的文件。FileItem接口提供了多種方法來判斷它是否是一個可上傳的文件,然后你就可以用最合適的方式來處理這些數據了。FileUpload使用FileItemFactory來創建新的文件項目。這正是給FileUpload帶來靈活性的原因。這個工廠最終控制每個項目的創建。默認的工廠在內存或者磁盤上保存了項目的數據,這個可以根據項目的大小來定(例如,字節數據)。當然,這個動作可以通過自定義來滿足你應用的需要。

    解析請求

    在你對要上傳的選項處理之前,很顯然的你得先解析這些請求本身。很直接的就是要確保這個請求是不是一個要上傳的文件,然而FileUpload使這一點簡單化了,你只需提供一個靜態的方法來做到這一點。

    //檢查是否是一個文件上傳請求
    boolean isMultipart = FileUpload.isMultipartContent(request);


    現在我們就可以準備解析這個請求到一個備選的選項了。解析的結果是一個文件選項的List,每個這樣的選項都實現了FileItem接口,處理這些選項將在下面得到討論。

    最簡單的情況

    最簡單的使用場景可以參照下面:

    • 被上傳得選項必須以適度的大小駐留在內存中;
    • 比較大的文件上傳選項必須寫入到磁盤的臨時文件中去;
    • 大文件上傳請求必須不被允許;
    • 默認的駐留內存的選項的最大大小,最大允許的上傳文件請求,和臨時文件的存儲地方是可以接受的;

    在這種情景下處理這樣一個請求并不是很簡單的:


    //創建一個新的文件上傳句柄
    DiskFileUpload upload = new DiskFileUpload();
    //解析請求
    List /* FileItem */ items = upload.parseRequest(request);


    這就是所有我們需要做的,真的!
    解析的結果是一個文件項目的List,每一個都實現了FileItem接口。處理這些項目將在下面討論。

    練習更多的控制

    如果你的使用情景非常接近最簡單的使用方式,在上文中可以看到,但是你需要更多的控制臨界的大小和臨時文件的駐留地址,你可以使用DiskFileUpload類的方法來自定義這些動作,就像這樣:


    //創建一個新的文件上傳句柄
    DiskFileUpload upload = new DiskFileUpload();
    //設置上傳參數
    upload.setSizeThrehold(最大內存大小);
    upload.setSizeMax(最大請求大小);
    upload.setRepositoryPath(臨時目錄);
    //解析請求
    List /* FileItem */ items = upload.parseRequest(request);


    當然,每個配置方法都是獨立于其它的,但是如果你想一次就配置它們,你可以使用可選的parseRequest()方法,像這樣:


    // 建立一個新的文件上傳句柄
    DiskFileUpload upload = new DiskFileUpload();
    // 解析請求
    List /* FileItem */ items = upload.parseRequest(request,
    ??????? 內存大小, 允許上傳的最大文件, 臨時目錄);


    如果你想更多地控制請求的解析,比如把上傳選項存儲到其它地方,例如,存到數據庫中-你可以參照自定義FileUpload。

    處理上傳選項

    一旦解析過程完畢,你就可以獲得一個文件選項的List,以便進一步處理。在大多數情況下,你將會根據規則的表單域來不同地處理文件的上傳。所以你可能以這樣的方式來處理:


    // 處理上傳的選項
    Iterator iter = items.iterator();
    while (iter.hasNext()) {
    ??? FileItem item = (FileItem) iter.next();

    ??? if (item.isFormField()) {
    ??????? processFormField(item);
    ??? } else {
    ??????? processUploadedFile(item);
    ??? }
    }


    對于一個規則的表單域來說,你對它感興趣的可能就只有它的名字以及它的字符串值。你也會想到,處理它們是簡單的:


    //處理一個規則表單域
    if (item.isFormField()) {
    ??? String name = item.getFieldName();
    ??? String value = item.getString();
    ??? ...
    }


    而對于一個文件的上傳,在你處理它的內容之前,可以有好多令你想知道的不同的東西,這里有一個采用了一些你可能感興趣的方法的例子


    // 處理一個文件上傳
    if (!item.isFormField()) {
    ??? String fieldName = item.getFieldName();
    ??? String fileName = item.getName();
    ??? String contentType = item.getContentType();
    ??? boolean isInMemory = item.isInMemory();
    ??? long sizeInBytes = item.getSize();
    ??? ...
    }


    對于這些上傳的文件,你一般不想通過內存來存取它們,除非它們很小,或者你沒有其它好的方法,更進一步,你想將內容當作文件流來處理,或者將整個文件寫到最終的地址。FileUpload提供了簡單的方法來完成這些 操作。


    // 處理一個文件上傳的情況
    if (writeToFile) {
    ??? File uploadedFile = new File(...);
    ??? item.write(uploadedFile);
    } else {
    ??? InputStream uploadedStream = item.getInputStream();
    ??? ...
    ??? uploadedStream.close();
    }


    注意到,在默認的FileUpload的實現中,write()方法將嘗試把文件改名以將它保存到特定的地點,如果數據已經在臨時文件中了,如果重命名失敗,實際的復制文件就完成了(?),在其它原因看來,或者數據已經在內存中了。如果你的確需要在內存中取上傳的數據,你只需簡單的調用get()方法來把它當作一個字符數組來獲得。



    // 在內存中處理一個上傳的文件
    byte[] data = item.get();
    ...



    和殺毒軟件的相互作用

    當web容器在運行時,而殺毒軟件又同時運行在同樣的系統上,這種情況下在應用中使用FileUpload容易導致一些很難預料的事情.這部分將描述一些你可能要遇到的情況,我們會提供一些方法來處理它們。默認的FileUpload實現將會使超過它在內存中大小的上傳的選項寫入到磁盤。而當這樣的文件關閉后,任何系統中的殺毒軟件都會被喚醒,然后去檢查它,然后會潛在地隔離這個文件--就是說,將它移動到一個不產生問題的特定地方。這樣一來,對開發者來說當然是一個意外,因為剛剛上傳的文件將不能被處理了。從另一方面來說,小于設定的內存大小的那些上傳的文件將被保持在內存中,這樣一來,將不會被殺毒軟件所檢測到,這樣就有可能使病毒以某種方式駐留在了系統中了(雖然如果一旦它被寫入到磁盤,殺毒軟件就會定位并檢測到它)。一個通用的解決方法是在系統中專門設置一個目錄來存放這些上傳的文件,然后配置殺毒軟件忽略這個目錄。這樣將確保上傳的文件在系統中不被隔離,但是這樣就把掃描病毒的責任交給了應用程序的開發者了。掃描這些上傳的文件的任務可以在外部的處理中實現。這樣可以將干凈的文件移動到一個“改進”過的地方,或者也可以把殺毒集成到應用中去。至于怎么將外部處理或集成病毒掃描到一個
    應用,這個已經超出了本文檔的討論范圍。

    下一步是什么

    希望這個頁面能提供給你一個好的意見,讓你在你自己的應用中能使用FileUpload。更多關于這里介紹的方法,以及其它可用的方法,你可以參照api文檔。這里介紹的用法已經可以滿足大多數的文件上傳的需要了,當然,如果你還有更多的復雜的需求,使用它的靈活的自定義配置的能力,FileUpload一定可以能夠幫助你。

    另一個實例:


    commons.fileupload實現文件的上傳,代碼如下:
    <%!
    ?//服務器端保存上傳文件的路徑
    ??? String saveDirectory = "g:\\upload\\";
    ??? // 臨時路徑 一旦文件大小超過getSizeThreshold()的值時數據存放在硬盤的目錄
    ??? String tmpDirectory = "g:\\upload\\tmp\\";
    ??? // 最多只允許在內存中存儲的數據大小,單位:字節
    ??? int maxPostSize = 1024 * 1024;
    %>
    <%
    ??? // 文件內容?
    ??? String FileDescription = null;
    ??? // 文件名(包括路徑)
    ??? String FileName = null;
    ??? // 文件大小
    ??? long FileSize = 0;
    ??? // 文件類型
    ??? String ContentType = null;

    %>

    <%
    ?? DiskFileUpload fu = new DiskFileUpload();
    ??? // 設置允許用戶上傳文件大小,單位:字節
    ?? fu.setSizeMax(200*1024*1024);
    ??? // 設置最多只允許在內存中存儲的數據,單位:字節
    ?? fu.setSizeThreshold(maxPostSize);
    ??? // 設置一旦文件大小超過getSizeThreshold()的值時數據存放在硬盤的目錄
    ?? fu.setRepositoryPath("g:\\upload\\tmp\\");
    ??? //開始讀取上傳信息 得到所有文件
    ?? try{
    ????? List fileItems = fu.parseRequest(request);
    ???? }catch(FileUploadException e){
    ???????? //這里異常產生的原因可能是用戶上傳文件超過限制、不明類型的文件等
    ???????? //自己處理的代碼
    ???? }
    %>
    <%
    ?? // 依次處理每個上傳的文件
    ?? 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,"\\");? //對原來帶路徑的文件名進行分割
    ?? name = names[names.length-1];
    ?? item.write(new File(saveDirectory+ name));
    ? }
    }
    %>
    ?下面是其簡單的使用場景:
    ?A、上傳項目只要足夠小,就應該保留在內存里。
    ?B、較大的項目應該被寫在硬盤的臨時文件上。
    ?C、非常大的上傳請求應該避免。
    ?D、限制項目在內存中所占的空間,限制最大的上傳請求,并且設定臨時文件的位置。
    ?
    ?可以根據具體使用用servlet來重寫,具體參數配置可以統一放置到一配置文件
    ?



    ?文件的下載用servlet實現
    ????? 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);
    ???????????? }
    ???????? }
    ???? }






    昨夜人生 2006-11-03 20:51 發表評論
    ]]>
    轉貼 jsp生成隨機圖片 http://m.tkk7.com/mphome/archive/2006/11/03/78809.html昨夜人生昨夜人生Thu, 02 Nov 2006 16:02:00 GMThttp://m.tkk7.com/mphome/archive/2006/11/03/78809.htmlhttp://m.tkk7.com/mphome/comments/78809.htmlhttp://m.tkk7.com/mphome/archive/2006/11/03/78809.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/78809.htmlhttp://m.tkk7.com/mphome/services/trackbacks/78809.html??? 原型參考ALIBABA http://china.alibaba.com/member/showimage 產生驗證碼圖片的文件image.jsp

    <%@ page contentType="image/jpeg" import="java.awt.*,
    java.awt.image.*,java.util.*,javax.imageio.*" %>
    <%!
    Color getRandColor(int fc,int bc){//給定范圍獲得隨機顏色
    ??????? 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);
    ??????? }
    %>
    <%
    //設置頁面不緩存
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires", 0);

    // 在內存中創建圖象
    int width=60, height=20;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    // 獲取圖形上下文
    Graphics g = image.getGraphics();

    //生成隨機類
    Random random = new Random();

    // 設定背景色
    g.setColor(getRandColor(200,250));
    g.fillRect(0, 0, width, height);

    //設定字體
    g.setFont(new Font("Times New Roman",Font.PLAIN,18));

    //畫邊框
    //g.setColor(new Color());
    //g.drawRect(0,0,width-1,height-1);

    // 隨機產生155條干擾線,使圖象中的認證碼不易被其它程序探測到
    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);
    }

    // 取隨機產生的認證碼(4位數字)
    String sRand="";
    for (int i=0;i<4;i++){
    ??? String rand=String.valueOf(random.nextInt(10));
    ??? sRand+=rand;
    ??? // 將認證碼顯示到圖象中
    ??? g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
    //調用函數出來的顏色相同,可能是因為種子太接近,所以只能直接生成
    ??? g.drawString(rand,13*i+6,16);
    }

    // 將認證碼存入SESSION
    session.setAttribute("rand",sRand);

    // 圖象生效
    g.dispose();

    // 輸出圖象到頁面
    ImageIO.write(image, "JPEG", response.getOutputStream());
    %>


    使用驗證碼圖片的文件a.jsp

    <%@ page contentType="text/html;charset=gb2312" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <title>認證碼輸入頁面</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>系統產生的認證碼:</td>
    <td><img border=0 src="image.jsp"></td>
    </tr>
    <tr>
    <td align=left>輸入上面的認證碼:</td>
    <td><input type=text name=rand maxlength=4 value=""></td>
    </tr>
    <tr>
    <td colspan=2 align=center><input type=submit value="提交檢測"></td>
    </tr>
    </form>
    </body>
    </html>


    驗證的頁面check.jsp

    <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
    <html>
    <head>
    <title>認證碼驗證頁面</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");
    %>
    系統產生的認證碼為: <%= rand %><br>
    您輸入的認證碼為: <%= input %><br>
    <br>
    <%
    ? if (rand.equals(input)) {
    %>
    <font color=green>輸入相同,認證成功!</font>
    <%
    ? } else {
    %>
    <font color=red>輸入不同,認證失敗!</font>
    <%
    ? }
    %>
    </body>
    </html>



    昨夜人生 2006-11-03 00:02 發表評論
    ]]>
    Blog開題http://m.tkk7.com/mphome/archive/2006/11/02/78785.html昨夜人生昨夜人生Thu, 02 Nov 2006 13:45:00 GMThttp://m.tkk7.com/mphome/archive/2006/11/02/78785.htmlhttp://m.tkk7.com/mphome/comments/78785.htmlhttp://m.tkk7.com/mphome/archive/2006/11/02/78785.html#Feedback0http://m.tkk7.com/mphome/comments/commentRss/78785.htmlhttp://m.tkk7.com/mphome/services/trackbacks/78785.html
    ??? 記錄以下今天寫程序時的總結:

    ?????? 1.不要將ResultSet的對象通過setAttribute來傳遞,應為如果對應的connection關閉的話ResultSet會失效的。
    ?????? 2.Hibernate中的CreateQuery("from Table as a where a.name =?")? 中的name是其*.bml.htm中定義的字段和數據庫中的字段是不同的。
    ?????? 3.Struts中使用普通的表單元素
    ?????????????<html:form action="/register.do">
    ??????????????????用戶名:<html:text property="username"/><br/>
    ????????????????? 密碼1: <html:text property="password1"/><br/>
    ??????????????????密碼2:<html:text property="password2"/><br/>
    ????????????
    ?????????????????????????????? <html:submit value="Register"/>
    ???????????</html:form>?? 可以
    ????????????<html:form action="/register.do">
    ??????????????????用戶名:<input type="button"><br/>
    ?????????????????
    ???????????</html:form>?? 可以

    ??????? <form action="/register.do">
    ??????????? <input type="text" name="username" value="" /><br/>
    ??????????? <input type="text" name="password1" value="" /><br/>
    ??????????? <input type="text" name="password2" value="" /><br/>
    ??????????? <input type="submit" value="ok" />
    ??????? </form>??不可以
    ??
    ???????? 注意Form的action,如果用struts標簽的話"/"表示當前web應用的根目錄,如果用html標記的話"/"表示localhost的根目錄。第三種
    ??????????? 把/register.do?改成register.do。

    ??? 感覺自己編寫的代碼太沒有質量拉 ,要多看看別人的代碼,學會總結。
    ??
    ?? 還有英語作文要寫,哦還有車牌識別系統? ,事情真多? 。

    ?? 明天繼續.byby

    昨夜人生 2006-11-02 21:45 發表評論
    ]]>
    主站蜘蛛池模板: 日韩免费高清视频| 亚洲AV无码专区电影在线观看| 免费在线人人电影网| 亚洲午夜未满十八勿入网站2| 99热这里只有精品免费播放| 亚洲日韩乱码中文字幕| 日韩一卡2卡3卡4卡新区亚洲| 亚洲精品视频在线观看免费| 国产亚洲高清在线精品不卡| 亚洲AV成人精品网站在线播放 | www免费插插视频| 亚洲春色另类小说| 亚洲国产精品一区二区第四页| 国产精品免费福利久久| 国产成人亚洲精品电影| 亚洲va久久久噜噜噜久久狠狠| 好吊妞788免费视频播放| 国产色无码精品视频免费| 亚洲heyzo专区无码综合| 亚洲激情视频在线观看| 日本一道一区二区免费看| 99热这里只有精品6免费| 精品一区二区三区免费毛片| 亚洲成a人片在线观看中文app| 亚洲伊人久久综合影院| 午夜dj在线观看免费视频| 一级毛片免费观看不卡视频| 色多多www视频在线观看免费| 亚洲av乱码一区二区三区香蕉| 亚洲国产一成人久久精品| 免费一区二区视频| 欧洲精品成人免费视频在线观看| 国产免费一区二区三区不卡| 日韩毛片在线免费观看| 亚洲综合国产成人丁香五月激情 | 日韩高清在线高清免费| 色欲A∨无码蜜臀AV免费播| 国产精品内射视频免费| 美女尿口扒开图片免费| 成人区精品一区二区不卡亚洲| 亚洲综合久久综合激情久久|