靈感範文站

一個老鳥的java學習心得

目錄

一個老鳥的java學習心得
第一篇:一個老司機的心得第二篇:一個老業務員的心得第三篇:java學習心得筆記第四篇:java學習心得第五篇:關於java學習的一點心得體會更多相關範文

正文

第一篇:一個老司機的心得

一個老司機的心得

1)當你在野外開車時,突然從路旁竄出一行人,這時候如果你躲避行人,你就會 車毀人亡,否則你就會將行人碾過。你怎麼辦?

答:軋死他,你的命比他值錢

2)在正常行使過程中,如果大家的車速假定都是50公里/小時,你的車速應該是多少?

答:略大於50公里/小時,因爲其它車輛超你的可能性小。

3)如何躲避十字路口的?

答:過十字路口時先跟在一個比你大的車後,綠燈一亮,開車就跑。

4)如何躲避電子眼(電子)的監控?

答:按照中國的交通法,十字路口紅燈可以右轉向,你闖紅燈時要在靠右的慢行道或者逆道行使。

5)你違章被抓住了怎麼辦?

答:如果你還沒下車,先觀察地形,把幾個車門都從裏面鎖好,看能否跑掉。如果跑不掉,你就把執照給小,千萬別和他糾纏,然後找關係要出來。

6)在野外遇到查車的怎麼辦?

答:你要看見是提着衝鋒槍查車的,你就老老實實下來接受檢查。如果是設卡查車亂罰款的,你先看看他們是什麼車輛,能不能追上你,減速打右轉向燈,假裝要停車接受檢查,騙過後加油就跑,一般不會追你。

7)有人投訴你的車違章怎麼辦?

答:死不認帳。

8)遇見攔你車搭乘車怎麼辦?

答:別給他停。下次你違章被他抓住一樣會被罰款,他不會和你交朋友的。

9)遇見同方向行使的警車開道的車隊怎麼辦?

答:不要超,停車去解個手。

10)遇見前面同方向有個大車(滿載)不給你讓路怎麼辦?

答:緊跟其後,找準機會,超過它後你用車壓住他的車,待上大坡時你減速,直到讓他一擋起步。

11)如果在十字路口你走眼誤闖紅燈過線了怎麼辦?

答:緊急剎車,只要後輪不過線,電子眼不會拍攝。

12)五座小車哪個位置最安全?

答:駕駛員位。

13)你把車交給無證人員駕駛,出了點小車禍怎麼辦(你在車上)?

答:不管你有理無理,停車下來先和對方大吵大罵,迷惑對方,轉移他的注意力,待交警來後你把執照交上去,多數情況對方不會注意,如果對方發現,你就死不認帳。

14)公路限速60公里/小時,你高速行使時遇見緊急情況,緊急剎車後造成事故,剎車印痕很長,交警來處理時問你行使車速,你怎麼回答?

答:大約60公里/小時的速度行使,主要是剎車不太好,再加上駕駛技術欠佳。

15)你在野外農村撞死了農民怎麼辦?

答:如果農民確已死亡,你要快速搭乘其它車輛離開出事地點,向保險公司和交通部門報案,再派一個朋友去幫你處理後事。你千萬不能去出事地點,農民家屬會打死你的。你可以說你受到刺激,也去住院檢查。

16)你在野外農村撞死了農民的牲畜怎麼辦?

答:只要汽車還能開,能跑多遠就跑多遠,因爲一頭豬的價格要2014多元,要是一頭牛,沒個萬兒八千的下不來,因爲農民會說他的牛是種牛,肚子裏還有牛崽等等。

17)你在野外汽車拋錨了,過路車又不給你停怎麼辦?

答:去路邊撿些石頭塊,橫擋在路上,手裏再拿出200元錢示意,會有人幫你的。

18)如果你的車行使在野外沒油了怎麼辦?

答:攔一輛大車,從他的車裏用管吸出幾升油即可,70號油不要緊。不要攔小車,一般小車是不能抽油的。

19)野外路上遇到有人搭車怎麼辦?

答:最好不要帶。你又不知他是幹什麼的,萬一要是販賣大煙的呢。

20)連續下山,剎車片過熱引起制動不靈怎麼辦?

答:停下來,自然冷卻。千萬不要用水冷卻。

21)夏日連續上山爬坡,車溫過高但你又不想停車,怎麼辦?

答:把空調關掉,車窗打開,把暖氣開到最大,風門也開到最大,幾分鐘車即可降溫。

22)普通野外三級公路,公路兩邊都有自行車和行人,如何高速行使?

答:儘可能佔用逆向道行使,因爲同方向的自行車等看不見你。

23)崎嶇山路如何高速行使?

答:拐彎要加油。(經驗豐富者)

24)如何在普通公路上超越比你性能優越的車?

答:緊跟其後,在同方向車多的情況時退檔加速超越,不過你要膽大車技好。

25)什麼情況下最好不要超車?

答:對面來的車比你大,如果撞擊你倒黴。

26)夏天行使汽車要注意哪些?

答:前輪胎氣壓不能大,防止高速爆胎。

27)行車與時間的關係?

答:晚上8--10點要注意地方牌照的公用小車,這時候他們可能剛喝完酒,橫衝直撞。凌晨3--5點,要注意過境公路上的長途汽車,司機可能在打磕睡

第二篇:一個老業務員的心得

一個老業務員的心得體會

業務是從市場上學出來的,不是從書裏學出來的我收藏過一篇 一個老業務員的自白 的文章拿出來和大家分享下,希望對大家有所幫助:

1、業務員和客戶聊天的時候哪些話題不需要聊太多關於技術和理論的話題,需要的是今天的新聞呀、天氣呀等話題。因此,業務員在日常的時候必須多讀些有關經濟、銷售方面的書籍、雜誌,尤其必須每天閱讀報紙,瞭解國家、社會消息、新聞大事,這往往是最好的話題,這樣我們在拜訪客戶時纔不會被看成孤陋寡聞、見識淺薄。

2、關於業務員晚上的四個小時。一個業務員的成就很大程度上取決於他晚上那四個小時是怎樣過的。最差的業務員晚上就抱着個電視看,或者在抱怨,出去玩等。這樣的業務員沒出息。一般的業務員去找客戶應酬,喝酒聊天。這樣的業務員會有單,但我個人認爲難有很高的成就。好一點的業務員晚上整理資料,分析客戶,做好計劃等。這樣的業務是一個好業務,應該有前途。最好的業務員我認爲是在做完好業務員的工作後還堅持看一個小時的書。我覺得這樣的業務很有出息,以後有機會可以做老闆。

業務是從市場上學出來的,不是從書裏學出來的我收藏過一篇 一個老業務員的自白 的文章拿出來和大家分享下,希望對大家有所幫助:

3、關於業務員本身。很多人覺得,業務員最好身材高大,英俊瀟灑。業務員一定要口才好,能說會道,嘴裏能吐出油來才叫口才好。業務員一定要會抽菸,身上隨時帶着煙,逢人就派。業務員一定要會喝酒,白酒,啤酒千杯不倒。其實我感覺這些都不是重要的。就我個人而言,我身高不到160mm,剛開始跑業務時心裏很自卑,說話都不流暢,更別說口才好了。我是從來不抽菸的,喝酒我最多一瓶啤酒,多點就醉了。可是勤能補拙,我剛跑業務時,在惠州,剛開始三個月,我拿幾件衣服就到東莞的弟弟廠裏一跑就是幾天。一個工業區,一個工業區的跑。就這樣,我走了三個月,客戶也跑下了幾個,可是皮鞋也爛了一雙,人黑的像黑碳頭一樣。我現在自己開工廠了,我經常對業務員,頭三個月過的是不是人的日子的,熬過後就可以了。所以業務的辦公室在廠外。 關於找客戶

做業務剛進公司的頭三個月是考驗業務員能否成功的最關鍵的三個月,這三個月可以說是影響了業務員以後的業務工作的。這之中第一個面對的就是如何找到客戶的問題,關於怎樣尋找目標客戶。一般來說新業務員進到一個新公司後,在熟悉到1個星期左右的產品知識就要自己找客戶去拜訪了。如果開始沒有業務經理或者老闆提供客戶資源的話,可以通過以下方法去找客戶。

1、黃頁,一般公司都有很多黃頁的,如《深圳黃頁》等。我們可以按照上面的分類等找到我 們的原始目標客戶。現在深圳也有好多專業類的行業黃頁,如家電黃頁,玩具黃頁等,業務員最好找到這樣的黃頁來收集第一手資料。這些黃頁在一般大的圖書館都有。可以拿個本子去那裏抄就可以了。

2、瀏覽招聘廣告,就象在深圳,《深圳特區報》每天都有大量的招聘廣告,還有《南方都市報》每個星期一都有招聘廣告,我們可以通過閱覽的招聘廣告來獲得我們想要的客戶。我們也可以去附近的招聘市場看看,一般的招聘市場會在門口貼出每天的招聘單位的名稱和招聘工種我們也可以通過他招聘的工種來分析他是做什麼的,這樣就可以找到我們要的客戶了。還有我們可以去一些大的工業區附近轉轉,現在幾乎所有的廠都招工,也可以通過他們門口的招工廣告找到的。我們也可以上網看招聘網站,如卓博招聘網等。

從招聘廣告中找的客戶的好處是第一可以找到很多新的客戶,因爲有很多新的廠,他或者剛開,或者剛搬過來,如果我們第一個先找到他,那就是捷足先登了。還有,一般有能力大量招工的廠家生意都比較好,對以後業務做成功後的貨款回收也相對有點信心。

3、網絡搜索。我們可以通過關鍵字去搜索,如在百度輸入我們要找的客戶的生產產品的名字,我們可以找到大把的客戶。我們也可以通過專業的網站來找客戶,如阿里巴巴,如慧聰等等。這樣我們可以找到很多客戶的名單了。而且還可以找到老闆的手機號碼和老闆的姓名等。

4、我們也要經常上街找客戶,我們去逛商場,我一般會到家電商場去看看,他們都有包裝的,或者有品牌和公司的名稱,我們可以記錄下來,回去上網找就可以了。我們可以通過商場的產品的銷售來判斷一個客戶的經營情況來的。這從側面也反映了他的一個經濟實力。 5、但我個人認爲最好的找客戶的方法是通過交際網絡的相互介紹來發展客戶。以後做業務講究資源共享的時代。例如你是做電線的,我是做插頭的,他是做電阻的。我們同時做一個音響的客戶。如果我們都可以資源共享,把好的客戶都互相介紹,這樣做進去一個客戶就非常容易和省心。而且我們的客戶因爲大家互相看着,客戶一有什麼風吹草動.大家可以提防,風險不就低很多了嗎。

6、還有個最好的辦法是客戶介紹客戶,這是成功率最高的。厲害的業務員在有了幾個原始客戶以後,就會認真服務好這幾個客戶,和他們做朋友。等到熟悉了,就開口讓他們介紹同行或者朋友給你。這時候不要讓他們給你名單就好了,名單那裏都可以找到,最主要是要讓他幫你打個電話。如果他幫你打了個推薦電話,好過你打100個電話。你以後就主要服務好他介紹的客戶,然後也依次類推的讓這個新客戶介紹下去,那樣你就可以很輕鬆的找到你的客戶網絡拉

所以我們是有很多方法來找到我們想要的客戶的,只要我們要用心。業務員的身上無論什麼時候都要有三個東西在身上,除了沖涼的時候,這三個東西是:筆,小筆記本,名片。別人都說業務員有8個眼睛的,也是很有道理的,生活中處處留心,就可以找到很多商機。 關於打電話

我們找到客戶之後,第二個問題就是要想着怎樣打電話約客戶了。這裏面也有一些細節的。注意一下就可以了。

1、很多人打電話都會遇到這樣的情況。客戶還沒有聽完我們的介紹,就說不要不要,接着就啪的一生掛電話了。還有你說要去拜訪他,他說沒空,讓你傳真資料給他,或者把資料放到門衛室去。我們千萬不要傳真資料和放到保安室給他,沒用的。遇到這樣的情況我開始就很鬱悶,後來我就這樣想,可能採購小姐今天一上班就給老闆罵了,不高興所以才拒絕我,或者想可能採購小姐今天和男朋友吵架了,所以不理我。沒關係,我下次再找你好了。我很多客戶都是打了好多次電話纔得到約見的,有時就是這麼奇怪,採購小姐昨天還說不要,今天再打就可以讓你帶樣品去見她了。所以生意的成功往往就是看你堅持不堅持了。 2、無論你的業務技巧多麼熟練,我覺得打電話是還是要想一想將要講的內容比較好,不要一拿起電話就聊。因爲我們會聊着聊着就忘記了一些本來要講的內容,往往剛掛掉電話又要打多一次。搞的大家都不好。對於剛做業務的朋友最好用紙寫下來。這樣會講的比較有條理。 3、我覺得站着打電話比較好點。因爲人站着的時候我感覺注意力比較集中,會比較認真,還有站着的時候中氣十足,講的話聲音比較好聽。大家不信試試看。無論你剛剛受了多大的氣,打電話時最好帶着微笑。這樣氣氛比較輕鬆,客戶會感覺的到的。做業務本來就是受氣的活,可是我們的客戶沒必要和你分擔。

4、我們不要等到有求於客戶的時候纔打電話給他們。我們在平時的時候要經常給他們打電話,聊聊天,問候問候也好。直到他一聽到聲音就知道是我爲止。最好能讓他惦記着你。做業務就像談戀愛一樣。我們不能約了一次會後就指望別人能嫁給你。採購是很健忘的,我們要不斷的提醒他。 初拜訪客戶

1、推銷前的準備、計劃工作,決不可疏忽輕視,有備而來才能勝券在握。準備好樣品,目錄書、筆和筆記本等。見客戶之前先想想開場白、要問的問題、該說的話、以及可能的回答。

平時對與公司產品有關的資料、說明書、廣告等,均必須努力研討、熟記,同時要收集競爭對手的廣告、宣傳資料、說明書等,加以研究、分析,以便做到“知己知彼”,如此才能真正知己知彼.2、準時赴約——遲到意味着:“我不尊重你的時間”。遲到是沒有任何藉口的,假使無法避免遲到的發生,你必須在約定時間之前打通電話過去道歉,我相信提前出門是避免遲到的唯一方法。

3、服裝不能造就完人,但是初次見面給的人印象,90%產生於服裝。禮節、儀表、談吐、舉止是人與人相處的好壞印象的來源,銷售代表必須多在這方面下功夫。我不喜歡我的業務員穿着紅色綠色的t襯衣等去見我的客戶。我起碼要求是襯衣。還有公文包一定是皮的。 4、我們不可能與拜訪的每一位客戶達成交易,他應當努力去拜訪更多的客戶來提高成交的百分比。在拜訪客戶時,我們應當信奉的一個原則是“即使跌倒也要抓一把沙”。意思是,銷售代表不能空手而歸,即使你拜訪的哪個暫時沒有需求,不能成交。也要想辦法讓他幫你介紹一位新客戶。

5、對客戶而言。要經常留意客戶喜歡的話題和他的愛好,他喜歡的就多跟他聊些。留意他的一舉一動。你就可以投其所好拉。談話的結果不重要,過程的氣氛很重要。我們在和採購聊天的時候,往往很注意談話的內容,老是說沒話題。其實我們要注意到我們談話的過程和氣氛。如果我們哪天聊的很愉快,和融洽,我們的感情就會很親近。在許多天後,我們往往回忘記了當時談的是什麼,只記得哪天我們聊得很好。其實採購也一樣。價格我們會有報價單給他,品質我們有品質承認書給他,交期我們會蓋章簽名回傳給他。所以我們只要和業務之外的事情就可以了,聊他感興趣的問題最好。 如何維護客戶

1、業務員在做到應該釣魚,不是灑網。跑業務時最有效和舒服的做法是用釣魚法。就像我們剛開始追女孩子時,難道我們會同時追幾個女孩子,然後在博他有一個成嗎嗎。我們往會看準一個,竭而不捨的追求她,直到成功吧。我自己是這樣跑業務的。我會選準一個行業,比如我要做耳機行業,我會挑行業裏的3個左右認認真真的去攻他,直到做進去爲止,以後其他的就很好做了。這樣等你在耳機行業裏佔到80%的份額。我們再轉到別的行業,複製它。就像釣魚一樣,看準大的。一條一條的釣,很舒服。膽大,心細,臉皮厚。我們年輕的時候,追女孩子,大一點的告訴我們的經驗就是:膽大,心細,臉皮厚。其實做業務就像追女孩子一樣的。

2、據估計,有80%的業務之所以完成,是由於交情關係。現在競爭都很激烈,在同樣質量,同樣價格,同樣服務等的情況下,你要競爭過對手,只有憑交情了,如果你比對手更用心的對待客戶,和朋友結成朋友關係。這樣誰還能搶走你的單?所以你把時間花在什麼地方,你就得到什麼。所以說交情是個寶。

3、一定要熱情,熱情可以感染客戶的。可能我們有很多業務員剛開始會非常熱情,可是等到你做到一定的成績就會變成老油條了,失去了往日的熱情,有時候感覺反而單沒那麼好做了,你會以過分熱情而失去某一筆交易,但會因熱情不夠而失去一百次交易。熱情遠比花言巧語更有感染力。

4、一定要有個試用期。一個客戶做下來,就像男女結婚一樣。發現客戶就像我們發現一個心儀的夢中情人。從打電話到下單就像開始送情書到訂婚那麼漫長。到真正結婚了,都還要度完蜜月纔可以認認真真的過日子。所以我們和客戶也要度度蜜月,我們不要一下子就做的很大。一見鍾情而結婚的新鮮感過後很難維持的。我們都應該給點時間客戶和我們。互相考察一下信用,服務等等。 關於成交

1、很多業務員開始做業務的時候,往往衝勁很大,找到客戶,送了樣品,報了價就不知道怎麼辦了,往往前功盡棄。其實你應該不斷的問他,你哪個單什麼時候下呀(先假設已經成交),不斷的問他,知道有結果爲止。其實,採購就是等我們問他呢。會哭的孩子有奶吃。就像孩子不哭,我們怎麼知道他餓了呢?所以我們要要求客戶購買。然而,80%的業務員都

沒有向客戶提出成交要求。

2、如果未能成交,銷售代(本站:)表要立即與客戶約好下一個見面日期,如果在你和客戶面對面的時候,都不能約好下—次見面的時間,以後要想與這位客戶見面可就難上加難了。 3、我的感覺是,做業務要堅持追蹤,追蹤、再追蹤,如果要完成一件業務工作需要與客戶接觸5至10次的話,那你不惜一切也要熬到那第10次傾聽購買信號—如果你很專心在聽的話,當客戶已決定要購買時,通常會給你暗示。傾聽比說話更重要。

做業務就是:以成交爲目的而開展的一系列活動。雖然成交不等於一切,但沒有成交就沒有一切。 關於收款

1、做業務不要愛面子。業務做下來了,到收款的時候,很多人會想,我跟採購那麼熟,一天到晚去追他的款感覺不好意思。所以就很少追款或者追幾次沒追到就不追了。其實我們也是要拿到貨款纔有提成拿呀。欠債還錢,天經地義的,如果你給他欠的太多,你的生意還做不長久呢。我一般追款,不是求他安排,而是說。 **先生,你星期3安排貨款給我,我哪天下午去拿。他有時會說哪天不行,那我就說,那就星期二羅,他往往就說星期三行了。 2、對自己而言,在做客戶之前,應該細心的去了解客戶的一切。比如他之前和誰做的業務,也就是你的競爭對手是誰,知道了這一點你就可以報價和做出對策。瞭解客戶爲什麼會想和你做生意。如果是別人不肯供貨給他,那我們就可以要求他做現金。他肯定會賴帳。如果是對手的原因,例如質量不好,價錢高,服務不好。你就可以作相應的對策去應付他。如果是你在某方面做的比對手好而令到他跟你做,那你以後就知道怎麼做了。

3、預防客戶的拖款最好的辦法是和客戶成交之前的調查。我們要認真的考察客戶的一切信息,包括他的員工工資水準,發工資準時否,廠房是自己的還是租的,老闆是那裏的。生產的東西是在中國賣還是外銷。最好是要認識客戶的一些老供應商,這樣可以向他們瞭解客戶的的信用情況。書嘛,多看看是有必要的,平時抽空去書店看看,書店關於業務方面的書很多

第三篇:java學習心得筆記

j2ee學習筆記

注:框架可以用word菜單中的 “視圖/文檔結構圖” 看到

j2ee模式

value object(值對象)用於把數據從某個對象/層傳遞到其他對象/層的任意java對象。

通常不包含任何業務方法。

也許設計有公共屬性,或者提供可以獲取屬性值的get方法。

jsp

1.jsp的基礎知識

__

_____ |directive(指令)

| |-- scripting (腳本)

jsp -------| |__ action(動作)

|

|_____template data :除jsp語法外,jsp引擎不能解讀的東西

1)在jsp中使用的directive(指令)主要有三個:

a) page指令

b) include指令

c) taglib指令

在jsp的任何地方,以任何順序,一個頁面可以包含任意數量的page指令

2)scripting(腳本)包括三種類型

a) <%!declaraction%>;

b) <%scriptlet %>;

c) <%= expression%>;

3)action(動作)

標準的動作類型有:

a)<jsp:usebean>;

b)<jsp:setproperty>;

d) <jsp:getproperty>;

e) <jsp:param>;

f) <jsp:include>;

g) <jsp:forward>;

h) <jsp:plugin>;

1. 註釋: <% -----jsp comment-------%>;

<! -----html comment-------%>;

2. <%@ page session = “true”import =”.*” %>;

session可以不賦值,默認爲true,如果session=”false”,則在jsp頁面中,隱含的變量session就不能使用。

3. 請求控制器結構(request controller)

也被稱之爲jsp model 2 architecture

這種途徑涉及到使用一個servlet或一個jsp作爲一個應用程序或一組頁面的入口點。

爲創建可維護的jsp系統,request controller是最有用的方式之一。

不是jsp,而是java類纔是放置控制邏輯的正確的地方。

請求控制器的命名模式爲:

請求控制器類的命名模式爲: xxxrequestcontroller

2.jsp中的javabean

jsp三種bean的類型

1) 頁面bean

2) 會話bean

3) 應用bean

大多數的系統會使用一個會話bean來保持狀態,而對每一個頁面使用一個頁面bean 來對複雜的數據進行表示。

頁面bean是一個模型,而jsp是一個視圖。

3.custom tag

bean是信息的攜帶者,

而tag更適用於處理信息。

標記庫包含一個標記庫描述符(tld)和用於實現custom tag的java類

在翻譯階段,jsp容器將使用tld來驗證頁面中的所有的tag是否都被正確的使用。

標記處理程序只是一個簡單的適配器,而真正的邏輯是在另一個類中實現的,標記處理程序只是提供了一個供其他的可複用的類的jsp接口

servlet

1.servletconfig

&#61548; 一個servletconfig對象是servlet container在servlet initialization的時候傳遞給servlet的。

servletconfig包涵 servletcontext 和 一些 name/value pair (來自於deployment descriptor)

&#61548; servletcontext接口封裝了web應用程序的上下文概念。

2.會話跟蹤

1) session

&#61548; 當一個client請求多個servlets時,一個session可以被多個servlet共享。

&#61548; 通常情況下,如果server detect到browser支持cookie,那麼url就不會重寫。

2) cookie

&#61548; 在java servlet中,如果你光cookie cookie = new cookie(name,value)

那麼當用戶退出browser時,cookie會被刪除掉,而不會被存儲在客戶端的硬盤上。

如果要存儲 cookie,需加一句axage(200)

&#61548; cookie是跟某一個server相關的,運行在同一個server上的servlet共享一個cookie.

3) url rewriting

在使用url rewriting來維護session id的時候,每一次http請求都需要encodeurl()

典型的用在兩個地方

1) t(“form action=” ”);

t(deurl(“sessionexample”));

t(“form action=” ”);

t(“method = get>;”);

2) t(“<p>;<a href=” ”);

t(deurl(“sessionexample?database=foo&datavalue=bar”));

tln(“” >;url encoded </a>;”);

3.singlethreadmodel

默認的,每一個servlet definition in a container只有一個servlet class的實例。

只有實現了singlethreadmodel,container纔會讓servlet有多個實例。

servlet specification上建議,不要使用synchronized,而使用singlethreadmodel。

singlethreadmodel(沒有方法)

保證servlet在同一時刻只處理一個客戶的請求。

singlethreadmodel是耗費資源的,特別是當有大量的請求發送給servlet時,singlethreadmodel的作用是使包容器以同步時鐘的方式調用service方法。

這等同於在servlet的service()方法種使用synchronized.

single thread model一般使用在需要響應一個heavy request的時候,比如是一個需要和數據庫打交道的連接。

2. 在重載servlet地init( )方法後,一定要記得調用( );

3. the client通過發送一個blank line表示它已經結束request

而the server通過關閉the socket來表示response已結束了。

4. 一個http servlet可以送三種東西給client

1) a single status code

2) any number of http headers

3) a response body

5. servlet之間信息共享的一個最簡單的方法就是

roperties()(“key”,”value”);

6. post和get

post:將form內各字段名稱和內容放置在html header內傳送給server

get:?之後的查詢字符串要使用urlencode,經過urlencode後,這個字符串不再帶有空格,以後將在server上恢復所帶有的空格。

get是web上最經常使用的一種請求方法,每個超鏈接都使用這種方法。

7. 就是web applicatin 的deployment descriptor

作用有:組織各類元素

設置init param

設置安全性

8. request dispatcher用來把接收到的request forward processing到另一個servlet

要在一個response裏包含另一個servlet的output時,也要用到request dispatcher.

9. servlet和jsp在同一個jvm中,可以通過serveltcontext的

setattribute( )

getattribute( )

removeattribute( )

來共享對象

10. 利用arameter( )得到的string存在字符集問題。

可以用strtitle = arameter(“title”);

strtitle = new string(ytes(“8859-1”),”gb2312”);

如果你希望得到更大得兼容性

string encoding = haracterencoding();

//確定application server用什麼編碼來讀取輸入的。

strtitle = new string(ytes(encoding),”gb2312”);

xml

1.xml基礎知識

1. 一個xml文檔可以分成兩個基本部分:

首部( header )

內容( content )

2. xml名字空間規範中指定:

xml文檔中的每一個元素都處在一個名字空間中;如果沒有指定的名字空間,缺省的名字空間就是和該元素相關聯的名字空間。

3. a document that is well-formed obeys all of the rules of xml documents (nested tags, etc.)

" if a well-formed document uses a document type definition (more on these in a minute), and it follows all the rules of the dtd, then it is also a valid document

4. a tag is the text between the <angle brackets>;

" an element is the start tag, the end tag,and everything (including other elements) in between

5. 標籤( tags ) 實際上包含了“元素”( elements ) 和 “屬性”( attributes )兩部分。

用元素( elements )來描述有規律的數據。

用屬性( attributes ) 來描述系統數據。

如果你有一些數據要提供給某個應用程序,該數據就可能要用到一個元素。

如果該數據用於分類,或者用於告知應用程序如何處理某部分數據,或者該數據從來沒有直接對客戶程序公開,那麼它就可能成爲一種屬性。

6. cdata (讀作:c data ) c是character的縮寫。

er

/|

eader

/|

arser

2.webservice

2.1 webservice的基本概念

webservice是一種可以接收從internet或者intranet上的其它系統中傳遞過來的請求,輕量級的獨立的通訊技術。

這種技術允許網絡上的所有系統進行交互。隨着技術的發展,一個web服務可以包含額外的指定功能並且可以在多個b2b應用中協作通訊。

web服務可以理解請求中上下文的關係,並且在每一個特定的情況下產生動態的結果。這些服務會根據用戶的身份,地點以及產生請求的原因來改變不同的處理,用以產生一個唯一的,定製的方案。這種協作機制對那些只對最終結果有興趣的用戶來說,是完全透明的。

uddi

在用戶能夠調用web服務之前,必須確定這個服務內包含哪些商務方法,找到被調用的接口定義,還要在服務端來編制軟件。所以,我們需要一種方法來發布我們的web服務。

uddi (universal description, discovery, and integration) 是一個主要針對web服務供應商和使用者的新項目。uddi 項目中的成員可以通過uddi business registry (ubr) 來操作web服務的調用,ubr是一個全球性的服務。

web服務供應商可以在ubr中描述並且註冊他們的服務。

用戶可以在ubr中查找並定位那些他們需要的服務。

uddi是一種根據描述文檔來引導系統查找相應服務的機制。

uddi包含標準的“白皮書”類型的商業查詢方式,

“黃皮書”類型的局部查找,以及

“綠皮書”類型的服務類型查找。

uddi利用soap消息機制(標準的xml/http)來發布,編輯,瀏覽以及查找註冊信息。它採用xml格式來封裝各種不同類型的數據,並且發送到註冊中心或者由註冊中心來返回需要的數據。

wsdl

對於商業用戶來說,要找到一個自己需要使用的服務,他必須知道如何來調用。

wsdl (web services description language) 規範是一個描述接口,語義以及web服務爲了響應請求需要經常處理的工作的xml文檔。這將使簡單地服務方便,快速地被描述和記錄。

以下是一個wsdl的樣例:

<?xml version="1.0"?>;

<definitions name="stockquote"

targetnamespace=""

xmlns:tns=""

xmlns:xsd1=""

xmlns:soap=""

xmlns="">;

<types>;

<schema targetnamespace=

xmlns="">;

<element name="tradepricerequest">;

<complextype>;

<all>;

<element name="tickersymbol" type="string"/>;

</all>;

</complextype>;

</element>;

<element name="tradeprice">;

<complextype>;

<all>;

<element name="price" type="float"/>;

</all>;

</complextype>;

</element>;

</schema>;

</types>;

<message name="getlasttradepriceinput">;

<part name="body" element="xsd1:tradepricerequest"/>;

</message>;

<message name="getlasttradepriceoutput">;

<part name="body" element="xsd1:tradeprice"/>;

</message>;

<porttype name="stockquoteporttype">;

<operation name="getlasttradeprice">;

<input message="tns:getlasttradepriceinput"/>;

<output message="tns:getlasttradepriceoutput"/>;

</operation>;

</porttype>;

<binding name="stockquotesoapbinding"

type="tns:stockquoteporttype">;

<soap:binding style="document"

transport=""/>;

<operation name="getlasttradeprice">;

<soap:operation

soapaction=""/>;

<input>;

<soap:body use="literal"/>;

</input>;

<output>;

<soap:body use="literal"/>;

</output>;

</operation>;

</binding>;

<service name="stockquoteservice">;

<documentation>;my first service</documentation>;

<port name="stockquoteport" binding="tns:stockquotebinding">;

<soap:address location=""/>;

</port>;

</service>;

</definitions>;

它包含了以下的關鍵信息:

消息的描述和格式定義可以通過xml文檔中的<types>;和<message>; 標記來傳送。

<porttype>; 標記中表示了消息傳送機制。 (e.g. request-only, request-response, response-only) 。

<binding>; 標記指定了編碼的規範 。

<service>; 標記中表示服務所處的位置 (url)。

wsdl在uddi中總是作爲一個接口描述文檔。因爲uddi是一個通用的用來註冊wsdl規範的地方,uddi的規範並不限制任何類型或者格式描述文檔。這些文檔可能是一個wsdl文檔,或者是一個正規的包含導向文檔的web頁面,也可能只是一個包含聯繫信息的電子郵件地址。

現在java提供了一個 java api for wsdl (jwsdl)規範。它提供了一套能快速處理wsdl文檔的方法,並且不用直接對xml文檔進行操作,它會比jaxp更方便,更快速。

soap

當商業用戶通過uddi找到你的wsdl描述文檔後,他通過可以simple object access protocol (soap) 調用你建立的web服務中的一個或多個操作。

soap是xml文檔形式的調用商業方法的規範,它可以支持不同的底層接口,象http(s)或者smtp。

之所以使用xml是因爲它的獨立於編程語言,良好的可擴展性以及強大的工業支持。之所以使用http是因爲幾乎所有的網絡系統都可以用這種協議來通信,由於它是一種簡單協議,所以可以與任何系統結合,還有一個原因就是它可以利用80端口來穿越過防火牆。

soap的強大是因爲它簡單。soap是一種輕量級的,非常容易理解的技術,並且很容易實現。它有工業支持,可以從各主要的電子商務平臺供應商那裏獲得。

從技術角度來看,soap詳細指明瞭如何響應不同的請求以及如何對參數編碼。一個soap封裝了可選的頭信息和正文,並且通常使用http post方法來傳送到一個http 服務器,當然其他方法也是可以的,例如smtp。soap同時支持消息傳送和遠程過程調用。以下是一個soap請求。

post /stockquote http/1.1

host:

content-type: text/xml; charset="utf-8"

content-length: nnnn

soapaction: "some-uri"

<soap-env:envelope

xmlns:soap-env=""

關。

以下是你應該回避使用的一些java特色,並且在你的ejb組件的實現代碼中要嚴格限

制它們的使用:

1.使用static,非final 字段。建議你在ejb組件中把所有的static字段都聲明爲final型的。這樣可以保證前後一致的運行期語義,使得ejb容器有可以在多個java虛擬機之間分發組件實例的靈活性。

2.使用線程同步原語來同步多個組件實例的運行。避免這個問題,你就可以使ejb容器靈活的在多個java虛擬機之間分發組件實例。

3.使用awt函數完成鍵盤的輸入和顯示輸出。約束它的原因是服務器方的商業組件意味着提供商業功能而不包括用戶界面和鍵盤的i/o功能。

4.使用文件訪問/ 操作。ejb商業組件意味着使用資源管理器如jdbc來存儲和檢索數據而不是使用文件系統api。同時,部署工具提供了在部署描述器(descriptor)中存儲環境實體,以至於ejb組件可以通過環境命名上下文用一種標準的方法進行環境實體查詢。所以,使用文件系統的需求基本上是被排除了。

5.監聽和接收socket連接,或者用socket進行多路發送。ejb組件並不意味着提供網絡socket服務器功能,但是,這個體系結構使得ejb組件可以作爲socket客戶或是rmi客戶並且可以和容器所管理的環境外面的代碼進行通訊。

6.使用映象api查詢ejb組件由於安全規則所不能訪問的類。這個約束加強了java平臺的安全性。

7.欲創建或獲得一個類的加載器,設置或創建一個新的安全管理器,停止java虛擬機,改變輸入、輸出和出錯流。這個約束加強了安全性同時保留了ejb容器管理運行環境的能力。

8.設置socket工廠被url's serversocket,socket和stream handler使用。避免這個特點,可以加強安全性同時保留了ejb容器管理運行環境的能力。

9.使用任何方法啓動、停止和管理線程。這個約束消除了與ejb容器管理死鎖、線程

和併發問題的責任相沖突的可能性。

通過限制使用10-16幾個特點,你的目標是堵上一個潛在的安全漏洞:

10.直接讀寫文件描述符。

11.爲一段特定的代碼獲得安全策略信息。

12.加載原始的類庫。

13.訪問java一般角色所不能訪問的包和類。

14.在包中定義一個類。

15.訪問或修改安全配置對象(策略、安全、提供者、簽名者和實體)。

16.使用java序列化特點中的細分類和對象替代。

17.傳遞this引用指針作爲一個參數或者作爲返回值返回this引用指針。你必須使用

sessioncontext或entitycontext中的getejbobject()的結果。

java2平臺的安全策略

以上所列的特點事實上正是java編程語言和java2標準版中的標準的、強有力的特色。ejb容器允許從j2se中使用一些或全部的受限制的特色,儘管對於ejb組件是不可用的,但需通過j2se的安全機制來使用而不是通過直接使用j2se的api。

java2平臺爲ejb1.1規範中的ejb容器所制定的安全策略定義了安全許可集,這些許可在ejb組件的編程限制中出現。通過這個策略,定義了一些許可諸如:permission,ermission,ectpermission,ritypermission,以便加強先前所列出的編程限制。

許多ejb容器沒有加強這些限制,他們希望ejb組件開發者能遵守這些編程限制或者是帶有冒險想法違背了這些限制。違背這些限制的ejb組件,比標準方法依賴過多或過少的安全許可,都將很少能在多個ejb容器間移植。另外,代碼中都將隱藏着一些不確定的、難以預測的問題。所有這些都足以使ejb組件開發者應該知道這些編程限制,同時也應該認真地遵守它們。

任何違背了這些編程限制的ejb組件的實現代碼在編譯時都不能檢查出來,因爲這些特點都是java語言和j2se中不可缺少的部分。

對於ejb組件的這些限制同樣適用於ejb組件所使用的幫助/訪問(helper/access)類,j2ee應用程序使用java文檔(jar)文件格式打包到一個帶(代表enterprise archive)擴展名的文件中,這個ear文件對於發送給文件部署器來說是標準的格式。ear文件中包括在一個或多個ejb-jar文件中的ejb組件,還可能有ejb-jar所依賴的庫文件。所有ear文件中的代碼都是經過深思熟慮開發的應用程序並且都遵守編程限制和訪問許可集。

未來版本的規範可能會指定通過部署工具來定製安全許可的能力,通過這種方法指定了一個合法的組件應授予的許可權限,也指定了一個標準方法的需求:如從文件系統中讀文件應有哪些要求。一些ejb容器/服務器目前在它們的部署工具中都提供了比標準權限或多或少的許可權限,這些並不是ejb1.1規範中所需要的。

理解這些約束

ejb容器是ejb組件生存和執行的運行期環境,ejb容器爲ejb組件實例提供了一些服務如:事務管理、安全持久化、資源訪問、客戶端連接。ejb容器也負責ejb組件實例整個生命期的管理、擴展問題以及併發處理。所以,ejb組件就這樣寄居在一個被管理的執行環境中--即ejb容器。

因爲ejb容器完全負責ejb組件的生命期、併發處理、資源訪問、安全等等,所以與容器本身的鎖定和併發管理相沖突的可能性就需要消除,許多限制都需要使用來填上潛在的安全漏洞。除了與ejb容器責任與安全衝突的問題,ejb組件還意味着僅僅聚焦於商務邏輯,它依賴於ejb容器所提供的服務而不是自己來直接解決底層的系統層的問題。

可能的問題

通常,ejb組件在容器之間的移植不可避免地與如下問題相關:

1.它需要依靠的受限制的特點在特定ejb容器中沒有得到加強。

2.它需要依靠的非標準的服務從容器中可獲得。

爲了保證ejb組件的可移植性和一致的行爲,你應該使用一個具有與java2平臺安全

策略集相一致的策略集的容器來測試ejb組件,並且其加強了前述的編程限制。

總結

ejb組件開發者應該知道這些推薦的關於ejb組件的編程限制,明白它們的重要性,並且從組件的穩定性和可移植性利益方面考慮來遵循它們。因爲這些編程限制能阻止你使用標準的java語言的特點,違背了這些編程限制在編譯時不會知道,並且加強這些限制也不是ejb容器的責任。所有這些原因都使你應很小心地遵守這些編程限制,這些限制在組件的合同中已經成爲了一個條款,並且它們對於建造可靠的、可移植的組件是非常重要的。

2. 優化ejb

entity bean爲在應用程序和設計中描述持久化商業對象(persistent business objec ts)提供了一個清晰的模型。在java對象模型中,簡單對象通常都是以一種簡單的方式進行處理但是,很多商業對象所需要的事務化的持久性管理沒有得到實現。entity bean將持久化機制封裝在容器提供的服務裏,並且隱藏了所有的複雜性。entity bean允許應用程序操縱他們就像處理一個一般的java對象應用。除了從調用代碼中隱藏持久化的形式和機制外,entity bean還允許ejb容器對對象的持久化進行優化,保證數據存儲具有開放性,靈活性,以及可部署性。在一些基於ejb技術的項目中,廣泛的使用oo技術導致了對entity bean的大量使用,sun的工程師們已經積累了很多使用entity bean的經驗,這篇文章就詳細闡述的這些卡發經驗:

*探索各種優化方法

*提供性能優化和提高適用性的法則和建議

*討論如何避免一些教訓。

法則1:只要可以,儘量使用cmp

cmp方式不僅減少了編碼的工作量,而且在container中以及container產生的數據庫訪問代碼中包括了許多優化的可能。container可以訪問內存緩衝中的bean,這就允許它可以監視緩衝中的任何變化。這樣的話就在事物沒有提交之前,如果緩存的數據沒有變化就不用寫到數據庫中。就可以避免許多不必要的數據庫寫操作。另外一個優化是在調用find方法的時候。通常情況下find方法需要進行以下數據庫操作:

查找數據庫中的紀錄並且獲得主鍵

將紀錄數據裝入緩存

cmp允許將這兩步操作優化爲一步就可以搞定。[具體怎麼做我也沒弄明白,原文沒有具體闡述]

法則2:寫代碼時儘量保證對bmp和cmp都支持

許多情況下,ejb的開發者可能無法控制他們寫的bean怎麼樣被部署,以及使用的container是不是支持cmp.

一個有效的解決方案是,將商業邏輯的編碼完全和持久化機制分離。再cmp類中實現商業邏輯,然後再編寫一個bmp類,用該類繼承cmp類。這樣的話,所有的商業邏輯都在cmp類中,而持久化機制在bmp中實現。[我覺得這種情況在實際工作中很少遇到,但是作者解決問題的思路值得學習]

法則3:把ejbstore中的數據庫訪問減小到最少。

如果使用bmp,設置一個緩存數據改變標誌dirty非常有用。所有改變數據庫中底層數據的操作,都要設置dirty,而在ejbstore()中,首先檢測dirty的值,如果dirty的值沒有改變,表明目前數據庫中的數據與緩存的一致,就不必進行數據庫操作了,反之,就要把緩存數據寫入數據庫。

法則4:總是將從lookup和find中獲得的引用進行緩存。(cache)

引用緩存對session bean和entity bean 都是適用的。

通過jndi lookup獲得ejb資源。比如datasource,bean的引用等等都要付出相當大的代價。因此應該避免多餘的lookup.可以這樣做:

將這些引用定義爲實例變量。

從setentitycontext(session bean使用setsessioncontext)方法查找他們。setentitycontext方法對於一個bean實例只執行一次,所有的相關引用都在這一次中進行查找,這樣查找的代價就不是那麼昂貴了。應該避免在其他方法中查找引用。尤其是訪問數據庫的方法:ejbload()和ejbstore(),如果在這些頻繁調用的方法中進行datasource的查找,勢必造成時間的浪費。

調用其他entity bean的finder方法也是一種重量級的調用。多次調用finder()方法的代價非常高。如果這種引用不適合放在setentitycontext這樣的初始化時執行的方法中執行,就應該在適當的時候緩存finder的執行結果。只是要注意的是,如果這個引用只對當前的entity有效,你就需要在bean從緩衝池中取出來代表另外一個實體時清除掉這些引用。,這些操作應該在ejbactivate()中進行。

法則5:總是使用prepare statements

這條優化法則適用於所有訪問關係數據庫的操作。

數據庫在處理每一個sql statement的時候,執行前都要對statement進行編譯。一些數據庫具有緩存statement和statement的編譯後形式的功能。數據庫可以把新的statement和緩存中的進行匹配。然而,如果要使用這一優化特性,新的statement要必須和緩存中的statement完全匹配。

對於non-prepared statement,數據和statement本身作爲一個字符串傳遞,這樣由於前後調用的數據不同而不能匹配,就導致無法使用這種優化。而對於prepared statement,數據和statement是分開傳遞給數據庫的,這樣statement就可以和cache中已編譯的statement進行匹配。statement就不必每次都進行編譯操作。從而使用該優化屬性。

這項技術在一些小型的數據庫訪問中能夠減少statement將近90%的執行時間。

法則6:完全關閉所有的statement

在編寫bmp的數據庫訪問代碼時,記住一定要在數據庫訪問調用之後關閉statement,因爲每個打開的statement對應於數據庫中的一個打開的遊標。

security

1.加密

對稱加密

(1)分組密碼

(2)流密碼

常用的對稱加密算法:

des和tripledes

blowfish

rc4

aes

非對稱加密

常用的非對稱加密算法

rsa

elgamal

會話密鑰加密(對稱加密和非對稱加密一起使用)

常用的會話密鑰加密協議

s/mime

pgp

ssl和tlsssl是在application level protocal和transport protocal之間的。

比如:http和tcp/ip之間

ssl 提供了服務器端認證和可選的客戶端認證,保密性和數據完整性。

提供基於ssl方式的傳輸加密和認證,確保以下三種安全防護:

數據的機密性和準確性、

服務器端認證

客戶端認證。

客戶端認證比服務器端認證不很普遍的原因是每一個要被認證的客戶都必須有一張verisign這樣的ca簽發的證書。

通常,在進行身份認證的時候,應當只接受一個ca,這個ca的名字包含在客戶證書中。

由於不可能隨意創建一個由指定ca簽發的證書,所以這可以有效的防禦通過僞造證書來進行的攻擊嘗試。

2.認證(authentication)

認證就是確定一條消息或一個用戶的可靠性的過程。

1.消息摘要

md5

sha和sha-1

2.消息認證碼(message authientication codes,mac)

3.數字簽名

用戶可以用自己的密鑰對信息加以處理,由於密鑰僅爲本人所有,這樣就產生了別人無法生成的文件,也就形成了數字簽名

數字簽名可以

1)保證數據的完整性

2)驗證用戶的身份

數字簽名採用一個人的私鑰計算出來,然後用公鑰去檢驗。

hash算法 私鑰加密

原報文 ――――――>;報文摘要( message digest ) ―――――>;數字簽名

原報文和數字簽名一起被髮送到接受者那裏,接受者用同樣的hash算法得到報文摘要,然後用發送者的公鑰解開數字簽名。

比較是否相同,則可以確定報文確定來自發送者。

驗證數字簽名必須使用公鑰,但是,除非你是通過安全的方式直接得到,否則不能保證公鑰的正確性。(數字證書可以解決這個問題)

一個接受者在使用公鑰(public key)檢查數字簽名(digital signature)的可信度時,通常先要檢查收到的公鑰(public key)是否可信的。

因此發送方不是單單地發送公鑰(public key),而是發送一個包含公鑰(public key)的數字證書(cetificate )。

4.數字證書

數字證書是一個經證書授權中心數字簽名的包含公開密鑰所有者信息以及公開密鑰的文件。

數字證書cetificate中包括:

i. 用戶的公鑰(public key)

ii. 用戶的一些信息,如姓名,email

iii. 發行機構的數字簽名(digital signature), 用於保證證書的可信度

iv. 發行機構的一些信息

數字證書的格式遵循x.509國際標準。

注意:一個數字證書certificate並不適用於多種browser,甚至一種browser的多個版本。

數字標識由公用密鑰、私人密鑰和數字簽名三部分組成。

當在郵件中添加數字簽名時,您就把數字簽名和公用密鑰加入到郵件中。數字簽名和公用密鑰統稱爲證書。您可以使用 outlook express 來指定他人向您發送加密郵件時所需使用的證書。這個證書可以不同於您的簽名證書。

收件人可以使用您的數字簽名來驗證您的身份,並可使用公用密鑰給您發送加密郵件,這些郵件必須用您的私人密鑰才能閱讀。

要發送加密郵件,您的通訊簿必須包含收件人的數字標識。這樣,您就可以使用他們的公用密鑰來加密郵件了。當收件人收到加密郵件後,用他們的私人密鑰來對郵件進行解密才能閱讀。

在能夠發送帶有數字簽名的郵件之前,您必須獲得數字標識。如果您正在發送加密郵件,您的通訊簿中必須包含每位收件人的數字標識。

數字證書,可以是個人證書或 web 站點證書,用於將身份與"公開密鑰"關聯。只有證書的所有者才知道允許所有者"解密"或進行"數字簽名"的相應"私人密鑰"。當您將自己的證書發送給其他人時,實際上發給他們的是您的公開密鑰,這樣他們就可以向您發送只能由您使用私人密鑰解密和讀取的加密信息。

通過瀏覽器使用數字證書,必須先要設置瀏覽器軟件 internet explorer 或 netscape使用此證書,才能開始發送加密或需要數字簽名的信息。訪問安全的 web 站點(以"https"打頭的站點)時,該站點將自動向您發送他們的web站點證書。

3.ca(證書授證中心)

ca機構,又稱爲證書授證(certificate authority)中心,作爲電子商務交易中受信任的第三方,承擔公鑰體系中公鑰的合法性檢驗的責任。ca中心爲每個使用公開密鑰的用戶發放一個數字證書,數字證書的作用是證明證書中列出的用戶合法擁有證書中列出的公開密鑰。ca機構的數字簽名使得攻擊者不能僞造和篡改證書。在set交易中,ca不僅對持卡人、商戶發放證書,還要對獲款的銀行、網關發放證書。它負責產生、分配並管理所有參與網上交易的個體所需的數字證書,因此是安全電子交易的核心環節。

對證書的信任基於對根證書的信任. 例如在申請sheca的個人數字證書前,需要先下載根證書,然後再進行各類證書的申請。

下載根證書的目的:

網絡服務器驗證(s);安全電子郵件(e)

申請個人數字證書可以爲internet用戶提供發送電子郵件的安全和訪問需要安全連接(需要客戶證書)的站點。

1)個人數字證書

a.個人身份證書

個人身份證書是用來表明和驗證個人在網絡上的身份的證書,它確保了網上交易和作業的安全性和可靠性。可應用於:網上炒股、網上理財、網上保險、網上繳費、網上購物、網上辦公等等。個人身份證書可以存儲在軟盤或ic卡中。

b.個人安全電子郵件證書

個人安全電子郵件證書可以確保郵件的真實性和保密性。申請後一般是安裝在用戶的瀏覽器裏。用戶可以利用它來發送簽名或加密的電子郵件。

用戶在申請安裝完安全安全電子郵件數字證書後,就可以對要發送的郵件進行數字簽名。收信人收到該郵件後,就可以看到數字簽名的標記,這樣就可以證明郵件肯定來自發信者本人,而不是別人盜用該帳號僞造信件,同時也保證該郵件在傳送過程中沒被他人篡改過任何數據。

安全電子郵件中使用的數字證書可以實現:

保密性通過使用收件人的數字證書對電子郵件加密。如此以來,只有收件人才能閱讀加密的郵件,在internet上傳遞的電子郵件信息不會被人竊取,即使發錯郵件,收件人也無法看到郵件內容。

認證身份在internet上傳遞電子郵件的雙方互相不能見面,所以必須有方法確定對方的身份。利用發件人數字證書在傳送前對電子郵件進行數字簽名即可確定發件人身份,而不是他人冒充的。

完整性利用發件人數字證書在傳送前對電子郵件進行數字簽名不僅可確定發件人身份,而且傳遞的電子郵件信息也不能被人在傳輸過程中修改。

不可否認性由於發件人的數字證書只有發件人唯一擁有,故發件人利用其數字證書在傳送前對電子郵件進行數字簽名,發件人就無法否認發過這個電子郵件。

outlook express中的個人安全電子郵件證書

簽名郵件帶有簽名郵件圖標。

簽名郵件可能出現的任何問題都將在本信息之後可能出現的“安全警告”中得到描述。如果存在問題,您應該認爲郵件已被篡改,或並非來自所謂的發件人。

當收到一封加密郵件時,您應該可以自信地認爲郵件未被任何第三者讀過。outlook express 會自動對電子郵件解密, 如果在您的計算機上裝有正確的數字標識。

2)企業數字證書

a.企業身份證書

企業身份證書是用來表明和驗證企業用戶在網絡上身份的證書,它確保了企業網上交易和作業的安全性和可靠性。可應用於:網上證券、網上辦公、網上交稅、網上採購、網上資金轉帳、網上銀行等。企業身份證書可以存儲在軟盤和ic卡中。

b.企業安全電子郵件證書

企業安全電子郵件證書可以確保郵件的真實性和保密性。申請後一般是安裝在用戶的瀏覽器裏。企業可以利用它來發送簽名或加密的電子郵件。

可使用 windows xx 中的證書服務來創建證書頒發機構 (ca),它負責接收證書申請、驗證申請中的信息和申請者的身份、頒發證書、吊銷證書以及發佈證書吊銷列表 (crl)。

通常,當用戶發出證書申請時,在其計算機上的加密服務提供程序 (csp) 爲用戶生成公鑰和私鑰對。用戶的公鑰隨同必要的識別信息發送至 ca。如果用戶的識別信息符合批准申請的 ca 標準,那麼 ca 將生成證書,該證書由客戶應用程序檢索並就地存儲。

4.set

安全接口層協議——ssl(se cure socketslayer),並且已經幾乎成爲了目前www 世界的事實標準。這一標準使用公共密鑰編碼方案來對傳輸數據進行加密,在雙方之間建立一個internet 上的加密通道,從而使第三方無法獲得其中的信息,其思路與目前流行的vpn方案大致相同,目的都是要保護數據不被未經授權的第三方所竊聽,或即使竊聽到也不知所云。但就象vpn 一樣,ssl 在認證方面沒有任何作爲,它們都需要通過另外的手段來確認身份和建立雙方彼此間的信任,然後再通過ssl 進行交易。

正是由於ssl 標準在認證方面的缺憾,所以set 纔有存在的必要。set(secure electronic transactions) 規範由masterc ard 和visa 公司於1996 年發佈,專家們認爲set 是保證用戶與商家在電子商務與在線交易中免受欺騙的重要手段。傳統的信用卡交易者總在擔心不誠實的店員會將自己的信用卡號碼透露給他人,而在線交易也是如此,持卡者總在擔心服務器端的管理員會將信用卡號碼泄露出去,或者擔心黑客會在管理員不知情的情況下盜取信用卡號碼。事實上這些擔心都是必要的,而set 標準則可以保證用戶的信用卡號碼只傳送給信用卡公司進行認證,不會被系統管理員看到,也不會留在交易服務器的硬盤上給黑客以可乘之機。

5.pki

pki是一種易於管理的、集中化的網絡安全方案。它可支持多種形式的數字認證: 數據加密、數字簽字、不可否認、身份鑑別、密鑰管理以及交叉認證等。pki可通過一個基於認證的框架處理所有的數據加密和數字簽字工作。p ki標準與協議的開發迄今已有15年的歷史,目前的pki已完全可以向企業網絡提供有效的安全保障。

pki是一種遵循標準的密鑰管理平臺,它能夠爲所有網絡應用透明地提供採用加密和數字簽名等密碼服務所必需的密鑰和證書管理。pki必須具有

1)ca、

2)證書庫、

3)密鑰備份及恢復系統、

4)證書作廢處理系統、

5)客戶端證書處理系統

等基本成分,構建pki也將圍繞着這五大系統來構建

一個pki由衆多部件組成,這些部件共同完成兩個主要功能:

1)爲數據加密

2)創建數字認證。

服務器(即後端)產品是這一系統的核心,這些數據庫管理着數字認證、公共密鑰及專用密鑰( 分別用於數據的加密和解密)。

ca數據庫負責發佈、廢除和修改x.509數字認證信息,它裝有用戶的公共密鑰、證書有效期以及認證功能(例如對數據的加密或對數字簽字的驗證) 。爲了防止對數據簽字的篡改,ca在把每一數字簽字發送給發出請求的客戶機之前,需對每一個數字簽字進行認證。一旦數字認證得以創建, 它將會被自動存儲於x.500目錄中,x.500目錄爲樹形結構。ldap(lightweight directory access protocol)協議將響應那些要求提交所存儲的公共密鑰認證的請求。ca爲每一用戶或服務器生成兩對獨立的公共和專用密鑰。其中一對用於信息的加密和解密, 另一對由客戶機應用程序使用,用於文檔或信息傳輸中數字簽字的創建。

大多數pki均支持證書分佈,這是一個把已發佈過的或續延生命期的證書加以存儲的過程。這一過程使用了一個公共查詢機制,x.500目錄可自動完成這一存儲過程。影響企業普遍接受p ki的一大障礙是不同ca之間的交叉認證。假設有兩家公司,每一家企業分別使用來自不同供應商的ca,現在它們希望相互託管一段時間。如果其後援數據庫支持交叉認證, 則這兩家企業顯然可以互相托管它們的ca,因而它們所託管的所有用戶均可由兩家企業的ca所託管。

* 認證機關

ca是證書的簽發機構,它是pki的核心。衆所周知,構建密碼服務系統的核心內容是如何實現密鑰管理,公鑰體制涉及到一對密鑰,即私鑰和公鑰, 私鑰只由持有者祕密掌握,無須在網上傳送,而公鑰是公開的,需要在網上傳送,故公鑰體制的密鑰管理主要是公鑰的管理問題,目前較好的解決方案是引進證書(certificate)機制。

證書是公開密鑰體制的一種密鑰管理媒介。它是一種權威性的電子文檔,形同網絡計算環境中的一種身份證,用於證明某一主體(如人、服務器等)的身份以及其公開密鑰的合法性。在使用公鑰體制的網絡環境中, 必須向公鑰的使用者證明公鑰的真實合法性。因此,在公鑰體制環境中,必須有一個可信的機構來對任何一個主體的公鑰進行公證,證明主體的身份以及他與公鑰的匹配關係。c a正是這樣的機構,它的職責歸納起來有:

1、驗證並標識證書申請者的身份;

2、確保ca用於簽名證書的非對稱密鑰的質量;

3、確保整個簽證過程的安全性,確保簽名私鑰的安全性;

4、證書材料信息(包括公鑰證書序列號、ca標識等)的管理;

5、確定並檢查證書的有效期限;

6、確保證書主體標識的唯一性,防止重名;

7、發佈並維護作廢證書表;

8、對整個證書籤發過程做日誌記錄;

9、向申請人發通知。

其中最爲重要的是ca自己的一對密鑰的管理,它必須確保其高度的機密性,防止他方僞造證書。ca的公鑰在網上公開,整個網絡系統必須保證完整性。

* 證書庫

證書庫是證書的集中存放地,它與網上"白頁”類似,是網上的一種公共信息庫,用戶可以從此處獲得其他用戶的證書和公鑰。

構造證書庫的最佳方法是採用支持ldap協議的目錄系統,用戶或相關的應用通過ldap來訪問證書庫。系統必須確保證書庫的完整性,防止僞造、篡改證書。

* 密鑰備份及恢復系統

* 證書作廢處理系統

* pki應用接口系統

pki的價值在於使用戶能夠方便地使用加密、數字簽名等安全服務,因此一個完整的pki必須提供良好的應用接口系統,使得各種各樣的應用能夠以安全、一致、可信的方式與p ki交互,確保所建立起來的網絡環境的可信性,同時降低管理維護成本。最後,pki應用接口系統應該是跨平臺的。

許多權威的認證方案供應商(例如verisign、thawte以及gte)目前都在提供外包的pki。外包pki最大的問題是,用戶必須把企業託管給某一服務提供商, 即讓出對網絡安全的控制權。如果不願這樣做,則可建造一個專用的pki。專用方案通常需把來自entrust、baltimore technologies以及xcert的多種服務器產品與來自主流應用程序供應商(如microsoft、netscape以及qualcomm)的產品組合在一起。專用pk i還要求企業在準備其基礎設施的過程中投入大量的財力與物力。

7.jaas

擴展jaas實現類實例級授權

“java 認證和授權服務”(java authentication and authorization service,jaas)

在 jaas 下,可以給予用戶或服務特定的許可權來執行 java 類中的代碼。在本文中,軟件工程師 carlos fonseca 向您展示如何爲企業擴展 jaas 框架。向 jaas 框架添加類實例級授權和特定關係使您能夠構建更動態、更靈活並且伸縮性更好的企業應用程序。

大多數 java 應用程序都需要某種類實例級的訪問控制。例如,基於 web 的、自我服務的拍賣應用程序的規範可能有下列要求:

public static object

doas(subject subject, ilegedaction action)

throws ilegedactionexception

注意,用來保護敏感代碼的方法與“java 2 代碼源訪問控制”(java 2 codesource access control)概述中描述的方法相同。請參閱參考資料部分以瞭解更多關於 jaas 中代碼源訪問控制和認證的信息。

jaas 中的授權

清單 4 顯示一個授權請求的結果,該請求使用清單 3 中顯示的 jaas 策略文件。假設已經安裝了 securitymanager,並且 logincontext 已經認證了一個帶有名爲“admin”的 cipalexample 主體的 subject。

清單 4. 一個簡單的授權請求

public class jaasexample {

public static void main(string[] args) {

...

// where authenticateduser is a subject with

// a principalexample named admin.

(authenticateduser, new jaasexampleaction());

...

}

}

public class jaasexampleaction implements privilegedaction {

public object run() {

filewriter fw = new filewriter("");

e("hello, world!");

e();

}

}

這裏,敏感代碼被封裝在 jaasexampleaction 類中。還要注意,調用類不要求爲 jaasexampleaction 類代碼源授予許可權,因爲它實現了一個 privilegedaction。

擴展 jaas

大多數應用程序都有定製邏輯,它授權用戶不僅僅在類上執行操作,而且還在該類的實例上執行操作。這種授權通常建立在用戶和實例之間的關係上。這是 jaas 的一個小缺點。然而,幸運的是,這樣設計 jaas 使得 jaas 可以擴展。只要做一點工作,我們將可以擴展 jaas,使其包含一個通用的、類實例級的授權框架。

在文章開頭處我已經說明了,抽象類 cy 被用於代表 jaas 安全性策略。它的缺省實現是由 cyfile 類提供。policyfile 類從 jaas 格式的文件(象清單 3 中顯示的那個一樣)中讀取策略。

我們需要向這個文件添加一個東西爲類實例級授權擴展策略定義:一個與許可權語句相關的可選關係參數。

缺省 jaas 許可權語句的格式如下:

permission <permission implementation class>; [name], [actions];

我們在這個許可權語句的末尾添加一個可選的關係參數來完成策略定義。下面是新許可權語句的格式:

permission <permission implementation class>;

[name], [actions], [relationship];

在爲類實例級授權擴展 jaas 時要注意的最重要的一點是:許可權實現類必須有一個帶三個參數的構造函數。第一個參數是名稱參數,第二個是行爲參數,最後一個是關係參數。

解析新文件格式

既然文件格式已經改變,就需要一個新的 cy 子類來解析文件。

爲簡單起見,我們的示例使用了一個新的 cy 子類 olicyfile,來從 xml 文件讀取策略。在實際的企業應用程序中,關係數據庫更適合執行這個任務。

使用 xmlpolicyfile 類代替缺省的 jaas 訪問控制策略實現的最容易的方法是向 rity 屬性文件添加 ider=olicyfile 條目。rity 屬性文件位於 java 2 平臺運行時的 lib/security 目錄下。清單 5 是與 xmlpolicyfile 類一起使用的樣本 xml 策略文件:

清單 5. 一個 xml 策略文件

<?xml version="1.0"?>;

<policy>;

<grant codebase="file:/d:/sample_">;

<principal classname=

"cipalexample" name="users">;

<permission classname=

"urcepermission"

name="ion"

actions="create" />;

<permission classname=

"urcepermission"

name="ion"

actions="read" />;

<permission classname=

"urcepermission"

name="ion"

actions="write"

relationship="owner" />;

<permission classname=

"urcepermission"

name=""

actions="create" />;

<permission classname=

"urcepermission"

name=""

actions="read" />;

<permission classname=

"urcepermission"

name=""

actions="write"

relationship="owner" />;

<permission classname=

"urcepermission"

name=""

actions="accept"

relationship="actionowner" />;

</principal>;

</grant>;

</policy>;

在這個示例策略文件中,任何與名爲 principalexample 的用戶有關的用戶(subject)都可以創建並讀取一個 s 實例。但是,只有創建該實例的用戶纔可以更新(寫)它。這是第三個 permission 元素定義的,該元素包含值爲 owner 的 relationship 屬性。s 實例也是一樣,除了相應 s 實例的所有者可以更改投標接受標誌。

resource 接口

要求類實例級訪問控制的類必須實現 resource 接口。該接口的 getowner() 方法返回類實例的所有者。fulfills(subject subject, string relationship) 方法被用於處理特定關係。另外,這些類使用 urcepermission 類保護敏感代碼。例如,auction 類擁有下列構造函數:

public auction() {

permission permission =

new resourcepermission("ion", "create");

kpermission(permission);

}

所有者關係

resourcepermission 類的 implies(permission p) 方法是這個框架的關鍵。implies() 方法就等同性比較名稱和行爲屬性。如果定義了一個關係,那麼必須把受保護的類實例(resource)傳遞到 resourcepermission 構造函數中。resourcepermission 類理解所有者關係。它將類實例的所有者與執行代碼的 subject(用戶)進行比較。特定關係被委託給受保護類的 fulfills() 方法。

例如,在清單 5 中所示的 xml 策略文件中,只有 auction 類實例的所有者可以更新(寫)文件。該類的 setter 方法使用清單 6 中顯示的保護代碼:

清單 6. 運行中的 implies(permission) 方法

public void setname(string newname) {

permission permission =

new resourcepermission("ion", "write", this);

kpermission(permission);

// sensitive code

= newname;

}

被傳遞到 resourcepermission 構造函數中的 this 引用代表 auction 類實現的 resource 接口。由於策略文件中列出的關係是 owner,所以 resourcepermission 類使用這個引用檢查當前 subject(用戶)是否擁有與實例所有者相匹配的主體。如果指定了另一個關係,那麼 resourcepermission 類調用 auction 類的 fulfills(subject subject, string relationship) 方法。由 resource 實現類提供 fulfills() 方法中的邏輯。

xml 策略文件中列出的 bid 類擁有清單 7 中所示的方法(假設 bid 類實例有一個對相應 auction 類實例的引用 — auction)。

清單 7. 處理特定關係

public void setaccepted(boolean flag) {

permission permission =

new resourcepermission("ion", "accept", this);

kpermission(permission);

// sensitive code

pted = flag;

}

public boolean fulfills(subject user, string relationship) {

if( lsignorecase("auctionowner") ) {

string auctionowner = wner();

iterator principaliterator = rincipals()ator();

while(ext()) {

principal principal = (principal) ();

if( ame()ls(auctionowner) )

return true;

}

}

return false;

}

傳遞到 fulfills() 方法中的關係字符串是策略文件中列出的關係。在這個案例中,我們使用了“auctionowner”字符串。

缺省情況下,xmlpolicyfile 類在當前工作目錄中查找名爲 的文件。系統屬性 cy 可以用於指定另一個不同的文件名和位置。

websphere application server 示例

除命令行示例之外,您可能還想運行這個簡單的程序,該程序爲了 ibm websphere application server,version 4.0.2 而被優化。

一個可運行的示例

綜合這些信息,我們將運行一個簡單的命令行示例。該示例程序包含三個 jar 文件:

文件包含允許實例級訪問控制的 jaas 擴展框架。它還包含一個 loginmoduleexample 類,這個類從 xml 文件讀取用戶認證信息。用戶標識和密碼存儲在 文件中。用戶組存儲在 文件中。關於 loginmoduleexample 的更多信息,請參閱參考資料部分。

該示例包含四個附加的文件:

policy

在試圖運行這個示例程序之前,請確保更新了 、policy 和 文件中的路徑。缺省情況下,所有的密碼都是“passw0rd”。

示例如何工作

該示例程序提示輸入用戶標識和密碼。它用 文件中的條目覈對所提供的用戶標識和密碼。在認證了用戶之後,程序設法創建一個 userprofile 類實例,修改它並從中讀取。缺省情況下,userprofile 類的所有者是 jane(jane)。當 jane 登錄時,三個操作全部成功。當 john(john)登錄時,只有創建操作成功。當 jane 的經理 lou(lou)登錄時,只有第一個和最後一個操作成功。當系統管理員(admin)登錄時,操作全部成功。當然,只有當提供的 文件未被修改時,上述這些才都是真的。

示例安裝

下面的安裝指導假設您正在使用 jdk 1.3 並且已經把文件解壓縮到 d:jaasexample 目錄。通過將文件解壓縮到這個目錄,您可以省去一些工作;否則您就必須使用正確的路徑名修改 policy 和 策略文件。

下面是運行該示例需要做的工作:

下載這個示例的源文件。

把 和 複製到 jdk jrelibext 目錄(即 d:jdk1.3jrelibext)。

向位於 jdk 的 jrelibsecurity 目錄(即 d:jdk1.3jrelibsecurity)中的 rity 文件的末尾添加下面的字符串:ider=olicyfile。

執行 文件。

結束語

類實例級授權把訪問控制分離到一個通用框架(該框架使用基於所有權和特定關係的策略)中。然後管理員可以在應用程序的生命週期內更改這些策略。用這種方法擴展 jaas 減少了您或另一個程序員必須在應用程序生命週期內業務規則發生更改時重寫代碼的可能性。

通過將關係字符串抽象爲類可以進一步擴展特定關係這個概念。不調用 resource 實現類的 fulfills(subject user, string relationship) 方法,而只要調用 relationship 實現類中定義的新 fulfills(subject user, resource resource) 方法。這樣就會允許許多 resource 實現類使用相同的關係邏輯。

6.java的安全性

1. the security manager是一個application-wide object ( ritymanager)

每個java application都可以有自己地security manager,但是默認地java application沒有一個security manager

可以通過下面地代碼得到一個security manager

try

{

ecuritymanager(new securitymanager(“--”));

}

catch( )

{}

2.

jdbc

在 jdbc 2 開發的過程中,sql99 還處在一種變化不定的情況下。現在規範已經完成了,而且數據庫廠商已經採用了部分標準。所以自然地,jdbc 規範就跟着將自己與 sql99 功能的一部分相統一。最新的 jdbc 規範已經採用了 sql99 標準中那些已經被廣泛支持的功能,還有那些在五年內可能會獲得支持的功能。

1. datasource

在jdbc2.0 optional package中,提供了透明的連接池(connection pooling)。

一旦配置了j2ee應用服務器後,只要用datasource獲取連接(connection),連接池(connection pooling)就會自動的工作。

如果用戶希望建立一個數據庫連接,通過查詢在jndi服務中的datasource,可以從datasource中獲取相應的數據庫連接。

datasource被認爲是從jndi中獲取的網絡資源。

datasource在池中保存的對象都實現了pooledconnection接口。

當應用程序向datasource請求一個connection時,它會找到一個可用的pooledconnection對象。

如果連接池空了,它就向connectionpoolecdatasource請求一個新的pooledconnection對象

通過使用 datasource 接口 (jdbc 2.0) 或 drivermanager (jdbc 1.0) 接口,j2ee 組件可以獲得物理數據庫連接對象(connection)。要獲得邏輯(合用的)連接,j2ee 組件必須使用以下這些 jdbc 2.0 合用管理器接口:

ectionpooldatasource 接口,該接口充當合用的 ection 對象的資源管理器連接 factory。每家數據庫服務器供應商都提供該接口的實現

(例如,oracle 實現 leconnectionpooldatasource 類)。

edconnection 接口,該接口封裝到數據庫的物理連接。同樣,數據庫供應商提供其實現。

對於那些接口和 xa 連接的每一個,都存在一個 xa(x/open 規範)等價定義。

2. resultset

在jdbc2.0中,爲了獲得一個uptatable result,在query語句裏必須包含primarykey,並且查詢的內容裏必須來自一個table

ltset接口中定義了三種類型的結果集

type_forward_only

type_scroll_insensitive這種類型的結果集支持雙向滾動

type_scroll_sensitive

如果要建立一個雙向滾動的resultset,一定要在建立statement的時候使用如下參數

statement stmt = testatement(_scroll_insensitive,

ur_read_only);

3. jdbc驅動程序

連通oracle8.1.6的jdbc

把oracle8.1.6/lib/jdbc/* copy 到 %java_home%/jre/lib/ext/*

如果光copy不ren爲是沒有用的。

4. 事務處理

本地事務

ection接口可以控制事務邊界(即開始和結束)。

在事務開始的時候調用setautocommit( false ), 而在中止事務時調用rollback或commit()方法。這類事務叫本地事務。

分佈式事務

但是,在特定的情況下,可能有多個客戶(例如兩個不同的servlet或ejb組件)參與了同一個事務。

或者,客戶在同一個事務中可能會執行跨越多個數據庫的數據庫操作。

jdbc2.0 optional package 同jta一起來實現分佈式樣事務。

5. 一些技巧

檢索自動產生的關鍵字

爲了解決對獲取自動產生的或自動增加的關鍵字的值的需求,jdbc 3.0 api 現在將獲取這種值變得很輕鬆。要確定任何所產生的關鍵字的值,只要簡單地在語句的 execute() 方法中指定一個可選的標記,表示您有興趣獲取產生的值。您感興趣的程度可以是 rn_generated_keys,也可以是 _generated_keys。在執行這條語句後,所產生的關鍵字的值就會通過從 statement 的實例方法 getgeneratedkeys() 來檢索 resultset 而獲得。resultset 包含了每個所產生的關鍵字的列。清單 1 中的示例創建一個新的作者並返回對應的自動產生的關鍵字。

清單 1. 檢索自動產生的關鍵字

statement stmt = testatement();

// obtain the generated key that results from the query.

uteupdate("insert into authors " +

'(first_name, last_name) " +

"values ('george', 'orwell')",

rn_generated_keys);

resultset rs = eneratedkeys();

if ( () ) {

// retrieve the auto generated key(s).

int key = nt();

}

jta/jts

1.jta/jts基本知識

服務器實現jts是否對應用程序開發人員來說不是很重要的。

對你來說,應該把jta看作是可用的api。

jta是用來開發distributed tansaction的 api.

而jts定義了支持jta中實現transaction manager 的規範。

javatransaction service (jts) specifies the implementation of a transaction manager which supports the java transaction api (jta) 1.0 specification at the high-level and implements the java mapping of the omg object transaction service (ots) 1.1 specification at the low-level. jts uses the standard corba orb/ts interfaces and internet inter-orb protocol (iiop) for transaction context propagation between jts transaction managers.

a jts transaction manager provides transaction services to the parties involved in distributed transactions: the application server, the resource manager, the standalone transactional application, and the communication resource manager (crm).

2.jta

1.1 事務處理的概念

jta實際上是由兩部分組成的:一個高級的事務性客戶接口和一個低級的 x/open xa接口。

我們關心的是高級客戶接口,因爲bean可以訪問它,而且是推薦的客戶應用程序的事務性接口。

低級的xa接口是由ejb服務器和容器使用來自動協調事務和資源(如數據庫)的

1.1.1事務劃分

a.程序劃分

使用usertransaction啓動jta事務

the usertransaction interface defines the methods that allow an application to explicitly manage transaction boundaries.(from j2ee api document)

第四篇:java學習心得

java學習心得之一——鼠標事件處理

java中,鼠標事件一般由用戶界面個組件的內部實現,用戶不用關心太多細節。然而,在處理一些鼠標自適應事件如鼠標繪圖、鼠標移動特定組件時,就需要對鼠標事件做專門的處理了。

和其他用戶界面組件的實現一樣,java對鼠標事件的處理也是通過awt事件處理機制來實現的,即:事件源(在此,鼠標事件的事件源可以看做隱藏,或爲需要對鼠標事件響應的相關組件,如panel對象等)註冊監聽器(mouselistener or mousemotionlistener)對象,併發送事件對象的對象(mouseevent)。當事件發生時(如鼠標點擊、指針移動等),事件源將事件對象傳遞給所註冊的監聽器,監聽器對象利用事件對象中的信息 決定如何對事件做出響應。

在此,將引用一段源碼()來具體說明。這段源碼實現瞭如下功能:

1. 繪製方塊:在鼠標任意鍵被按下時,繪製一個正方形。

2. 改變指針狀態:當鼠標指針移動至圖形內部時,指針變爲十字形狀,移出方塊時,指針恢復。

3. 拖動方塊:當鼠標指針移至圖形內部,按下任意鍵,拖動指針時,圖形將隨之移動,直到鬆開按鈕爲止。

4. 擦除方塊,當指針移至圖形內部,雙擊鼠標任意鍵,可擦除當前方塊。

具體源碼如下:

import .*;

import t.*;

import .*;

import g.*;

import .*;

public class mousetest

{

public static void main(string[] args)

{

mouseframe frame=new mouseframe();

efaultcloseoperation(_on_close);

isible(true);

}

}

class mouseframe extends jframe

{

public mouseframe()

{

settitle("mouse test");

setsize(default_width,default_height);

mousepanel panel=new mousepanel();

add(panel);

}

public static final int default_width=500;

public static final int default_height=400;

}

class mousepanel extends jpanel

{

//繪製圖形

public mousepanel()

{

squares=new arraylist<rectangle2d>();

current=null;

addmouselistener(new mousehandler());

addmousemotionlistener(new mousemotionhandler());

}

public void paintcomponent(graphics g)

{

tcomponent(g);

graphics2d g2=(graphics2d)g;

for(rectangle2d r: squares)

{

olor();

(r);

}

}

/*

* 查詢當前點是否已經存在

*/

public rectangle2d find(point2d p)

{

for(rectangle2d r: squares)

{

if(ains(p))

return r;

}

return null;

}

/*

* 用當前鼠標點擊的點生成圖形,並存入圖形數組列表,同時重畫

*/

public void add(point2d p)

{

double x=();

double y=();

current=new

le(x-side_length/2,y-side_length/2,side_length,side_length);

(current);

repaint();

}

/*

* 刪除圖形

*/

public void remove(rectangle2d s)

{

if(s==null) return;

if(s==current) current=null;

ve(s);

repaint();

}

private static final int side_length=20;//正方形的邊長

private arraylist<rectangle2d> squares;//存放所有已繪製的方塊(鼠標有效繪製路徑)

private rectangle2d current;//當前需要繪製的方塊

private class mousehandler extends mouseadapter

{

/*

* 當鼠標按鈕被按下時,先查找當前點是否已經包含在前期圖新內,* 否,則添加至數組列表

*/

public void mousepressed(mouseevent event)

{

current=find(oint());

if(current==null)

add(oint());

}

/*

* 處理鼠標點擊事件,如果當前點包含於圖形之中,且鼠標連續點擊兩次以上,則擦除該圖形。

*/

public void mouseclicked(mouseevent event)

{

current=find(oint());

if(current!=null && lickcount()>=2)

remove(current);

}

}

private class mousemotionhandler implements mousemotionlistener

{

/*

* 改變鼠標形狀

h);*/public void mousemoved(mouseevent event){if(find(oint())==null)setcursor(efaultcursor());elsesetcursor(redefinedcursor(shair_cursor));}/** 拖動圖形*/public void mousedragged(mouseevent event){if(current!=null){int x=oint().x;int y=oint().y;rame(x-side_length/2,y-side_length/2,side_length,side_lengt

}}}} repaint();

第五篇:關於java學習的一點心得體會

管理科學與工程學院11信管2班孫鑫20144548

關於java學習的一點心得體會

我是學信管專業的,這學期除了學習了java軟件開發綜合實驗這門選修課外,還有自己本專業要學的java面向對象的程序設計。學習了近一學期的java課程,覺得是該總結自己的心得體會了。開始學習任何一門課(包括java),興趣最重要。一直覺得自己在學習了計算機編程語言(也就是c語言),學到了很多東西,再學習java的話,應該問題不大,但在學習了幾個星期後,還是明確感到了,有點吃力,於是趁學校開設這門選修課,並且有自己院的老師講解,還有了上機的機會,比自己自學省事多了,於是鼓足信心,開始了漫長的java征途。

還記得我編寫的第一個程序是簡單的輸出程序。當時自己不是很理解爲什麼main方法要這樣來定義public static void main(string[] args),問了好多同學,他們告訴我的答案是一樣的“java本身要求就是這樣子的”,但我自己不甘心,就自己進行了探索:把main改個名字運行一下,看看報什麼錯誤,然後根據出錯信息進行分析;把main的public取掉,在試試看,報什麼錯誤;static去掉還能不能運行;不知道main方法是否一定要傳一個string[]數組的,把string[]改掉,改成int[],或者string試試看;不知道是否必須寫args參數名稱的,也可以把args改成別的名字,看看運行結果如何。 結果一個簡單程序反覆改了七八次,不斷運行,分析運行結果,最後就徹底明白爲什麼了main方法是這 1

樣定義的了。接着在以後的學習中我也採用這樣的方法解決問題,卻發現自己的速度比別人慢了好多,我就把自己的課餘時間也分一部分給了java。

因爲基礎是最重要的,只有基礎牢固纔有可能對後面的學習有更加深刻的認識!

學習一門新的語言,參考書是離不開的。聽專業課老師說訂的教材偏難,不適合我們初學者,於是我在圖書館借了本參考書(一本篇幅較短的入門書來學習那些最簡單、最基本的東西,包括學習java語法等)。同時,對一個最簡單的程序也應該多去調試,多想想如果改動一下會出現什麼結果?爲什麼必須那樣寫?多去想想這些問題然後去操作,會讓你有更多的收穫。這樣反覆地思考是很有用的。

在學習java的語法時,java的語法是類似c語言的,所以學習的比較輕鬆。唯一需要注意的是有幾個不容易搞清楚的關鍵字的用法,public,protected,private,static,什麼時候用,爲什麼要用,怎麼用,和同學一起討論了好久才得以解決。

在學習java的面向對象的編程語言的特性。比如繼承,抽象類,方法的多態,重載,覆蓋。對於一個沒有面向對象語言背景的人來說,我覺得這個過程需要花很長很長時間,因爲學習java之前沒有c++的經驗,只有c語言的經驗,花了很長時間,才徹底把這些概念都搞清楚,把書上面的例子反覆的揣摩,修改,嘗試,把那幾章內容反覆的看過來,看過去,看了很多遍,才徹底領悟了。

此外,我對於static,public,private等等一開始都不是很懂,

都是把書上面的例子運行成功,然後就開始破壞它,不斷的根據自己心裏面的疑問來重新改寫程序,看看能不能運行,運行出來是個什麼樣子,是否可以得到預期的結果。這樣雖然比較費時間,不過一個例子程序這樣反覆破壞幾次之後。我就對這個相關的知識徹底學通了。有時候甚至故意寫一些錯誤的代碼來運行,看看能否得到預期的運行錯誤。這樣對於編程的掌握是及其深刻的。

在學習java的過程中我得出這樣的結論:

1.學習中,要養成良好的習慣(寫括號時要成對,字母大小寫要區分,單詞拼寫要準確)。

2.在學習的過程中,最好不是僅僅停留在java表層,不是抄書上的例子運行出結果就可以。要注意,即便對一個簡單的例子也要有耐心去琢磨、調試、改動。

3.在學習的過程中一定要動手做、試着寫代碼,而不是抱一本書看看就行。很多東西和體會必須自己動手才能真正屬於自己。

4. 在 java 的學習過程中,可能會遇到形形色色的問題不容易解決,應多去專業論壇瞭解相關的知識,書本上的知識有限。要會從網上搜索有用的信息 加以整理,促進學習的深入和知識水平的提高。

看了好多網上課程,說學到一定程度要嘗試着自己做東西,但覺得自己僅僅經過一學期的學習,還遠遠不夠,希望自己在以後學習中繼續努力,能夠真真正正擁有一門編程語言,對自己今後的發展起到作用。

本網推薦訪問其他精彩內容:

java學習心得

學習java的心得體會

學習java的心得體會

java學習的心得體會

java培訓學習心得