Web架構(gòu)特性及REST架構(gòu)風(fēng)格(部分內(nèi)容摘自網(wǎng)絡(luò))

          良好的Web架構(gòu)風(fēng)格:
              1. 客戶/服務(wù)器模式:  實(shí)現(xiàn)了UI與數(shù)據(jù)的分離。
              2. 服務(wù)端無狀態(tài)性: 可見性,可靠性,可伸縮性等方面的改善。
               可見性-無狀態(tài)性使得服務(wù)器不必要維護(hù)海量的上下文(Context)。
               可靠性-無狀態(tài)性減少了服務(wù)器從局部錯(cuò)誤中恢復(fù)的任務(wù)量。
               可伸縮性-無狀態(tài)性使得服務(wù)器可以很容易的釋放資源。
              3. 緩存: 減少服務(wù)端不必要的處理。
              4. 可伸縮性: 便于分布式和集群部署。
               上面的2,3點(diǎn)也是影響4的主要因素。而隨著系統(tǒng)用戶規(guī)模的指數(shù)上升,可伸縮性將變的至關(guān)重要。

          現(xiàn)在大多數(shù)應(yīng)用程序都忽略或者違反了上述2, 3的風(fēng)格。當(dāng)然也肯定失去了4帶來的好處。
          比如Java Servlet中HttpSession的應(yīng)用,使服務(wù)器端保存了客戶端的狀態(tài)。
          時(shí)下流行的動(dòng)態(tài)頁面的做法也使得資源緩存變得困難或者不可能。
          這些都直接影響了應(yīng)用的可伸縮性。

          改善現(xiàn)狀的思路是,把服務(wù)端的處理和狀態(tài)前移,由客戶端來實(shí)現(xiàn)。使服務(wù)端回歸到無狀態(tài)的特性。
          以采用ajax技術(shù)的應(yīng)用系統(tǒng)為例:因?yàn)椴恍枰耆⑿戮涂梢耘c服務(wù)器進(jìn)行交互,使得有狀態(tài)客戶機(jī)成為可用選擇。基于瀏覽器的應(yīng)用程序代碼可以在必要時(shí)獲取新的服務(wù)器數(shù)據(jù),并把這些數(shù)據(jù)織入當(dāng)前頁面。
          將處理和狀態(tài)前移到每個(gè)客戶機(jī)上后,實(shí)現(xiàn)了無狀態(tài)的服務(wù)端;同時(shí)緩存服務(wù)器可以緩存ajax引擎(比如dojo, prototype etc.),以及狀態(tài)無關(guān)的數(shù)據(jù)。
          個(gè)人理解,多種瀏覽器的plug-in技術(shù)(Sun的applet, MS的ActiveX等等),都應(yīng)該是這種思路的不同技術(shù)實(shí)現(xiàn)。

          經(jīng)過以上分析整理,實(shí)際上已經(jīng)涉及到了時(shí)下流行的一個(gè)概念-REST.

          REST(Representational State Transfer)來源于Dr. Roy Thomas Fielding,  <Architectural Styles and the Design of Network-based Software Architectures>
          當(dāng)瀏覽器瀏覽訪問一個(gè)url資源時(shí),返回的頁面即為該url資源的representation,這個(gè)representation給瀏覽器一個(gè)state,當(dāng)
          瀏覽器訪問下一個(gè)url資源時(shí),瀏覽器的state就transfer了。
          REST其本身只是為分布式超媒體系統(tǒng)(distributed hypermedia systems)設(shè)計(jì)的一種架構(gòu)風(fēng)格,而不是某個(gè)標(biāo)準(zhǔn),框架。

          REST的設(shè)計(jì)準(zhǔn)則
              1.網(wǎng)絡(luò)上的所有事物都被抽象為資源(resource);
              2.每個(gè)資源對應(yīng)一個(gè)唯一的資源標(biāo)識(shí)符(resource identifier);
              3.通過通用的連接器接口(generic connector interface)對資源進(jìn)行操作;
              4.對資源的各種操作不會(huì)改變資源標(biāo)識(shí)符;
              5.所有的操作都是無狀態(tài)的(stateless)。

          REST中的資源所指的不是數(shù)據(jù),而是數(shù)據(jù)和表現(xiàn)形式的組合。
          REST是基于Http協(xié)議的,任何對資源的操作行為都是通過Http協(xié)議來實(shí)現(xiàn)。以往的Web開發(fā)大多數(shù)用的都是Http協(xié)議中的GET和POST方法,對其他方法很少使用,這實(shí)際上是因?yàn)閷ttp協(xié)議認(rèn)識(shí)片面的理解造成的。Http不僅僅是一個(gè)簡單的運(yùn)載數(shù)據(jù)的協(xié)議,而是一個(gè)具有豐富內(nèi)涵的網(wǎng)絡(luò)軟件的協(xié)議。他不僅僅能對互聯(lián)網(wǎng)資源進(jìn)行唯一定位,而且還能告訴我們?nèi)绾螌υ撡Y源進(jìn)行操作。Http把對一個(gè)資源的操作限制在4個(gè)方法以內(nèi):GET, POST,PUT和DELETE,這正是對資源CRUD操作的實(shí)現(xiàn)。由于資源和URI是一一對應(yīng)的,執(zhí)行這些操作的時(shí)候URI是沒有變化的,這和以往的 Web開發(fā)有很大的區(qū)別。正由于這一點(diǎn),極大的簡化了Web開發(fā),也使得URI可以被設(shè)計(jì)成更為直觀的反映資源的結(jié)構(gòu),這種URI的設(shè)計(jì)被稱作 RESTful的URI。這位開發(fā)人員引入了一種新的思維方式:通過URL來設(shè)計(jì)系統(tǒng)結(jié)構(gòu)。當(dāng)然了,這種設(shè)計(jì)方式對一些特定情況也是不適用的,也就是說不是所有的URI都可以RESTful的。
          REST 之所以可以提高系統(tǒng)的可伸縮性,就是因?yàn)樗笏械牟僮鞫际菬o狀態(tài)的。由于沒有了上下文(Context)的約束,做分布式和集群的時(shí)候就更為簡單,也可以讓系統(tǒng)更為有效的利用緩沖池(Pool)。并且由于服務(wù)器端不需要記錄客戶端的一系列訪問,也減少了服務(wù)器端的性能。

          posted @ 2008-03-24 16:35 bluoy 閱讀(399) | 評論 (0)編輯 收藏

                 Java語言編程中更新XML文檔的四種方法。第一種方法是直接讀寫XML文件。第二種方法是使用Apache Crimson的XmlDocument類,這種方法極為簡單,使用方便,如果你選用Apache Crimson作為XML解析器,那么不妨使用這種方法,不過這種方法似乎效率不高(源于效率低下的Apache Crimson),另外,高版本的JAXP或者是Java XML Pack、JWSDP不直接支持Apache Crimson,亦即這種方法不通用。第三種方法是使用JAXP的XSLT引擎(Transformer類)來輸出XML文檔,這種方法也許是標(biāo)準(zhǔn)的方法 了,使用起來十分靈活,特別是可以自如控制輸出格式,我們推薦采用這種方法。第四種方法是第三種方法的變種,采用了Xalan XML Serializer,引入了串行化操作,對于大量文檔的修改/輸出有優(yōu)越性,可惜的是要重復(fù)設(shè)置XSLT引擎的屬性和XML Serializer的輸出屬性,比較麻煩,而且依賴于Apache Xalan和Apache Xerces技術(shù),通用性略顯不足。除此之外,實(shí)際上應(yīng)用別的API(比如dom4j、JDOM、Castor、XML4J、Oracle XML Parser V2)也有很多辦法可以更新XML文檔。

          概念介紹
                  Xerces/Crimson是XML解析器,Xalan是XSLT處理器,xml-apis.jar實(shí)際上是JAXP。
                  Apache Crimson的前身是Sun Project X Parser, 至今Apache Crimson的很多代碼都是從X Parser中直接移植過來的。早期的JAXP是和X Parser捆綁在一起的。后來的 JAXP和Apache Crimson捆綁在一起,比如JAXP 1.1。最新的JAXP 1.2 EA(Early Access)改弦更張,采用性能更好的Apache Xalan和Apache Xerces分別作為XSLT處理器和XML解析器,不能直接支持Apache Crimson了。
                  dom4j(dom4j.jar)是一個(gè)Java的XML API,類似于jdom,用來讀寫XML文件的。dom4j是一個(gè)非常非常優(yōu)秀的Java XML API,具有性能優(yōu)異、功能強(qiáng)大和極端易用使用的特點(diǎn),同時(shí)它也是一個(gè)開放源代碼的軟件,可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章,對主流的Java XML API進(jìn)行的性能、功能和易用性的評測,dom4j無論在那個(gè)方面都是非常出色的。

          posted @ 2008-03-19 10:27 bluoy 閱讀(1985) | 評論 (0)編輯 收藏

          .NET垃圾收集器的過去、現(xiàn)在和未來(一)

          Patrick Dussud介紹:
          Patrick Dussud在微軟工作了11年,曾經(jīng)負(fù)責(zé)VBA、Jscript、MS Java等語言運(yùn)行時(shí)的垃圾收集器(Garbage Collector)的設(shè)計(jì),目前負(fù)責(zé).NET CLR垃圾收集器的設(shè)計(jì)。他是.NET CLR的架構(gòu)師,WinFX的首席架構(gòu)師,Windows架構(gòu)師組的成員。
          在微軟之前,Patrick是德州儀器(TI)Explorer工作站系統(tǒng)的主要設(shè)計(jì)人,Lucid公司Energize產(chǎn)品的首席架構(gòu)師。

          關(guān)鍵內(nèi)容摘要

          1. 微管理 / 內(nèi)存的顯式管理 ---  手動(dòng)內(nèi)存管理(new/delete)
                  你必須保證在釋放之前內(nèi)存沒有被別人使用,如果你把內(nèi)存給了別人,往往你就不確定應(yīng)該何時(shí)釋放內(nèi)存了。當(dāng)你釋放了內(nèi)存,不知道別人正在使用這塊內(nèi)存時(shí),就產(chǎn)生了程序崩潰的問題。所以,當(dāng)你顯式進(jìn)行“new”和“delete”時(shí),內(nèi)存管理是一個(gè)復(fù)雜的問題,并且,此時(shí)你的代碼不可組合。要么你必須確定對自己的內(nèi)存有完全的控制,因此,要達(dá)到這種完全隔離的目的,你必須在將內(nèi)存?zhèn)鬟f給別的模塊時(shí)進(jìn)行完全拷貝,這樣,別的模塊就只對這個(gè)完全拷貝的內(nèi)存負(fù)責(zé)。要么你就得在某個(gè)地方形成對整個(gè)內(nèi)存池的統(tǒng)一的管理,這就是自動(dòng)化內(nèi)存管理,這就是垃圾收集器的工作。

          2. 對象終止器的調(diào)用時(shí)機(jī)由垃圾收集器決定,這些對象的析構(gòu)函數(shù)被調(diào)用的先后順序是無法預(yù)先確定的。提出了“關(guān)鍵終止化對象”的概念。當(dāng)有一系列對象需要終止化時(shí),關(guān)鍵終止化對象最后被終止化,直到上層對象干完工作前。

          3.  工作機(jī)理: 垃圾收集器首先遍歷所有的棧和靜態(tài)變量,然后返回最初的樹集。然后遍歷樹集對程序能夠到達(dá)的每一個(gè)對象作標(biāo)記。此時(shí),我們就能逐個(gè)對象地檢查內(nèi)存,發(fā)現(xiàn)它被標(biāo)記了,好的,留下。沒有被標(biāo)記?喔,我們有一個(gè)垃圾了。

          4.  垃圾收集器的絕大部分速度和效率都來源于對回收策略的調(diào)整。通過保持內(nèi)存緊湊,形成緩存本地化,頁面本地化等等優(yōu)勢,很可能其效率甚至高于傳統(tǒng)“new”和“delete” 操作,尤其是對于非常難以管理的服務(wù)器內(nèi)存來說更是如此。

          posted @ 2008-03-13 21:26 bluoy 閱讀(356) | 評論 (0)編輯 收藏

          如下代碼:
          class A{
              public void foo(){print("aaaaa");}
          }

          class B extends A{
              public void foo(){print("bbbbb");}
          }

          如果想通過B的實(shí)例化變量來調(diào)用被override的父類的方法foo():

          B b = new B();

          在C++中(VC 6)可以兩種途徑;
          1.  ((A)b).foo();
          2.  A a = B();

          在java中類似做法則行不通,依然訪問的是子類方法。
          而且,在java中好像達(dá)不到這個(gè)目的。

          posted @ 2008-03-06 10:34 bluoy 閱讀(1069) | 評論 (3)編輯 收藏

          web常用的功能性測試方法

                
                  1. 頁面鏈接檢查:每一個(gè)鏈接是否都有對應(yīng)的頁面,并且頁面之間切換正確。

                  2. 相關(guān)性檢查:刪除/增加一項(xiàng)會(huì)不會(huì)對其他項(xiàng)產(chǎn)生影響,如果產(chǎn)生影響,這些影響是否都正確。

                  3. 檢查按鈕的功能是否正確:如update、cancel、delete、save等功能是否正確。

                  4. 字符串長度檢查:輸入超出需求所說明的字符串長度的內(nèi)容,看系統(tǒng)是否檢查字符串長度,會(huì)不會(huì)出錯(cuò)。

                  5. 字符類型檢查:在應(yīng)該輸入指定類型的內(nèi)容的地方輸入其他類型的內(nèi)容(如在應(yīng)該輸入整型的地方輸入其他字符類型),看系統(tǒng)是否檢查字符類型,會(huì)否報(bào)錯(cuò)。

                  6. 標(biāo)點(diǎn)符號(hào)檢查:輸入內(nèi)容包括各種標(biāo)點(diǎn)符號(hào),特別是空格、各種引號(hào)、回車鍵。看系統(tǒng)處理是否正確。

                  7. 中文字符處理:在可以輸入中文的系統(tǒng)輸入中文,看會(huì)否出現(xiàn)亂碼或出錯(cuò)。

                  8. 檢查帶出信息的完整性:在查看信息和update信息時(shí),查看所填寫的信息是不是全部帶出,帶出信息和添加的是否一致。

                  9. 信息重復(fù):在一些需要命名,且名字應(yīng)該唯一的信息輸入重復(fù)的名字或ID,看系統(tǒng)有沒有處理,會(huì)否報(bào)錯(cuò),重名包括是否區(qū)分大小寫,以及在輸入內(nèi)容的前后輸入空格,系統(tǒng)是否作出正確處理。

                  10. 檢查刪除功能:在一些可以一次刪除多個(gè)信息的地方,不選擇任何信息,按”delete”,看系統(tǒng)如何處理,會(huì)否出錯(cuò);然后選擇一個(gè)和多個(gè)信息,進(jìn)行刪除,看是否正確處理。

                  11. 檢查添加和修改是否一致:檢查添加和修改信息的要求是否一致,例如添加要求必填的項(xiàng),修改也應(yīng)該必填;添加規(guī)定為整型的項(xiàng),修改也必須為整型。

                  12. 檢查修改重名:修改時(shí)把不能重名的項(xiàng)改為已存在的內(nèi)容,看會(huì)否處理,報(bào)錯(cuò)。同時(shí),也要注意,會(huì)不會(huì)報(bào)和自己重名的錯(cuò)。

                  13. 重復(fù)提交表單:一條已經(jīng)成功提交的紀(jì)錄,back后再提交,看看系統(tǒng)是否做了處理。

                  14. 檢查多次使用back鍵的情況:在有back的地方,back,回到原來頁面,再back,重復(fù)多次,看會(huì)否出錯(cuò)。

                  15. search檢查:在有search功能的地方輸入系統(tǒng)存在和不存在的內(nèi)容,看search結(jié)果是否正確。如果可以輸入多個(gè)search條件,可以同時(shí)添加合理和不合理的條件,看系統(tǒng)處理是否正確。

                  16. 輸入信息位置:注意在光標(biāo)停留的地方輸入信息時(shí),光標(biāo)和所輸入的信息會(huì)否跳到別的地方。

                  17. 上傳下載文件檢查:上傳下載文件的功能是否實(shí)現(xiàn),上傳文件是否能打開。對上傳文件的格式有何規(guī)定,系統(tǒng)是否有解釋信息,并檢查系統(tǒng)是否能夠做到。

                  18. 必填項(xiàng)檢查:應(yīng)該填寫的項(xiàng)沒有填寫時(shí)系統(tǒng)是否都做了處理,對必填項(xiàng)是否有提示信息,如在必填項(xiàng)前加* 

                  19. 快捷鍵檢查:是否支持常用快捷鍵,如Ctrl+C Ctrl+V Backspace等,對一些不允許輸入信息的字段,如選人,選日期對快捷方式是否也做了限制。

                  20. 回車鍵檢查:在輸入結(jié)束后直接按回車鍵,看系統(tǒng)處理如何,會(huì)否報(bào)錯(cuò)。

          posted @ 2008-01-11 09:55 bluoy 閱讀(197) | 評論 (0)編輯 收藏

          調(diào)整完/usr的掛載點(diǎn)后,出現(xiàn)了一個(gè)奇怪的現(xiàn)象,原來正確的系統(tǒng)時(shí)鐘現(xiàn)在出故障了,提前了8個(gè)小時(shí)。
          鼓掌現(xiàn)象具體表現(xiàn)為:每次啟動(dòng)系統(tǒng),ubuntu會(huì)用BIOS的時(shí)間+8后作為系統(tǒng)時(shí)鐘,同時(shí)會(huì)把新的時(shí)間重新同步到BIOS中。所以每啟動(dòng)一次,時(shí)間就會(huì)快進(jìn)8小時(shí)。很是怪異。
          網(wǎng)上一通google才搞定。

          原因是因?yàn)?usr的掛載時(shí)間被滯后了,由于/etc/localtime(時(shí)區(qū)信息)是連接到/usr/share/zoneinfo/下的某個(gè)設(shè)定好的時(shí)區(qū)文件。在系統(tǒng)獲取時(shí)區(qū)信息時(shí)/usr尚未掛載,所以系統(tǒng)始終就錯(cuò)了。

          修復(fù)辦法很簡單:
          1.  rm /etc/localtime(取消原來的符號(hào)連接)
          2. 把/usr/share/zoneinfo/下的某個(gè)設(shè)定好的時(shí)區(qū)文件copy到/etc/localtime.
          3. 重新啟動(dòng),故障消除。

          相關(guān)概念:
          UTC(Universal Time Coordinated)  = GMT  (Greenwich Mean Time)
          hwclock :   query and set the hardware clock (RTC)
          hwclock通過/etc/default/rcS的UTC(=y(tǒng)es/no)來認(rèn)定BIOS時(shí)鐘是UTC還是localtime。

          參考文章:
          http://blog.chinaz.com/u1/5830/archives/2006/36628.shtml

          posted @ 2007-11-13 12:09 bluoy 閱讀(294) | 評論 (0)編輯 收藏

          昨天由于ubuntu的/分區(qū)空間緊張,決定把/usr掛載到別的分區(qū)。
          掛載步驟(root權(quán)限執(zhí)行):
          1.   init  1  -- 切換到單用戶模式。
          2.   cp -ax /usr/*  /mnt/tmp  (tmp為新的/usr分區(qū))。 -- 拷貝現(xiàn)在/usr下的內(nèi)容到待切換的分區(qū)。
          3.   ls -l /dev/disk/by-uuid    -- 查看分區(qū)的UUID。
          4.   修改/etc/fstab中/usr的掛載方式,掛接到新的/usr分區(qū)。
          5.   mv /usr /usr.old   -- 重命名現(xiàn)有的/usr為/usr.old, 為第6步做準(zhǔn)備,重啟動(dòng)后可以刪除之。
          6.   mkdir /usr   -- 創(chuàng)建新的/usr掛載點(diǎn),啟動(dòng)時(shí)自動(dòng)掛載/usr分區(qū)到此處。
          7.   restart

          posted @ 2007-11-13 11:49 bluoy 閱讀(5738) | 評論 (5)編輯 收藏

          /home 分區(qū)是最常移動(dòng)的分區(qū)之一。某些時(shí)候,/home 中的全部空間都用完了,而且需要增加一個(gè)硬盤驅(qū)動(dòng)器。另一些時(shí)候,/home 被設(shè)置為根分區(qū)的一部分,為了提高性能或便于備份,可能需要將它移動(dòng)到別的地方。我會(huì)針對每種情況說明如何安全有效地移動(dòng) /home。

          please visit the address:
          http://www.ibm.com/developerworks/cn/linux/l-tip-prompt/tip05/index.html

          posted @ 2007-11-09 15:52 bluoy 閱讀(148) | 評論 (0)編輯 收藏

          網(wǎng)上常見的推薦是tora. 地址: http://sourceforge.net/projects/tora/
          但由于License關(guān)系,二進(jìn)制版本剔除了對oracle的providor. 所以需要下載源碼自己編譯。
          感覺比較麻煩。

          最近又找到一個(gè)比較好的東東-- Aqua Data Studio。 (http://www.aquafold.com/index.html)
          而且也有免費(fèi)版本。
          下載試用了一下,非常方便易用。
          推薦給有此需要者。

          posted @ 2007-11-07 11:49 bluoy 閱讀(2505) | 評論 (0)編輯 收藏

          如何臨時(shí)增加交換空間。

          1.產(chǎn)生一個(gè)64M的空文件

          #dd if=/dev/zero of=/swapfile bs=1024 count=65536

          2.初始化該文件為交換文件:

          mkswap /swapfile 65536

          sync

          3.激活這個(gè)交換文件:

          swapon /swapfile

          posted @ 2007-11-06 14:03 bluoy 閱讀(305) | 評論 (0)編輯 收藏

          僅列出標(biāo)題
          共4頁: 上一頁 1 2 3 4 下一頁 
          主站蜘蛛池模板: 乌拉特前旗| 盐城市| 海晏县| 泾阳县| 双流县| 泸溪县| 家居| 邵东县| 合水县| 甘南县| 上虞市| 松滋市| 惠州市| 邵东县| 桂林市| 新密市| 莒南县| 七台河市| 洮南市| 逊克县| 通州市| 汉阴县| 昭平县| 大余县| 奇台县| 怀集县| 海盐县| 冕宁县| 铁力市| 宁远县| 同江市| 华容县| 临漳县| 淮滨县| 施甸县| 行唐县| 高阳县| 大同县| 将乐县| 界首市| 凭祥市|