<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    @OverWrite BlogJava

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      128 隨筆 :: 0 文章 :: 29 評論 :: 0 Trackbacks

    2008年3月11日 #

    httpclient已停止維護,其替代產品為 Apache HttpComponents 。 官方聲明如下(詳細信息點擊這里):
    The Commons HttpClient project is now end of life, and is no longer being developed. It has been replaced by the Apache HttpComponents project in its HttpClient and HttpCore modules, which offer better performance and more flexibility.

    HttpClient 是 Apache Jakarta Common 下的子項目,可以用來提供高效的、最新的、功能豐富的支持 HTTP 協議的
    客戶端程工具包,并且它支持 HTTP 協議最新的版本和建議。本文首先介紹 HTTPClient,然后根據作者實際工作經驗給出了一些常見問題的解決方法。 

    所以打算用HttpClient的朋友,可以考慮使用HttpComponents 了。
    HttpComponents 入門,筆者認為 iteye上的一篇文章寫的不錯,大家可以參考 《HttpComponents入門解析》
    posted @ 2012-08-12 17:50 vesung 閱讀(397) | 評論 (0)編輯 收藏

    現在本本屏幕越來越小, 在上面運行eclipse就會顯得字體小, 那么如何調整字體大小那?
    方法一:
        打開菜單 window->preferences->general->appearance->colors and fonts
    打開basec里面的text font 進行編輯會彈出一個字體編輯的窗口, 在里面調整字體即可。

    方法二:
        因為eclipse版本眾多,所以菜單路徑也會有所差異。 還有一種方法可以不用擔心不同版本的差異:
        開始先打開菜單 window->preferences   在左上角數據font 回車, eclipse就會自動搜索出可以設置字體的地方了。 接下來打開basec里面的text font 進行編輯會彈出一個字體編輯的窗口, 在里面調整字體即可。 


    一點小技巧希望對大家能有所幫助。
    posted @ 2012-07-26 14:46 vesung 閱讀(43764) | 評論 (1)編輯 收藏

    這篇文章在chinaunix上看到,寫的很不錯。希望能對學習linux的人有所幫助。

    隨著Linux應用的擴展許多朋友開始接觸Linux,根據學習Windwos的經驗往往有一些茫然的感覺:不知從何處開始學起。作為一個 Linux系統管理員,我看了許多有關Linux的文檔和書籍,并為學習Linux付出了許多艱苦的努力。當真正獲得了一份正式的Linux系統管理工作 后,我更加深刻地理解了Linux的靈魂:服務與多用戶。Linux系統知識是非常廣博的,但是只要掌握了重點知識,管理它并沒有想象中的那么可怕。在下 面我會將作為系統管理員的一些工作心得和總結出來的經驗系統地介紹給大家。

    一、 學習的目的

    通過Linux的學習掌握UNIX的目的想必不用多說了,在這個網絡人才身價倍增的年代,想靠技術吃飯又不想掌握網絡和編程技術是不明智的。當一人第一次 聽說Linux并躍躍欲試的時候,總會提出幾個?,它是什么(What)? 為什么要用它(Why)? 怎樣學習它(How)?做為開放源碼運動的主要組成部分,Linux的應用越來越廣泛,從我們平時的娛樂、學習,到商業、政府辦公,再到大規模計算的應 用。為了滿足人們的需求,各種各樣的、基于Linux的應用軟件層出不窮。只要具備了LinuX的基本功,并具有了自學的能力之后,都可以通過長期的學習 將專項內容予以掌握。

    二、 從命令開始從基礎開始

    常常有些朋友一接觸Linux 就是希望構架網站,根本沒有想到要先了解一下Linux 的基礎。這是相當困難的。雖然Linux桌面應用發展很快,但是命令在Linux中依然有很強的生命力。Linux是一個命令行組成的操作系統,精髓在命 令行,無論圖形界面發展到什么水平這個原理是不會變的,Linux命令有許多強大的功能:從簡單的磁盤操作、文件存取、到進行復雜的多媒體圖象和流媒體文 件的制作。這里筆者把它們中比較重要的和使用頻率最多的命令,按照它們在系統中的作用分成幾個部分介紹給大家,通過這些基礎命令的學習我們可以進一步理解 Linux系統:

    ●安裝和登錄命令:login、 shutdown、 halt、 reboot 、mount、umount 、chsh
    ●文件處理命令:file、 mkdir、 grep、dd、 find、 mv 、ls 、diff、 cat、 ln
    ●系統管理相關命令: df、 top、 free、 quota 、at、 lp、 adduser、 groupadd kill、 crontab、 tar、 unzip、 gunzip 、last
    ●網絡操作命令:ifconfig、 ip 、ping 、 netstat 、telnet、 ftp、 route、 rlogin rcp 、finger 、mail 、nslookup
    ●系統安全相關命令: passwd 、su、 umask 、chgrp、 chmod、chown、chattr、sudo、 pswho

    三、 選擇一本好的Linux書籍

    無論在論壇還是讀者反饋中,我們看到最多的問題往往是某個新手,在安裝或使用linux的過程中遇到一個具體的問題就開始提問,很多都是重復性的問題,甚 至有不少人連基本的問題描述都不是很清楚。這說明很多初學linux的人還沒有掌握基本功。怎樣才能快速提高掌握linux的基本功呢? 最有效的方法莫過于學習權威的linux工具書,工具書對于學習者而言是相當重要的。一本錯誤觀念的工具書卻會讓新手整個誤入歧途。目前國內關于 linux的書籍有很多不過精品的不多,筆者強烈建議閱讀影印本的“o'reilly原版linux圖書”,而且出版社還提供了一個非常好的路線圖


    四 、養成在命令行下工作

    一定要養成在命令行下工作的習慣,要知道X-window只是運行在命令行模式下的一個應用程序。在命令行下學習雖然一開始進度較慢,但是熟悉后,您未來 的學習之路將是以指數增加的方式增長的。從網管員來說,命令行實際上就是規則,它總是有效的,同時也是靈活的。即使是通過一條緩慢的調制解調器線路,它也 能操縱幾千公里以外地遠程系統。

    五、用Unix思維思考Linux

    由于Linux是參照Unix的思想來設計的,理解和掌握它就必須以Unix的思維來進行,而不能以Windows思維。不可否認,windows 在市場上的成功很大一部分在于技術思想的獨到之處。可是這個創新是在面對個人用戶的前提下進行的,而面對著企業級的服務應用,它還是有些力不從心。多年來 在計算機操作系統領域一直是二者獨大:unix在服務器領域,Windows在個人用戶領域。由此可見,用戶需求決定了所采用的操作系統。不管什么原因, 如果要學習Linux,那么首先要將思維從Windows的“這個小河” 中拖出來,放入Unix的海洋。

    六 、學習shell

    對于Shell(中文名稱殼),習慣Windows的讀者肯定是非常陌生的,因為Windows只有一個“Shell”(如果可以說是Shell的話), 那就是Windows自己。用一句話容易理解的解釋就是,shell是用戶輸入命令與系統解釋命令之間的中介。最直觀的說法,一種Shell有一套自己的 命令。舉一個容易理解的例子,Linux的標準Shel是Bash Shel;Solaris的shell是B shell;Linux的Shell是以命令行的方式表現出來的。讀者可能會不理解,Windows從命令行“進化”到了圖形界面,那么Linux現在還 使用命令行豈不是一種倒退?

    當初我剛剛接觸Linux時就曾有過這種想法。可是后來發現,如果使用圖形界面,那么分配給應用軟件的資源就少了,在價格昂貴的服務器上,能夠以較低的硬件配置實現同樣的功能是非常重要的。

    下面舉例說明,一臺服務器有1GB內存,假設其中512MB用于處理圖形界面,若要安裝一個需要784MB內存的數據庫軟件,惟一的辦法就是擴大內存。但 是如果使用命令行,系統可能只需要64MB內存,其它的內存就可以供數據庫軟件使用了。使用命令行,不僅是內存,而且CPU及硬盤等資源的占用都要節省很 多。所以,作為服務器使用命令行是優點而不是缺點。既然Shell有這么多優點,就必須要學習它。
    七、勤于實踐

    要增加自己Linux 的技能,只有通過實踐來實現了。所以,趕快找一部計算機,趕快安裝一個 Linux 發行版本,然后進入精彩的Linux世界。相信對于你自己的 Linux 能力必然大有斬獲。此外,人腦不像計算機的硬盤一樣,除非硬盤壞掉了或者是資料被你抹掉了,否則儲存的資料將永遠而且立刻的記憶在硬盤中。在人類記憶的曲 線中,你必須要不斷的重復練習才會將一件事情記得比較熟。

    同樣的,學習 Linux 也一樣,如果你無法經常學習的話,學了后面的,前面的忘了。你對Linux命令熟悉后你可以開始搭建一個小的Linux網絡,這是最好的實踐方法。 Linux是網絡的代名詞,Linux網絡服務功能非常強大,不論是郵件服務器、Web服務器、DNS服務器等都非常完善。當然你不需搭建所有服務,可以 慢慢來。需要說明的是這個Linux網絡對于初學者有兩三臺計算機即可。自己多動手,不要非要等著別人幫你解決問題。

    八、學會使用文檔

    和私有操作系統不同,各個Linux的發行版本的技術支持時間都較短,這對于Linux初學者是往往不夠的。其實當你安裝了一個完整的Linux系統后其 中已經包含了一個強大的幫助,只是可能你還沒有發現和使用它們的技巧。主流Linux發行版都自帶非常詳細的文檔(包括手冊頁和FAQ),從系統安裝到系 統安全,針對不同層次的人的詳盡文檔,仔細閱讀文檔后40%問題都可在此解決。查閱經典工具書和Howto,特別是Howto是全球數以萬計的 Linux、Unix的經驗總結非常有參考價值通常40%的問題同樣可以解決。安裝一個新的軟件時先看README,再看INSTALL然后看FAQ,最 后才動手安裝,這樣遇到問題就知道為什么。如果說明文檔不看,結果出了問題再去論壇來找答案反而浪費時間。

    當查找文檔時, 一定要看文檔是在何種版本、何種環境及何種狀態下出現的何種結果。對于文檔的有效性, 一時還無法在操作前就知道結論如何,那么對某個專題或問題,閱讀相關的多篇文章將會節省大量的時間,還可以保證盡量“干凈”的環境,有效避免因為不同操作 所造成的更多問題。操作時要仔細核對各個步驟及輸出的結果,盡量保持與文檔一致。

    九、在Linux論壇獲取幫助

    如果上面的措施沒有解決問題,此時你就需要Linux社區的幫助了。需要說明的是你要有周全的思考,準備好你的問題,不要草率的發問,否則只會得到到草率 的回答或者根本得不到任何答案。越表現出在尋求幫助前為解決問題付出的努力,你越能得到實質性的幫助。最好先搜尋一下論壇是否有您需要的文章。這樣可以獲 得事半功倍的效果。

    你需要提供精確有效的信息。這并不是要求你簡單的把成噸的出錯代碼或者數據完全轉儲摘錄到你的提問中。如果你有龐大而復雜的測試條件,盡量把它剪裁得越小 越好。可能你會遇到這種情況,對于一個問題會出現不同內容回答,這時你需要通過實踐來驗證。另外把這個問題放在其他Linux社區請求幫助也是一種選擇。 如果得不到答案,請不要以為我們覺得無法幫助你。有時只是看到你問題的人不知道答案罷了。這時換一個社區是不錯的選擇。

    十、學習專業英文

    如果你想深入學習Linux,看不懂因為文檔實在是太難了。寫的最好的,最全面的文檔都是英語寫的,最先發布的技術信息也都是用英語寫的。即便是非英語國家的人發布技術文檔,也都首先翻譯成英語在國際學術雜志和網絡上發表。

    通過man、info等命令,可以從在線幫助中快速地獲得所需要的命令和操作方法。不要害怕海量的系統幫助,仔細閱讀幾個man或info文檔就會發現, 這些幫助幾乎都按照固定格式寫成一命令名稱、參數、參數說明、使用例子、參考等。當英語成為一種習慣,就會自覺地查找或訂閱互聯網上感興趣的英文材料。這 樣,在不知不覺中就已經和世界同步。

    十一、在社區共享你的經驗

    隨著Linux應用的擴展,出現了不少Linux社區。其中有一些非常優秀的社區:水木清華、其中有一些非常優秀的社區:www.linuxforum.net(國內最高水平GNU站點)、http://www.chinaunix.net/ (中國最大的Unix技術社區),隨著知識的不斷積累,就可以把自己動手解決一些前人沒有遇到的問題寫出文檔在網絡上共享給其他讀者。這個時候,也就成為 了一名“高手”。Linux的使用者一般都是專業人士,他們有著很好的電腦背景且愿意協助他人,Linux高手更具有鼓勵新手的文化精神。

    最后是一個筆者的Linux學習的路線圖(roadmap):

    ●了解Linux 的基礎知識,這些包含了用戶管理、群組的概念、權限的觀念等;
    ●掌握至少50個以上的常用命令;
    ●掌握.tgz、.rpm等軟件包的常用安裝方法
    ●學習添加外設,安裝設備驅動程序(比如網卡)
    ●熟悉Linux文件系統 和目錄結構。
    ●掌握vi,gcc,gdb等常用編輯器,編譯器,調試器 。
    ●理解shell別名、管道、I/O重定向、輸入和輸出以及shell腳本編程。
    ●網絡的基礎包括: 掌握路由概念、OSI七層網絡模型、TCP/IP模型及相關服務對應的層次對于Linux學習非常重要的。然后學習Linux環境下的組網。
    posted @ 2008-07-31 17:49 vesung 閱讀(393) | 評論 (0)編輯 收藏

    國外開發者博客中有一篇有趣的文章,將程序員按水平像軟件版本號那樣劃分為不同的版本。相對于在招聘時分為初級,中級,高級程序員,直接表明需要某種語言N版本的程序員或許更方便直接。根據作者的觀點,可將WEB開發者大致分為以下幾個版本:

    Alpha:閱讀過一些專業書籍,大多數能用Dreamweaver或者FrontPage幫朋友制作一些Web頁面。但在他們熟練掌握HTML代碼以前,你大概不會雇傭他們成為職業的WEB制作人員。

    Beta:已經比較擅長整合站點頁面了,在HTML技巧方面也有一定造詣,但還是用Tables來制作頁面,不了解CSS,在面對動態頁面或數據庫連接時還是底氣不足。

    Pre Version 1 (0.1):比Beta版的開發者水平要高。熟悉HTML,開始了解CSS是如何運作的,懂一點JavaScript,但還是基于業余水準,逐步開始關心動態站點搭建和數據庫連接的知識。這個版本的WEB開發人員還遠不能成為雇主眼中的香餑餑。

    1.0: 能夠基本把控整個站點開發,針對每個問題盡可能的找到最直接的解決辦法。但對可測性,可擴展性以及在不同(層)框架下如何選擇最合適的WEB設計工具尚無概念。這個版本的WEB開發者有良好的技術基礎,需要有進一步的幫助和指導。

     

    2.0:懂面向對象的編程語言,理解分層開發的必要性,關注代碼分離,對問題尋找更完美的解決方法,偶然也會考慮設計模式的問題,但對此仍然概念不清。屬于優秀的初級開發者,能完成較松散的代碼開發(相對大型嚴謹的站點開發而言),在面對較復雜問題尋找解決辦法時需要周邊人的幫助。

    3.0:開始較為深入的理解面向對象編程和設計模式,了解他們的用途,當看到好的設計模式時能看透其本質,逐步關注分層的架構解決辦法和可測試性。理解不同的開發語言并能說出他們的異同(例如各自的優勢)。屬于優秀的中級別開發者,雇主也確信他們最終能找到問題的解決辦法,這個版本的人可以給1.0和2.0的開發者以指導。但他們對架構的理解仍然不夠清晰,值得一提的是,只要給予一些指導,他們能很快理解并熟記做出的決定,以及選定方案的優勢所在。

    4.0:理解模式,重視用戶的反饋。著手研究方法論,架構設計和軟件開發的最佳入口。頭腦中已經形成了超越開發語言,技術架構的整體方案,可根據需求解構程序。能從理論的角度,不同模式如何融合成最佳形態,將多種X-驅動的模式應用到不同的方案中。是精通多語言的高手,理解不同系統和方法論的細微差別,屬于高級程序員。這個級別的人能夠輕易的輔導2.0和3.0的程序員,將他們推向更高的級別。

    5.0:從系統的角度考慮問題。對各種系統結構有深入研究,能對整個代碼架構中的問題進行改進。在團隊粘合性以及代碼安全性方面有杰出貢獻。對1.0到4.0版本的開發人員出現的問題能及時察覺,讓整個團隊保持積極性且保持興奮的狀態創建軟件解決辦法。舉例來說,他們總是對新的技術和信息保持饑渴狀態,試圖用最簡便的方案解決開發任務。在整個IT團隊中獲得信任,屬于高級程序員和架構師。

    那么,您屬于哪個版本的程序員呢?

    posted @ 2008-06-29 23:28 vesung 閱讀(625) | 評論 (1)編輯 收藏

    中國互聯網審查制度的不透明一直為人所詬病。現在還不清楚56.com是因為什么開罪了監管機構,也不知道該網站會關閉多久。這些疑問也表明籠罩整個中國互聯網視頻領域的風險,即使是那些有明智投資方支持的大型互聯網公司也面臨著同樣的問題。該網站至少募集了3,000萬美元資金,投資方中包括風險投資巨頭Sequoia Capita和華特•迪斯尼(Walt Disney Co.)旗下的Steamboat Ventures。

    網絡視頻主管部門之一的中國國家廣電總局(SARFT)沒有回復記者就56.com問題的采訪申請。該網站首席財務長張福興(Jay Chang)拒絕發表評論,其投資方的人士也拒絕置評。

    看來清理行動開始下狠手了。
    posted @ 2008-06-23 08:54 vesung 閱讀(352) | 評論 (0)編輯 收藏

    不說廢話了,直接看代碼:
    頁面:
    <html>
    <head>
    <script type='text/javascript' src='jquery.js'></script>
    <script type='text/javascript'>
    //js代碼1
    <script>

    <body>
    <table>
     
    <tr>
      
    <td>級聯菜單</td>
      
    <td>
        
    <select name='city' class='amenu'>
         
    <option value=''>-市局全部-</option>
         
    <option value='1'>a市</option>
         
    <option value='2'>b市</option>
         
    <option value='3'>c市</option>
        
    </select>
      
    </td>
      
    <td>
        
    <select name='country' class='amenu'>
         
    <option value=''>-縣局全部-</option>
         
    <option value='1'>test</option>
        
    </select>
      
    </td>
      
    <td>
        
    <select name='taxOffice' class='amenu'>
         
    <option value=''>-所全部-</option>
         
    <option value='1'>test</option>    
        
    </select>
      
    </td>
      
    <td>
        
    <select name='taxOffical' class='amenu'>
         
    <option value=''>-職員全部-</option>
         
    <option value='1'>test</option>    
        
    </select>
      
    </td>
     
    </tr>
    </table>
    </body>

    對應的js代碼:
    js代碼1:
    //本菜單是4級級聯菜單,采用jquery框架來實現
    $(document).ready(function(){
     
    //為所有class為amenu的元素綁定onchange事件
     $('.amenu').change(function(){
      
    //記錄本級菜單標志
      var orgLevel = this.name;
      
    //下級菜單
      var nextMenu = $(this).parents().next().children[0];
      
    //ajax動作提交的對象(后臺采用java程序)
      var postUrl = 'pubOrgAjax.do';

      
    //如果本菜單是最后一級菜單的話則不做任何動作
      if(orgLevel=='taxOffical') return true;
      
    //本級菜單選擇為全部選項,則下級菜單也置為全部
      if(this.value == ''){
       
    var firstOption = nextMenu.option[0];
       nextMenu.length
    =0;
       nextMenu.options.add(firstOption);
       
    return true;
      }


      
    //ajax動作
      $.post(postUrl,{orgFlag:orgLevel,orgCode:this.value},function(xml){
        
    var dicts = $('dict',xml);
        
    if(dicts.length<1){alert('返回數據錯誤,請重新登陸');return false;}
        
    //清空nextMenu
        if(nextMenu.options[0].value == ''){
          
    var firstOption = nextMenu.options[0].text;
          nextMenu.length 
    = 0;
          nextMenu.options.add(
    new Option(firstOption,''));
        }
    else{
          nextMenu.length 
    = 0;
        }

        
    //為清空后的nextMenu填充新值
        for(var i=0;i<dicts.length;i++){
          
    var newOption = new Option($('name',dicts[i]).text(),$('code',dicts[i]).text());
          nextMenu.options.add(newOption);
        }

        
      }
    );
      
     }
    );
    }
    );

    后臺返回的數據格式:
    <?xml version="1.0" cencodeing="gbk"?>
    <ajax-response>
    <response>
     
    <dict>
        
    <code>1</code>
        
    <name>市局1</name>
     
    </dict>
     
    <dict>
     
     
    </dict>

     
    </response>
    </ajax-respnse>

    posted @ 2008-06-12 09:44 vesung 閱讀(9840) | 評論 (5)編輯 收藏

    Yahoo本周發表研發一年的Yahoo!BrowserPlus預覽版,這是一個用來延伸網絡應用的平臺,開發人員可透過該平臺結合桌面程序,而用戶只要透過瀏覽器就能執行利用該平臺開發的網絡應用。

    現階段BrowserPlus平臺所提供的功能包括自桌面拖曳、客戶端的圖像處理,以及桌面通知工具等。Yahoo指出,BrowserPlus的最大特色就是可以直接新增或更新服務而不用重新啟動瀏覽器,甚至不需重新下載網頁,對使用者而言,這代表在執行這些新應用時不用進行安裝或受到其他干擾;開發人員則能透過單一的功能呼叫檢視或啟動新服務。

    Yahoo展示了基于BrowserPlus所設計的應用范例,其中一個為照片上傳工具Photo Uploader,該工具參考了Flickr Uploader桌面應用程序的功能,用戶可以透過瀏覽器,從桌面上拖曳照片,并進行諸如旋轉、改變大小以及特效等簡單的編輯功能。

    BrowserPlus屬于近來風行的豐富網絡應用程序(RIA)平臺,Yahoo利用該平臺替開發人員處理了復雜的軟件發表及更新功能,讓開發人員及使用者皆能從中受益。

    Yahoo目前僅允許Yahoo及其合作伙伴使用BrowserPlus,預計在公開版本發表后才會供其他開發人員使用。現階段BrowserPlus支持Windows XP及Mac OS X等操作系統,以及IE、Firefox及Safari等瀏覽器,未來將支持更多的平臺。

    Yahoo指出,Yahoo致力于開發開放的平臺,其中一項重點是提供開發人員用來開發內容的客戶端工具,Yahoo先前已釋出Yahoo用戶接口鏈接庫(Yahoo!User Interface Library,YUI)開放源碼計劃,BrowserPlus則是提供以瀏覽器為基礎的網站開發解決方案,該平臺之后也將朝開放的目標前進。

    豐富網絡應用程序平臺成為各大業者爭相競逐的領域,市場上類似的平臺還包括微軟發表的Silverlight、Adobe的AIR,以及Mozilla基金會所開發的Prism等

    posted @ 2008-06-05 08:50 vesung 閱讀(423) | 評論 (0)編輯 收藏

    (轉載)
    2007年6月項目準備開始了,剛來到一個新的項目組,什么都是新的,除了我自己。

    需要一個新的框架來開發項目,香港的同事決定使用Dojo,DWR, 我開始學習使用dojo,時間很短,但是我還是基本上熟悉了dojo的基本控件和架構。在此基礎上搭建起了項目的基本框架。這是一個單頁面,基于ajax和dojo widget的系統,一切都那么的新奇,又充滿挑戰,但是既然dojo有這么多后臺,又有香港同事的推薦,我顯得自信滿滿。

    框架搭建的同事,也開始后了緊鑼密鼓的招兵買馬,一起都像是從零開始。陸陸續續,招了5個程序員和一個測試員。開始了整個項目的快速開發,由于需求由香港負責,而且需求做的比較細致,基本上問題很少。Dojo 卻是麻煩不斷。

    首先的一個壞消息是當我們做完了幾乎全部300個頁面的時候,dojo宣布0.43不在得到支持,取而代之是完全不同的dojo0.9。 而且dojo0.9 還不是穩定的版本,問題多多,讓我們騎虎難下,最后還是決定按兵不動。 隨之而來,是dojo1.0,dojo1.1 的陸續發布,但是一直都無法讓我看到希望的曙光。 與之相對的是ext在國內的廣泛使用和熱烈追捧。

    Dojo 的控件有很多奇怪的地方,日期選擇控件的行為非常怪異,與國內的使用習慣很不相同。而且樣式極其丑陋,當字體放大縮小的時候更是丑陋。顯示的格式和保存的格式需要分別指定。我們修改了大量的代碼。

    dojo 的下拉框也被用戶投訴,過濾之后一定要再選擇一次或者按回車才能選定結果,前臺值和后臺值分開操作也帶來很多不變。

    dojo 的驗證文本框顏色現實有bug,我們不得不修改代碼

    dojo的對話框也有問題,對話框中無法在彈出對話框。對話框的操作和控制很不靈活。

    js代碼不利于管理,容易發生命名沖突。

     

    致命的問題發生在項目的后期,在客戶的系統進行測試時發現。dojo的性能非常差,在賽揚2G的電腦上,一個頁面顯示的時間竟然需要17秒。簡直就是噩夢。

    另外使用dojo的對話框時出現cpu占用100%而且一直不回落下來。

    頁面載入完成的時候,它有將整個頁面重新刷新一次,又需要花費額外的5到8s時間,不僅花費更多的時間,而且嚴重影響客戶體驗。

     

    還有開發過程中碰到的無數問題,雖然一個一個被解決,但是無疑是一次一次痛苦的煎熬。

     

    最后,在性能面前,我被dojo徹底打敗,如此的速度是任何客戶都無法忍受的,客戶不可能為了這個系統全部升級電腦cpu。而且還有很多未知的問題可能還沒有被發覺,不如內存泄露,可能導致資源耗盡,內存耗盡。cpu 的占用可能在使用時間長了之后越來越高,等等,這些都是我擔心的問題。

     

    使用Ajax或者說Rich client,一定要謹慎啊。使用新的技術和框架,一定要謹慎,這是我的教訓,希望給同行們一個參考。

    posted @ 2008-06-04 11:32 vesung 閱讀(2099) | 評論 (2)編輯 收藏

    看兩段代碼:
    import java.util.ArrayList;   
    import java.util.List;   
      
    public class TailRecursionTest {   
        
    public static void main(String[] args) {   
            TailRecursionTest t 
    = new TailRecursionTest();   
            
    for (int i = 0; i < 10000; i++)   
                t.a(
    0);   
        }
       
      
        
    public void a(int j) {   
            j
    ++;   
            List list 
    = new ArrayList<Integer>(100000);   
            
    // 對list進行處理   
        }
       
    }

    沒啥特殊的,僅僅是為了測試,我們將a方法調用10000次,a方法創建一個有100000個元素的list的局部變量。
    第二個程序:
    import java.util.ArrayList;   
    import java.util.List;   
      
    public class TailRecursionTest2 {   
        
    public static void main(String[] args) {   
            TailRecursionTest2 t 
    = new TailRecursionTest2();   
            t.a(
    0);   
        }
       
      
        
    public void a(int j) {   
            System.out.println(j);   
            j
    ++;   
            
    if (j == 10000)   
                
    return;   
            List list 
    = new ArrayList<Integer>(100000);   
            
    // 對list進行處理   
            a(j);   
        }
       
    }
      

    也沒啥特殊的,就是將循環換成了遞歸,a方法做的事情沒變。兩個都跑一下,程序1順利結束,程序2出問題了,啥問題?如下:
    161  
    162  
    163  
    164  
    165  
    Exception in thread 
    "main" java.lang.OutOfMemoryError: Java heap space   
        at java.util.ArrayList.
    <init>(Unknown Source)   
        at TailRecursionTest2.a(TailRecursionTest2.java:
    17)   
        at TailRecursionTest2.a(TailRecursionTest2.java:
    20)   
        at TailRecursionTest2.a(TailRecursionTest2.java:
    20)   
        at TailRecursionTest2.a(TailRecursionTest2.java:
    20)   
        at TailRecursionTest2.a(TailRecursionTest2.java:
    20

    我倒,才運行166次了,heap就滿了。問題在哪呢?oh,yep,你肯定想到了,是不是重復創建list這個大集合引起的呢?它不是局部變量嗎?怎么也會溢出?是的,list是局部變量,在a的方法棧里引用著,指向heap上的大對象,更關鍵的問題在于,java是沒有尾遞歸優化的,遞歸方法是不會使用同一個棧幀,每一次遞歸調用,都將壓入新的棧幀,并且這個棧幀上又new了一個list變量,引用著heap上新的一個大集合。隨著棧深度的增加, jvm里維持著一條長長的方法調用軌跡以便你能回來,在方法沒有返回之前,這些list變量一直被各自的棧幀引用著,不能被GC,你說,能不OOM嗎?

        也許,你想到了個補救方法來挽救程序2,就是每次在處理完list后,我把它設置為null,不讓棧幀繼續引用著它,咱編寫對gc友好的代碼,這不就行了,試試:


    import java.util.ArrayList;   
    import java.util.List;   
      
    public class TailRecursionTest2 {   
        
    public static void main(String[] args) {   
            TailRecursionTest2 t 
    = new TailRecursionTest2();   
            t.a(
    0);   
        }
       
      
        
    public void a(int j) {   
            System.out.println(j);   
            j
    ++;   
            
    if (j == 10000)   
                
    return;   
            List list 
    = new ArrayList<Integer>(100000);   
            
    // 對list進行處理   
            list = null;  //gc友好   
            a(j);   
        }
       
    }
     

    得意洋洋,我跑一下看看,這次跑到4000多次,但是:
       
    4289  
    4290  
    4291  
    4292  
    java.lang.StackOverflowError   
        at sun.nio.cs.ext.DoubleByteEncoder.encodeArrayLoop(Unknown Source)   
        at sun.nio.cs.ext.DoubleByteEncoder.encodeLoop(Unknown Source)   
        at java.nio.charset.CharsetEncoder.encode(Unknown Source) 

    總結:在java里,遞歸最好咱還是別用,老老實實地while、for;就算遞歸了,最好遞歸方法不要new太大的對象,除非你能確定遞歸的深度不是那么大,否則OOM和堆棧溢出的陰影將籠罩著你。
    posted @ 2008-06-03 09:14 vesung 閱讀(1565) | 評論 (0)編輯 收藏

    先看下面表格:

    作用域
    當前類 同一package 子孫類
    其他package
    public √   
    √   
    √   
    √   
    protected
    √   
    √   
    √   
      × 
    default √   
    √   
      × 
      × 
    private √   
      × 
      × 
      × 

    不寫時默認為default

    我們先看類:

    public class  Test 可以在任何地方訪問,無論是否為當前package
    class Test 只允許當前的package使用,不允許其它package使用
    class 不與許prirvate和protected ,所以不討論了

    我們再看方法
    private 的只允許類自己使用,子類都不可見。但允許inner類調用,因為inner類屬于他自己。

    class Test 里面的方法
      public 和default和protected 方法,允許同包的訪問,因為類是default的,所以方法不可能大于它

    public class Test 里面的方法
      private 只允許自己內部訪問
     default 只允許同包的訪問
      protected 只允許同包和子類訪問
      public 可以任意訪問
    posted @ 2008-06-02 09:12 vesung 閱讀(879) | 評論 (0)編輯 收藏

         摘要:   默認的序列化機制并不難操縱。然而,假若有特殊要求又該怎么辦呢?我們可能有特殊的安全問題,不希望對象的某一部分序列化;或者某一個子對象完全不必序列化,因為對象恢復以后,那一部分需要重新創建。 此時,通過實現Externalizable接口,用它代替Serializable接口,便可控制序列化的具體過程。這個Externalizable接口擴展了Serializable,并增添了兩個...  閱讀全文
    posted @ 2008-05-28 12:00 vesung 閱讀(677) | 評論 (0)編輯 收藏

    JNDI是J2EE中一個很重要的標準,通常我們是在EJB編程中用到, 
    Tomcat4.0中提供了在JSP和Servelt中直接使用JNDI的方法,下面談一下在Tomcat4.0中配置和使用JNDI的方法 
    (以通過JNDI連接數據庫為例) 
    假設使用的數據庫是mysql,實驗例子在TOMCAT_HOME/webapps/DBTest目錄中 

    A.將mysql的JDBC連接庫mm.mysql-2.0.9-bin.jar放入TOMCAT_HOME/common/lib中 

    B.配置TOMCAT_HOME/conf/serer.xml文件在<Service>;段中加入一個Context: 
    <Context path="/DBTest" docBase="DBTest" 
    debug="5" reloadable="true" crossContext="true"> 
    </Context> 
    這是DBTest的根路徑,這是為了在DBTest中使用做準備. 

    C.在上面加入的<Context>;段加入 
    <Resource name="jdbc/TestDB" 
    auth="Container" 
    type="javax.sql.DataSource"/> 

    <ResourceParams name="jdbc/TestDB">
    <parameter> 
    <name>;factory</name> 
    <value>;org.apache.commons.dbcp.BasicDataSourceFactory</value> 
    </parameter> 

    <!-- Maximum number of dB connections in pool. Make sure you 
    configure your mysqld max_connections large enough to handle 
    all of your db connections. Set to 0 for no limit. 
    --> 
    <parameter>
    <name>;maxActive</name>
    <value>;100</value>
    </parameter>

    <!-- Maximum number of idle dB connections to retain in pool. 
    Set to 0 for no limit. 
    -->
    <parameter> 
    <name>;maxIdle</name> 
    <value>;30</value> 
    </parameter> 

    <!-- Maximum time to wait for a dB connection to become available 
    in ms, in this example 10 seconds. An Exception is thrown if 
    this timeout is exceeded. Set to -1 to wait indefinitely. 
    --> 
    <parameter> 
    <name>;maxWait</name> 
    <value>;10000</value> 
    </parameter> 

    <!-- MySQL dB username and password for dB connections --> 
    <parameter> 
    <name>;username</name>; 
    <value>;test</value> 
    </parameter> 
    <parameter> 
    <name>;password</name> 
    <value>;test</value> 
    </parameter> 

    <!-- Class name for mm.mysql JDBC driver -->; 
    <parameter>; 
    <name>;driverClassName</name>; 
    <value>;org.gjt.mm.mysql.Driver</value> 
    </parameter> 

    <!-- The JDBC connection url for connecting to your MySQL dB.--> 
    <parameter> 
    <name>;url</name> 
    <value>;jdbc:mysql://localhost:3306/test</value> 
    </parameter> 
    </ResourceParams> 

    這里每一個小段都有英文注解,是Tomcat提供的,我們可以將按照Sample加入,主要修改的是driverClassName, 
    url,和用戶帳號;需要強調的是"jdbc/TestDB"就是JDNI要查找的Name.

    在web.xml中加入 
    <resource-ref> 
    <description>;DB Connection</description> 
    <res-ref-name>;jdbc/TestDB</res-ref-name> 
    <res-type>;javax.sql.DataSource</res-type> 
    <res-auth>;Container</res-auth> 
    </resource-ref> 
    這里的jdbc/TestDb要和C中Resource段的name匹配 

    posted @ 2008-04-25 09:02 vesung 閱讀(431) | 評論 (0)編輯 收藏

    一、DataSource接口是一個更好的連接數據源的方法:
      JDBC1.0是原來是用DriverManager類來產生一個對數據源的連接。JDBC2.0用一種替代的方法,使用DataSource的實現,代碼變的更小巧精致,也更容易控制。
      一個DataSource對象代表了一個真正的數據源。根據DataSource的實現方法,數據源既可以是從關系數據庫,也電子表格,還可以是一個表格形式的文件。當一個DataSource對象注冊到名字服務中,應用程序就可以通過名字服務獲得DataSource對象,并用它來產生一個與DataSource代表的數據源之間的連接。
      關于數據源的信息和如何來定位數據源,例如數據庫服務器的名字,在哪臺機器上,端口號等等,都包含在DataSource對象的屬性里面去了。這樣,對應用程序的設計來說是更方便了,因為并不需要硬性的把驅動的名字寫死到程序里面去。通常驅動名字中都包含了驅動提供商的名字,而在DriverManager類中通常是這么做的。如果數據源要移植到另一個數據庫驅動中,代碼也很容易做修改。所需要做的修改只是更改DataSource的相關的屬性。而使用DataSource對象的代碼不需要做任何改動。
      由系統管理員或者有相應權限的人來配置DataSource對象。配置DataSource,包括設定DataSource的屬性,然后將它注冊到JNDI名字服務中去。在注冊DataSource對象的的過程中,系統管理員需要把DataSource對象和一個邏輯名字關聯起來。名字可以是任意的,通常取成能代表數據源并且容易記住的名字。在下面的例子中,名字起為:InventoryDB,按照慣例,邏輯名字通常都在jdbc的子上下文中。這樣,邏輯名字的全名就是:jdbc/ InventoryDB。
      一旦配置好了數據源對象,應用程序設計者就可以用它來產生一個與數據源的連接。下面的代碼片段示例了如何用JNDI上下文獲得一個一個數據源對象,然后如何用數據源對象產生一個與數據源的連接。開始的兩行用的是JNDI API,第三行用的才是JDBC的API:
       Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/InventoryDB");Connection con = ds.getConnection("myPassword", "myUserName");
      在一個基本的DataSource實現中,DataSource.getConnection方法返回的Connection對象和用DriverManager.getConnection方法返回的Connection對象是一樣的。因為DataSource提供的方便性,我們推薦使用DataSource對象來得到一個Connection對象。我們希望所以的基于JDBC2.0技術的數據庫驅動都包含一個基本的DataSource的實現,這樣就可以在應用程序中很容易的使用它。
      對于普通的應用程序設計者,是否使用DataSource對象只是一個選擇問題。但是,對于那些需要用的連接池或者分布式的事務的應用程序設計者來說,就必須使用DataSource對象來獲得Connection,原因在下面我們會提到。
       二、Connection pooling(連接池):
      連接池是這么一種機制,當應用程序關閉一個Connection的時候,這個連接被回收,而不是被destroy,因為建立一個連接是一個很費資源的操作。如果能把回收的連接重新利用,會減少新創建連接的數目,顯著的提高運行的性能。
      假設應用程序需要建立到一個名字為EmpolyeeDB的DataSource的連接。使用連接池得到連接的代碼如下:
       Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB");Connection con = ds.getConnection("myPassword", "myUserName");除了邏輯名字以外,我們發現其代碼和上面舉的例子的代碼是一樣的。邏輯名字不同,就可以連接到不同的數據庫。DataSource對象的getConnection方法返回的Connection是否是一個連接池中的連接完全取決于DataSource對象的實現方法。如果DataSource對象實現與一個支持連接池的中間層的服務器一起工作,DataSource對象就會自動的返回連接池中的連接,這個連接也是可以重復利用的。
      是否使用連接池獲得一個連接,在應用程序的代碼上是看不出不同的。在使用這個Connection連接上也沒有什么不一樣的地方,唯一的不同是在java的finally語句塊中來關閉一個連接。在finally中關閉連接是一個好的編程習慣。這樣,即使方法拋出異常,Connection也會被關閉并回收到連接池中去。代碼應該如下所示:
      try{…
      }catch(){…
      }finally{ if(con!=null)con.close();}
      三、分布式事務:
      獲得一個用來支持分布式事務的連接與獲得連接池中的連接是很相似的。同樣,不同之處在于DataSource的實現上的不同,而不是在應用程序中獲得連接的方式上有什么不同。假設DataSource的實現可以與支持分布式事務中間層服務器一起工作,得到連接的代碼還是如下所示:
       Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/EmployeeDB"); Connection con = ds.getConnection("myPassword", "myUserName");由于性能上的原因,如果一個DataSource能夠支持分布式的事務,它同樣也可以支持連接池管理。
      從應用程序設計者的觀點來看。是否支持分布式的事務的連接對它來說沒什么不同,唯一的不同是在事務的邊界上(開始一個事務的地方和結束一個事務的地方),開始一個事務或者結束一個事務都是由事務服務器來控制的。應用程序不應該做任何可能妨礙服務的事情。應用程序不能夠直接調用事務提交commit或者回滾rollback操作,也不能夠使用事務的自動提交模式auto-commit mode(在數據庫操作完成的時候自動的調用commit或者rollback)。 
     
    在一個連接參與了分布式事務的時候,下面的代碼是你不能做的(con表示支持分布式事務的連接Connection)。
      con.commit();或者con.rollback();或者con.setAutoCommit(true);對于通常的Connection來說,缺省的是auto-commit模式。而對于支持分布式事務的Connection來說,缺省不是auto-commit模式。注意,即使Connection是支持事務的,它也可以用于沒有事務的情況。關于事務邊界的限制只是是對分布式事務的情況下才成立的。
      配置支持連接池的DataSource的時候,涉及到配置ConnectionPoolDataSource對象,這個對象是三層體系結構中的中間層來管理連接池的。同樣的,在配置支持分布式事務的時候,需要配置XADataSource,XADataSource是中間層用來管理分布式事物的對象。ConnectionPoolDataSource和XADataSource是由驅動提供商提供的,對應用程序的設計者來說是透明的。和基本的DataSource一樣,系統管理員來配置ConnectionPoolDataSource和XADataSource對象。
      四、結果集(RowSet接口):
      結果集對象是一行行數據的容器。根據其目的,可以通過多種方法實現。RowSet及其相關的接口與JDBC2.0的標準擴展API有點不同,他們并不是驅動的一部分,RowSet是在驅動的上層實現的,可以由其它的任何人來實現他們。
      任何類型的rowset都實現了RowSet接口,RowSet接口擴展了ResultSet接口。這樣RowSet對象就有了ResultSet對象所有的功能。能夠通過getXXX方法得到數據庫中的某列值,通過updateXXX方法可以修改某列值,可以移動光標,是當前行變為另一行。
      當然,我們更感興趣的是RowSet接口提供的新的功能。作為一個JavaBean組件,RowSet對象可以增加或者刪除一個listener(監聽者),可以get或者set其屬性值,這些屬性中,有一個是字符串,表示一個對數據庫Query請求,RowSet接口定義了設定參數的方法,也提供了執行這個請求的方法。這意味著RowSet對象能夠執行查詢請求,可以根據它產生的結果集進行計算。同樣,RowSet也可以根據任何表格數據源進行計算,所以,它不局限于關系數據庫。
      從數據源得到數據之后,RowSet對象可以和數據源斷開連接,rowset也可以被序列化。這樣,RowSet就可以通過網絡傳遞給瘦客戶端。
      RowSet可以被重新連接到數據源,這樣,做的修改就可以存回到數據源中去。如果產生了一個listener,當RowSet的當前行移動,或者數據被修改的時候,監聽者就會收到通知。例如,圖形用戶界面組件可以注冊成為監聽者,當RowSet更改的時候,圖形用戶界面接到通知,就可以修改界面,來符合它所表示的RowSet。
      根據不同的需要,RowSet接口可以通過多種方法來實現。Java software已經寫了一個CachedRowSet實現,從http://developer.java.sun.com/developer/earlyAccess/crs/index.html中可以得到這個實現。
      與CachedRowSet類不樣的是,JDBCRowSet類總是保持一個和數據源的連接。這樣,在ResultSet外圍簡單到加了一層,是基于JDBC技術的驅動看起來象是一個簡單的JavaBean組件一樣。

      總結:JDBC2.0標準擴展API通過見DataSource注冊到JNDI名字服務上,將JDBC技術擴展為一個全新的概念。使應用程序的代碼更加精巧,易于控制。新的API支持了連接池,支持分布式的事務。最后,還使java應用程序可以在網絡上傳播結果集,是不可以滾動的ResultSet變成了可以滾動的RowSet。
    posted @ 2008-04-21 08:58 vesung 閱讀(3256) | 評論 (0)編輯 收藏

    JDBC 2.0 API被劃分為兩部分:JDBC 2.0核心API和JDBC 2.0標準擴展API。核心API在java.sql里面。這是原來的版本就實現了的基本的功能。標準擴展API在javax.sql里面。由JDBC2.0規范新規定的一些接口在這里面。當然,JDBC2.0也對原來版本的java.sql核心做了一些改動。不過不是很大。原來JDBC1.0的程序可以不加修改的在JDBC2.0上運行。這是Java的一貫的良好的作風。最新的JDBC包可以從sun公司的網站上下載。 
      JDBC2.0的擴展API增加了一些數據訪問和數據源訪問的重大的功能。這中間有一些是主要用來做企業計算的。用JDBC2.0的新的擴展包,JDBC提供了一個從JAVA2平臺的通用的數據訪問的方法。
      首先,我們來看看JDBC標準擴展的API怎樣來和JDBC2.0結合在一起的。JDBC2.0包括兩個包:
      1、 java.sql包,個包里面是JDBC2.0的核心API。它包括了原來的JDBC API(JDBC 1.0版本),再加上一些新的2.0版本的API。這個包在Java 2 Platform SDK里面有。
      2、 javax.sql包,這里面是JDBC2.0的標準擴展API。這個包是一個全新的,在Java 2 Platform SDK, Enterprise Edition里面單獨提供。
      JDBC2.0的核心API包括了JDBC1.0的API,并在此基礎上增加了一些功能,對某些性能做了增強。使java語言在數據庫計算的前端提供了統一的數據訪問方法,效率也得到了提高。
      JDBC是向后兼容的,JDBC1.0的程序可以不加修改的運行在JDBC2.0上。但是,假如程序中用到了JDBC2.0的新特性,就必須要運行在JDBC2.0版本上。
      概括的來說,JDBC核心API的新特性在兩個方面做了工作。一個是支持一些新的功能,另一個就是支持SQL3的數據類型。
      1、 在支持新功能方面:包括結果集可以向后滾動,批量的更新數據。另外,還提供了UNICODE字符集的字符流操作。
      2、 在支持SQL3的數據類型方面:包括新的SQL3數據類型,增加了對持久性對象的存貯。
      為了對數據的存取,操作更加方便,JDBC的新特性是應用程序的設計更容易了。例如:數據塊的操作能夠顯著的提高數據庫訪問的性能。新增加的BLOB, CLOB,和數組接口能夠是應用程序操作大塊的數據類型,而不必客戶端在存貯之前進行其它的處理。這樣,就顯著的提高了內存的使用效率。
       下面我們來介紹JDBC2.0的標準擴展API。標準擴展API分為如下幾個方面:
      1、 DataSource接口:和Java名字目錄服務(JNDI)一起工作的數據源接口。它提供了對數 吹囊恢指玫牧臃椒ā?br>;  2、 Connection pooling(連接池):可以重復使用連接,而不是對每個請求都使用一個新的連接。
      3、 Distrubute transaction(分布式的事務):在一個事務中涉及到了多個數據庫服務器。
      4、 Rowsets:JavaBean組件包含了結果集,主要用來將數據傳給瘦客戶,或者提供一個可以滾動的結果集。
    posted @ 2008-04-10 11:29 vesung 閱讀(713) | 評論 (0)編輯 收藏

    1.$("#idName")
        獲取元素id為idName的元素 
     如:html
    <a id="myLinck" href="#"></a>
    $("#myLinck") 會返回<a id="myLinck"></a>元素
    -----------------------------------
    2.$(".className")
        獲取元素class屬性為className的元素集合
    如:html
    <a class="a1" href="#">1</a>
    <a class="a1" href="#">2</a>
    <a class="a2" href="#">3</a>
    $(".a1")返回[<a class="a1" href="#">1</a>,<a class="a1" href="#">2</a>]
    ---------------------------------------
    3.$("input[@type='text']")
        獲取所有type=text的input元素
    如:html
    <input type='text'/>
    <input type='text/>
    <input type='checkbox'/>
    $("input[@type='text']")返回[<input type='text'/><input type='text/>]
    posted @ 2008-03-24 17:53 vesung 閱讀(539) | 評論 (0)編輯 收藏

    普通的dom對象一般可以通過$()轉換成jquery對象。
    如:$(document.getElementById("msg"))則為jquery對象,可以使用jquery的方法。
    由于jquery對象本身是一個集合。所以如果jquery對象要轉換為dom對象則必須取出其中的某一項,一般可通過索引取出。
    如:$("#msg")[0],$("div").eq(1)[0],$("div").get()[1],$("td")[5]這些都是dom對象,可以使用dom中的方法,但不能再使用Jquery的方法。
    以下幾種寫法都是正確的: 字串8

    $("#msg").html();
    $("#msg")[0].innerHTML;
    $("#msg").eq(0)[0].innerHTML;
    $("#msg").get(0).innerHTML;

    posted @ 2008-03-24 17:38 vesung 閱讀(693) | 評論 (0)編輯 收藏

    為了支持 AJAX 功能。這個包定義了 Ajax.Request 類。

    假如你有一個應用程序可以通過url http://yoursever/app/get_sales?empID=1234&year=1998與服務器通信。它返回下面這樣的XML 響應。

     

     

    <?xml version="1.0" encoding="utf-8" ?>
    <ajax-response>
        
    <response type="object" id="productDetails">
            
    <monthly-sales>
                
    <employee-sales>
                    
    <employee-id>1234</employee-id>
                    
    <year-month>1998-01</year-month>
                    
    <sales>$8,115.36</sales>
                
    </employee-sales>
                
    <employee-sales>
                    
    <employee-id>1234</employee-id>
                    
    <year-month>1998-02</year-month>
                    
    <sales>$11,147.51</sales>
                
    </employee-sales>
            
    </monthly-sales>
        
    </response>
    </ajax-response>

     

    Ajax.Request對象和服務器通信并且得到這段XML是非常簡單的。下面的例子演示了它是如何完成的。

     

    <script>
        
    function searchSales()
        
    {
            
    var empID = $F('lstEmployees');
            
    var y = $F('lstYears');
            
    var url = 'http://yoursever/app/get_sales';
            var pars = 'empID=+ empID + '&year=+ y;
           
    var myAjax = new Ajax.Request(
                        url,
                        
    {method: 'get', parameters: pars, onComplete: showResponse}
                        );

        }


        
    function showResponse(originalRequest)
        
    {
            
    //put returned XML in the textarea
            $('result').value = originalRequest.responseText;
        }

    </script>

    <select id="lstEmployees" size="10" onchange="searchSales()">
        
    <option value="5">Buchanan, Steven</option>
        
    <option value="8">Callahan, Laura</option>
        
    <option value="1">Davolio, Nancy</option>
    </select>
    <select id="lstYears" size="3" onchange="searchSales()">
        
    <option selected="selected" value="1996">1996</option>
        
    <option value="1997">1997</option>
        
    <option value="1998">1998</option>
    </select>
    <br><textarea id=result cols=60 rows=10 ></textarea>


    你看到傳入 Ajax.Request構造方法的第二個對象了嗎? 參數{method: 'get', parameters: pars, onComplete: showResponse} 表示一個匿名對象的真實寫法。他表示你傳入的這個對象有一個名為 method 值為 'get'的屬性,另一個屬性名為 parameters 包含HTTP請求的查詢字符串,和一個onComplete 屬性/方法包含函數showResponse

    還有一些其它的屬性可以在這個對象里面定義和設置,如 asynchronous,可以為truefalse 來決定AJAX對服務器的調用是否是異步的(默認值是 true)。

    這個參數定義AJAX調用的選項。在我們的例子中,在第一個參數通過HTTP GET命令請求那個url,傳入了變量 pars包含的查詢字符串, Ajax.Request 對象在它完成接收響應的時候將調用showResponse 方法。

    也許你知道, XMLHttpRequest在HTTP請求期間將報告進度情況。這個進度被描述為四個不同階段:Loading, Loaded, Interactive, 或 Complete。你可以使 Ajax.Request 對象在任何階段調用自定義方法 ,Complete 是最常用的一個。想調用自定義的方法只需要簡單的在請求的選項參數中的名為 onXXXXX 屬性/方法中提供自定義的方法對象。 就像我們例子中的 onComplete 。你傳入的方法將會被用一個參數調用,這個參數是 XMLHttpRequest 對象自己。你將會用這個對象去得到返回的數據并且或許檢查包含有在這次調用中的HTTP結果代碼的 status 屬性。

    還有另外兩個有用的選項用來處理結果。我們可以在onSuccess 選項處傳入一個方法,當AJAX無誤的執行完后調用, 相反的,也可以在onFailure選項處傳入一個方法,當服務器端出現錯誤時調用。正如onXXXXX 選項傳入的方法一樣,這兩個在被調用的時候也傳入一個帶有AJAX請求的XMLHttpRequest對象。

    我們的例子沒有用任何有趣的方式處理這個 XML響應, 我們只是把這段XML放進了一個文本域里面。對這個響應的一個典型的應用很可能就是找到其中的想要的信息,然后更新頁面中的某些元素, 或者甚至可能做某些XSLT轉換而在頁面中產生一些HTML。
    完。
    摘自:https://compdoc2cn.dev.java.net

    posted @ 2008-03-21 17:45 vesung 閱讀(879) | 評論 (0)編輯 收藏

    ? Fed救市之舉令中國控制通脹難度加大 (原文地址)
            在援救完貝爾斯登公司(Bear Stearns Cos.)后,美國聯邦儲備委員會(Fed)主席貝南克(Ben Bernanke)今晚可能會再次送出減息良藥。(編者:最新消息,Fed周二已宣布將關鍵利率下調75個基點。)而這對于香港和中國大陸市場來說又意味著什么呢?對正面臨著十幾年來最高通貨膨脹率的中國貨幣政策制定者而言,Fed的“靈丹”卻可能產生副作用。但是,只要中國繼續堅持現行的匯率制度,就不得不生生吞下這顆藥丸,而且還必須硬著頭皮去應對。中國央行(People's Bank of China)加息而Fed大幅降息,產生的直接影響就是中美利差進一步擴大,使得熱錢問題再次成為眾矢之的。上周公布的數據顯示,Fed 1月份的緊急降息造成中美貨幣市場利差達到了50個基點,并使得流入中國大陸的外商直接投資規模進一步增大。今年前兩個月流入中國大陸的外商直接投資較上年同期增長了75%。這些外資到底是進行商業投資還是純粹出于投機目的不得而知,不過可以肯定的一點是,中美利差的擴大勢必會增強人民幣升值預期。上周五人民幣升至匯改以來最高水平,達到1美元兌人民幣7.0844元。
    .... ...
    ? Fed救市之舉令中國控制通脹難度加大 
    posted @ 2008-03-19 09:24 vesung 閱讀(292) | 評論 (0)編輯 收藏

    struts響應用戶請求的工作流程:

    Request

    |
    V

    ActionServlet

    |

    如果不存在相應的Action則否則返回error,流程結束

    |
    V

    創建ActionForm

    |

    進行validatge校驗,如果沒有通過校驗則返回error


    創建Action

    |
    V

    執行Action的execute方法,并返回ActionForword對象

    |
    V

    return respose
    結束

     

     

    posted @ 2008-03-11 11:22 vesung 閱讀(744) | 評論 (1)編輯 收藏

    主站蜘蛛池模板: 无码日韩精品一区二区免费| 亚洲日日做天天做日日谢| 花蝴蝶免费视频在线观看高清版| 亚洲国产精品无码久久九九| 牛牛在线精品观看免费正| 国产精品jizz在线观看免费| 亚洲精品GV天堂无码男同| 在线免费观看一级片| 亚洲色成人四虎在线观看| 成人毛片免费视频| 亚洲欧美日韩一区二区三区| 无码免费午夜福利片在线| 亚洲人精品亚洲人成在线| 最近免费中文字幕大全视频| 在线亚洲午夜片AV大片| 女人18毛片特级一级免费视频| 亚洲人成色99999在线观看| 日本成人在线免费观看| 国产精品久久久久久亚洲影视| 免费国产美女爽到喷出水来视频| 国产亚洲精品91| 亚洲精品偷拍视频免费观看| 国产免费伦精品一区二区三区| 国产亚洲av片在线观看16女人| 久久精品免费电影| 亚洲综合区图片小说区| 中文字幕av无码无卡免费| 亚洲精品永久在线观看| xvideos亚洲永久网址| 久久久久久久国产免费看| 亚洲AV一宅男色影视| 1000部啪啪毛片免费看| 亚洲va久久久久| 国产精品色午夜视频免费看 | 成年男女免费视频网站| 亚洲av综合av一区二区三区| 亚洲阿v天堂在线2017免费| 成人无码区免费A∨直播| 久久精品国产亚洲AV无码娇色| 黄页网站免费观看| 国产成人亚洲精品蜜芽影院|