隨筆 - 18  文章 - 0  trackbacks - 0
          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          首先引包:
              import jxl.Workbook;
          代碼示例:
              jxl.Workbook rwb = jxl.Workbook.getWorkbook(new File("C:/Documents and Settings/Administrator/桌面/department.xls"));   
              jxl.Sheet rs = rwb.getSheet("部門信息"); //sheet名稱,也可以getSheet(0)方法取得sheet  
              String sheetContext = rs.getCell(1, 0).getContents();
              ServletActionContext.getRequest().setAttribute("sheetName", sheetContext);

          具體操作見:
              http://philos.javaeye.com/blog/90802
          posted @ 2010-03-09 11:22 lucas_y 閱讀(154) | 評論 (0)編輯 收藏
          hibenate的面試總結.
          可能現在大家常常還會遇到一個些面試的時候問一些關于hibernate的問題,我個人覺得,這些東西一般做過開發的人在使用上沒有任何的問題的,但是如果是要你來說就不一定能夠說好的,下面是從goole上找的一些常見的面試。
          1.Hibernate session接口的get和load方法有何異同?
          答: get不到實體對象時會返回null,load會拋出異常
            - get會立即加載實體對象,load默認是延遲加載
            - get會忽略二級緩存(這個沒有試驗過),load則是一級和二級緩存都使用

          2.在持久化層,對象分為哪些狀態?分別列出來.
          答:瞬時態(Transient)、持久態(Persistent)、脫管態(Detached)。
          瞬時態(Transient)
          是對象是創建時,瞬時對象在內存孤立存在,它是攜帶信息的載體,不和數據庫的數據有任何關聯關系,在Hibernate中,可通過session的save()或 saveOrUpdate()方法將瞬時對象與數據庫相關聯,并將數據對應的插入數據庫中,此時該瞬時對象轉變成持久化對象。
          持久態(Persistent)
          是該對象在數據庫中已有對應的記錄,并擁有一個持久化標識,如果是用hibernate的delete()方法,對應的持久對象就變成瞬時對象,因數據庫中的對應數據已被刪除,該對象不再與數據庫的記錄關聯。
              當一個session執行close()或clear()、evict()之后,持久對象變成脫管對象,此時持久對象會變成脫管對象,此時該對象雖然具有數據庫識別值,但它已不在hibernate持久層的管理之下。
            持久對象具有如下特點:
               1. 和session實例關聯;
               2. 在數據庫中有與之關聯的記錄。
          脫管態(Detached)
          當與某持久對象關聯的session被關閉后,該持久對象轉變為脫管對象。當脫管對象被重新關聯到session上時,并再次轉變成持久對象。
                 脫管對象擁有數據庫的識別值,可通過update()、saveOrUpdate()等方法,轉變成持久對象。
                 脫管對象具有如下特點:
            1.本質上與瞬時對象相同,在沒有任何變量引用它時,JVM會在適當的時候將它回收;
          2. 比瞬時對象多了一個數據庫記錄標識值。

          3.lock和update區別
          答: update是把一個已經更改過的脫管狀態的對象變成持久狀態
          lock是把一個沒有更改過的脫管狀態的對象變成持久狀態(針對的是因Session的關閉 而處于脫管狀態的po對象(2),不能針對因delete而處于脫管狀態的po對象)
          對應更改一個記錄的內容,兩個的操作不同:
          update的操作步驟是:
          (1)屬性改動后的脫管的對象的修改->調用update
          lock的操作步驟是:
          (2)調用lock把未修改的對象從脫管狀態變成持久狀態-->更改持久狀態的對象的內容-->等待flush或者手動flush

          4.save 和update區別
          答: save是把一個對象做為一個新的數據保存, update則是把一個脫管狀態的對象或自由態對象(一定要和一個記錄對應)更新到數據庫,其實一個是保存一個是更新,一看都知道是有什么區別了。

          5.update 和saveOrUpdate區別
          答:這個是比較好理解的,顧名思義,saveOrUpdate基本上就是合成了save和update,而update只是update;引用hibernate reference中的一段話來解釋他們的使用場合和區別
          通常下面的場景會使用update()或saveOrUpdate():
          程序在第一個session中加載對象,接著把session關閉
          該對象被傳遞到表現層
          對象發生了一些改動
          該對象被返回到業務邏輯層最終到持久層
          程序創建第二session調用第二個session的update()方法持久這些改動
          saveOrUpdate(po)做下面的事:
          如果該po對象已經在本session中持久化了,在本session中執行saveOrUpdate不做任何事
          如果savaOrUpdate(新po)與另一個與本session關聯的po對象擁有相同的持久化標識(identifier),拋出一個異常
          org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.itfuture.www.po.Xtyhb#5]
          saveOrUpdate如果對象沒有持久化標識(identifier)屬性,對其調用save() ,否則update() 這個對象     

          6.flush和update區別
          答:這兩個的區別好理解update操作的是在自由態或脫管狀態(因session的關閉而處于脫管狀態)的對象//updateSQL
          而flush是操作的在持久狀態的對象。
          默認情況下,一個持久狀態的對象的改動(包含set容器)是不需要update的,只要你更改了對象的值,等待hibernate flush就自動更新或保存到數據庫了。hibernate flush發生在以下幾種情況中:
          1, 調用某些查詢的和手動flush(),session的關閉、SessionFactory關閉結合
          get()一個對象,把對象的屬性進行改變,把資源關閉。
          2,transaction commit的時候(包含了flush)
          posted @ 2010-03-08 16:14 lucas_y 閱讀(207) | 評論 (0)編輯 收藏
                  1、Web Services. 優先支持編寫 XML web service 客戶端程序。你可以用過簡單的annotaion將你的API發布成.NET交互的web services. Mustang 添加了新的解析和 XML 在 Java object-mapping APIs中, 之前只在Java EE平臺實現或者Java Web Services Pack中提供. 
           

            2、Scripting. 現在你可以在Java源代碼中混入JavaScript了,這對開發原型很有有用,你也可以插入自己的腳本引擎。  

            3、Database. Mustang 將聯合綁定 Java DB (Apache Derby). JDBC 4.0 增加了許多特性例如支持XML作為SQL數據類型,更好的集成Binary Large OBjects (BLOBs) 和 Character Large OBjects (CLOBs) . 

            4、More Desktop APIs. GUI 開發者可以有更多的技巧來使用 SwingWorker utility ,以幫助GUI應用中的多線程。, JTable 分類和過濾,以及添加splash閃屏。 

            5、Monitoring and Management. Mustang 添加更多的診斷信息,綁定了不是很知名的 memory-heap 分析工具Jhat 來查看內核導出。 

            6、Compiler Access.  compiler API提供編程訪問javac,可以實現進程內編譯,動態產生Java代碼。  

            7、Pluggable Annotation. Java tool和framework 提供商可以定義自己的 annotations ,并且內核支持自定義annotation的插件和執行處理器  

            8、Desktop Deployment. Swing擁有更好的 look-and-feel , LCD 文本呈現, 整體GUI性能的提升。Java應用程序可以和本地平臺更好的集成,例如訪問平臺的系統托盤和開始菜單。Mustang將Java插件技術和Java Web Start引擎統一了起來。 

            9、Security. XML-數字簽名(XML-DSIG) APIs 用于創建和操縱數字簽名); 新的方法來訪問本地平臺的安全服務,例如本地Microsoft Windows for secure authentication and communicationnative 的Public Key Infrastructure (PKI) 和 cryptographic services, Java Generic Security Services (Java GSS) 和 Kerberos services for authentication, 以及訪問 LDAP servers 來認證用戶. 

            10、The -ilities: 質量,兼容性,穩定性。 80,000 test cases 和數百萬行測試代碼(只是測試活動中的一個方面). Mustang 的快照發布已經被下載15個月了,每一步中的Bug都被修復了,表現比J2SE 5還要好。
          posted @ 2010-03-05 16:34 lucas_y 閱讀(166) | 評論 (0)編輯 收藏

          原文地址:http://sjtu.blog.sohu.com/108202346.html

           

          ------------------------------------------軟開開發篇-------------------------
          -------------------------- 
           
               在我剛進軟開的時候,我想,這有什么啊,泡著茶寫點兒JAVA的日子么?最多用JAVA查
          個數據庫,插個數據庫,還有啥?取錢存錢不也就是個人帳戶數據的此消彼長么?IDE會幫你
          發現任何一個細小的失誤,而JAVA的簡單語法也不會讓你擔心有什么疑難雜癥.我不知道
          跟我想法法一致的人有多少,但這確實就是我剛開始看軟開的眼光,安逸,掙閑錢的地方.
           
               然則,就類似于能量守恒的定理,你做的東西少,一定是有人幫你做的東西多,JAVA是
          簡單,可是那是JVM做的東西多,就如銀行,銀行的系統之復雜,是任何一個人無法想象的,
          然而它的真正目的不是像IBM一樣要向別人出賣技術,所以對人才要求很高,它只是要使成
          熟的技術造福于自己特色業務的推廣,造福于針對業務的系統的開發,說白了,是靠業務的
          走紅而不是技術的復雜來掙錢,.JAVA雖簡單,但是要想徹頭徹尾學明白也難,那么銀行軟
          開不允許這種復雜性存在,它簡單,但不徹底,那么我們就要讓它變得徹底的簡單,我們要
          繼續開發自己的系統,提供一套很容易的開發平臺,當這套平臺開發出來之后,就招一批能
          夠泡著茶寫JAVA的人去為業務服務,所以這就是軟開表面給大家造成這樣一種映向的原因
          ,工作難度是不大,但是絕對不是說銀行系統無人,只是那些平臺的工作者沒有浮出水面,
          或者相對來說比較低調而已. 
              回到了我不屑的泡著茶寫JAVA,啊,的確,難度是不大,數據庫查來查去,日志記來記去
          ,流程可能夠復雜,但不是算法的復雜,只是實現起來很煩而已.但是,這些人真的有足夠的
          工夫泡茶么?大家喜歡用日新月異來形容當今社會的發展,形勢日新月異了,業務需求一樣
          也是日新月異,于是他們每天都要針對各種業務需求寫出不同的程序來,這個時候,他們的
          關注點應該從技術轉向業務上來.業務需求給他們的壓力使他們再無暇關注技術本身,所
          以寫JAVA的人也有寫JAVA的人的難處,只是業務上的繁瑣,向來被純正的喜歡搞底層/搞算
          法的人所鄙視,的確,你的腦筋可能是很活,但是物盡其才,如果真的有這樣的思維,是應該
          去搞一些高深的東西,研究技術的創新,寫JAVA,面對各種應用需求,是有些埋沒,但是話又
          說回來,這樣腦筋很活的人能干這樣的工作么?工作再枯燥也需要有人做,他們能有耐心應
          付這樣的枯燥么? 
              現在滿大街的小公司,沒有幾個是真正搞什么底層東西的,大家其實都在針對各種業
          務做各種項目,銀行的開發之所以顯得有些乍眼,主要是因為:1,國企大氛圍;2,做出的東
          西不用面對銷售壓力.其開發從技術含量來講,并無本質區別. 
              所以在銀行軟開工作,絕大部分人,絕對部分學計算機的人,需要面臨的是一個方向的
          調整,需要將注意力從技術的深度轉到業務的廣度上來,一味盲目的覺得人家的工作乏味,
          沒技術含量是不現實的,這也是我目前一個態度的轉變. 
              技術做到最后,就是大同,惟有業務,才能使其中的努力變成鈔票,大家(尤其是學計算
          機的人,尤其是并不適合搞算法,搞底層的人)如果想進軟開,一定要有這樣的認識. 
           
          ----------------------------------------------------------------------------
          --------------------------------- 
           
          ------------------------------軟開的壓力篇----------------------------------
          --------------------------- 
              銀行軟開之所以有些乍眼,前面說過一條,不用面對銷售的壓力,是,我們做出來,業務
          人員就得用,可是真的沒有壓力么? 
                  我曾經聽說過這樣一個例子:一個工行網點的客戶經理,費盡了口舌,花了半天工
          夫,說服了兩個客戶買基金,終于她們被說動了,坐下來填單子準備簽字了,這個時候,系統
          出故障了,交易無法進行,沒辦法,客戶經理只能含著淚,帶著她們出來,把她們指給旁邊的
          農行/建行(本人屬于工行,這些時候自然偏向工行,其他銀行朋友勿怪).這個例子,體現了
          銀行軟開的一點壓力吧,不論什么時間,不論什么情況,不論你用什么手段什么方法,請你
          給我保持住穩定,如果系統慢,客戶經理還可以陪客戶聊天,可是如果宕了,什么叫所有努
          力付諸東流,這就是. 
              銀行在全國的網點,大的數以萬計,小的也數以千計吧,各個地方,招來的柜員,那是怎
          么樣素質的都有,我曾聽說過這樣的柜員,這輩子她就會干兩件事,做取款的交易和存款的
          交易,轉賬怎么辦?不會直接轉賬,先給A做提現的交易,再給B做存現的交易.內部實現怎么
          別扭,但是外部的易用性你可得給我做足了,要不人家網點柜員是真不明白.記得唐朝詩人
          白居易還是王安石,每寫一首詩,都要問老百姓能不能看懂,軟開面臨的情況也很類似,白
          居易王安石歷史上就這么兩個人,然而你要求每個軟開員工每個項目都能做到這樣,不覺
          得有壓力么?尤其是心高氣傲的計算機人,那 更是不屑了.可是,這是軟開,如果想進來玩,
          請放下你的架子,認真/細致的處理好所有細節. 
              還有一個路人皆知的壓力,如何保障運營系統的安全,大家存錢的時候按完密碼鍵盤
          了,系統沒有響應,柜員要求你重新輸入你會怎么想?難道不是我的密碼被盜了?你怎么能
          保證?這樣的事情只要發生,只要桶上來,整個銀行總部的領導層都會開始關注這個問題,
          甚至銀監會也要監督你的處理方式.這個時候,軟開員工身上的壓力將會可想而知,一旦最
          后查明是程序的問題,所有一干人等(開發/測試/小組領導/部門領導),全部要受罰,這是
          肯定的.網銀的運營,得有多少加密措施來保障數據的安全,且不說技術上的加密算法,就
          拿業務來說,大家去辦個U盾,看那個網點工作人員得填多少單子,就知道銀行為保證安全
          ,得下多少精力了. 
              很多小公司,常年就給一個醫院/一個機關做項目,每做一個,掙10幾萬,然后全組人出
          動到現場,花幾天時間,解決各種安裝遇到的問題,保證沒問題后再大家都撤,老總請大家
          吃飯.銀行是怎么樣?做一個項目,全國所有省份所有網點均要投產,如果大家各自全都出
          動,人手夠么?各種不一致的現象報上來,就是招10倍人也解決不了,所以銀行軟開壓力最
          大的時候就是投產前夕,所有人從老總到小兵全部通宵達旦地守在電腦旁,應付各種可能
          問題的出現,而且作為高風險機構,銀行在投產時候遇到的問題的解決,一定要準,一次性
          成功!就如密碼鍵盤來說,出現問題是系統不響應,馬上回來改了,自己測過之后沒問題,再
          發補丁,結果造成系統崩潰,你可以想象一下客戶的憤怒和不安!全中國這么大,我們不可
          能到處跑過去看問題,所以,怎么樣才能保證程序在全國跑都沒問題,這是問題,也是巨大
          的壓力. 
              銀行軟開的壓力,不來自于有沒有客戶,而來自于客戶太多,給我們系統造成的壓力,
          無人問津的悲哀和無數人目光如炬的質詢,后果都一樣,讓你身心俱疲. 
          ----------------------------------------------------------------------------
          ------------------------------------- 
           
          ------------------------------銀行軟開的發展篇------------------------------
          ----------------------------- 
              銀行軟開的發展,對于學計算機的人來說,是一個不小的難題,也是很多人對于要不
          要來這很猶豫的問題,技術和業務上的難以抉擇.還有國企多少的一點特色對自己發展造
          成的干擾. 
              是的,這些都是問題,值得研究,第一個關于技術和業務的問題,我不想再多說,以掙錢
          為終點,那么條條大路通羅馬,以境界的追求為終點,軟開可能不屬于一個好的地方,畢竟
          你的心高高在上,不屑于一些簡單的活.路是自己選的,怎么走都可以,但是有一點要注意,
          軟開是有一部分專搞技術的人的,只是因為銀行軟開的出發點是針對業務做開發,所以為
          開發提供更便捷方式的平臺方面的人屬于少而精的配置.因為一些國企的特色,進來后可
          能因為我這篇文章,一些想要進來做平臺的計算機人,有可能被領導分配到業務為主的開
          發部門,關于這些人我想說的是,軟開屬于計算機研發為主的企業性質單位,人與人之間的
          關系,沾點國企的影子,卻遠沒有那么復雜,關于自己角色的的定位,你可以跟領導好好溝
          通你的長處和你希望干的內容,一般來說,領導是會多少考慮的,即便不能百分百滿足你需
          要,百分之三十/四十/五十等等也能滿足一些,只會悶頭做技術,不會與人交流的人還是不
          要來了,這里不適合你,即便你不跟領導溝通,你也需要跟下面分行的人溝通,交流,是工作
          需要. 
              有的人會說,銀行軟開不掙錢,掙錢的是那些懂業務的人,這里首先要明確,什么樣算
          掙錢,工資是每個人都掙的,要是拿這個說的話就沒意思了.大家說的應該是提成/分紅的
          那一類人,的確,軟開掙不到那樣一些錢,那些屬于業務部該掙的錢.我覺得大家在討論這
          樣一些問題的時候,首先要把自己擺正,軟開的人,其實也就相當于一個IT公司的人,IT公
          司的那一部分分紅,軟開一分錢都不會少,而且軟開的錢有保證,不隨經濟危機而起伏.平
          時福利也還可以.大家在羨慕業務的人拿得多的時候,是否可曾想到自己公司的銷售在談
          好一個項目的時候提成也是遠勝于自己工資的呢?只要你自己肯轉變思路,專心學業務,借
          助于自己的技術優勢,以后去業務部分掙錢也不是沒可能,關鍵就在于自己怎么看,不能既
          不想作出改變現狀的努力,又覺得人家掙錢掙那么多不公平.再者如果你實在干不了業務,
          那么就干技術,轉管理或者技術做到死當技術經理,總之就是成為領導,軟開領導同樣掙不
          少錢,他們地位也和HP/IBM的高管地位一樣,也許錢一年比人家的少些,但是國企有國企的
          福利,這個是外企不能比的.每個人都該知足,生活提高一點,抱怨就該少一點,自己已經掙
          了30W一年,夠花了,聽說別的部門一年年終獎拿了20W,全年工資50W也該把心態放平和些,
          不就是錢么,又不是不夠花,何不知足長樂呢?(注:業務部門不包括那些網點的柜員,他們
          工資很少的). 
               軟開的發展空間最大的難處在我看來,是這里雖然由業務指導開發,但是開發量很大
          ,導致你也不能完全放下你的技術,這樣技術和業務之間徘徊不定,最終會有礙人的成長,
          而且他的技術為了業務開發的便捷,被很好的簡化了最后有可能技術沒學成技術,業務也
          沒懂多少.這個是確實,一個地方不可能十全十美. 
              我的意見是,你一生比較想過安穩的生活可以來這,你如果是一個有追求的人,并且腦
          筋可以變通的人,也可以來這,你如果是是一個有追求的人,并且好學的人(無論是業務還
          是技術,都多得讓你學不完,當你學得夠多就有資格提前成為領導了),也可以來這.一個有
          追求的人,并且勤勉踏實的人也可以來,有這么兩類人,技術的大牛人不要來,你應該去百
          度/GOOGLE發揮你的優勢所在,有追求,但是沒有什么魄力改變現狀的人,就不要來,免得一
          輩子平庸的現狀可能讓你萬分苦惱. 
              還有一個難處我也提一下,它終歸是國企,它注重能力,畢竟銀行的系統不能瞎來,同
          時也要求年限,年限一到才能往上升,所以不能忍的人也不要來了吧,當然也可以來了再走
          ~呵呵 
             最后我說一下薪資發展空間吧,現在銀行軟開一般待遇都不差,但是升值空間,在你沒
          成為領導之前漲幅不大,其實任何地方都一樣,只有當領導,工資才能有質的變化,只是軟
          開要當上領導的周期比外企要長一些,也不會長得不可理喻,大家有的總說想來這,覺得穩
          定但是又嫌工資漲得不快,這就是典型的魚和熊掌都想得到的心理了,選擇了軟開,選擇了
          國企的穩定,必然要放棄一部分收入的增幅,既然思想不夠純粹,要為追求奮斗一生,而是
          選擇既有保障也要有追求的奮斗,那么你的生命里必將在別的地方付出一些代價,怎么樣
          都能成功,問題還是在于個人吧. 
              我簡單說明一下,工行軟開,屬于總行編制,恩,就這么多了. 

          posted @ 2010-03-01 11:25 lucas_y 閱讀(1292) | 評論 (0)編輯 收藏

           代理模式


          代理模式的作用是:

                為其他對象提供一種代理以控制對這個對象的訪問。在某些情況下,一個客戶不想或者不能直接引用另一個對象,而代理對象可以在客戶端和目標對象之間起到中介的作用。


          代理模式一般涉及到的角色有:


          抽象角色:聲明真實對象和代理對象的共同接口;

          代理角色:代理對象角色內部含有對真實對象的引用,從而可以操作真實對象,同時代理對象提供與真實對象相同的接口以便在任何時刻都能代替真實對象。同時,代理對象可以在執行真實對象操作時,附加其他的操作,相當于對真實對象進行封裝。

          真實角色:代理角色所代表的真實對象,是我們最終要引用的對象。

          以下以《Java與模式》中的示例為例:

          代碼: //抽象角色:
          abstract public class Subject{
          abstract public void request();
          }

          //真實角色:實現了Subject的request()方法。
          public class RealSubject extends Subject{
          public RealSubject(){
          }
          public void request(){
          System.out.println("From real subject.");
          }
          }

          //代理角色:
          public class ProxySubject extends Subject{
          private RealSubject realSubject; //以真實角色作為代理角色的屬性
          public ProxySubject(){
          }
          public void request(){ //該方法封裝了真實對象的request方法
          preRequest();
          if( realSubject == null ){
          realSubject = new RealSubject();
          }
          realSubject.request(); //此處執行真實對象的request方法
          postRequest();
          }
          private void preRequest(){
          //something you want to do before requesting
          }
          private void postRequest(){
          //something you want to do after requesting
          }
          }

          //客戶端調用:
          Subject sub=new ProxySubject();
          Sub.request();


                由以上代碼可以看出,客戶實際需要調用的是RealSubject類的request()方法,現在用ProxySubject來代理RealSubject類,同樣達到目的,同時還封裝了其他方法(preRequest(),postRequest()),可以處理一些其他問題。

                另外,如果要按照上述的方法使用代理模式,那么真實角色必須是事先已經存在的,并將其作為代理對象的內部屬性。但是實際使用時,一個真實角色必須對應一個代理角色,如果大量使用會導致類的急劇膨脹;此外,如果事先并不知道真實角色,該如何使用代理呢?這個問題可以通過Java的動態代理類來解決。

          2.動態代理

          Java動態代理類位于Java.lang.reflect包下,一般主要涉及到以下兩個類:

          (1). Interface InvocationHandler:該接口中僅定義了一個方法Object:invoke(Object obj,Method method, Object[] args)。在實際使用時,第一個參數obj一般是指代理類,method是被代理的方法,如上例中的request(),args為該方法的參數數組。這個抽象方法在代理類中動態實現。

          (2).Proxy:該類即為動態代理類,作用類似于上例中的ProxySubject,其中主要包含以下內容:
          Protected Proxy(InvocationHandler h):構造函數,估計用于給內部的h賦值。

          Static Class getProxyClass (ClassLoader loader, Class[] interfaces):獲得一個代理類,其中loader是類裝載器,interfaces是真實類所擁有的全部接口的數組。

          Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理類的一個實例,返回后的代理類可以當作被代理類使用(可使用被代理類的在Subject接口中聲明過的方法)。

          所謂Dynamic Proxy是這樣一種class:它是在運行時生成的class,在生成它時你必須提供一組interface給它,然后該class就宣稱它實現了這些interface。你當然可以把該class的實例當作這些interface中的任何一個來用。當然啦,這個Dynamic Proxy其實就是一個Proxy,它不會替你作實質性的工作,在生成它的實例時你必須提供一個handler,由它接管實際的工作。(參見文獻3)

          在使用動態代理類時,我們必須實現InvocationHandler接口,以第一節中的示例為例:

          代碼: //抽象角色(之前是抽象類,此處應改為接口):

          public interface Subject{
          public void request();
          }

          //具體角色RealSubject:實現了Subject接口的request()方法。
          public class RealSubject implements Subject{
          public RealSubject(){

          }
          public void request(){
          System.out.println("From real subject.");
          }
          }

          //代理角色:
          import java.lang.reflect.Method;
          import java.lang.reflect.InvocationHandler;
          public class DynamicSubject implements InvocationHandler{
          private Object sub;
          public DynamicSubject(Object sub){
          this.sub = sub;
          }
          public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
          System.out.println("before calling " + method);
          method.invoke(sub,args);
          System.out.println("after calling " + method);
          return null;
          }
          }

          該代理類的內部屬性為Object類,實際使用時通過該類的構造函數DynamicSubject(Object sub)對其賦值;此外,在該類還實現了invoke方法,該方法中的"method.invoke(sub,args)" 其實就是調用被代理對象的將要被執行的方法,方法參數sub是實際的被代理對象,args為執行被代理對象相應操作所需的參數。通過動態代理類,我們可以在調用之前或之后執行一些相關操作。

          客戶端:
          代碼: import java.lang.reflect.InvocationHandler;
          import java.lang.reflect.Proxy;
          import java.lang.reflect.Constructor;
          import java.lang.reflect.Method;
          public class Client{
          static public void main(String[] args) throws Throwable{
          RealSubject rs = new RealSubject(); //在這里指定被代理類
          InvocationHandler ds = new DynamicSubject(rs); //初始化代理類
          Class cls = rs.getClass();
          //以下是分解步驟
          /*
          Class c = Proxy.getProxyClass(cls.getClassLoader(),cls.getInterfaces());
          Constructor ct=c.getConstructor(new Class[]{InvocationHandler.class});
          Subject subject =(Subject) ct.newInstance(new Object[]{ds});
          */

          //以下是一次性生成

          Subject subject = (Subject) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),ds);
          subject.request();
          }

          通過這種方式,被代理的對象(RealSubject)可以在運行時動態改變,需要控制的接口(Subject接口)可以在運行時改變,控制的方式(DynamicSubject類)也可以動態改變,從而實現了非常靈活的動態代理關系。

          3.代理模式使用原因和應用方面

          (1)授權機制 不同級別的用戶對同一對象擁有不同的訪問權利,如Jive論壇系統中,就使用Proxy進行授權機制控制,訪問論壇有兩種人:注冊用戶和游客(未注冊用戶),Jive中就通過類似ForumProxy這樣的代理來控制這兩種用戶對論壇的訪問權限.

          (2)某個客戶端不能直接操作到某個對象,但又必須和那個對象有所互動.
          舉例兩個具體情況:
          如果那個對象是一個是很大的圖片,需要花費很長時間才能顯示出來,那么當這個圖片包含在文檔中時,使用編輯器或瀏覽器打開這個文檔,打開文檔必須很迅速,不能等待大圖片處理完成,這時需要做個圖片Proxy來代替真正的圖片.

          如果那個對象在Internet的某個遠端服務器上,直接操作這個對象因為網絡速度原因可能比較慢,那我們可以先用Proxy來代替那個對象.

          總之原則是,對于開銷很大的對象,只有在使用它時才創建,這個原則可以為我們節省很多寶貴的Java內存. 所以,有些人認為Java耗費資源內存,我以為這和程序編制思路也有一定的關系.

          (3)現實中,Proxy應用范圍很廣,現在流行的分布計算方式RMI和Corba等都是Proxy模式的應用

           

          本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/goodHabit/archive/2009/11/08/4784461.aspx

          posted @ 2010-02-04 17:52 lucas_y 閱讀(208) | 評論 (0)編輯 收藏
          JAVA反射機制
              JAVA反射機制是在運行狀態中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法;這種動態獲取的信息以及動態調用對象的方法的功能稱為java語言的反射機制。
          Java反射機制主要提供了以下功能: 在運行時判斷任意一個對象所屬的類;在運行時構造任意一個類的對象;在運行時判斷任意一個類所具有的成員變量和方法;在運行時調用任意一個對象的方法;生成動態代理。
          1. 得到某個對象的屬性

          1 public Object getProperty(Object owner, String fieldName) throws Exception {
          2     Class ownerClass = owner.getClass();

          4     Field field = ownerClass.getField(fieldName);

          6     Object property = field.get(owner);

          8     return property;
          9 }
          Class ownerClass = owner.getClass():得到該對象的Class。

          Field field = ownerClass.getField(fieldName):通過Class得到類聲明的屬性。

          Object property = field.get(owner):通過對象得到該屬性的實例,如果這個屬性是非公有的,這里會報IllegalAccessException。

          2. 得到某個類的靜態屬性

           1 public Object getStaticProperty(String className, String fieldName)
           2             throws Exception {
           3     Class ownerClass = Class.forName(className);
           4 
           5     Field field = ownerClass.getField(fieldName);
           6 
           7     Object property = field.get(ownerClass);
           8 
           9     return property;
          10 }

          Class ownerClass = Class.forName(className) :首先得到這個類的Class。

          Field field = ownerClass.getField(fieldName):和上面一樣,通過Class得到類聲明的屬性。

          Object property = field.get(ownerClass) :這里和上面有些不同,因為該屬性是靜態的,所以直接從類的Class里取。

          3. 執行某對象的方法

           1 public Object invokeMethod(Object owner, String methodName, Object[] args) throws Exception {
           2 
           3     Class ownerClass = owner.getClass();
           4 
           5     Class[] argsClass = new Class[args.length];
           6 
           7     for (int i = 0, j = args.length; i < j; i++) {
           8         argsClass[i] = args[i].getClass();
           9     }
          10 
          11     Method method = ownerClass.getMethod(methodName, argsClass);
          12 
          13     return method.invoke(owner, args);
          14 }
          Class owner_class = owner.getClass() :首先還是必須得到這個對象的Class。

          5~9行:配置參數的Class數組,作為尋找Method的條件。

          Method method = ownerClass.getMethod(methodName, argsClass):通過Method名和參數的Class數組得到要執行的Method。

          method.invoke(owner, args):執行該Method,invoke方法的參數是執行這個方法的對象,和參數數組。返回值是Object,也既是該方法的返回值。

          4. 執行某個類的靜態方法

           1 public Object invokeStaticMethod(String className, String methodName,
           2             Object[] args) throws Exception {
           3     Class ownerClass = Class.forName(className);
           4 
           5     Class[] argsClass = new Class[args.length];
           6 
           7     for (int i = 0, j = args.length; i < j; i++) {
           8         argsClass[i] = args[i].getClass();
           9     }
          10 
          11     Method method = ownerClass.getMethod(methodName, argsClass);
          12 
          13     return method.invoke(null, args);
          14 }

          基本的原理和實例3相同,不同點是最后一行,invoke的一個參數是null,因為這是靜態方法,不需要借助實例運行。

          5. 新建實例
           1 
           2 public Object newInstance(String className, Object[] args) throws Exception {
           3     Class newoneClass = Class.forName(className);
           4 
           5     Class[] argsClass = new Class[args.length];
           6 
           7     for (int i = 0, j = args.length; i < j; i++) {
           8         argsClass[i] = args[i].getClass();
           9     }
          10 
          11     Constructor cons = newoneClass.getConstructor(argsClass);
          12 
          13     return cons.newInstance(args);
          14 
          15 }

          這里說的方法是執行帶參數的構造函數來新建實例的方法。如果不需要參數,可以直接使用newoneClass.newInstance()來實現。

          Class newoneClass = Class.forName(className):第一步,得到要構造的實例的Class。

          第5~第9行:得到參數的Class數組。

          Constructor cons = newoneClass.getConstructor(argsClass):得到構造子。

          cons.newInstance(args):新建實例。

          6. 判斷是否為某個類的實例

          1 public boolean isInstance(Object obj, Class cls) {
          2     return cls.isInstance(obj);
          3 }

          7. 得到數組中的某個元素
          1 public Object getByArray(Object array, int index) {
          2     return Array.get(array,index);
          3 }
          posted @ 2010-02-04 17:00 lucas_y 閱讀(175) | 評論 (0)編輯 收藏
          win7快捷鍵大全



          一、Win鍵相關的快捷鍵
          鍵位
           操作
           
          Win Home
           將所有使用中窗口以外的窗口最小化(和搖動使用中窗口一樣意思) 
          Win Space空格鍵 將所有桌面上的窗口透明化(和鼠標移到工作列的最右下角一樣意思) 
          Win  ↑ 上方向鍵
           最大化使用中窗口(和將窗口用鼠標拖到屏幕上緣一樣意思) 
          Shift Win  ↑ 上方向鍵
           垂直最大化使用中窗口(但水平寬度不變) 
          Win ↓ 下方向鍵 最小化窗口/還原先前最大化的使用中窗口 
          Win 左/右方向鍵 將窗口靠到屏幕的左右兩側(和將窗口用鼠標拖到左右邊緣一樣意思) 
          Shift Win 左/右方向鍵 將窗口移到左、右屏幕(如果你有接雙屏幕的話)工作列快速列 
          Win 1~9 開啟工作列上相對應的軟件,從左到右依順序為Win+1到Win+9 
          Shift Win 1~9 開啟對應位置軟件的一個新「分身」,例如firefox的話會是開新窗口(鼠標是Shift+點軟件) 
          Ctrl Win 1~9 在對應位置軟件已開的分身中切換 
          Alt Win 1~9 開啟對應位置軟件的右鍵選單 
          Ctrl Shift 鼠標點軟件 以管理員權限開啟該軟件 
          WIN 點擊任務欄快捷方式 在此程序中新建一個實例 
          Win  (+/-):       打開Windows放大、縮小功能 
          Win 在屏幕上的Gadget 間切換 
          Win 打開移動中心 
          Win 顯示桌面,最小化所有窗口 
          Win 打開資源管理器 
          Win 打開資源管理器搜索結果 
          Win 鎖定計算機,回到登陸窗口 
          Win 最小化當前窗口 
          Win 投影機輸出設定(僅屏幕、同步顯示、延伸、僅投影機) 
          Win 打開運行窗口 
          Win 工作列的Alt+Tab 
          Win 打開控制面板輕松訪問中心 
          Win Break 打開控制面板系統屬性 
          Win Tab 打開Flip3D任務切換功能 


           

          二、Windows基礎快捷鍵

          鍵位
           操作
           
          F1
           幫助
           
          Ctrl+C Ctrl+Insert)
           復制選中項目
           
          Ctrl+X
           剪切選中項目
           
          Ctrl+V Shift+Insert)
           粘貼選中項目
           
          Ctrl+Z
           撤銷
           
          Ctrl+Y
           重做
           
          Delete Ctrl+D)
           刪除選中項目至回收站
           
          Shift+Delete
           直接刪除選中項目
           
          F2
           重命名選中項目
           
          Ctrl+A
           全選
           
          F3
           搜索
           
          Alt+Enter
           顯示選中項目屬性
           
          Alt+F4
           關閉當前項目或退出當前程序
           
          Alt+空格
           打開當前窗口的快捷方式菜單
           
          Alt+Tab
           在當前運行的窗口中切換
           
          Ctrl+Alt+Tab
           使用方向鍵在當前運行的窗口中切換
          Ctrl+滾輪
           改變桌面圖標大小
           
             +Tab
           開啟Aero Flip 3-D
           
          Ctrl+  +Tab
           使用方向鍵在 Aero Flip 3D程序中切換
           
          Alt+Esc
           在當前打開的程序間切換
           
          F4
           顯示資源管理器的地址欄列表
           
          Shift+F10
           顯示選中項目的快捷方式菜單
           
          Ctrl+Esc
           打開開始菜單
           
          F10
           激活當前窗口的菜單欄
           
          F5 Ctrl+R)
           刷新
           
          Alt+ 
           資源管理區中返回文件夾的上一級菜單
           
          Esc
           取消當前操作
           
          Ctrl+Shift+Esc
           打開任務欄管理器
           
          插入碟片時按住Shift
           禁止CD/DVD的自動運行
           
          右邊或左邊的 Ctrl+Shift
           改變閱讀順序
           


          三、資源管理器相關快捷鍵



          鍵位
           操作
           
          Ctrl N
           打開新窗口
           
          Ctrl W
           關閉當前窗口
           
          Ctrl Shift N
           新建文件夾
           
          End
           顯示文件夾底部
           
          Home
           顯示文件夾頂部
           
          F11
           最大/最小化當前文件夾
           
          Ctrl 句號 (.)
           順時針方向旋轉圖片
           
          Ctrl 逗號 (,)
           逆時針方向旋轉圖片
           
          Num Lock 小鍵盤星號 (*)
           顯示選中文件夾下的所有子文件夾
           
          Num Lock 小鍵盤加號( )
           顯示選中文件夾的內容
           
          Num Lock 小鍵盤減號 (-)
           折疊選中文件夾
           

           折疊選中文件夾或返回父文件夾
           
          Alt Enter
           打開選中項目的屬性對話框
           
          Alt P
           預覽面板開關
           
          Alt 
           打開上一個文件夾
           
          Backspace
           打開上一個文件夾
           

           選中第一個子文件夾
           
          Alt 
           打開下一個文件夾
           
          Alt 
           返回上一層文件夾
           
          Ctrl 滾輪
           改變圖標大小
           
          Alt D
           選中地址欄
           
          Ctrl E
           選中搜索框
           
          Ctrl F
           選中搜索框
           
          Shift+右鍵點選文件 出現「附到開始菜單」和「復制為路徑」兩個額外的右鍵選項 
          Shift+右鍵點選文件夾 出現「在新處理程序開啟(另開新窗口)」、
          「在此處開啟命令窗口(DOS!)」和
          「復制為路徑」三個額外的右鍵選項
           


          四、任務欄快捷鍵



          鍵位
           操作
           
          Shift 點擊任務欄程序按鈕
           在新窗口中打開此程序
           
          Ctrl Shift 點擊任務欄程序按鈕
           以管理員身份運行此程序
           
          Shift 右鍵點擊任務欄程序按鈕
           打開此程序的窗口菜單
           
          Shift 右鍵點擊任務欄分組按鈕
           打開本組的窗口菜單
           
          Ctrl 點擊任務欄分組按鈕
           在本組窗口中循環 

           

          “windows鍵”+“方向鍵”=大小化

            通過“windows鍵”+“方向鍵”,可分別實現“使當前窗口最大化”、“當前窗口最小化”、“窗口貼向屏幕左側或右側,占用50%面積”四個操作結果。

            而“windows鍵”+“Home”,可實現最小化其他的“非當前使用中的窗口”。例如當前正在使用“IE瀏覽器”,通過此快捷鍵,可以把其他暫時不用的窗口最小化到任務欄上。再次按此快捷鍵,最小化窗口又會全部出現。

            “windows鍵”+“Space”=窗口透明化

            “windows鍵”+“Space”,可將目前顯示的所有窗口透明化,以便查看桌面。“windows鍵”+“D”可將目前顯示的所有窗口最小化,以便查看桌面。

            以往我們打開一個程序的新窗口時(比如word),需要在已經打開的word窗口的工具欄中選擇“新建”,現在通過windows7快捷鍵,只需一個操作就可以快速新建一個窗口,即“Shift”+“鼠標左鍵”組合快捷鍵。按住Shift鍵,在某個程序圖標上點擊鼠標左鍵,可以打開一個此程序的“新建窗口”。

            “windows鍵”+數字鍵=快速啟動

            windows7左下方有快速啟動欄,通過“windows鍵”+數字鍵,可快捷打開固定在快速啟動欄中的程序,如要打開排在第二位的IE程序,可以使用Win+2即可快速打開。

            通過“Shift鍵”+“鼠標右鍵”可實現一組程序的還原、最大或關閉操作。按住Shift鍵,在某個程序圖標上點擊鼠標右鍵。

            通過“Window Menu”,進行還原、移動、最大/最小化等操作。如果某個程序已經打開了很多窗口,那么“WindowsMenu”將可以進行還原、最大/最小化、關閉組。

           

          以下六種快捷鍵組合是所謂的“鍵盤流”高手最常用的六種,習慣使用這幾種之后,我們會發現自己操作電腦的速度會快如此之多!這些快捷鍵經測試在win7下也可以正常使用。(微軟:汗……我可沒傻到在win7里頭去掉這些大大方便用戶的功能……)

            1.Win+D: 這是高手最常用的第一快捷組合鍵。這個快捷鍵組合可以將桌面上的所有窗口瞬間最小化,無論是聊天的窗口還是游戲的窗口……只要再次按下這個組合鍵,剛才的所有窗口都回來了,而且激活的也正是你最小化之前在使用的窗口!

            2.Win+F:不用再去移動鼠標點“開始→搜索→文件和文件夾”了,在任何狀態下,只要一按Win+F就會彈出搜索窗口。

            3.Win+R:在我們的文章中,你經常會看到這樣的操作提示:“點擊‘開始→運行’,打開‘運行’對話框……”。其實,還有一個更簡單的辦法,就是按Win+R!

            4.Alt+Tab:如果打開的窗口太多,這個組合鍵就非常有用了,它可以在一個窗口中顯示當前打開的所有窗口的名稱和圖標,選中自己希望要打開的窗口,松開這個組合鍵就可以了。而alt+tab+shift鍵則可以反向顯示當前打開的窗口。

            5.Win+E:當你需要打開資源管理器找文件的時候,這個快捷鍵會讓你感覺非常“爽”!再也不用騰出一只手去摸鼠標了!

            6.Win:就是開始菜單咯!!!

           

          1. Windows鍵 + 空格鍵“Space”

            功能:透明化所有窗口,快速查看桌面。使用此快捷鍵可以立即將目前顯示的所有窗口透明化,以便查看桌面。這有什么用?如果你已經習慣使用vista系統中的側邊欄小工具,Windows 7系統中的小工具更是可以隨心所欲在桌面上擺放,當你正在工作時,突然想起看看時間、股票指數、日程安排...按下這組快捷鍵就會馬上看見,放手后立即恢復之前的窗口,對自己的工作毫無影響。

          Win7鍵盤常用快捷鍵組合 - Loshua - 忘憂Yu軒

          Win7鍵盤常用快捷鍵組合 - Loshua - 忘憂Yu軒

            按下Windows鍵 + 空格鍵“Space”快捷鍵后桌面顯示

            2. Windows鍵 + 字母鍵“D”

            功能:最小化所有窗口,并快速查看桌面。這組快捷鍵幫助用戶立即將當前桌面上所有窗口最小化,以便查看桌面,再次按下此快捷鍵時,剛剛最小化的窗口又會全部出現了。

            不知道小編是否已經講清了以上兩組快捷鍵的不同用法,如果還不是太明白的網友,自己試試便知。

            3. Windows鍵 + 數字鍵

            功能:按照數字排序打開相應程序。針對固定在快速啟動欄中的程序,如果你能記住啟動欄中的程序排序,直接按下此快捷鍵就能馬上調用了,如圖中啟動欄上的IE瀏覽器排在第一位,使用“Win+1”快捷鍵立即打開IE瀏覽器。

          Win7鍵盤常用快捷鍵組合 - Loshua - 忘憂Yu軒

            4. Windows鍵 + 字母鍵“T”

            功能:依次查看已經打開程序的預覽圖。Windows 7的強大任務欄得到了大量用戶的喜愛,用戶可以輕松從任務欄預覽已打開程序的縮略圖,使用這組快捷鍵就能從左到右循環查看任務欄上的所有預覽圖,同時使用Windows鍵+Shift鍵+“T”可以從右至左,相反方向循環查看任務欄上的預覽圖。

            5. Windows鍵 + 字母鍵“G”

            功能:依次顯示桌面小工具。微軟vista系統開始啟用了桌面小工具這一深受用戶喜愛的功能,Windows 7系統中繼續將該特性充分發揮,如果你的桌面上有太多的小工具以致于發生層疊的時候,查看起來就不太方便了,此時使用快捷鍵迅速讓層疊的小工具依次顯示在面前,想找哪一個都十分方便。

            6. Windows鍵 + 字母鍵“P”

            功能:打開“外接顯示”的設置面板,當然這個功能只有接入了一些外接設備后才能派上用場。

            7. Windows鍵 + 字母鍵“X”

            功能:打開“移動中心”設置面板,Windows 7中的移動中心提供了顯示器亮度控制、音量控制、筆記本電池監控、Mobile手機同步設置、外接顯示器管理...等多種功能。

          Win7鍵盤常用快捷鍵組合 - Loshua - 忘憂Yu軒

            8. Windows鍵 + 符號鍵“+” 功能:打開放大鏡。Windows 7中新增加了放大鏡功能,也許對于視力不好的用戶來說十分友好的一項新功能。當首次按下此快捷鍵組合時,Windows 7將自動打開放大鏡功能,重復使用該快捷鍵可以不斷放大內容。能放大當然也必須能縮小至還原,使用Windows鍵+符號鍵“-”即可實現縮小功能。

           

           

          按住右Shift 八秒鐘: 啟用和關閉篩選鍵
            按左 Alt+左 Shift+PrtScn(或 PrtScn):啟用或關閉高對比度
            按左 Alt+左 Shift+Num Lock :啟用或關閉鼠標鍵
            按 Shift 五次: 啟用或關閉粘滯鍵
            按住 Num Lock 五秒鐘:啟用或關閉切換鍵
            Windows 徽標鍵 : 打開輕松訪問中心
            3. 對話框鍵盤快捷方式
            Ctrl+Tab 在選項卡上向前移動
            Ctrl+Shift+Tab 在選項卡上向后移動
            Tab 在選項上向前移動
            Shift+Tab 在選項上向后移動
            Alt+加下劃線的字母 執行與該字母匹配的命令(或選擇選項)
            Enter 對于許多選定命令代替單擊鼠標
            空格鍵 如果活動選項是復選框,則選中或清除該復選框
            箭頭鍵 如果活動選項是一組選項按鈕,則選擇某個按鈕
            F1 顯示幫助
            F4 顯示活動列表中的項目
            Backspace 如果在“另存為”或“打開”對話框中選中了某個文件夾,則打開上一級文件夾
            4. Windows 徽標鍵相關的快捷鍵
            Windows徽標鍵就是顯示為Windows旗幟,或標有文字Win或Windows的按鍵,以下簡稱Win鍵。XP時代有4個經典的 Win 鍵組合:R/E/F/L。到了 Win7,花樣更多了。
            Win:打開或關閉開始菜單
            Win Pause:顯示系統屬性對話框
            Win D:顯示桌面
            Win M:最小化所有窗口
            Win SHIFT M:還原最小化窗口到桌面上
            Win E:打開我的電腦
            Win F:搜索文件或文件夾
            Ctrl Win F:搜索計算機(如果您在網絡上)
            Win L:鎖定您的計算機或切換用戶
            Win R:打開運行對話框
            Win T:切換任務欄上的程序(感覺是和alt+ESC 一樣 )
            Win 數字:讓位于任務欄指定位置(按下的數字作為序號)的程序,新開一個實例。(感覺這個比較新穎,貌似快速啟動。) Shift Windows logo key +number:Start new instance of the program pinned to the taskbar in the position indicated by the number
            Ctrl Win 數字:讓位于任務欄指定位置(按下的數字作為序號)的程序,切換到上一次的活動窗口。 Ctrl+Windows logo key +number:Switch to the last active window of the program pinned to the taskbar in the position indicated by the number
            ALT Win 數字:讓位于任務欄指定位置(按下的數字作為序號)的程序,顯示跳轉清單。 Alt+Windows logo key +number: Open the Jump List for the program pinned to the taskbar in the position indicated by the number
            Win TAB:循環切換任務欄上的程序并使用的Aero三維效果
            Ctrl Win TAB:使用方向鍵來循環循環切換任務欄上的程序,并使用的Aero三維效果
            按Ctrl Win B:切換到在通知區域中顯示信息的程序
            Win 空格:預覽桌面
            Win ↑:最大化窗口
            Win ↓:最小化窗口
            Win ←:最大化到窗口左側的屏幕上
            Win →:最大化窗口到右側的屏幕上
            Win Home:最小化所有窗口,除了當前激活窗口
            Win+ SHIFT ↑:拉伸窗口的到屏幕的頂部和底部
            Win+ SHIFT →/←:移動一個窗口,從一個顯示器到另一個
            Win P:選擇一個演示文稿顯示模式
            Win G:循環切換側邊欄的小工具
            Win U:打開輕松訪問中心
            Win x:打開Windows移動中心

          posted @ 2010-02-01 13:59 lucas_y 閱讀(2472) | 評論 (0)編輯 收藏
          一.類型轉換
          eg:point 自動轉換PointAction-conversion.properties  在“-”前面要與一個包下的action同名,里面內容是point = com.test.util.TypeConverter,而TypeConverter是TypeConverter extends DefaultTypeConverter,結構如下:


          示例代碼如下:
          @Override
           public Object convertValue(Map context, Object value, Class toType) {
            if (Point.class == toType) {
             Point point = new Point();
             if (value != null && !"".equals(value)) {
              String[] str = (String[])value;
              String[] val = str[0].split(",");
              if (val != null && 2 == val.length) {
               String x = val[0];
               String y = val[1];
               if (StringUtil.isInteger(x) && StringUtil.isInteger(y)) {
                point.setX(Integer.parseInt(x));
                point.setY(Integer.parseInt(y));
               }
              }
             }
             return point;
            } else if (String.class == toType) {
             StringBuffer sb = new StringBuffer();
             Point point = (Point)value;
             Integer x = point.getX();
             Integer y = point.getY();
             sb.append("[").append(x).append(",").append(y).append("]");
             return sb.toString();
            }
            return null;
           }

          總結:
          類型轉換:    
          全局                                                                局部
          ***Action-conversion.properties             xwork-converison.properties

          校驗:
          ***Action.properties                                  message.properies(message名字可任意取,但要在配置)
          ***Action-validation.xml (配置的元素在package com.opensymphony.xwork2.validator.validators.default.xml里)                          
          posted @ 2010-01-27 18:23 lucas_y 閱讀(185) | 評論 (0)編輯 收藏

          1.策略模式:封裝了變化(算法),而且便利進行單元測試(可以通過自己的借口進行單元測試),在實際情況中,為了使客戶端減小判斷的壓力并且降低耦合,最好與簡單工廠模式結合,把選擇判斷寫在context的構造方法里。考慮到健壯性,(比如增加需求,有新的算法)用發射機制。(反射,反射,程序員的快樂,呵呵~)

          持續更新,謝謝~

          posted @ 2010-01-25 17:35 lucas_y 閱讀(168) | 評論 (0)編輯 收藏
               摘要: Spring Security-3.0.1中文官方文檔(翻譯版) 這次發布的Spring Security-3.0.1是一個bug fix版,主要是對3.0中存在的一些問題進行修正。文檔中沒有添加新功能的介紹,但是將之前拼寫錯誤的一些類名進行了修正,建議開發者以這一版本的文檔為參考。 另:Spring Security從2010-01-01以后,版本控制從SVN換成了GIT,我們在翻譯文...  閱讀全文
          posted @ 2010-01-19 16:48 lucas_y 閱讀(2112) | 評論 (0)編輯 收藏
          僅列出標題  下一頁
          主站蜘蛛池模板: 光山县| 房产| 靖边县| 敖汉旗| 长子县| 靖州| 资阳市| 开原市| 湟源县| 阳原县| 大田县| 遂宁市| 伽师县| 连城县| 上林县| 青海省| 拜城县| 溧水县| 抚顺市| 开原市| 海伦市| 满洲里市| 深水埗区| 通化县| 华池县| 江安县| 舞阳县| 砀山县| 客服| 大渡口区| 北川| 咸宁市| 江西省| 子长县| 万年县| 九龙县| 新竹市| 广平县| 仙居县| 饶阳县| 冀州市|