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

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

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

    posts - 5, comments - 16, trackbacks - 0, articles - 0

    2006年9月5日

    收藏一篇DLEE老大的文章,里面的話句句說到了我的心坎里。

    為什么我說Struts/WebWork會受到Ajax的威脅呢?有的人可能覺得大家相安無事不是很好,你是不是有神經病故意挑起人民內部矛盾?問題是他們之間確實存在著一些深層的內在矛盾和沖突,這些矛盾才是目前Struts和 WebWork都只能在非常有限的程度上支持Ajax的原因。所以,問題是架構性的,并不是小型的修補或者更好的編程技巧可以徹底解決的。

    傳統(tǒng)的服務器端MVC架構設計(也就是Model2),存在著一個基本的假設就是Web應用的工作流是由一系列的頁面切換構成的。這種架構中的一個View,從語義上來講只能代表一個完整的HTML頁面。整個Web應用的表現(xiàn)層,被劃分成為非常多的頁面的組合。

    而Ajax開發(fā)者眼里,Web應用的工作流并不是這樣構成的。Ajax開發(fā)者看待Web應用的角度與傳統(tǒng)開發(fā)者相比差別非常大。在一個Ajax應用中,只有相對很少的頁面。每個頁面,包括頁面引用CSS樣式、JS腳本,都是一個更小型的Ajax應用。甚至一些功能簡單的Ajax應用,本身僅僅由一個單一的頁面構成。例如一個簡單的RSS閱讀器,還有IBM筆記本上那個獲得天氣預報的桌面。
    按照Ajax in Action,Ajax應用可以分成3種類型:

    1. 以內容為中心的應用,服務器返回的是一段HTML內容。
    2. 以腳本為中心的應用,服務器返回的是一段JS腳本。
    3. 以數(shù)據(jù)為中心的應用,服務器返回的是一段數(shù)據(jù),可以是XML格式、JSON格式或者其他文本格式。
    服務器返回給Ajax應用的3種類型的網絡流量(不稱為數(shù)據(jù)是與上面第3種Ajax應用相區(qū)別),任何一種都不能被簡單地視作傳統(tǒng)MVC架構中的View,因為他們各自所代表的語義與傳統(tǒng)MVC架構中的View的語義是完全不同的。所以可以看出,除了初次交付給瀏覽器一個完整的Ajax應用之外,傳統(tǒng)的MVC架構對于Ajax應用的支持是非常有限的。其實為了給客戶端提供上面3類網絡流量,一個Servlet已經足夠了。DWR、JSON-RPC、Buffalo在服務器端也就是由Servlet實現(xiàn)的,不要求服務器端一定要安裝某種MVC框架。
    上面3類應用,前面的兩類,客戶端JS代碼比較簡單,表現(xiàn)邏輯僅有一部分位于客戶端,大部分仍然位于服務器端,因此傳統(tǒng)的服務器端MVC架構仍然是非常有價值的。但是大家注意第3類Ajax應用,實際上它已經將絕大部分甚至可以將全部的表現(xiàn)邏輯都轉移到客戶端來執(zhí)行,這個時候服務器端傳統(tǒng)的Web表現(xiàn)層實際上被架空了(皮之不存,毛將焉附?)。而對于Ajax應用來說,雖然近期可能還是以第1類Ajax應用為主(例如,所謂的AHAH技術),但是最有生命力和發(fā)展前景的還是第3類Ajax應用。

    自從1999年M$推出IE5.0支持XMLHTTP,可以不刷新頁面以異步方式從服務器獲取數(shù)據(jù)之后,Web開發(fā)的領域就埋下了一顆定時炸彈(6年以后,一個新詞Ajax的出現(xiàn)引爆了這顆炸彈)。Model2最初的設計應該發(fā)生在這件大事(現(xiàn)在應該承認,M$做了一件天大的好事)發(fā)生之前,其設計師不可能想到異步請求的價值。按照Model2的設計思想直接產生了Struts。但是后來的WebWork在最初設計階段仍然與這個技術失之交臂,這是相當可惜的一件事情。WebWork其實最初設計的時候就可以走的更遠,但是他們只想超越Struts,做一個更好的Model2 MVC開發(fā)框架。現(xiàn)在他們再想趕上這班列車已經有點晚了。如果基礎的服務器端MVC架構的價值是可疑的,那么其他圍繞這個架構所開發(fā)的基礎架構的價值也同樣是可疑的。

    所以在現(xiàn)在這個時刻,重新正本清源地思考Model2最初的設計,它帶來的Web開發(fā)的巨大進步,以及它所存在的不足,是一個非常現(xiàn)實的問題。

    posted @ 2006-09-08 22:16 BennyBao 閱讀(281) | 評論 (0)編輯 收藏

         摘要: 在網上看到了有些同志提到了為Ajax的XMLHttpRequest提供一個對象池,也讀了他們給出的實現(xiàn)代碼。感覺不是特別理想,于是模仿apache的commons中的ObjectPool的思路寫了一個簡單的JavaScript版。望指教: function ...  閱讀全文

    posted @ 2006-09-08 17:47 BennyBao 閱讀(2487) | 評論 (3)編輯 收藏

    在JavaScript可以使用try...catch來進行異常處理。例如:
    try ? {
    ????foo.bar();
    }
    ? catch ?(e)?
    {
    ????alert(e.name?
    + ? " :? " ? +
    ?e.message);
    }

    目前我們可能得到的系統(tǒng)異常主要包含以下6種:
    • EvalError:?raised when an error occurs executing code in eval()
    • RangeError:?raised when a numeric variable or parameter is outside of its valid range
    • ReferenceError: raised when de-referencing an invalid reference
    • SyntaxError: raised when a syntax error occurs while parsing code in eval()
    • TypeError: raised when a variable or parameter is not a valid type
    • URIError: raised when encodeURI() or decodeURI() are passed invalid parameters

    上面的六種異常對象都繼承自Error對象。他們都支持以下兩種構造方法:

    new ?Error();
    new ?Error( " 異常信息 " );

    手工拋出異常的方法如下:

    try ? {
    ????
    throw ? new ?Error( " Whoops! "
    );
    }
    ? catch ?(e)? {
    ????alert(e.name?
    + ? " :? " ? +
    ?e.message);
    }

    如要判斷異常信息的類型,可在catch中進行判斷:

    try ? {
    ????foo.bar();
    }
    ? catch ?(e)?
    {
    ????
    if ?(e? instanceof ?EvalError)?
    {
    ????????alert(e.name?
    + ? " :? " ? +
    ?e.message);
    ????}
    ? else ? if ?(e? instanceof ?RangeError)? {
    ????????alert(e.name?
    + ? " :? " ? +
    ?e.message);
    ????}

    ????
    // ??etc
    }

    Error具有下面一些主要屬性:

    • description: 錯誤描述 (僅IE可用).
    • fileName: 出錯的文件名 (僅Mozilla可用).
    • lineNumber: 出錯的行數(shù) (僅Mozilla可用).
    • message: 錯誤信息 (在IE下同description)
    • name: 錯誤類型.
    • number: 錯誤代碼 (僅IE可用).
    • stack: 像Java中的Stack Trace一樣的錯誤堆棧信息 (僅Mozilla可用).
    因此為了更好的了解錯誤信息我們可以將catch部分改為如下形式:

    try ? {
    ????foo.bar();
    }
    ? catch ?(e)?
    {
    ????
    if ?(browserType? != ?BROWSER_IE)?
    {????????????????????????????
    ????????alert(
    ????????????
    " name:? " ? + ?e.name? +

    ????????????
    " \nmessage:? " ? + ?e.message? +
    ????????????
    " \nlineNumber:? " ? + ?e.lineNumber? +
    ????????????
    " \nfileName:? " ? + ?e.fileName? +
    ????????????
    " \nstack:? " ? + ?e.stack);????????
    ????}

    ????
    else ? {????????????????????
    ????????alert(
    ????????????
    " name:? " ? + ?e.name? +
    ????
    ????????????
    " \nerrorNumber:? " ? + ?(e.number? & ? 0xFFFF )? +

    ????????????
    " \nmessage:? " ? + ?e.message " );????????
    ????}

    }

    JavaScript中的throw命令事實上可以拋出任何對象,并且我們可以在catch接受到此對象。例如:

    try ? {
    ????
    throw ? new ?Date();???? // ?拋出當前時間對象

    }
    ? catch ?(e)? {
    ????alert(e.toLocaleString());????
    // ?使用本地格式顯示當前時間

    }

    posted @ 2006-09-05 17:56 BennyBao 閱讀(2000) | 評論 (1)編輯 收藏

    主站蜘蛛池模板: 国产精品亚洲综合一区| 亚洲?V乱码久久精品蜜桃 | 亚洲制服中文字幕第一区| A毛片毛片看免费| 国产亚洲av片在线观看16女人 | 亚洲videos| 在线jyzzjyzz免费视频| 亚洲欧美不卡高清在线| 免费看无码自慰一区二区| 久久水蜜桃亚洲AV无码精品| 又粗又大又硬又爽的免费视频| 蜜桃传媒一区二区亚洲AV| 亚洲国产高清在线一区二区三区| 一级特级aaaa毛片免费观看| 亚洲色欲久久久久综合网| 国产免费一区二区三区在线观看| 久久久亚洲AV波多野结衣| 老司机永久免费网站在线观看| 人成电影网在线观看免费| 久久青青成人亚洲精品| 国产精品久久久久久久久免费| 亚洲成人激情小说| 亚洲毛片不卡av在线播放一区| 久久久久国产精品免费网站| 国产成人亚洲合集青青草原精品 | 国产.亚洲.欧洲在线| 亚洲国产成人久久综合一区77| 97国免费在线视频| 激情亚洲一区国产精品| 亚洲国产91精品无码专区| 成人免费区一区二区三区 | 国产精品va无码免费麻豆| 51午夜精品免费视频| 亚洲日产2021三区在线 | 亚洲精品乱码久久久久久下载 | 99热精品在线免费观看| 亚洲国产欧美日韩精品一区二区三区 | 色噜噜亚洲精品中文字幕| 亚洲一级毛片免费观看| 一级视频免费观看| 久久精品亚洲AV久久久无码|