posts - 32, comments - 153, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          2006年11月26日

          1. 在創建Human Task的UI項目時,請注意保證每個Project的package名都不相同,否則在BPM Workspace中會出現DataControl的NullPointerException。最簡單的方法就是不要設置Application的package prefix,然后讓每個項目都使用auto-generate的package名。
          2. 在Human Task中可以動態指定審批人,具體做法是在Assign標簽頁中,選擇Single類型(當然也完全可以是別的類型),然后選擇User,By Expression,后面的表達式是一個字符串,比如'weblogic,wfaulk,jstein',注意要使用單引號,也可以從payload中讀取。不過這種方式有時會出錯,出錯原因不明,不過在Organization中添加一個用戶,deploy,然后再把這個用戶刪除就解決了,不得不說非常汗。
          3. 如果需要對某個Human Task定時做一些操作,可以使用Catch Timer Event,注意這里指向End1,說明Timer觸發以后直接走Update Database & Send Email這條分支,然后結束,并不是主流程結束。


          posted @ 2011-04-07 10:35 Zou Ang 閱讀(1263) | 評論 (0)編輯 收藏

               摘要: JAVA相關基礎知識 1、面向對象的特征有哪些方面   1.抽象: 抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。 2.繼承: 繼 承是一種聯結類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法...  閱讀全文

          posted @ 2007-12-25 07:14 Zou Ang 閱讀(520) | 評論 (0)編輯 收藏

               摘要: 使用Hessian開發C/S模式的小系統
          之所以叫小系統,主要是因為Hessian不支持Hibernate的延遲加載,所以需要在DAO層使用Hibernate的同學請注意了。

          Hessian其實是一種RMI技術,已經被集成在Spring Framework中,這樣就很方便了。

          首先看客戶端

          第一步:
          先定義Client與Server交互的接口。  閱讀全文

          posted @ 2007-07-28 10:48 Zou Ang 閱讀(3854) | 評論 (4)編輯 收藏

          Another Quiz : " Which Programming Language Are You?"

          http://www.bbspot.com/News/2006/08/language_quiz.php

          You are Java.  You are very strong and sturdy, but this makes you a bit sluggish.

          posted @ 2007-05-07 12:09 Zou Ang 閱讀(522) | 評論 (0)編輯 收藏

          測到最后我才發現原來我是一個內向的人啊~~真是,搞得我一直都不知道呢
          大家有空也去玩玩
          http://www.psytopic.com/mag/post/820.html

          Psytopic分析:您的性格類型是“ISTJ”(內向+實感+思維+判斷)

          沉靜,認真;貫徹始終、得人信賴而取得成功。講求實際,注重事實和有責任感。能夠合情合理地去決定應做的事情,而且堅定不移地把它完成,不會因外界事物而分散精神。以做事有次序、有條理為樂---不論在工作上, 家庭上或者生活上。重視傳統和忠誠。

          ISTJ型的人是嚴肅的、有責任心的和通情達理的社會堅定分子。他們值得信賴,他們重視承諾,對他們來說,言語就是莊嚴的宣誓。 ISTJ型的人工作縝密,講求實際,很有頭腦也很現實。他們具有很強的集中力、條理性和 準確性。無論他們做什么,都相當有條理和可靠。他們具有堅定不移、深思熟慮的思想,一旦他們著手自己相信是最好的行動方法時,就很難轉變或變得沮喪。ISTJ型的人特別安靜和勤奮,對于細節有很強的記憶和判斷。 他們能夠引證準確的事實支持自己的觀點,把過去的經歷運用到現在的決策中。他們重視和利用符合邏輯、客觀的分析,以堅持不懈的態度準時地完成工作,并且總是安排有序,很有條理。他們重視必要的理論體系和傳統 慣例,對于那些不是如此做事的人則很不耐煩。ISTJ型的人總是很傳統、謹小甚微。他們聆聽和喜歡確實、清晰地陳述事物。ISTJ型的人天生不喜歡顯露,即使危機之時,也顯得很平靜。他們總是顯得責無旁貸、堅定不變 、但是在他們冷靜的外表之下,也許有強烈卻很少表露的反應。

          您適合的領域有:工商業領域、政府機構 金融銀行業、政府機構、技術領域、醫務領域

          您適合的職業有:

          · 審計師
          · 會計
          · 財務經理
          · 辦公室行政管理
          · 后勤和供應管理
          · 中層經理
          · 公務(法律、稅務)執行人員
          · 銀行信貸員
          · 預算分析師
          · 保險精算師
          · 稅務經紀人
          · 稅務檢查員
          · 機械、電氣工程師
          · 計算機程序員
          · 數據庫管理員
          · 地質、氣象學家
          · 法律研究者
          · 律師
          · 外科醫生
          · 藥劑師
          · 實驗室技術人員
          · 牙科醫生
          · 醫學研究員
          · 信息總監
          · 電腦編程員
          · 證券經紀人
          · 會計
          · 文字處理專業人士

          posted @ 2007-05-06 08:09 Zou Ang 閱讀(1538) | 評論 (2)編輯 收藏

          基于求函數f(x,y,z)=xyz*sin(xyz)最大值問題的演示程序:


          截圖:








           

          壓縮包:
          genetic_algorithm.part1.rar
          genetic_algorithm.part2.rar
          genetic_algorithm.part3.rar
          genetic_algorithm.part4.rar

          運行方法:
          解壓后在命令行輸入:java -jar genetic_algorithm.jar

          posted @ 2007-04-29 12:11 Zou Ang 閱讀(6223) | 評論 (75)編輯 收藏

               摘要: 最近學習遺傳算法,寫了這么一個小程序來計算函數 f(x,y,z) = xyz*sin(xyz)的最大值,這段程序經過小小改變就可以適應其他的函數最大值求解問題首先介紹一下遺傳算法,遺傳算法就是模擬自然界中物競天擇,適者生存的法則,通過對解空間進行進化從而求得最優方案的方法,遺傳算法的好處在于,即使算法中的某些參數不起作用了,整個算法還是可以正常地工作,也就是說,整體種群的走向是越來越好的遺傳算法的...  閱讀全文

          posted @ 2007-04-26 21:41 Zou Ang 閱讀(7049) | 評論 (14)編輯 收藏

               摘要: 用Java從控制臺輸入密碼

          本來以為是很簡單的問題,查了一下發現Java居然沒提供這樣一個方法。目前實現的方式有2個,一個是利用JNI來調用C/C++方法,另一個是使用多線程。
          本文使用JNI調用C/C++的方法實現  閱讀全文

          posted @ 2007-02-24 22:06 Zou Ang 閱讀(3675) | 評論 (6)編輯 收藏

               摘要: JDK6.0發布有段時間了,新的JDK也有不少新的特性,我去網上搜集了一下,列在下面和大家一起學習.1.Desktop和SystemTray. 在JDK6中 ,AWT新增加了兩個類:Desktop和SystemTray,前者可以用來打開系統默認瀏覽器瀏覽指定的URL,打開系統默認郵件客戶端給指定的郵箱發郵件,用默認應用程序打開或編輯文件(比如,用記事本打開以txt為后綴名的文件),用系統默認的打印...  閱讀全文

          posted @ 2007-02-09 12:00 Zou Ang 閱讀(2423) | 評論 (3)編輯 收藏

          這幾天突然遇到了一個問題:Tomcat跑不起來了!提示錯誤信息:
          Error Listener Start
          org.springframework.web.context.ContextLoaderListener
          Error Listener Start
          ....
          就這么2行,讓人一頭霧水。昨天檢查了一個下午也沒發現問題。今天突然在查看錯誤日志時發現:
          Context initialization failed

          org.springframework.beans.factory.BeanDefinitionStoreException: Line 14 in XML document from ServletContext resource [/WEB-INF/springctx-datareport.xml] is invalid; nested exception is org.xml.sax.SAXParseException: Element type "bean" must be followed by either attribute specifications, ">" or "/>".

          仔細查看了一下配置文件,原來是同組的組員在寫配置文件的時候在class="...."后面多了一個引號!
          這個Listener Start的問題太隱蔽,如果沒有做錯誤日志估計一直很難發現了
          不過這次有了教訓,以后也有方向了

          posted @ 2007-02-03 09:33 Zou Ang 閱讀(3703) | 評論 (1)編輯 收藏

               摘要: 根據Ajax in Action書進行調整,修改了原書上的錯誤,調試通過。
          可重用的Ajax輸入提示類,功能類似Google的輸入提示  閱讀全文

          posted @ 2007-02-01 22:39 Zou Ang 閱讀(3940) | 評論 (7)編輯 收藏

               摘要: JSP與Tomcat亂碼解決方法  閱讀全文

          posted @ 2007-01-23 21:12 Zou Ang 閱讀(4384) | 評論 (6)編輯 收藏

          經常開各種各樣的會議,要達成共識很不容易,尤其技術會議更是容易吵架。舊年最后一天,寫點關于“開會”的想法。

          首先,要注意聽別人發言。盡量不要打斷別人的發言,抓住對方的主要思想和依據。不要帶著偏見聽,有時候可能覺得對方不如你,但是不代表他現在說的就不對。把口頭禪從“不,……”改成“對,……”,即使有時候你不同意他的觀點,但是先肯定一下,可以緩和很多氣氛。

          然后,盡量先把自己的理論基礎表達清楚,有時候爭了半天,發現兩個人想法是一樣的,不過是換了種表達方式……

          最后,不要長篇大論,給別人一個插口的機會。有些人講話,喜歡停頓一下,然后在別人馬上要開口講話的時候接著講。我很反感這種人,耍猴呢啊?給別人一個提出意見和疑問的機會。盡量把自己放到討論的主導地位上來,就是說,要慢慢地讓大家圍繞著你的觀點提問題,然后你再來進行解答。但是千萬不要不讓別人說話,有時候給別人機會說話對自己理清思路也非常有好處。

          最近看一本叫《人件集-人性化的軟件開發》的書,里面第一篇文章就講如何作出決策和達成一致意見。一致意見應該做到綜合各方的優點,而不應該是各方意見的“折衷”。書里有一個稍顯極端的例子:假如你的團隊正在開發一個圖形用戶界面的項目,一部分人強烈建議直接將控制按鈕放在屏幕底部,而另一部分人建議在屏幕左側放置一個控制窗口。兩種意見中,一個是水平放置,一個是垂直放置,形成了兩個極端。那么一個最具代表意義的折衷方案就是,將控制按鈕沿著對角線放置在屏幕的中央。在很多時候,由折衷所產生的解決方案比任何一個原始方案都差勁,但是“技術性一致意見”就恰恰相反,它所產生的解決方案要比任何一個原有的方案都好。書上給的“一致意見”解決方法是給控制按鈕窗體加上選項,讓用戶來決定是水平放置還是垂直放置。

          在團隊中的表現是很重要的,通過一個團隊來改變團隊中的個體,要比單獨改變一個個體容易得多。所以在團隊中發揮影響,比單獨對每一個人發揮影響要有用得多。

          有人說軟件工程更像是“社會學”,而不是“工程學”,我也越來越有這種感覺了。

          posted @ 2006-12-31 15:22 Zou Ang 閱讀(1472) | 評論 (3)編輯 收藏

          圣誕到了,祝所有的朋友圣誕快樂!!

          posted @ 2006-12-24 14:05 Zou Ang 閱讀(308) | 評論 (0)編輯 收藏

          原貼地址:
          http://news.csdn.net/n/20061221/99748.html

          從根本上說,面向服務的架構能夠使企業內部動態數據服務的創建變得更加方便,同時,還能夠使企業開發人員創建影響這些服務的復合應用程序。Web2.0提供了一個豐富的Web體驗,用戶能夠以高效的、充滿希望的、有益的方式參與合作。

            如果我們把這兩個現象結合起來,那么,通過企業社團成員之間的互相交流,以及成員與不斷變化的企業數據之間的交互,我們就能夠實現這一關鍵的提高效率的新方法。

            協作型企業相互融合,下一代的Web應用程序也已露端倪,但是,開發團體的推測是,為了實現明顯的利益,企業所采用的各種技術之間存在著根本性 的差異。標準必須朝哪個方向發展才能夠滿足SOA與Web2.0概念的結合,為了更好的理解這個問題,我們將致力于檢驗Java表示技術的狀態。

            Ajax化JavaServer Faces

            標準奠定了SOA的基本結構,但是,在Web2.0的世界中卻不存在著標準。為了支持Web2.0的功能,市場上出現了太多的方法,其中大多數 在JavaScript的實現(影響Ajax的技術)上卻非常繁雜。在Java EE的規范中,JavaServer Faces提供了表示層,但是,相比起Ajax技術和Web2.0概念的流行,它目前的修訂版出現的更早。

            事實證明,在組件層,JSF中的可擴展組件架構非常適合與Ajax技術協同使用,但是,組件層Ajax技術存在的問題是,它們是存在于狹小的規 避JSF生命周期的交互空間內。解決這一問題所需要的是,一種更加全面的方式,以實現在JSF生命周期內的Ajax交互。具體來說,有以下兩點需要著重闡 述。

            1.改進的用戶交互模型: 在JSF中,目前的用戶交互模型是基于表格的,它過于粗略而無法傳輸豐富的Web2.0特性。組件層的Ajax交互粒度,以及JSF目前依賴的基于表格的子任務模型,這兩者之間存在著顯著的差異。交互類型應當包含以下幾種形式:

          •   純粹的本地客戶端JavaScript交互,沒有服務器通信、不需要執行JSF生命周期。這種類型的例子可以是,在日期選擇組件中通過日歷來進行導航。目前,通過組件層JavaScript實現能夠支持這個模型。
          •   組件層的Ajax交互,不需要執行JSF生命周期。這種類型的例子可以是,基于當前用戶在文本框中的輸入,從而形成一個列表。這里的關鍵是,用戶與組件的交互僅僅影響到該組件的表示。同樣,目前,通過組件層JavaScript實現能夠支持這個模型。
          •   組件層的提交,引發JSF生命周期的執行。生命周期的執行結果將成為新的表示,該表示可能會影響到頁面中的多種組件。這這種類型的例子可以是,在日期選擇組件中完成日期的選擇,結果是引發顯示不同的日期安排信息。目前在JSF中,還無法支持這種形式的交互。

            2. 增量表示更新: 為了使用Ajaxian 方式(不是頁面刷新)實現第三種交互模型,JSF需要一個增量更新機制,僅僅是把頁面中應用到的表示層所做的必要修改從一個表現處理傳向下一個表現處理。 下面這個圖示表明了這個概念。它需要一個Ajax橋,在服務器端把表示的改變組合起來,在客戶端的DOM把那些變化重組。

          JSF Push模式

            Ajaxified JSF實現和多數其它的Ajax方式從遺留的Web應用程序模型中繼承了一個共同的特征,該模型是一個客戶端發起的交互模型。這意味著,客戶端的表示層只需要針對用戶與表示層的交互進行相應變化。

            與使用遺留應用程序相比,使用Ajax技術,這個交互是細粒度的,但是,它仍然是客戶發起的。現在,當你檢驗支持應用程序的SOA數據模型的動 態特性、了解眾多同步用戶采用這一動態數據所進行的協調互操作時,你就能夠意識到,在客戶端推動動態表示變化的機制是非常重要的,這一點越來越清晰。它是 達到Web2.0模型所需要的真正的動態特性的唯一途徑。

          在產業中已經證明,對于JSF規范與一個表示push模型的協作來說,Ajax push技術,也指Comet,是十分必要的。前文已經描述的這個增量更新特性,提供了在實現JSF Push模式時所需要的基于Ajax的更新機制。除此之外,當應用程序邏輯發現出現了一些將會影響客戶端表示層狀態的變化時,延長JSF的生命周期來允許 一個強制的表現處理是很有必要的。

          雖然,JSF push模型相對而言實現起來更加容易,但是,生產經驗表明,為使得開發人員能夠有效繼承,僅僅暴露JSF API中底層強制的表示機制是遠遠不夠的。關于基本的push機制,JSF規范很有必要對表現API進行介紹,從而呈現給開發人員一個清晰有效的機制,用 于請求強制表示。API尤其需要提供以下幾個方面:

            1.觸發的表現:應用程序開發人員應當能夠在發出表示處理請求的業務邏輯中定義觸發點。

            2. 群組表現: 一個觸發點能夠影響一個單一客戶端、多個客戶端,或者是所有連接到該應用程序上的客戶端。因此,為觸發表現提供群組管理結構,這是很有必要的。

            3. 預定的表現:有許多合適的計劃機制應當被支持,包括,按需表現、推遲表現,以及內部表現。預定的表現架構應當具備可擴展性,以支持其他用戶預先設定的需 求。很重要的一點是,觸發表現機制應當能夠更加有效的傳輸。由于存在著大量的觸發,它們潛在地以各種方式影響著客戶端,因此,管理表現的處理這一任務不能 僅僅落在開發人員身上。觸發表現的實現,必須有效地合并表現處理請求、處理必要的同步,而且,這些操作都是以一種線程有效的方式。

            多視圖支持

            現存的為JSF定義的階段和需求范圍,根本不足以支持滿足Ajax的JSF應用程序——用戶能夠在同一應用程序上獲得多個活動視圖。階段范圍能 夠維護所有視圖共同的狀態,但是,它不足以處理視圖之間不同的狀態。由于多個同步請求都必須是活動狀態,所以,需求范圍也不充分。因此,需要一個新的范 圍,來管理滿足Ajax 的JSF應用程序的會話方面。JBoss的Seam 方案提出了會話范圍,它主要提供JSF中所需要的額外范圍。除了支持多視圖之外,會話范圍還能夠帶來其他優勢,例如,在應用程序中,通過會話中對一系列用 戶交互的明確描述,就能夠有效地支持書簽和返回按鈕特性。

            長期存在的HTTP請求

            回到前面所提到的push模型,你可能注意到,機制需要一個特殊的HTTP請求,它能夠異步地響應從應用程序中發出的觸發表現出理請求。依據更 新的頻率,這個特殊HTTP請求能夠長期存在。由于在響應之前,每一個請求都占用其線程,所以,在處理這個長期存在的請求時,現存的Servlet模型無 法很好的響應。因此,為了支持push模型,必須對Servlet模型進行改變,使它能夠以線程有效的方式來處理長期存在的請求。再強調一次,有很多生產 方案與異步Servlets和HTTP服務器相關,Java EE規范能夠在此基礎上定義一個解決方案。

            結論

            人們仍然有些質疑:SOA與Web2.0世界將會發生抵觸,新一代的協作型企業應用程序已露端倪。也存在著這樣的質疑,現存的Java EE規范無法完全處理Web2.0提出的請求,以及JSR處理必須開始在直接項中考慮這些請求。然而,產業中的重大進步,已經能夠處理出現的請求,并且能 夠實現擴展現存Java EE基礎結構的商業化的可行方案。即將使用JSR 172來生成JSF2.0規范,非常重要的是,包含Ajax特性,以及產業參與者貢獻相關技術,來確保能夠及時做出基于標準的解決方案。

          posted @ 2006-12-23 17:39 Zou Ang 閱讀(605) | 評論 (0)編輯 收藏

          原帖地址:
          http://www.aygfsteel.com/errorfun/archive/2006/12/09/86584.html
          亂碼問題好像跟我們中國程序員特別有緣,一直困擾著我們,從開始的JSP亂碼問題,STRUTS亂碼問題,到現在的AJAX亂碼問題,無一不是搞得許多程序員焦頭爛額的,整天罵XXX產品對中文支持不了,UTF-8無法使用中文啊什么的,其實這里面被罵的產品中其實99%以上是對中文支持非常好的,而出現亂碼的原因只是因為自身對國際化支持以及文件編碼等信息的認識不知造成的。要知道一個產品那么流行,怎么可能對中文支持不了呢,下面就開始一一幫大家解決這些問題。


          1
          、編碼
          ????? --
          想要解決好中文問題,對編碼肯定是不能一概不懂了,編碼是解決中文亂碼問題的根本。
          ???? ?
          編碼比較常用的有: UTF-8 GBK GB2312 ISO-8859-1 ,除了 iso-8859-1 之外的其它三個編碼都能很好的支持中文,但它們都兼容 ISO-8859-1 的編碼(就是說無論編碼怎么改變,只要是 ISO-8859-1 中的字符,永遠不會出現亂碼)。
          ?????
          這四種編碼中, GB2312 是中國規定的漢字編碼,也可以說是簡體中文的字符集編碼 ; GBK GB2312 的擴展 , 除了兼容 GB2312 外,它還能顯示繁體中文,還有日文的假名 ; UTF-8 雖然也支持中文,但卻 GB 碼不兼容(編碼值不同) UTF-8 使用的是可變長的 UNICODE 編碼,編碼可能是 1 16 進制(即 ISO-8859-1 中的字符,其編碼也是相同的)也有可能是 2 位或 3 位的 16 進制。 UTF-8 的優點是: 1 CPU 字節順序無關 , 可以在不同平臺之間交流。 2 、容錯能力高 , 任何一個字節損壞后 , 最多只會導致一個編碼碼位損失 , 不會鏈鎖錯誤 ( GB 碼錯一個字節就會整行亂碼 ) ,所以在國際化處理中基本都是建議使用 UTF-8 作為編碼。

          2、文件的編碼
          ????? --雖然說只要設置了正確的編碼就可以使字符正確顯示了,但如果忽略了文件保存時的編碼的話,那可是會讓你走進迷霧中的。
          ????? 文件編碼最常使用的有兩種:ANSI和UTF-8,光看名字估計你都可以猜到了,ANSI就是我們保存文件時使用的默認編碼,而UTF-8則需自己設置。對于編碼的改變,我使用的工具是NOTEPAD和ECLIPSE,NOTEPAD使用最簡單,只要打開文件后在另存為中選擇相應的編碼就行了,而且它對編碼的支持非常好;而在ECLIPSE中,只要稍微設置一下就行了,打開首選項,然后選擇:常規->內容類型(ContentType),在右邊選中你想改變保存編碼的文件類型,然后在下方的缺省編碼中改變其值,最后點擊更新(UPDATE)按鈕即可。



          而在其它的編輯器中,默認保存的內容都是GB2312或者GBK(NOTEPAD中對應ANSI).而根據前面所說的UTF-8和GBK,GB2312等的編碼值是不同的這一點,可以知道,如果文件使用了UTF-8,那么字符編碼就必須使用UTF-8,否則編碼值的不同就可能造成亂碼。而這也就是為什么那么多的人使用了UTF-8編碼后還會產生亂碼的根本原因。(JS和JSP都是這個道理)

          3、JSP,STRUTS等的中文亂碼解決方案
          ?????其實解決的方法只有一個:

          ?request.setCharacterEncoding(encoding);

          ???方法只有一種,但處理方式就多種多樣了,初學者會在JSP頁面上直接使用,而有經驗的程序員會使用過濾器。而現在所要說的方法也是過濾器。這里以統一使用UTF-8作為編碼作為例子說明。具體過程就不多說了,網上有很多教程。偷懶一點的,到TOMCAT中復制就行了。在TOMCAT的目錄下的\webapps\jsp-examples\WEB-INF\classes\filters\找到SetCharacterEncodingFilter.java 這個類,放到你的程序中并配置好映射路徑。配置好后基本上你的亂碼問題就解決了。但要映射路徑中需要注意的就是不能使用 '*'

          ?? < filter-mapping >
          ????
          < filter-name > Set?Character?Encoding </ filter-name >
          ????
          < servlet-name > * </ servlet-name >
          ??
          </ filter-mapping >

          像上面這樣配置的話(可能也是網上大多教程的做法,想當年也是害苦了我),可能你只有JSP的亂碼解決了,要解決STRUTS的亂碼需要映射 *.do 或者 servletActionName。然后在初始化參數中設置encoding的值就行了。

          < init-param >
          ??????
          < param-name > encoding </ param-name >
          ??????
          < param-value > UTF-8 </ param-value >
          </ init-param >

          當然,最重要的是要記得根據前面所說的方法,改變你所使用的編輯器保存文件的編碼要與使用的字符編碼一致。
          而在JSP內容中,還是使用如網上教程所說的那種技倆,在所有頁面的頁首加入:

          <% @?page?language = "java"?contentType = " text / html;?charset = UTF - 8 "
          ????pageEncoding
          = "UTF - 8 " %>

          至此,相信JSP,ACTION都不太可能出現亂碼了。

          4、資源文件的亂碼解決方案
          ????? 資源文件誰都知道是國際化支持不可或缺的一部分,如果資源文件都出現亂碼了那還了得?其實資源文件的亂碼是很好解決的,其原因也是因為使用了UTF-8做為JSP編碼后,沒有相應地改變資源文件的文件編碼造成的,所以只要對資源文件保存的編碼進行更正后,亂碼問題也就解決了。當然,你的中文要使用 native2ascii 命令進行正確的轉換。

          5、調用JS時,JS內容亂碼的解決方案。
          ???? 其實JS的亂碼還是跟文件的編碼有關系的,如果JS中有中文的話,那JS文件保存的編碼就必須跟調用此JS的頁面編碼相同,否則,你的所有中文都要從JSP頁面傳給JS才會顯示正常。可以看出對于調用JS出現的亂碼是最容易解決的(也是建立在前面的辛苦之下的)。

          6、AJAX提交數據亂碼,返回數據亂碼的解決方案
          ???? 隨著AJAX的流行,亂碼問題也開始困擾著許多剛開始使用它的程序員,幸好我之前對JSP亂碼有過一點研究,在遇到AJAX后,并沒有給我帶來多大的困擾,在此將我的一些心得共享給大家。
          ???? 萬變不離其宗,AJAX的亂碼問題自然跟編碼有關了,其實很多人跟我一樣想到了對文件編碼進行設置,并且在接數據時設置了requet的編碼,在返回的數據時設置了response的編碼一切都以為會很順利,可是這一切都是徒勞無功的,討厭的亂碼再一次出現在你眼前。在你試了N多種方法,包括JS自身的escape,unescape方法后,你發現亂碼仍然猖狂地出現在屏幕上。
          ??? 其實在試過這N多方法后,很多人都沒發現,解決的方法其實很簡單,而且其答案就在我們之前處理的JSP亂碼之中。讓我們先看一下AJAX的經典請求代碼

          xmlhttp.open(?"post",?url,?async?);
          xmlhttp.setRequestHeader(?
          "Content-Type",?"text/html"
          ?);
          xmlhttp.send(?params?);

          通過前面的說明,不知道你現在看出端倪了沒有。不知道是受了網上教程的影響還是其它方面影響,setRequestHeader并是萬年不變的,也沒人想過去改它,而問題就正好出在這個地方。回想一個JSP頁面內容的編碼設置,其中有這么一節:
          contentType="text/html;?charset=UTF-8"

          現在知道問題了吧,所以我們要把第二句代碼改為:
          xmlhttp.setRequestHeader(?"Content-Type",?"text/html;charset=UTF-8"?);

          最后別忘了在返回數據時也設置上:
          response.setContentType(?"text/xml"?);
          response.setCharacterEncoding(?
          "UTF-8"?);

          是不是很簡單,一點都不麻煩呢?
          如果要問為什么的話,其實我們可以把xmlhttp看成是一個臨時頁面,它由瀏覽器動態生成,主要作用是在后臺獲得請求的數據(可以看成是一個高級的iframe)。所以對于普通頁面設置的編碼,對它也要同樣設置。而在servlet中返回數據為什么要設置contentType和encoding其道理也是一樣的。眾所周知,jsp的最后形態就是servlet,而jsp頁首設置的那個內容其實也就是讓生成的servlet中生成這么兩句話:
          response.setContentType(?"text/html"?);
          response.setCharacterEncoding(?
          "UTF-8"?);

          而pageEncoding則是跟jvm說明了這個頁面的內容要使用什么編碼保存(這跟之后生成的CLASS有關系)。所以在servlet設置response的編碼也是理所當然的了。

          一口氣把自己一年以來遇到的亂碼問題和解決的方案寫出來了,希望對你有所幫助。

          posted @ 2006-12-11 11:04 Zou Ang 閱讀(3305) | 評論 (11)編輯 收藏

          好象轉眼間,大三也要過去一半了..畢業的日子也隱隱可見了,到底要怎么走呢..本來一心打算出國,但是考慮到需要6個月左右的時間來準備GRE,就覺得不太值得了.用6個月學習英語,而且還不是說GRE考好了就能去好學校,那有必要么?頭腦中一團亂麻...

          posted @ 2006-12-09 09:27 Zou Ang 閱讀(346) | 評論 (1)編輯 收藏

          今天去聼了MS的軟件過程技術的課,講的是軟件設計。其實這兩天聼下來的感覺,就是以客戶為中心,已滿足客戶作爲第一要求,永遠要優先考慮“Money and Time"。然後到了工程的方面,也就是面向“技術”的方面,那就是做設計不要只做一個,至少要有一個alternative的design。先盡量將問題“量化”,盡可能細緻地描述要做的東西,也就是要把requirement變成specification,這種規格的粒度需要自己控制,最好能做到設計做完以後,拿給SDE的時候,他會有一種強烈的開始寫代碼的衝動。

          其實,工科,我覺得永遠都要考慮到實際的環境。畢竟現實世界不是理想囯,我們能做到的,就是在有限的條件下,綜合考慮所有的因素,然後給出性價比最高的方案。

          ps.今天沒拿到U盤,很遺憾

          posted @ 2006-12-06 22:42 Zou Ang 閱讀(296) | 評論 (0)編輯 收藏

          今天在學習Web Service的時候得知Amazon提供了一個搜索的Web Service,于是考慮寫一個方法訪問一下看看..
          Amazon Web Service 的WSDL: http://soap.amazon.com/schemas2/AmazonWebServices.wsdl
          得到了WSDL以后,在命令行執行:
          java org.apache.axis.wsdl.WSDL2Java http://soap.amazon.com/schemas2/AmazonWebServices.wsdl
          就會在%AXIS_HOME%目錄下生成一個包結構:com.amazon.soap.*;里面有很多包,不過如果看了上面那個wsdl的話應該知道主要的類是
          AmazonSearchService和AmazonSearchPort,前面是服務,后面是調用方法的對象..

          AmazonSearchService:
          public?interface?AmazonSearchService?extends?javax.xml.rpc.Service?{
          ????
          public?java.lang.String?getAmazonSearchPortAddress();

          ????
          public?com.amazon.soap.AmazonSearchPort?getAmazonSearchPort()?throws?javax.xml.rpc.ServiceException;

          ????
          public?com.amazon.soap.AmazonSearchPort?getAmazonSearchPort(java.net.URL?portAddress)?throws?javax.xml.rpc.ServiceException;
          }

          AmazonSearchPort:
          package?com.amazon.soap;

          public?interface?AmazonSearchPort?extends?java.rmi.Remote?{
          ????
          public?com.amazon.soap.ProductInfo?keywordSearchRequest(com.amazon.soap.KeywordRequest?keywordSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?powerSearchRequest(com.amazon.soap.PowerRequest?powerSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?browseNodeSearchRequest(com.amazon.soap.BrowseNodeRequest?browseNodeSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?asinSearchRequest(com.amazon.soap.AsinRequest?asinSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductLine[]?blendedSearchRequest(com.amazon.soap.BlendedRequest?blendedSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?upcSearchRequest(com.amazon.soap.UpcRequest?upcSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?authorSearchRequest(com.amazon.soap.AuthorRequest?authorSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?artistSearchRequest(com.amazon.soap.ArtistRequest?artistSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?actorSearchRequest(com.amazon.soap.ActorRequest?actorSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?manufacturerSearchRequest(com.amazon.soap.ManufacturerRequest?manufacturerSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?directorSearchRequest(com.amazon.soap.DirectorRequest?directorSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?listManiaSearchRequest(com.amazon.soap.ListManiaRequest?listManiaSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?wishlistSearchRequest(com.amazon.soap.WishlistRequest?wishlistSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ListingProductDetails?exchangeSearchRequest(com.amazon.soap.ExchangeRequest?exchangeSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.MarketplaceSearch?marketplaceSearchRequest(com.amazon.soap.MarketplaceRequest?marketplaceSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.SellerProfile?sellerProfileSearchRequest(com.amazon.soap.SellerProfileRequest?sellerProfileSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.SellerSearch?sellerSearchRequest(com.amazon.soap.SellerRequest?sellerSearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ProductInfo?similaritySearchRequest(com.amazon.soap.SimilarityRequest?similaritySearchRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ShoppingCart?getShoppingCartRequest(com.amazon.soap.GetShoppingCartRequest?getShoppingCartRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ShoppingCart?clearShoppingCartRequest(com.amazon.soap.ClearShoppingCartRequest?clearShoppingCartRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ShoppingCart?addShoppingCartItemsRequest(com.amazon.soap.AddShoppingCartItemsRequest?addShoppingCartItemsRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ShoppingCart?removeShoppingCartItemsRequest(com.amazon.soap.RemoveShoppingCartItemsRequest?removeShoppingCartItemsRequest)?throws?java.rmi.RemoteException;
          ????
          public?com.amazon.soap.ShoppingCart?modifyShoppingCartItemsRequest(com.amazon.soap.ModifyShoppingCartItemsRequest?modifyShoppingCartItemsRequest)?throws?java.rmi.RemoteException;
          }


          我打算調用keywordSearchRequest這個方法,這個方法有一個keywordRequest參數,返回一個ProductInfo對象
          public?com.amazon.soap.ProductInfo?keywordSearchRequest(com.amazon.soap.KeywordRequest?keywordSearchRequest)?throws?java.rmi.RemoteException;
          下面是調用Web Service的類:
          /**
          ?*?org.zsu.zouang
          ?*?2006-11-30
          ?
          */

          package?org.zsu.zouang;

          import?java.rmi.RemoteException;

          import?javax.xml.rpc.ServiceException;

          import?com.amazon.soap.AmazonSearchPort;
          import?com.amazon.soap.AmazonSearchServiceLocator;
          import?com.amazon.soap.Details;
          import?com.amazon.soap.KeywordRequest;
          import?com.amazon.soap.ProductInfo;

          /**
          ?*?2006-11-30
          ?*?
          @author?Zou?Ang
          ?*?Contact?<a?href?="mailto:richardeee@gmail.com">Zou?Ang</a>
          ?
          */

          public?class?MyAmazonClient?{

          ????
          /**
          ?????*?
          @param?args
          ?????
          */

          ????
          public?static?void?main(String[]?args)?{
          ????????KeywordRequest?keyword?
          =?new?KeywordRequest();
          ????????keyword.setKeyword(
          "Java");
          ????????keyword.setMode(
          "books");
          ????????keyword.setTag(
          "D3HW0PG66IPLAM");
          ????????keyword.setDevtag(
          "D3HW0PG66IPLAM");
          ????????keyword.setPage(
          "1");
          ????????keyword.setType(
          "heavy");
          ????????keyword.setSort(
          null);
          ????????keyword.setVariations(
          null);
          ????????keyword.setLocale(
          null);
          ????????
          //?TODO?Auto-generated?method?stub
          ????????try?{
          ????????????AmazonSearchPort?port?
          =?new?AmazonSearchServiceLocator().getAmazonSearchPort();
          ????????????ProductInfo?info?
          =?port.keywordSearchRequest(keyword);
          ????????????System.out.println(
          "Number?of?Results?:"?+?info.getTotalResults());
          ????????????Details[]?details?
          =?info.getDetails();
          ????????????
          for(Details?d?:?details){
          ????????????????System.out.println(
          "ISBN?:"?+?d.getIsbn()?+?"?Name:"?+?d.getProductName());
          ????????????}

          ????????}
          ?catch?(RemoteException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????e.printStackTrace();
          ????????}
          ?catch?(ServiceException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????e.printStackTrace();
          ????????}

          ????}

          }
          返回的結果:
          -?Unable?to?find?required?classes?(javax.activation.DataHandler?and?javax.mail.internet.MimeMultipart).?Attachment?support?is?disabled.
          Number?of?Results?:
          5161
          ISBN?:
          0072253606?Name:SCJP?Sun?Certified?Programmer?for?Java?5?Study?Guide?(Exam?310-055)?(Certification?Press?Study?Guides)
          ISBN?:
          0596007124?Name:Head?First?Design?Patterns?(Head?First)
          ISBN?:
          0553803905?Name:Ship?of?Ghosts:?The?Story?of?the?USS?Houston,?FDR's?Legendary?Lost?Cruiser,?and?the?Epic?Saga?of?Her?Survivors
          ISBN?:0596009410?Name:Mac?OS?X?Tiger:?Missing?Manual
          ISBN?:
          0596101996?Name:JavaScript:?The?Definitive?Guide
          ISBN?:
          0131483986?Name:Java?How?to?Program?(6th?Edition)?(How?to?Program?(Deitel))
          ISBN?:
          0596009208?Name:Head?First?Java,?2nd?Edition
          ISBN?:
          1591968097?Name:What?is?WebSphere??Java,?J2EE,?Portal?and?Beyond!?(Demystifying?IBM's?Middle?Tier?Technology,?Vol.?1)
          ISBN?:0596005407?Name:Head?First?Servlets?and?JSP:?Passing?the?Sun?Certified?Web?Component?Developer?Exam?(SCWCD)
          ISBN?:
          1932394613?Name:Ajax?in?Action

          下一步可能打算寫個GUI的Amazon搜索客戶端

          posted @ 2006-11-30 23:32 Zou Ang 閱讀(770) | 評論 (1)編輯 收藏

          昨天把Web服務架好了,那今天自然要想怎么來遠程調用了.
          于是寫了如下代碼:
          /**
          ?*?org.zsu.zouang
          ?*?2006-11-29
          ?
          */

          package?org.zsu.zouang;

          import?java.net.MalformedURLException;
          import?java.net.URL;
          import?java.rmi.RemoteException;

          import?javax.xml.namespace.QName;
          import?javax.xml.rpc.ServiceException;

          import?org.apache.axis.client.Call;
          import?org.apache.axis.client.Service;

          /**
          ?*?2006-11-29
          ?*?
          @author?Zou?Ang
          ?*?Contact?<a?href?="mailto:richardeee@gmail.com">Zou?Ang</a>
          ?
          */

          public?class?MyBookServiceClient?{
          ????
          private?static?final?String?endPoint?=?"http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws?wsdl";
          ????
          public?static?void?main(String?args[]){
          ????????Service?service?
          =?new?Service();
          ????????
          try?{
          ????????????Call?call?
          =?(Call)service.createCall();
          ????????????call.setTargetEndpointAddress(
          new?URL(endPoint));
          ????????????call.setOperationName(
          new?QName("getBookTitle"));
          ????????????String?result?
          =?(String)call.invoke(new?Object[]{"0130895601"});
          ????????????System.out.println(result);
          ????????}
          ?catch?(ServiceException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????e.printStackTrace();
          ????????}
          ?catch?(MalformedURLException?e)?{
          ????????????
          //?TODO?Auto-generated?catch?block
          ????????????e.printStackTrace();
          ????????}
          catch(RemoteException?e){
          ????????????e.printStackTrace();
          ????????}

          ????}

          }

          控制臺輸出:
          -?Unable?to?find?required?classes?(javax.activation.DataHandler?and?javax.mail.internet.MimeMultipart).?Attachment?support?is?disabled.
          Advanced?Java?
          2?Platform?How?to?Program
          成功啦!
          在代碼中加上這一句:
          System.out.println(call.getResponseMessage().getSOAPPartAsString());
          會看到控制臺輸出:
          <?xml?version="1.0"?encoding="utf-8"?>
          <soapenv:Envelope?xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"?xmlns:xsd="http://www.w3.org/2001/XMLSchema"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

          ????
          <soapenv:Body>
          ????
          <getBookTitleResponse?soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
          ????????
          <getBookTitleReturn?xsi:type="xsd:string">
          ????????????Advanced?Java?2?Platform?How?to?Program
          ????????
          </getBookTitleReturn>
          ????
          </getBookTitleResponse>
          ????
          </soapenv:Body>
          </soapenv:Envelope>

          改進了一下,使用Swing建立一個圖形化界面:
          /**
          ?*?2006-11-29
          ?*?
          @author?Zou?Ang
          ?*?Contact?<a?href?="mailto:richardeee@gmail.com">Zou?Ang</a>
          ?
          */

          public?class?MyBookClient?extends?JFrame?{

          ????
          private?final?static?int?FRAME_WIDTH?=?500;
          ????
          private?final?static?int?FRAME_HEIGHT?=?100;
          ????
          ????
          public?MyBookClient(String?title)?{
          ????????
          super(title);
          ????????getContentPane().setLayout(
          new?GridLayout(2?,?2));
          ????????
          final?String?endPoint?=?"http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws?wsdl";
          ????????
          final?JLabel?resultLabel?=?new?JLabel();
          ????????
          final?JComboBox?bookISDNBox?=?new?JComboBox();
          ????????bookISDNBox.addItem(
          "0130895601");
          ????????bookISDNBox.addItem(
          "0430895717");
          ????????bookISDNBox.addItem(
          "0430293636");
          ????????bookISDNBox.addItem(
          "0130923613");
          ????????
          ????????
          this.setSize(FRAME_WIDTH,?FRAME_HEIGHT);
          ????????JButton?serviceButton?
          =?new?JButton("Get?Book?Title");
          ????????serviceButton.addActionListener(
          new?ActionListener(){

          ????????????
          public?void?actionPerformed(ActionEvent?e)?{
          ????????????????
          //?TODO?Auto-generated?method?stub
          ????????????????try?{
          ????????????????????Service?service?
          =?new?Service();
          ????????????????????Call?call?
          =?(Call)service.createCall();
          ????????????????????call.setTargetEndpointAddress(
          new?URL(endPoint));
          ????????????????????call.setOperationName(
          new?QName("getBookTitle"));
          ????????????????????String?result?
          =?(String)call.invoke(bookISDNBox.getSelectedObjects());
          ????????????????????resultLabel.setText(result);
          ????????????????}
          ?catch?(AxisFault?e1)?{
          ????????????????????
          //?TODO?Auto-generated?catch?block
          ????????????????????e1.printStackTrace();
          ????????????????}
          ?catch?(MalformedURLException?e1)?{
          ????????????????????
          //?TODO?Auto-generated?catch?block
          ????????????????????e1.printStackTrace();
          ????????????????}
          ?catch?(RemoteException?e1)?{
          ????????????????????
          //?TODO?Auto-generated?catch?block
          ????????????????????e1.printStackTrace();
          ????????????????}
          ?catch?(ServiceException?e1)?{
          ????????????????????
          //?TODO?Auto-generated?catch?block
          ????????????????????e1.printStackTrace();
          ????????????????}

          ????????????}

          ????????}
          );
          ????????
          ????????getContentPane().add(
          new?JLabel("Please?ISDN?number"));
          ????????getContentPane().add(bookISDNBox);
          ????????getContentPane().add(resultLabel);
          ????????getContentPane().add(serviceButton);
          ????}

          ????
          ????
          public?static?void?main(String?args[]){
          ????????MyBookClient?client?
          =?new?MyBookClient("Book?Title?Service");
          ????????client.setDefaultCloseOperation(EXIT_ON_CLOSE);
          ????????client.setVisible(
          true);
          ????}

          }

          posted @ 2006-11-29 22:15 Zou Ang 閱讀(819) | 評論 (4)編輯 收藏

          Java基礎知識,打好基礎才能更好地學習!
          原帖地址:http://www.linuxmine.com/44702.html
          對象引用應用程序設計接口是JDKTM1.2中新定義的。該應用程序設計接口允許應用程序以對象引用的方式與JVM的內存管理器進行交互。當應用程序需管理大量內存對象或者在新的Java對象創建之前需刪除原有對象時,Java對象引用應用程序設計接口具有相當大的用途,例如:
            
            ● 基于Web的應用程序常常要求顯示大量圖片,當用戶離開某一Web頁時,往往不能確定是否能夠順利的返回。在這種程序中,應用Java對象引用API可以創建這樣一個環境,即當堆內存以最小程度運行時,內存管理器創建對象。當用戶返回時,應用程序就會重新載入已經創建的圖片。
            
            ● 應用對象引用隊列可以創建這樣一個環境,當通過對象引用獲得某一對象時,應用程序得到通知。然后,應用程序就可以對相關對象進行清除操作,同時使這些對象在內存管理器中合法化。
            
            內存管理器的工作機制
            
            下面將首先介紹未嵌入引用對象時內存管理器的工作機制,然后討論引用對象加入之后Java堆發生的變化。
            
            內存管理器的作用就是識別程序中不再使用的對象,并且回收其內存。
            
            一個Java應用程序由一系列線程組成,每個線程執行一系列方法,而每個方法通過參數或局部變量來引用對象。這些引用屬于引用集合中的一部分,直接進入應用程序。另外,引用集合中還包括類庫中定義的靜態引用變量,以及通過Java本地接口(JNI)API獲得的引用。引用集合中的所有引用對象都可以被當前應用程序獲取,而不必被回收。同樣地,這些對象可能包含對其它對象的引用,也可以被應用程序獲取,依此類推。Java堆中的其它對象視為不可獲取的,而所有這些不可獲取的對象在內存管理中也是合法的。如果一個不可獲取的對象使用finalize()方法,任務就交給了對象所調用的收尾器(finalizer)。在內存回收期間,不具有收尾器的不可獲取對象和已經調用收尾器的對象被簡單回收。
            
            內存回收的算法是不斷變化的,共性的方面是從引用集合中識別可獲取的對象以及回收被其它對象占據的內存空間。
            
            加入引用對象之后的引用與常規引用的區別在于,引用對象中的引用專門由內存管理器來處理。引用對象封裝了其它一些對象的引用,我們稱之為指示對象。在引用對象創建的同時,也就定義了該引用對象的指示對象。
            
            Java對象引用
            
            圖1所示為對象引用應用程序設計接口中定義的類層次。其中SoftReference類、WeakReference類和PhantomReference類中分別定義了三種引用對象以及相應的三種獲取對象的能力。因此按照由強到弱,對象可獲取程度可劃分為如下五種類型:強獲取(strongly reachable)、次獲取(softly reachable)、弱獲取(weakly reachable)、虛獲取(phantomly reachable)和不可獲取(unreachable)。
             
            圖1 對象應用類層次
            
            根據應用程序要求,對象可以是強引用(strong references)、次引用(soft references)、弱引用(weak references)、虛引用(phantom references)的任意組合。為了確定對象的可獲取程度,JVM內存管理器從引用集合出發遍尋堆中所有到對象的路徑。當到達某對象的任意路徑都不含有引用對象時,則稱該對象具有強獲取能力;當路徑中含有一個或幾個引用對象時,根據內存管理器所查詢的引用對象的類型分別歸為次獲取、弱獲取、虛獲取。
            
            另外,對象引用API中還定義了引用對象隊列(java.lang.ref.ReferenceQueue),這是內存管理器對引用對象進行管理的一種簡單數據結構。值得注意的是,在進行引用對象定義時,要求phantom reference對象必須產生于一個引用對象隊列,而soft reference和weak reference對象則無此限制,如:
            
            

          ReferenceQueue?queue? = ? new ?ReferenceQueue();
            PhantomReference?pr?
          = ? new ?PhantomReference(object,?queue);

            Soft References 應用實例
            
            下面以在基于web的應用程序中使用soft references為例,來說明Java對象引用與JVM的內存管理器進行交互的原理。
            
            當用戶打開某一web頁時,applet代碼獲得圖片并且得到顯示。如果在代碼中同時創建了該圖片對象的soft references,那么當用戶離開該web頁時,內存管理器對圖片所分配的內存是否回收做出選擇。當用戶返回該web頁時,在applet代碼中使用SoftReference.get方法就會得到圖片才內存中是否仍存在的消息。如果在內存管理器中未創建該圖片,在web頁上會很快得到顯示;否則,applet代碼就會重新獲取。
            
            下面是Example.java的完整源代碼。
            
            

          import ?java.awt.Graphics;
            
          import ?java.awt.Image;
            
          import ?java.applet.Applet;
            
          import ?java.lang.ref.SoftReference;
            
          public ? class ?Example? extends ?Applet? {
              SoftReference?sr?
          = ? null ;
              
          public ? void ?init()? {
                System.out.println(
          " Initializing " );
              }

              
          public ? void ?paint(Graphics?g)? {
                Image?im?
          = ?(sr? == ? null )? ? ? null ?:?(Image)(sr.get());
                
          if ?(im? == ? null )? {
                  System.out.println(
          " Fetching?image " );
                  im?
          = ?getImage(getCodeBase(), " yundong.gif " );
                  sr?
          = ? new ?SoftReference(im);
               ?}

               ?System.out.println(
          " Painting " );
               ?g.drawImage(im,?
          25 ,? 25 ,? this );
               ?g.drawString(
          " 運動之美 " , 20 , 20 );?
               im?
          = ? null ; 
              
          /* ?Clear?the?strong?reference?to?the?image? */
              }

            
              
          public ? void ?start()? {
                System.out.println(
          " Starting " );
              }

            
              
          public ? void ?stop()? {
                System.out.println(
          " Stopping " );
              }

            }


            
            在上面的代碼中,對象image是一個圖片對象,傳遞給一個SoftReference對象sr。其中image對象是sr的指示對象,sr中的引用域是從次引用(soft reference)到 image。
            
            Weak References分析
            
            對于一個穩定的對象,比如說線程類對象,當需要獲取外部數據時,在程序中應用weak references是非常理想的。如果利用引用隊列創建了某一線程的weak reference,那么當線程不再具有強獲取能力時,應用程序得到通知,根據此通知,應用程序才能執行相關數據對象的清除工作。
            
            當內存管理器未發現strong references 和 soft references 時,我們稱對象具有弱獲取能力,即在到達該對象的路徑中至少包含一個weak reference。程序中weak references被清除一段時間后,弱獲取對象被收尾器收集。由此也可以看出,soft reference和weak reference之間的區別在于,應用soft reference時,內存管理器利用算法決定是否創建弱獲取對象,而應用weak reference時,內存管理器必須創建次獲取對象。
            
            引用對象鏈
            
            當到達某一對象的路徑中含有多個引用對象時,就構成了引用對象鏈。內存管理器按照由強到弱的順序處理引用對象,具體處理步驟包括:Soft references、 Weak references、Finalization、Phantom references和創建對象五個部分。
            
            當內存管理器未發現前三種對象引用時,我們稱對象具有虛獲取能力,即在到達該對象的路徑中至少包含一個phantom reference。虛引用對象直接被收尾器收集,而不被重新創建。當內存管理器發現只有phantom references時,對象就將處于等候phantom reference狀態,應用程序向引用隊列發出通知,然后對虛引用對象調用clear()方法,將其引用域設置為null,最后對不可獲取對象執行收集清除處理任務。
            
            通常,對象所具有的獲取能力與引用對象集合直接路徑中的最弱連接者相同。據此可以看出:
            
            圖2(a)中,虛引用對象具有強獲取能力,其它對象均具虛獲取能力;
            
            (b)中虛引用對象和弱引用對象均具強獲取能力,故次引用對象和對象集合具有若獲取能力;
            
            (c)中虛引用對象、弱引用對象和次引用對象均具強獲取能力,那么對象集合則具次獲取能力。
             
            圖2 引用對象鏈
            小結
            ● 引用對象API是Java2平臺中的特色之一。
            
            ● 在程序中使用引用對象API不但可以在一定程度上控制內存管理器,實現內存自動管理,還可以提高程序的穩定性和安全性。
            
            ● 引用對象鏈中各個對象的獲取能力與整個鏈相關。

          posted @ 2006-11-29 14:08 Zou Ang 閱讀(454) | 評論 (0)編輯 收藏

          今天在宿舍,用Axis來弄了個最簡單的Web Service.先來講下怎么安裝和部署.
          首先,去Apache的網站下載Axis,我沒有下載Axis2,因為據說Axis2和Axis有比較多的不同,所以還是覺得先用以前的吧.
          下載好了以后,把axis下的webapp文件夾中的axis放到tomcat的webapp目錄下,然后啟動tomcat,輸入:http://localhost:8080/axis/,如果成功會看到歡迎頁面.
          然后寫一個Java類:
          import?java.util.HashMap;
          import?java.util.Map;

          /**
          ?*?2006-11-28
          ?*?
          @author?Zou?Ang
          ?*?Contact?<a?href?="mailto:richardeee@gmail.com">Zou?Ang</a>
          ?
          */

          public?class?BookTitleService?{

          ????Map
          <String,String>?books;
          ????
          public?BookTitleService(){
          ????????books?
          =?new?HashMap<String,String>();
          ????????
          ????????books.put(
          "0130895601","Advanced?Java?2?Platform?How?to?Program");
          ????????books.put(
          "0430895717","C++?How?to?Program,Third?edition");
          ????????books.put(
          "0430293636","Visual?Basic.?NET?How?to?Program");
          ????????books.put(
          "0130923613","Python?How?to?Program");
          ????}

          ????
          ????
          public?String?getBookTitle(String?ISBN){
          ????????
          return?books.get(ISBN);
          ????}

          }
          然后把BookTitleService.java更名為BookTitleService.jws,把更改后的文件放到%CATALINA_HOME%/webapps/axis/%包結構(比如org/apache/..)/目錄下
          ,我的是D:\apache-tomcat-5.5.17\apache-tomcat-5.5.17\webapps\axis\org\zsu\zouang\BookTitleService.jws,注意,這樣放好了jws文件后,把java類中的包名要刪除,做完了以后重新啟動tomcat,在地址欄輸入http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws,如果Web服務部署成功就會有頁面顯示的了,點Click to See WSDL后,可以看到:
          ?<?xml?version="1.0"?encoding="UTF-8"??>?
          -?
          <wsdl:definitions?targetNamespace="http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws"?xmlns:apachesoap="http://xml.apache.org/xml-soap"?xmlns:impl="http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws"?xmlns:intf="http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws"?xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"?xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"?xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          -?
          <!--?
          WSDL?created?by?Apache?Axis?version:?1.4
          Built?on?Apr?22,?2006?(06:55:48?PDT)

          ??
          -->?
          -?
          <wsdl:message?name="getBookTitleRequest">
          ??
          <wsdl:part?name="ISBN"?type="xsd:string"?/>?
          ??
          </wsdl:message>
          -?
          <wsdl:message?name="getBookTitleResponse">
          ??
          <wsdl:part?name="getBookTitleReturn"?type="xsd:string"?/>?
          ??
          </wsdl:message>
          -?
          <wsdl:portType?name="BookTitleService">
          -?
          <wsdl:operation?name="getBookTitle"?parameterOrder="ISBN">
          ??
          <wsdl:input?message="impl:getBookTitleRequest"?name="getBookTitleRequest"?/>?
          ??
          <wsdl:output?message="impl:getBookTitleResponse"?name="getBookTitleResponse"?/>?
          ??
          </wsdl:operation>
          ??
          </wsdl:portType>
          -?
          <wsdl:binding?name="BookTitleServiceSoapBinding"?type="impl:BookTitleService">
          ??
          <wsdlsoap:binding?style="rpc"?transport="http://schemas.xmlsoap.org/soap/http"?/>?
          -?
          <wsdl:operation?name="getBookTitle">
          ??
          <wsdlsoap:operation?soapAction=""?/>?
          -?
          <wsdl:input?name="getBookTitleRequest">
          ??
          <wsdlsoap:body?encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"?namespace="http://DefaultNamespace"?use="encoded"?/>?
          ??
          </wsdl:input>
          -?
          <wsdl:output?name="getBookTitleResponse">
          ??
          <wsdlsoap:body?encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"?namespace="http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws"?use="encoded"?/>?
          ??
          </wsdl:output>
          ??
          </wsdl:operation>
          ??
          </wsdl:binding>
          -?
          <wsdl:service?name="BookTitleServiceService">
          -?
          <wsdl:port?binding="impl:BookTitleServiceSoapBinding"?name="BookTitleService">
          ??
          <wsdlsoap:address?location="http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws"?/>?
          ??
          </wsdl:port>
          ??
          </wsdl:service>
          ??
          </wsdl:definitions>
          這樣,一個最最簡單的Web Service就部署成功了.

          posted @ 2006-11-28 21:00 Zou Ang 閱讀(758) | 評論 (1)編輯 收藏

               摘要: Lazy Initialization and the DAO pattern with Hibernate and Spring的翻譯,照顧些不喜歡讀英文的朋友,請指導  閱讀全文

          posted @ 2006-11-27 20:03 Zou Ang 閱讀(2167) | 評論 (2)編輯 收藏

               摘要: 由于要求在項目中使用泛型的DAO,所以上網Google了一下,找到了IBM的一篇文章。文章講得不錯,但是有些地方不清楚,如果完全按照那篇文章可能還會遇到一些困難。所以寫了這篇文章,解釋如何在項目中加入泛型的DAO實現。 首先是總的類關系的UML圖:然后是在配置文件中的關系圖:??其中,IStaffDao是我們自己定義的接口,這個接口類似: publ...  閱讀全文

          posted @ 2006-11-26 21:08 Zou Ang 閱讀(5443) | 評論 (8)編輯 收藏

          主站蜘蛛池模板: 宁明县| 正定县| 荥经县| 永善县| 顺昌县| 大竹县| 同德县| 区。| 北碚区| 澄迈县| 平阴县| 新郑市| 景谷| 历史| 开封县| 新营市| 福安市| 喀什市| 玉环县| 陕西省| 宁武县| 星子县| 夹江县| 沙湾县| 张家港市| 绥宁县| 沙雅县| 都兰县| 甘泉县| 呼图壁县| 句容市| 湖北省| 安庆市| 丰县| 阳曲县| 财经| 华阴市| 宣威市| 南宁市| 闽侯县| 临城县|