Vincent Jia 博客

          to be a better man, to be a bad man.

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            29 隨筆 :: 3 文章 :: 0 評論 :: 0 Trackbacks

          2010年6月2日 #

          2016年,收獲了什么,失去了什么。 
          博客沒有寫作。
          國家大事件幾多。
          posted @ 2017-12-04 16:53 iLinux 閱讀(219) | 評論 (0)編輯 收藏

          The Collections Framework







          The collections framework is a unified architecture for representing and manipulating collections, allowing them to be manipulated independently of the details of their representation. It reduces programming effort while increasing performance. It allows for interoperability among unrelated APIs, reduces effort in designing and learning new APIs, and fosters software reuse. The framework is based on fourteen collection interfaces. It includes implementations of these interfaces, and algorithms to manipulate them.
          Overview
          • Overview - An overview of the Collections framework.
          API Specification
          • API Reference - An annotated outline of the classes and interfaces comprising the collections framework, with links into the JavaDoc.
          Tutorials and Programmer's Guides
          • Tutorial - A tutorial introduction to the collections framework with plenty of programming examples.
          API EnhancementsMore Information
          • Design FAQ- Answers to frequently asked questions concerning the design of the collections framework.

          From: http://docs.oracle.com/javase/6/docs/technotes/guides/collections/index.html
          posted @ 2012-07-06 16:15 iLinux 閱讀(275) | 評論 (0)編輯 收藏

          API Enhancements

          posted @ 2012-07-06 16:14 iLinux 閱讀(282) | 評論 (0)編輯 收藏

          LinkedHashSet是JDK 1.4中引入的新的集合類(LinkedHashMap也是同期引入)。 LinkedHashSet,顧名思義,就是在Hash的實現(xiàn)上添加了Linked的支持。對于LinkedHashSet,在每個節(jié)點上通過一個鏈表串聯(lián)起來,這樣,就可以保證確定的順序。對于希望有常量復雜度的高效存取性能要求、同時又要求排序的情況下,可以直接使用LinkedHashSet。

          它實現(xiàn)了Set接口。存入Set的每個元素必須是唯一的,因為Set不保存重復元素。但是Set接口不保證維護元素的次序(那里面的元素每次順序如何確定?TODO)。Set與Collection有完全一樣的接口Iterable,同時Set繼承了Collection。

          LinkedHashSet具有HashSet的查詢速度,且內部使用鏈表維護元素的順序(插入的順序),于是在使用迭代器便利Set時,結果會按元素插入的次序顯示。

          需求如: 含多個(有重復)元素ArrayList,去除重復。

          1, 可以使用如下略顯冗余的代碼:
           1 public static List removeDuplicateWithOrder(List list) {
           2         Set set = new HashSet();
           3         List newList = new ArrayList();
           4         for (Iterator iter = list.iterator(); iter.hasNext();) {
           5             Object element = iter.next();
           6             if (set.add(element))
           7                 newList.add(element);
           8         }
           9         return newList;
          10     }
          此方法有濫用set之嫌。

          2, 我們也可以使用本文章中提及的LinkedHashSet:
          return new ArrayList<T>(new LinkedHashSet<T>(list));
          此方法,既利用set去除了重復,又使用linked保持住了原順序。

          3, 貌似apache commons lang中有專門去重復的集合工具。

          這兒的鏈表操作是常量級的,這也是LinkedHashSet/LinkedHashMap比TreeSet/TreeMap性能更高的原因。當然,LinkedHashSet不是thread-safe的,在多線程環(huán)境下,需要進行同步包裝:
          Collections.synchronizedCollection(Collection);
          or:
          Collections.synchronizedSet(Set);
          在使用LinkedHashSet的iterator()方法遍歷元素時,如果其他線程有讀取操作,也要進行同步,否則,就會拋出同其它fail-fast一樣的由于刪除或增加操作而引起的CurrentModificationException。


          如上兩種方法的效率比較,設為TODO,
          1, 利用set.add(element)方法,本質是利用其contains()方法判斷,而contains()的本質就是遍歷。
          JDK doc中寫道:
          More formally, adds the specified element e to this set if the set contains no element e2 such that (e==null ? e2==null : e.equals(e2)). If this set already contains the element, the call leaves the set unchanged and returns false. In combination with the restriction on constructors, this ensures that sets never contain duplicate elements.
          2, 測試數(shù)據(jù),可以使用數(shù)據(jù)量:1W,5W,10W,100W。

          posted @ 2012-07-06 11:54 iLinux 閱讀(6223) | 評論 (0)編輯 收藏

          在當前的系統(tǒng)中,大量使用了非泛型模式的Collection、List、Map、HashMap、HashTable。
          其關系、區(qū)別在于。
          posted @ 2012-06-29 17:50 iLinux 閱讀(265) | 評論 (0)編輯 收藏

          在美國得克薩斯州的一個風雪交加的夜晚,一位名叫克雷斯的年輕人因為汽車“拋錨”被困在郊外。正當他萬分焦急的時候,有一位騎馬的男子正巧經(jīng)過這里。見此情景,這位男子二話沒說便用馬幫助克雷斯把汽車拉到了小鎮(zhèn)上。 事后,當感激不盡的克雷斯拿出不菲的美鈔對他表示酬謝時,這位男子說:“這不需要回報,但我要你給我一個承諾,當別人有困難的時候,你也要盡力幫助他人。”于是,在后來的日子里,克雷斯主動幫助了許許多多的人,并且每次都沒有忘記轉述那句同樣的話給所有被他幫助的人。 許多年后的一天,克雷斯被突然暴發(fā)的洪水困在了一個孤島上,一位勇敢的少年冒著被洪水吞噬的危險救了他。當他感謝少年的時候,少年竟然也說出了那句克雷斯曾說過無數(shù)次的話:“這不需要回報,但我要你給我一個承諾……” 克雷斯的胸中頓時涌起了一股暖暖的激流:“原來,我穿起的這根關于愛的鏈條,周轉了無數(shù)的人,最后經(jīng)過少年還給了我,我一生做的這些好事,全都是為我自己做的!”  當您有幸看到此消息時,請轉發(fā)給自己的朋友親人。我相信有更多的人需要我們的幫助, 正義會傳染 邪惡也是如此, 為現(xiàn)在的別人做善事也是為了將來的自己。
          傳遞溫暖,拒絕冷漠。
            1、如果錢還寬裕,別養(yǎng)二奶,偷偷養(yǎng)幾個貧困山區(qū)的學生,你心里一定會覺得舒坦;
            2、遇到夜里擺地攤的,能買就多買一些,別還價,東西都不貴。家境哪怕好一點,誰會大冷天夜里擺地攤;
              遇到學生出來勤工儉學的,特別是中學生、小姑娘,她賣什么你就買點。如果她不是家庭困難,出來打工也需要勇氣的,鼓勵鼓勵她吧;   
            3、撿到錢包就找找失主。如果你實在缺錢就把現(xiàn)金留下,打電話告訴失主就說你在廁所里撿到的。把信用卡、身份證、駕駛執(zhí)照還給人家,一般別人也不會在乎錢了。把人家的地址記在你的筆記本上,以后發(fā)達了去找人家道個歉,把錢還給人家;   
            4、遇到問路的,碰巧你又知道那個地址,就主動告訴一聲。別不好意思,沒有人笑話你;    
            5、如果丟的垃圾里有碎玻璃、大頭針、刀片等,請用膠帶把它們纏裹一下,并盡量多纏幾層。這樣就降低了保潔人員或者撿垃圾者被傷害的概率。他們大都是沒有醫(yī)保的弱勢群體,體貼體貼他們吧,好人會有好報的。
            6、遇到迷路的小孩和老頭老太,能送回家送回家,不能送回家的送上車、送到派出所也行。替老人或小孩打個電話再走,反正你也不缺那兩個電話費;    
            7、雨雪的時候、天冷的傍晚,遇到賣菜的、賣水果的,剩的不多了又不能回家,能全買就全買,不能全買就買一份,反正吃什么也是吃,買下來讓人早點回家;   
            8、上車遇到老弱病人、孕婦,讓座的時候別動聲色,也別大張旗鼓。站起來用身體擋住其他人,留出空位子給需要的人,然后裝作下車走遠點。人太多實在走不遠,人家向你表示謝意的時候微笑一下;   
            9、不要對有精神信念的人用猥褻言詞,要知道中國人缺就缺在沒有信仰。這世界什么都在變,什么都不可全信,唯有信念不變、不動、永恒;   
            10、如果您的時間還寬裕,把這幾句話轉幾個群,網(wǎng)上很多人看,轉了心里舒坦。
            11、一般情況,看完這段文章而且主動到各個群里轉發(fā)的人,都還是遺留著傳統(tǒng)美德的中國好人
          posted @ 2012-06-27 23:08 iLinux 閱讀(252) | 評論 (0)編輯 收藏

          在文章http://www.aygfsteel.com/aoxj/archive/2012/06/16/380926.html中,看到案例,++符號并不是原子操作,
          posted @ 2012-06-27 23:08 iLinux 閱讀(232) | 評論 (0)編輯 收藏

          李小龍傳奇 - 15 Kick-ass Bruce Lee quotes
          http://www.slideshare.net/thepresentationdesigner/15-kickass-bruce-lee-quotes
          posted @ 2012-06-25 17:33 iLinux 閱讀(233) | 評論 (0)編輯 收藏

          OoO
          http://www.bbc.co.uk/worldservice/learningenglish/language/wordsinthenews/2011/08/110803_witn_korea.shtml
          http://developer.51cto.com/col/461/
          http://www.google.com/search?q=runtimeexception&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:zh-CN:official&client=firefox-a#sclient=psy&hl=en&client=firefox-a&rls=org.mozilla:zh-CN%3Aofficial&source=hp&q=spring3+%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86&pbx=1&oq=spring3+%E5%BC%82%E5%B8%B8%E5%A4%84%E7%90%86&aq=f&aqi=&aql=&gs_sm=e&gs_upl=316376l316376l4l316608l1l1l0l0l0l0l0l0ll0l0&fp=1&biw=1280&bih=769&bav=on.2,or.r_gc.r_pw.,cf.osb&cad=b
          http://www.infoq.com/cn/news/2011/01/git-adventures-1
          http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html
          http://www.linuxeden.com/forum/thread-191912-1-1.html
          http://books.slashdot.org/story/04/11/12/2042249/How-Tomcat-Works
          http://static.springsource.org/spring/docs/3.1.0.M2/spring-framework-reference/html/orm.html#orm-hibernate
          http://stackoverflow.com/questions/tagged/spring?sort=faq&pagesize=15
          http://xiaolinjava.iteye.com/blog/684292
          http://www.donews.com/original/201112/1011333.shtm
          http://www.readwriteweb.com/archives/top_10_social_web_products_of_2011.php
          http://www.readwriteweb.com/archives/the_10_biggest_web_news_stories_of_2011.php
          http://blog.csdn.net/buoll/article/details/1851149
          http://www.aygfsteel.com/masen/articles/118701.html
          http://www.baidu.com/s?bs=org.springframework.jdbc.datasource.DriverManagerDataSource&f=8&rsv_bp=1&wd=tomcat+jndi&inputT=2640
          http://home.51.com/xiaohei267/diary/item/10048051.html
          http://blog.csdn.net/wzl002/article/details/5969635
          http://www.baidu.com/s?bs=spring+controller+%D7%AA%B7%A2&f=8&rsv_bp=1&wd=spring+3.0+%B4%EE%BD%A8&inputT=7004
          http://book.ifeng.com/lianzai/detail_2010_08/25/2309143_11.shtml
          http://www.learnamericanenglishonline.com/
          http://bulo.hjenglish.com/app/menu/558/
          http://bulo.hjenglish.com/menu/zzk?langs=en
          posted @ 2011-12-30 15:46 iLinux 閱讀(304) | 評論 (0)編輯 收藏

          沃夏克的《自新大陸交響曲》 卡拉揚指揮



          posted @ 2011-12-30 03:45 iLinux 閱讀(211) | 評論 (0)編輯 收藏

          “開-閉”原則 (Open-Closed principle, OCP)

           

          一個軟件實體應當對擴展開放,對修改關閉。

          Software entities should be open for extension, but closed for modification.

          在設計一個模塊的時候,應當使這個模塊可以在不被修改的前提下被擴展。

           

          “可變性的封裝原則”從工程的角度講解了如何實現(xiàn)“開-閉”原則。

             “可變性的封裝原則”意味著兩點:

          1.一種可變性不應當散落在代碼的很多角落里,而應當被封裝到一個對象里面。繼承應當被看做是封裝變化的方法,而不應當被認為是從一般的對象生成特殊的對象方法。

          2.一種可變性不應當與另一種可變性混合在一起。所有的類圖的繼承結構一般不會超過兩層,不然就意味著將兩種不同的可變性混合在一起。

           

          “開-閉”原則與其他原則的關系:

           

          里氏代換原則是,任何基類可以出現(xiàn)的地方,子類一定可以出現(xiàn)。

          里氏代換原則是對“開-閉”原則的補充。實現(xiàn)“開-閉”原則的關鍵步驟就是抽象化,而基類與子類的繼承關系就是抽象化的具體體現(xiàn),所以里氏代換原則是對實現(xiàn)抽象化的具體步驟的規(guī)范。違反里氏代換原則的,也違背“開-閉”原則,反之不一定成立。

           

          依賴倒轉原則是,要依賴于抽象,不要依賴于實現(xiàn)。

          “開-閉”原則是目標,依賴倒轉原則是手段。

           

          合成/聚合復用原則是,要盡量使用合成/聚合,而不是繼承關系達到復用的目的。

          合成/聚合復用原則與里氏代換原則相輔相成,兩者都是實現(xiàn)“開-閉”原則的具體步驟的規(guī)范。

           

          迪米特法則是,一個軟件實體應當與盡可能少的其他實體發(fā)生相互作用。

          一個遵守迪米特原則設計出來的系統(tǒng)在功能需要擴展時,會相對更容易地做到對修改的關閉。

           

          接口隔離原則是,應當為客戶端提供盡可能小的單獨的接口,而不是提供大的總接口。

          接口隔離原則與廣義的迪米特法則都是對一個軟件實體與其他的軟件實體的通信的限制。遵循接口隔離原則,會使一個軟件系統(tǒng)在功能擴展的過程當中,不會將修改的壓力傳遞到其他的對象。

           

          一個重構方法的討論

           

          “將條件轉移語句改寫成為多態(tài)性”是一條廣為流傳的代碼重構做法。

          這一做法本身并不能保證“開-閉”原則,應當以“開-閉”原則判斷是否需要改寫成多態(tài)。條件轉移并不是錯誤,如果需要,完全可以選擇使用條件轉移。

          如果一個條件轉移語句確實封裝了某種商務邏輯的可變性,那么將此種可變性封裝起來就符合“開-閉”原則設計思想了。如果一個條件轉移語句沒有涉及重要的商務邏輯,或者不會隨著時間的變化而變化,也不意味著任何的可擴展性,那么它就沒有涉及任何有意義的可變性。這時候將這個條件轉移語句改寫成多態(tài)性就是一種沒有意義的浪費。

           

          抽象類應當擁有盡可能多的共同代碼

           在一個繼承的等級結構中,共同的代碼應當盡量向等級結構的上方移動。把重復的代碼從子類里面移動到超類里面,可以提高代碼的復用率。在代碼發(fā)生改變時,設計師之需要修改一個地方。

           

          抽象類應當擁有盡可能少的數(shù)據(jù)

          與代碼的移動方向相反,數(shù)據(jù)的移動方向是從抽象類到具體類,向等級結構的下方移動。一個對象的數(shù)據(jù)不論是否使用都會占用資源,所以應當放到等級結構的低端。

           

          什么時候才應當使用繼承復用

          1.子類是超類的一個特殊種類,而不是超類的一個角色,Is-A才符合繼承關系。

          2.永遠不會出現(xiàn)需要將子類換成另一個類的子類的情況。

          3.子類具有擴展超類的責任,而不是具有置換掉(Override)和注銷掉(Nullify)超類的責任。

          4.只有在分類學角度上有意義時,才可以使用繼承,不要從工具類繼承。


          轉載自:“開-閉”原則 (Open-Closed principle, OCP)
          posted @ 2011-12-08 16:51 iLinux 閱讀(206) | 評論 (0)編輯 收藏

          前段時間系統(tǒng)升級時遭遇了OOM,具體解決過程見 遭遇OutOfMemoryError
          為了鞏固對于java啟動各項參數(shù)的認識,決定將所有參數(shù)列舉出來,并一一解釋,以便后查;

          java啟動參數(shù)共分為三類;
          其一是標準參數(shù)(-),所有的JVM實現(xiàn)都必須實現(xiàn)這些參數(shù)的功能,而且向后兼容;
          其二是非標準參數(shù)(-X),默認jvm實現(xiàn)這些參數(shù)的功能,但是并不保證所有jvm實現(xiàn)都滿足,且不保證向后兼容;
          其三是非Stable參數(shù)(-XX),此類參數(shù)各個jvm實現(xiàn)會有所不同,將來可能會隨時取消,需要慎重使用;
          本文主要描述標準參數(shù)部分,剩下的兩個部分將會陸續(xù)推出;

          標準參數(shù)列表如下:
          -client 
           設置jvm使用client模式,特點是啟動速度比較快,但運行時性能和內存管理效率不高,通常用于客戶端應用程序或者PC應用開發(fā)和調試。

          -server
           設置jvm使server模式,特點是啟動速度比較慢,但運行時性能和內存管理效率很高,適用于生產(chǎn)環(huán)境。在具有64位能力的jdk環(huán)境下將默認啟用該模式,而忽略-client參數(shù)。

          -agentlib:libname[=options] 
           用于裝載本地lib包;
           其中l(wèi)ibname為本地代理庫文件名,默認搜索路徑為環(huán)境變量PATH中的路徑,options為傳給本地庫啟動時的參數(shù),多個參數(shù)之間用逗號分隔。在Windows平臺上jvm搜索本地庫名為libname.dll的文件,在linux上jvm搜索本地庫名為libname.so的文件,搜索路徑環(huán)境變量在不同系統(tǒng)上有所不同,比如Solaries上就默認搜索LD_LIBRARY_PATH。
           比如:-agentlib:hprof
           用來獲取jvm的運行情況,包括CPU、內存、線程等的運行數(shù)據(jù),并可輸出到指定文件中;windows中搜索路徑為JRE_HOME/bin/hprof.dll。

          -agentpath:pathname[=options] 
           按全路徑裝載本地庫,不再搜索PATH中的路徑;其他功能和agentlib相同;更多的信息待續(xù),在后續(xù)的JVMTI部分會詳述。

          -classpath classpath 
          -cp classpath
           
           告知jvm搜索目錄名、jar文檔名、zip文檔名,之間用分號;分隔;使用-classpath后jvm將不再使用CLASSPATH中的類搜索路徑,如果-classpath和CLASSPATH都沒有設置,則jvm使用當前路徑(.)作為類搜索路徑。
           jvm搜索類的方式和順序為:Bootstrap,Extension,User。
           Bootstrap中的路徑是jvm自帶的jar或zip文件,jvm首先搜索這些包文件,用System.getProperty("sun.boot.class.path")可得到搜索路徑。
           Extension是位于JRE_HOME/lib/ext目錄下的jar文件,jvm在搜索完Bootstrap后就搜索該目錄下的jar文件,用System.getProperty("java.ext.dirs")可得到搜索路徑。
           User搜索順序為當前路徑.、CLASSPATH、-classpath,jvm最后搜索這些目錄,用System.getProperty("java.class.path")可得到搜索路徑。

          -Dproperty=value
           設置系統(tǒng)屬性名/值對,運行在此jvm之上的應用程序可用System.getProperty("property")得到value的值。
           如果value中有空格,則需要用雙引號將該值括起來,如-Dname="space string"。
           該參數(shù)通常用于設置系統(tǒng)級全局變量值,如配置文件路徑,以便該屬性在程序中任何地方都可訪問。

          -enableassertions[:<package name>"..." | :<class name> ] 
          -ea[:<package name>"..." | :<class name> ]
           
           上述參數(shù)就用來設置jvm是否啟動斷言機制(從JDK 1.4開始支持),缺省時jvm關閉斷言機制。
           用-ea 可打開斷言機制,不加<packagename>和classname時運行所有包和類中的斷言,如果希望只運行某些包或類中的斷言,可將包名或類名加到-ea之后。例如要啟動包com.wombat.fruitbat中的斷言,可用命令java -ea:com.wombat.fruitbat...<Main Class>。

          -disableassertions[:<package name>"..." | :<class ; ] 
          -da[:<package name>"..." | :<class name> ]

           用來設置jvm關閉斷言處理,packagename和classname的使用方法和-ea相同,jvm默認就是關閉狀態(tài)。
           該參數(shù)一般用于相同package內某些class不需要斷言的場景,比如com.wombat.fruitbat需要斷言,但是com.wombat.fruitbat.Brickbat該類不需要,則可以如下運行:
           java -ea:com.wombat.fruitbat...-da:com.wombat.fruitbat.Brickbat <Main Class>。
           
          -enablesystemassertions 
          -esa
           
           激活系統(tǒng)類的斷言。
           
          -disablesystemassertions 
          -dsa
           
           關閉系統(tǒng)類的斷言。

          -jar 
           指定以jar包的形式執(zhí)行一個應用程序。
           要這樣執(zhí)行一個應用程序,必須讓jar包的manifest文件中聲明初始加載的Main-class,當然那Main-class必須有public static void main(String[] args)方法。

          -javaagent:jarpath[=options] 
           指定jvm啟動時裝入java語言設備代理。
           Jarpath文件中的mainfest文件必須有Agent-Class屬性。代理類也必須實現(xiàn)公共的靜態(tài)public static void premain(String agentArgs, Instrumentation inst)方法(和main方法類似)。當jvm初始化時,將按代理類的說明順序調用premain方法;具體參見java.lang.instrument軟件包的描述。

          -verbose 
          -verbose:class
           
           輸出jvm載入類的相關信息,當jvm報告說找不到類或者類沖突時可此進行診斷。
          -verbose:gc 
           輸出每次GC的相關情況。
          -verbose:jni 
           輸出native方法調用的相關情況,一般用于診斷jni調用錯誤信息。
           
          -version 
           輸出java的版本信息,比如jdk版本、vendor、model。
          -version:release 
           指定class或者jar運行時需要的jdk版本信息;若指定版本未找到,則以能找到的系統(tǒng)默認jdk版本執(zhí)行;一般情況下,對于jar文件,可以在manifest文件中指定需要的版本信息,而不是在命令行。
           release中可以指定單個版本,也可以指定一個列表,中間用空格隔開,且支持復雜組合,比如:
           -version:"1.5.0_04 1.5*&1.5.1_02+"
           指定class或者jar需要jdk版本為1.5.0_04或者是1.5系列中比1.5.1_02更高的所有版本。

          -showversion 
           輸出java版本信息(與-version相同)之后,繼續(xù)輸出java的標準參數(shù)列表及其描述。
           
          -? 
          -help
           
           輸出java標準參數(shù)列表及其描述。

          -X 
           輸出非標準的參數(shù)列表及其描述。

          以上的這些參數(shù)我們經(jīng)常會在很多情況下用到多個的組合,比如我們在用JProfiler進行跟蹤監(jiān)控時,需要在被監(jiān)控java啟動參數(shù)中加上如下配置:
          -agentlib:jprofilerti=port=8849  -Xbootclasspath/a:/usr/local/jprofiler5/bin/agent.jar
          其中就用到兩個-agentlib和-X參數(shù),bootclasspath參數(shù)的詳細信息將會在非標準參數(shù)中詳細說明。

          轉自:http://blog.csdn.net/sfdev/article/details/2062042

          這篇文章補充說明了-X、-XX參數(shù)的說明:Java命令行運行參數(shù)說明大全(偷來的)

          posted @ 2011-12-08 15:49 iLinux 閱讀(5150) | 評論 (0)編輯 收藏

               摘要: 作者:北南南北贊助: eTony,pandonny,懶貓, Arch來自:LinuxSir.Org摘要: 超級用戶是系統(tǒng)最高權限的擁有者,是系統(tǒng)管理唯一的勝任者;由于權限的超級并且達到無所不能的地步,如果管理不擅,必會對系統(tǒng)安全造成威脅。 除了盡可能的避免用直接用超級用戶root登錄系統(tǒng)外,我們還要學會在普通用戶下臨時切換到超級用戶root下完成必要的系統(tǒng)管理工作;從用戶管理和...  閱讀全文
          posted @ 2011-12-08 15:36 iLinux 閱讀(1514) | 評論 (0)編輯 收藏

          hibernate中,比如B類繼承了A類,它們是可以對應同一張表的。
          可以參考如下文章Hibernate繼承映射一:每個類分層結構一張表

          posted @ 2011-12-08 12:50 iLinux 閱讀(140) | 評論 (0)編輯 收藏

          1 web容器啟動,初始化ActionServlet,加載struts-config.xml,根據(jù)請求路徑和信息找到ActionBean與FormBean

          2 確定將要調用的ActionBean與FormBean,將請求中包含的值填充到FormBean中(Action中要準備好ActionMapping的參數(shù))

          3 struts將請求分發(fā)到相應的的ActionBean處理,ActionMapping參數(shù)ActionForm參數(shù)request,resposne都做為參數(shù)傳給處理請求的ActionBean的execute方法

          4 Action調用業(yè)務邏輯方法,得到返回值ActionForward對象

          5 控制控重回ActionServlet,根據(jù)Action返回的ActionForward對象,轉發(fā)到相應的頁面

          6 處理結果返回瀏覽器

          posted @ 2011-12-08 12:29 iLinux 閱讀(114) | 評論 (0)編輯 收藏

          UML類圖中的關聯(lián)、聚合、組合

          posted @ 2011-12-08 12:25 iLinux 閱讀(131) | 評論 (0)編輯 收藏

          nio:  http://jiayanjujyj.iteye.com/blog/1044364



          posted @ 2011-12-08 00:14 iLinux 閱讀(819) | 評論 (0)編輯 收藏

          1 小白長得很像他的哥哥,打一句成語

          答案:真相大白
          Q:老板,你這不叫牛肉面嗎?怎么連牛肉都沒有?!  

          A:人家還叫老婆餅呢,難不成你買的時候還送你一個老婆 ?! 
          Q一根手指頭的英文叫做 ONE,兩根手指頭的英文叫做TWO,依次類推,四根手手指頭的英文叫做 four,那么彎起來的四根手指頭的英文叫什么  

          A答案:WONDERFFUL (彎的 FOUR)  
          Q:一只兔子和一只跑得很快的烏龜賽跑,猜一猜誰贏拉?  

          A:兔子 ~~

          Q:錯~!是烏龜拉,前面有說是一只跑很快的烏龜,跑很快噢~~

          Q:兔子不甘心,又和一只戴了墨鏡的烏龜比賽跑步,這次誰贏拉?  

          A:恩。。兔子吧

          Q:錯~~!那只烏龜把墨鏡一摘,也!又是剛才那只跑很快的烏龜噢

          english version: http://translate.google.com/translate?langpair=zh-CN%7Cen&hl=zh-CN&ie=UTF8&u=http%3A//www.aygfsteel.com/iLinux/archive/2011/12/07/322634.html
          posted @ 2011-12-07 23:31 iLinux 閱讀(148) | 評論 (0)編輯 收藏

          括號為是否線程安全
          list: LinkedList(no) ArrayList(no) Vector(yes) Stack(yes)
          map: HashMap(no) LinkedHashMap(no) HashTable(yes) WeakHashMap TreeMap
          set: HashSet(no) LinkedHashSet(no) SortedSet TreeSet
          最常用的好像為每行的前兩個
          特征:
          1. Linked開頭的適合快速插入,刪除元素, linked維護元素插入的次序
          2. Set 在 HashMap 的基礎上實現(xiàn), 所以Set結尾的key是不會重復的
          3. Tree開頭的是每次改變發(fā)生排序的, 速度慢
          適用:
          1. 需要快速插入,刪除元素, 用 LinkedList; 需要快速隨機訪問元素,用 ArrayList
          2. Vector 類似 ArrayList, 但是是同步的
          3. Stack 繼承 Vector , 是后進先出的堆棧
          4. HashMap, put進去的對象位置會發(fā)生變化, LinkedHashMap 則不會
          5. HashSet 是專門為快速查詢而設計的, 插入會產(chǎn)生排序(LinkedHashSet 不會), 存入HashSet的對象必須定義hashCode方法
             我的補充:關于“存入HashSet的對象必須定義hashCode方法”,其實不是必須的,但是,當我們沒有重寫hashCode()時,則所有我們添加進Set的對象都不會有重復現(xiàn)象,我們可以添加多個具有相等值得對象,但是,這就與我們的初衷有了背離,Set本身用于存儲unique的對象,所以我們重寫hashCode()和equals(),符合我們的業(yè)務邏輯。
          6. SortedSet 是保持元素的有序順序的Set接口, 添加到 SortedSet 實現(xiàn)類的元素必須實現(xiàn)Comparable接口, TreeSet 類是它的唯一一份實現(xiàn)
          其它:
          1. 非同步的可以進行外部同步,或者使用Collections.synchronizedMap()的方法包裝成一個thread-safe的Map/Set
          2. LinkedHashMap支持兩種排序:插入順序、訪問順序。前者是指按照插入時的順序排序,后者是指按照最舊使用到最近使用的順序
          3. 既然 Set 在 HashMap 的基礎上實現(xiàn), 那么 HashMap 和 HashSet 有什么區(qū)別嗎?
          答: HashMap提供get和put方法, 允許null 值和null 鍵; HashSet 提供add、remove、contains和size方法, 允許null 元素; 其它未知

          轉自:http://xu20cn.blog.51cto.com/274020/229009/
          posted @ 2011-12-07 17:02 iLinux 閱讀(892) | 評論 (0)編輯 收藏

          一、事務的4個基本特征 
              當事務處理系統(tǒng)創(chuàng)建事務時,將確保事務有某些特性。組件的開發(fā)者們假設事務的特性應該是一些不需要他們親自管理的特性。這些特性稱為ACID特性。 ACID就是:原子性(Atomicity )、一致性( Consistency )、隔離性或獨立性( Isolation)和持久性(Durabilily)。 
          1、原子性 (Atomicity ) 
              原子性屬性用于標識事務是否完全地完成,一個事務的任何更新要在系統(tǒng)上完全完成,如果由于某種原因出錯,事務不能完成它的全部任務,系統(tǒng)將返回到事務開始前的狀態(tài)。 
          讓我們再看一下銀行轉帳的例子。如果在轉帳的過程中出現(xiàn)錯誤,整個事務將會回滾。只有當事務中的所有部分都成功執(zhí)行了,才將事務寫入磁盤并使變化 永久化。為了提供回滾或者撤消未提交的變化的能力,許多數(shù)據(jù)源采用日志機制。例如,SQL Server使用一個預寫事務日志,在將數(shù)據(jù)應用于(或提交到)實際數(shù)據(jù)頁面前,先寫在事務日志上。但是,其他一些數(shù)據(jù)源不是關系型數(shù)據(jù)庫管理系統(tǒng) (RDBMS),它們管理未提交事務的方式完全不同。只要事務回滾時,數(shù)據(jù)源可以撤消所有未提交的改變,那么這種技術應該可用于管理事務。 
          2、一致性( Consistency ) 
              事務在系統(tǒng)完整性中實施一致性,這通過保證系統(tǒng)的任何事務最后都處于有效狀態(tài)來實現(xiàn)。如果事務成功地完成,那么系統(tǒng)中所有變化將正確地應用,系統(tǒng)處于有效狀態(tài)。如果在事務中出現(xiàn)錯誤,那么系統(tǒng)中的所有變化將自動地回滾,系統(tǒng)返回到原始狀態(tài)。因為事務開 
          始時系統(tǒng)處于一致狀態(tài),所以現(xiàn)在系統(tǒng)仍然處于一致狀態(tài)。 再讓我們回頭看一下銀行轉帳的例子,在帳戶轉換和資金轉移前,帳戶處于有效狀態(tài)。如果事務成功地完成,并且提交事務,則帳戶處于新的有效的狀態(tài)。如果事務出錯,終止后,帳戶返回到原先的有效狀態(tài)。 
          記住,事務不負責實施數(shù)據(jù)完整性,而僅僅負責在事務提交或終止以后確保數(shù)據(jù)返回到一致狀態(tài)。理解數(shù)據(jù)完整性規(guī)則并寫代碼實現(xiàn)完整性的重任通常落在 開發(fā)者肩上,他們根據(jù)業(yè)務要求進行設計。 當許多用戶同時使用和修改同樣的數(shù)據(jù)時,事務必須保持其數(shù)據(jù)的完整性和一致性。因此我們進一步研究A C I D特性中的下一個特性:隔離性。 
          3、隔離性 ( Isolation) 
              在隔離狀態(tài)執(zhí)行事務,使它們好像是系統(tǒng)在給定時間內執(zhí)行的唯一操作。如果有兩個事務,運行在相同的時間內,執(zhí)行相同的功能,事務的隔離性將確保每一事務在 系統(tǒng)中認為只有該事務在使用系統(tǒng)。 這種屬性有時稱為串行化,為了防止事務操作間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用于同一數(shù)據(jù)。重要的是,在隔離狀態(tài)執(zhí)行事務, 系統(tǒng)的狀態(tài)有可能是不一致的,在結束事務前,應確保系統(tǒng)處于一致狀態(tài)。但是在每個單獨的事務中,系統(tǒng)的狀態(tài)可能會發(fā)生變化。如果事務不是在隔離狀態(tài)運行, 它就可能從系統(tǒng)中訪問數(shù)據(jù),而系統(tǒng)可能處于不一致狀態(tài)。通過提供事務隔離,可以阻止這類事件的發(fā)生。在銀行的示例中,這意味著在這個系統(tǒng)內,其他過程和事 務在我們的事務完成前看不到我們的事務引起的任何變化,這對于終止的情況非常重要。如果有另一個過程根據(jù)帳戶余額進行相應處理,而它在我們的事務完成前就 能看到它造成的變化,那么這個過程的決策可能 
          建立在錯誤的數(shù)據(jù)之上,因為我們的事務可能終止。這就是說明了為什么事務產(chǎn)生的變化,直到事務完成,才對系統(tǒng)的其他部分可見。隔離性不僅僅保 證多個事務不能同時修改相同數(shù)據(jù),而且能夠保證事務操作產(chǎn)生的變化直到變化被提交或終止時才能對另一個事務可見,并發(fā)的事務彼此之間毫無影響。這就意味著 所有要求修改或讀取的數(shù)據(jù)已經(jīng)被鎖定在事務中,直到事務完成才能釋放。大多數(shù)數(shù)據(jù)庫,例如SQL Server以及其他的RDBMS,通過使用鎖定來實現(xiàn)隔離,事務中涉及的各個數(shù)據(jù)項或數(shù)據(jù)集使用鎖定來防止并發(fā)訪問。 
          4、持久性 (Durabilily) 
              持久性意味著一旦事務執(zhí)行成功,在系統(tǒng)中產(chǎn)生的所有變化將是永久的。應該存在一些檢查點防止在系統(tǒng)失敗時丟失信息。甚至硬件本身失敗,系統(tǒng)的狀態(tài)仍能通過在日志中記錄事務完成的任務進行重建。持久性的概念允許開發(fā)者認為不管系統(tǒng)以后發(fā)生了什么變化,完 
          成的事務是系統(tǒng)永久的部分。 在銀行的例子中,資金的轉移是永久的,一直保持在系統(tǒng)中。這聽起來似乎簡單,但這,依賴于將數(shù)據(jù)寫入磁盤,特別需要指出的是,在事務完全完成并提交后才寫 入磁盤的。 所有這些事務特性,不管其內部如何關聯(lián),僅僅是保證從事務開始到事務完成,不管事務成功與否,都能正確地管理事務涉及的數(shù)據(jù) ,當事務處理系統(tǒng)創(chuàng)建事務 時,將確保事務有某些特性。組件的開發(fā)者們假設事務的特性應該是一些不需要他們親自管理的特性。 
          二、為什么需要對事務并發(fā)控制 
              如果不對事務進行并發(fā)控制,我們看看數(shù)據(jù)庫并發(fā)操作是會有那些異常情形 
          1、丟失更新(Lost update) 
              兩個事務都同時更新一行數(shù)據(jù),但是第二個事務卻中途失敗退出,導致對數(shù)據(jù)的兩個修改都失效了。 
          2、臟讀(Dirty Reads) 
              一個事務開始讀取了某行數(shù)據(jù),但是另外一個事務已經(jīng)更新了此數(shù)據(jù)但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。 
          3、非重復讀(Non-repeatable Reads) 
             一個事務對同一行數(shù)據(jù)重復讀取兩次,但是卻得到了不同的結果。同一查詢在同一事務中多次進行,由于其他提交事務所做的修改或刪除,每次返回不同的結果集,此時發(fā)生非重復讀。 
          4、二類丟失更新(Second lost updates problem) 
              無法重復讀取的特例。有兩個并發(fā)事務同時讀取同一行數(shù)據(jù),然后其中一個對它進行修改提交,而另一個也進行了修改提交。這就會造成第一次寫操作失效。 
          5、幻像讀(Phantom Reads) 
              事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查 
          詢中未出現(xiàn)的數(shù)據(jù)(這里并不要求兩次查詢的SQL語句相同)。這是因為在兩次查詢過程中有另外一個事務插入數(shù)據(jù)造成的。 
          三、數(shù)據(jù)庫的隔離級別 
             為了兼顧并發(fā)效率和異常控制,在標準SQL規(guī)范中,定義了4個事務隔離級別,(ORACLE和SQLSERER對標準隔離級別有不同的實現(xiàn) ) 
          1、未提交讀(Read Uncommitted) 
              直譯就是"讀未提交",意思就是即使一個更新語句沒有提交,但是別 
          的事務可以讀到這個改變.這是很不安全的。允許任務讀取數(shù)據(jù)庫中未提交的數(shù)據(jù)更改,也稱為臟讀。 
          2、提交讀(Read Committed) 
             直譯就是"讀提交",可防止臟讀,意思就是語句提交以后即執(zhí)行了COMMIT以后 
          別的事務就能讀到這個改變. 只能讀取到已經(jīng)提交的數(shù)據(jù)。Oracle等多數(shù)數(shù)據(jù)庫默認都是該級別 
          3、可重復讀(Repeatable Read): 
             直譯就是"可以重復讀",這是說在同一個事務里面先后執(zhí)行同一個查詢語句的時候,得到的結果是一樣的.在同一個事務內的查詢都是事務開始時刻一致的,InnoDB默認級別。在SQL標準中,該隔離級別消除了不可重復讀,但是還存在幻象讀 
          4、串行讀(Serializable) 
             直譯就是"序列化",意思是說這個事務執(zhí)行的時候不允許別的事務并發(fā)執(zhí)行. 完全串行化的讀,每次讀都需要獲得表級共享鎖,讀寫相互都會阻塞

           

          四,隔離級別對并發(fā)的控制 
          下表是各隔離級別對各種異常的控制能力。


          LU丟失更新DR臟讀NRR非重復讀SLU二類丟失更新PR幻像讀
          未提交讀 RUYYYYY
          提交讀 RCNNYYY
          可重復讀 RRNNNNY
          串行讀 SNNNNN

           

           

          順便舉一小例。

          MS_SQL: 
          --事務一 
          set transaction isolation level serializable 
          begin tran 
          insert into test values('xxx') 
          --事務二 
          set transaction isolation level read committed 
          begin tran 
          select * from test 
          --事務三 
          set transaction isolation level read uncommitted 
          begin tran 
          select * from test 
          在查詢分析器中執(zhí)行事務一后,分別執(zhí)行事務二,和三。結果是事務二會等待,而事務三則會執(zhí)行。

          ORACLE: 
          --事務一 
          set transaction isolation level serializable; 
          insert into test values('xxx'); 
          select * from test; 
          --事務二 
          set transaction isolation level read committed--ORACLE默認級別 
          select * from test 
          執(zhí)行事務一后,執(zhí)行事務二。結果是事務二只讀出原有的數(shù)據(jù),無視事務一的插入操作。

          MYSQL 
          查看InnoDB系統(tǒng)級別的事務隔離級別: 
          以下為引用的內容: 
          mysql> SELECT @@global.tx_isolation; 
          +-----------------------+ 
          | @@global.tx_isolation | 
          +-----------------------+ 
          | REPEATABLE-READ   | 
          +-----------------------+ 
          1 row in set (0.00 sec) 
          查看InnoDB會話級別的事務隔離級別: 
          以下為引用的內容: 
          mysql> SELECT @@tx_isolation; 
          +-----------------+ 
          | @@tx_isolation | 
          +-----------------+ 
          | REPEATABLE-READ | 
          +-----------------+ 
          1 row in set (0.00 sec) 
          修改事務隔離級別: 
          以下為引用的內容: 
            mysql> set global transaction isolation level read committed; 
            Query OK, 0 rows affected (0.00 sec) 
            mysql> set session transaction isolation level read committed; 
            Query OK, 0 rows affected (0.00 sec) 
          InnoDB的可重復讀隔離級別和其他數(shù)據(jù)庫的可重復讀是有區(qū)別的,不會造成幻象讀(phantom read),所謂幻象讀,就是同一個事務內,多次select,可以讀取到其他session insert并已經(jīng)commit的數(shù)據(jù)。下面是一個小的測試,證明InnoDB的可重復讀隔離級別不會造成幻象讀。測試涉及兩個session,分別為 session 1和session 2,隔離級別都是repeateable read,關閉autocommit 
          以下為引用的內容: 
          mysql> select @@tx_isolation; 
          +-----------------+ 
          | @@tx_isolation | 
          +-----------------+ 
          | REPEATABLE-READ | 
          +-----------------+ 
          1 row in set (0.00 sec) 
            mysql> set autocommit=off; 
            Query OK, 0 rows affected (0.00 sec) 
            session 1 創(chuàng)建表并插入測試數(shù)據(jù) 
            mysql> create table test(i int) engine=innodb; 
            Query OK, 0 rows affected (0.00 sec)

            mysql> insert into test values(1); 
            Query OK, 1 row affected (0.00 sec) 
            session 2 查詢,沒有數(shù)據(jù),正常,session1沒有提交,不允許臟讀 
            mysql> select * from test; 
            Empty set (0.00 sec) 
            session 1 提交事務 
            mysql> commit; 
            Query OK, 0 rows affected (0.00 sec) 
            session 2 查詢,還是沒有數(shù)據(jù),沒有產(chǎn)生幻象讀 
            mysql> select * from test; 
            Empty set (0.00 sec) 
          以上試驗版本: 
          mysql> select version(); 
          +-------------------------+ 
          | version()       | 
          +-------------------------+ 
          | 5.0.37-community-nt-log | 
          +-------------------------+ 
          1 row in set (0.00 sec)

          五、并發(fā)一致性問題的解決辦法 
          1 封鎖(Locking) 
              封鎖是實現(xiàn)并發(fā)控制的一個非常重要的技術。所謂封鎖就是事務T在對某個數(shù)據(jù)對象例如表、記錄等操作之前,先向系統(tǒng)發(fā)出請求,對其加鎖。加鎖后事務T就對該 數(shù)據(jù)對象有了一定的控制,在事務T釋放它的鎖之前,其它的事務不能更新此數(shù)據(jù)對象。 基本的封鎖類型有兩種:排它鎖(Exclusive locks 簡記為X鎖)和共享鎖(Share locks 簡記為S鎖)。 
              排它鎖又稱為寫鎖。若事務T對數(shù)據(jù)對象A加上X鎖,則只允許T讀取和修改A,其它任何事務都不能再對A加任何類型的鎖,直到T釋放A上的鎖。這就保證了其它事務在T釋放A上的鎖之前不能再讀取和修改A。 
              共享鎖又稱為讀鎖。若事務T對數(shù)據(jù)對象A加上S鎖,則其它事務只能再對A加S鎖,而不能加X鎖,直到T釋放A上的S鎖。這就保證了其它事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。 
          2 封鎖協(xié)議 
              在 運用X鎖和S鎖這兩種基本封鎖,對數(shù)據(jù)對象加鎖時,還需要約定一些規(guī)則,例如應何時申請X鎖或S鎖、持鎖時間、何時釋放等。我們稱這些規(guī)則為封鎖協(xié)議 (Locking Protocol)。對封鎖方式規(guī)定不同的規(guī)則,就形成了各種不同的封鎖協(xié)議。下面介紹三級封鎖協(xié)議。三級封鎖協(xié)議分別在不同程度上解決了丟失的修改、不 可重復讀和讀"臟"數(shù)據(jù)等不一致性問題,為并發(fā)操作的正確調度提供一定的保證。下面只給出三級封鎖協(xié)議的定義,不再做過多探討。 
              1 級封鎖協(xié)議是:事務T在修改數(shù)據(jù)R之前必須先對其加X鎖,直到事務結束才釋放。事務結束包括正常結束(COMMIT)和非正常結束(ROLLBACK)。 1級封鎖協(xié)議可防止丟失修改,并保證事務T是可恢復的。在1級封鎖協(xié)議中,如果僅僅是讀數(shù)據(jù)不對其進行修改,是不需要加鎖的,所以它不能保證可重復讀和不 讀"臟"數(shù)據(jù)。 
              2級封鎖協(xié)議是:1級封鎖協(xié)議加上事務T在讀取數(shù)據(jù)R之前必須先對其加S鎖,讀完后即可釋放S鎖。2級封鎖協(xié)議除防止了丟失修改,還可進一步防止讀"臟"數(shù)據(jù)。 
              3級封鎖協(xié)議是:1級封鎖協(xié)議加上事務T在讀取數(shù)據(jù)R之前必須先對其加S鎖,直到事務結束才釋放。3級封鎖協(xié)議除防止了丟失修改和不讀'臟'數(shù)據(jù)外,還進一步防止了不可重復讀。 
          六、一般處理并發(fā)問題時的步驟: 
          1、開啟事務。 
          2、申請寫權限,也就是給對象(表或記錄)加鎖。 
          3、假如失敗,則結束事務,過一會重試。 
          4、假如成功,也就是給對象加鎖成功,防止其他用戶再用同樣的方式打開。 
          5、進行編輯操作。 
          6、寫入所進行的編輯結果。 
          7、假如寫入成功,則提交事務,完成操作。 
          8、假如寫入失敗,則回滾事務,取消提交。 
          9、(7.8)兩步操作已釋放了鎖定的對象,恢復到操作前的狀態(tài)。

          轉自:http://www.cnblogs.com/tqsummer/archive/2010/07/11/1775209.html

          posted @ 2011-12-07 14:11 iLinux 閱讀(569) | 評論 (0)編輯 收藏

          具體來說cookie機制采用的是在客戶端保持狀態(tài)的方案,而session機制采用的是在服務器端保持狀態(tài)的方案。同時我們也看到,由于采用服務器端保持狀態(tài)的方案在客戶端也需要保存一個標識,所以session機制可能需要借助于cookie機制來達到保存標識的目的,但實際上它還有其他選擇。

              cookie機制。正統(tǒng)的cookie分發(fā)是通過擴展HTTP協(xié)議來實現(xiàn)的,服務器通過在HTTP的響應頭中加上一行特殊的指示以提示瀏覽器按照指示生成相應的cookie。然而純粹的客戶端腳本如JavaScript或者VBScript也可以生成cookie。而cookie的使用是由瀏覽器按照一定的原則在后臺自動發(fā)送給服務器的。瀏覽器檢查所有存儲的cookie,如果某個cookie所聲明的作用范圍大于等于將要請求的資源所在的位置,則把該cookie附在請求資源的HTTP請求頭上發(fā)送給服務器
              cookie的內容主要包括:名字,值,過期時間,路徑和域。路徑與域一起構成cookie的作用范圍若不設置過期時間,則表示這個cookie的生命期為瀏覽器會話期間,關閉瀏覽器窗口,cookie就消失。這種生命期為瀏覽器會話期的cookie被稱為會話cookie。會話cookie一般不存儲在硬盤上而是保存在內存里,當然這種行為并不是規(guī)范規(guī)定的。若設置了過期時間,瀏覽器就會把cookie保存到硬盤上,關閉后再次打開瀏覽器,這些cookie仍然有效直到超過設定的過期時間。存儲在硬盤上的cookie可以在不同的瀏覽器進程間共享,比如兩個IE窗口。而對于保存在內存里的cookie,不同的瀏覽器有不同的處理方式
              session機制。session機制是一種服務器端的機制,服務器使用一種類似于散列表的結構(也可能就是使用散列表)來保存信息。
           
              當程序需要為某個客戶端的請求創(chuàng)建一個session時,服務器首先檢查這個客戶端的請求里是否已包含了一個session標識(稱為session id),如果已包含則說明以前已經(jīng)為此客戶端創(chuàng)建過session,服務器就按照session id把這個session檢索出來使用(檢索不到,會新建一個),如果客戶端請求不包含session id,則為此客戶端創(chuàng)建一個session并且生成一個與此session相關聯(lián)的session id,session id的值應該是一個既不會重復,又不容易被找到規(guī)律以仿造的字符串,這個session id將被在本次響應中返回給客戶端保存。
              保存這個session id的方式可以采用cookie,這樣在交互過程中瀏覽器可以自動的按照規(guī)則把這個標識發(fā)揮給服務器。一般這個cookie的名字都是類似于SEEESIONID。但cookie可以被人為的禁止,則必須有其他機制以便在cookie被禁止時仍然能夠把session id傳遞回服務器。
              經(jīng)常被使用的一種技術叫做URL重寫,就是把session id直接附加在URL路徑的后面。還有一種技術叫做表單隱藏字段。就是服務器會自動修改表單,添加一個隱藏字段,以便在表單提交時能夠把session id傳遞回服務器。比如:
               <form name="testform" action="/xxx">
               <input type="hidden" name="jsessionid" value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">
               <input type="text">
               </form>
          實際上這種技術可以簡單的用對action應用URL重寫來代替。
          posted @ 2010-06-02 15:03 iLinux 閱讀(153) | 評論 (0)編輯 收藏

          第一部分 DWR是什么,如何使用

              DWR是一個開源的類庫,可以幫助開發(fā)人員開發(fā)包含AJAX技術的網(wǎng)站.它可以允許在瀏覽器里的代碼(javascript)使用運行在WEB服務器上的 JAVA函數(shù),就像它就在瀏覽器里一樣. 它包含兩個主要的部分:允許JavaScript從WEB服務器上一個遵循了AJAX原則的Servlet(小應用程序)中獲取數(shù)據(jù).另外一方面一個 JavaScript庫可以幫助網(wǎng)站開發(fā)人員輕松地利用獲取的數(shù)據(jù)來動態(tài)改變網(wǎng)頁的內容.
              官方網(wǎng)站地址http://getahead.org/dwr

          關于DWR的使用 引用別人的文章。   

          開始使用 DWR
              原文出處: http://www.javatang.com/archives/2006/10/20/254879.html
              翻譯: Jet Mah
              有兩種方法來開始 DWR 的學習,最簡單的做法是下載官方提供的 WAR 文件然后對此深入研究。不過這種方式不能使你感到將 DWR 整合到你現(xiàn)有的 web 程序有多么的簡單,所以我們推薦你跟隨下面三個步驟:

          1. 安裝 DWR JAR 包
          下載 dwr.jar 文件,然后將它放在 web 程序的 WEB-INF/lib 目錄下面,很可能在這個目錄下已經(jīng)有一些 jar 文件了。

          2. 編輯 config 文件

          將下面的代碼添加到 WEB-INF/web.xml 文件中,<servlet>需要放在另外的<servlet>之后,<servlet-mapping>也是如此。

          <servlet>
             <servlet-name>dwr-invoker</servlet-name>
             <display-name>DWR Servlet</display-name>
             <servlet-class>uk.ltd.getahead.dwr.DWRServlet</servlet-class>
             <init-param>
                <param-name>debug</param-name>
                <param-value>true</param-value>
             </init-param>
          </servlet>

          <servlet-mapping>
             <servlet-name>dwr-invoker</servlet-name>
             <url-pattern>/dwr/*</url-pattern>
          </servlet-mapping>

          接下來創(chuàng)建 dwr.xml 文件并將此放在 web.xml 所在的 WEB-INF 目錄下。文件中類似下面的內容:

          <!DOCTYPE dwr PUBLIC
               ”-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN”
               ”http://www.getahead.ltd.uk/dwr/dwr10.dtd”>

          <dwr>
             <allow>
               <create creator=”new” javascript=”JDate”>
                 <param name=”class” value=”java.util.Date”/>
               </create>
               <create creator=”new” javascript=”Demo”>
                 <param name=”class” value=”your.java.Bean”/>
               </create>
             </allow>
          </dwr>

          DWR 配置文件定義了由 DWR 創(chuàng)建和被 Javascript 遠程使用的類。在上面的例子中我們在遠程創(chuàng)建了2個類,并且給出了在 Javascript 中的類名。

          上面使用的 new creator 使用了所有的 JavaBeans 必須含有的公有(public)無參(no-args)的構造函數(shù)。值得一提的是, DWR 還有一些限制:

        1. 避免使用 JavaScript 保留字;以保留字命名的方法將自動被排除。大多數(shù) JavaScript 的保留字同時也是 Java 的保留字,因此無論如何你也不能使用一個名為 “try()” 的方法。但是最常用的一個詞 “delete()”,在 JavaScript 中有特殊的含義而在 Java 中沒有。
        2. 重載方法(Overloaded methods)將會在調用的時候陷入未知的狀況,因此應該避免重載方法。

          3. 訪問下面的地址
          http://localhost:8080/[YOUR-WEBAPP]/dwr/

          你應該會看到一個頁面,上面顯示了剛才你在第二步所創(chuàng)建的類。進入一個鏈接之后你會看到所有等待調用方法的列表。這些動態(tài)產(chǎn)生的例子你也能通過 DWR 來實現(xiàn)。

          親自嘗試和體會下吧。

          怎樣應用到你的 Web 程序中?

          在側邊欄有很多例子演示了怎樣改變網(wǎng)頁中的文本、更新列表、操作表單和動態(tài)修改表格。每一個例子都有詳細的說明。

          另外一個開始方法就是從頁面中查看源代碼,這些頁面你剛剛瀏覽過:

        3. 進入 http://localhost:8080/[YOUR-WEBAPP]/dwr/ 然后點擊你創(chuàng)建的類;
        4. 查看源代碼然后定位到你所感興趣的方法的代碼行;
        5. 將這些文本粘貼到你 Web 程序的一個 HTML 或 JSP頁面中;
        6. 包含下面的 javascrip 文件:

          <script src=’/[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRIPT].js’></script>
          <script src=’/[YOUR-WEBAPP]/dwr/engine.js’></script>

          你可以根據(jù)實際情況修改 /[YOUR-WEBAPP]/ 部分。

          關于怎樣書寫 DWR 控制的 Javascript 代碼請查看 腳本簡介

        7. posted @ 2010-06-02 14:40 iLinux 閱讀(145) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 化隆| 西安市| 渭源县| 青阳县| 巴林右旗| 且末县| 马山县| 陇川县| 台北县| 抚宁县| 当涂县| 松溪县| 景谷| 河西区| 五家渠市| 遂溪县| 罗定市| 莱州市| 通辽市| 遵义县| 蓬溪县| 霍山县| 伽师县| 乐山市| 昆山市| 镇巴县| 江阴市| 景洪市| 正蓝旗| 凭祥市| 崇文区| 尤溪县| 常宁市| 哈密市| 舟山市| 蓬莱市| 昌邑市| 柘城县| 井冈山市| 邹城市| 逊克县|