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

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

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

    posts - 297,  comments - 1618,  trackbacks - 0
     

    說明:該文為《JavaScript高級程序設計》第16章學習筆記。

     Web項目中,要實現客戶端與服務端的交互,可通過cookie、隱藏框架、HTTP請求、LiveConnect請求和智能HTTP請求等方式實現,

    一.             cookie

     cookie是第一個JavaScript可以利用的客戶端-服務端之間的交互手段。瀏覽器向服務器發送請求時,為這個服務器存儲的cookie會與其他信息一起發送到服務器。這使得JavaScript可以在客戶端設置一個cookie,之后服務器端就能夠讀取它了。

    1.    cookie的成分

          名稱——每一個cookie由一個唯一的名稱代表。這個名稱可以包含字母、數字和下劃線。不區分大小寫。

          值——保存在cookie中的字符串值。這個值在存儲之前必須用encodeURIComponent()對其進行編碼,以免丟失數據或占用了cookie。名稱和值加起來的字節數不能超過4095字節,也就是4KB

          域——處于安全考慮,網站不能訪問其他域創建的cookie。創建cookie后,域的信息會作為cookie的一部分存儲起來。不過,雖然這不常見,還是可以覆蓋這個設置以允許另一個網站訪問這個cookie的。

          路徑——另一個cookie的安全特性,路徑限制了對Web服務器上的特定目錄的訪問。例如,可指定cookie只能從http://www.wrox.com/books中訪問。

          失效日期——確定cookie何時刪除。默認情況下,關閉瀏覽器時,即將cookie刪除,不過可以自己設置刪除時間。這個值是個GMT格式的日期(可以使用Date對象的toGMTString()方法),用于制定應該刪除cookie的準確時間。如果設置的日期是當前日期以前的時間,則cookie被立刻刪除。

           安全標志——用于表示cookie是否只能從安全網站(使用SSLhttps協議的網站)中訪問。可以將這個值設為true以加強保護,進而確保cookie不被其他網站訪問。

    2.    其他安全限制

         i)每個域最多只能只能在一臺用戶的機器上存儲20cookie

         ii)每個cookie的總尺寸不能超過4096字節;

         iii)一臺用戶的機器上的cookie總數不能超過30個。

    3.    JavaScript中的cookie

     下面來看一個設置cookie的函數,如下所示:

       function setCookie(sName, sValue, oExpires, sPath, sDomain, bSecure) {
     
    var sCookie = sName + “=” +encodeURIComponent(sValue);
     
    if (oExpires) {
             sCookie 
    +=”; expires=” + oExpires.toGMTString();
    }

    if (sPath) {
           sCookie 
    += “; path” + sPath;
    }

    if (sDomian) {
           sCookie 
    += “; domain” + sDomain;
    }

    if (bSecure) {
           sCookie 
    += “;secure”;
    }

    document.cookie 
    = sCookie;
    }

    setCookie()函數只有前兩個參數是必須的,函數的調用方法如下:

    setCookie(“name”, “阿蜜果”);

    setCookie(“book”, “JavaScript高級程序設計”,  new Date(Date.parse(“Jan 1, 2006”)));

    setCookie(“message”, “hello”, new Date(Date.parse(“Jan 1, 2006”)), “/books”, http://www.wrox.com, true );

    下面的函數是一個根據cookie的名稱獲取cookie的方法,代碼如下:

    function getCookie(sName) {
     
    var sRE= "(?:;.)?" + sName + "=([^;]*);?;
     var oRE= new RegExp(sRE);
     if (oRE.test(document.cookie)) {
           return decodeURIComponent(RegExp[“$1
    ");
    }
     else {
           
    return null;
    }

    }

     

    調用該方法可以獲取指定名稱的cookie,調用舉例如下:

    var sName = getCookie(“name”);

    下面我們再編寫一個刪除cookie的函數,只需將失效時間設為過去的一個時間即可,代碼如下:

    function deleteCookie(sName, sPath, sDomain) {

     setCookie(sName, “”, new Date(0), sPath, sDomain);

    }

     

    4. 服務器端的cookie

    1JSP

     Jsp提供了非常簡單的處理cookie的接口,request對象會在執行JSP時自動初始化,有一個返回一個Cookie對象數組的方法getCookies()方法。每個Cookie對象都具有getName()getPath(), getDomain(),getSecure()getMaxAge()等方法,下面我們還看一個獲取Cookie的方法:

    public static Cookie getCookie(HttpServletRequest request, String name) {

           Cookie[] cookies = request.getCookies();

           if (cookies != null) {

           for (int i = 0; i<cookies.length; i++) {

           if (cookies[i].getName().equals(name)) {

           return cookies[i];

    }

    }

    }

    }

    下面讓我們再來看看怎么樣新建一個cookie

    Cookie nameCookie = new Cookie(“name”, “Amigo”);

    nameCookie.setDomain(“http://www.wrox.com”);

    nameCookie.setPath(“/books”);

    response.addCookie(nameCookie);

    要刪除cookie,可用如下方法:

    Cookie cookieToDelete = getCookie(“name”);

    cookieToDelete.setMaxAge(0);

    response.addCookie(cookieToDelete);

    2ASP.NET

     略。

    3PHP

     略。

     

    二.             隱藏框架

    方法就是創建一個可用JavaScript與服務器進行通信的0像素高的框架。這種通信方式要求兩部分內容:用于處理客戶端通信的JavaScript對象和在服務端處理通信的特殊頁面。Eg.

    <html>

           <head>

                  <title>隱藏框架的例子</title>

           </head>

           <frameset rows=”*, 0”>

                  <frame src=”test1.html” nam=”mainFrame” />

                  <frame src=”hidden.html” nam=”hiddenFrame” />

           </frameset>

    </html>

    在第一個框架中,定義了兩個函數,一個用于向服務器發送請求,另一個用于處理響應。發送請求的函數如下:

    function getServerInfo() {

        parent.frames[“hiddenFrame”].location.href = “hiddenFrameCom.html”;

    }

    處理回應的函數handleResponse()的代碼如下:

    function handleResponse(sResponseTextt) {

        alert(“服務器返回: ” + sResponseTextt);

    }

    處理隱藏請求的頁面必須輸出一個普通的HTML頁面,其中有個<textarea/>元素,包含返回的元素。使用<textarea/>可以方便的處理多行數據,這個頁面必須在主框架中調用handleResponse()函數。實例代碼如下:

    <html>

        <head>

               <title>隱藏框架的例子</title>

               <script type=”text/javascript”>

               window.onload = function() {

           parent.frames[0].handleResponse(

                  document.forms[“formResponse”].result.value);

    };

    </script>

                  </head>

                  <body>

                         <form name=”formResponse”>

                                <textarea name=”result”>傳送回的數據</textarea>

                         </form>

                  </body>

           </html>

     

    三.             HTTP請求

     現在很多瀏覽器都可以直接從JavaScript中初始化HTTP請求并獲取結果,完全不用隱藏框架和其他取巧的小技巧。

     這個令人振奮的新功能的核心是,微軟創建的XML HTTP請求的對象。這個對象是與MSXML一起出現的,直到最近它的能力才被完全挖掘。XML HTTP請求實質上是添加了額外的用于發送和接收XML代碼的功能的普通的HTTP請求。

     要在IE中重新創建XML HTTP請求對象,還是要使用ActiveXObject,如下所示:

    var oRequest = new ActiveXObject(“Microsoft.XMLHTTP”);

     下面讓我們看一個創建XML HTTP的方法:

    function createXMLHTTP() {

           var arrSignatures = [“MSXML2.XMLHTTP.5.0”, “MSXML2.XMLHTTP.4.0”,

    “MSXML2.XMLHTTP.3.0”, “MSXML2.XMLHTTP”,

    “Microsoft.XMLHTTP”];

           for (var i=0; i< arrSignatures.length; i++) {

           try {

                  var oRequest = new ActiveXObject(arrSignatures[i]);

                  return oRequest;

    } catch (oError) {

           //ignore

    }

    }

     

    throw new Error(“你的機器上沒有安裝MSXML!”);

    }

    創建好HTTP請求后,可用open()方法來指定要發送的請求,該方法的參數描述如下:

    第一個參數:值可為“get”或“post”,或其他受服務器支持的HTTP方法;

    第二個參數:請求的URL

    第三個參數:表示請求是否以異步方式發送的布爾值。

    Eg. oRequest.open(“get”, “example.txt”, false);

    打開后,可用send()方法將請求發送出去,該方法需帶一個參數,該參數可為null

    eg. oRequest.send(null);

    下面讓我們來看一個比較完整的例子:

    var oRequest = createXMLHTTP();

    oRequest.open(“get”, “example.txt”, false);

    oRequest.send(null);

    alert(“狀態:” + oRequest.status + “(” + oRequest.statusText + “)”);

    alert(“回應的文本信息:” + oRequest.responseText);

    該例獲取服務器端的一個純文本文件,然后顯示此內容。

    如果發送異步請求,必須使用onreadystatechange事件處理函數,并檢查readyState特性是否等于4(與XML DOM一樣)。讓我們來看一個例子:

    var oRequest = createXMLHTTP();

    oRequest.open(“get”, “example.txt”, true);

    oRequest.onreadystatechange = function() {

        if (oRequest.readyState == 4) {

                  alert(“狀態:” + oRequest.status + “(” + oRequest.statusText + “)”);

    alert(“回應的文本信息:” + oRequest.responseText);

     

    }

    }

    oRequest.send(null);

    1.       使用HTTP頭部

    XML HTTP請求對象提供了獲取HTTP頭部和設置它們的方法:

    l         getAllResponseHeaders():返回包含所有響應的HTTP首部信息的字符串;

    l         getResponseHeader():獲取指定的某個頭部,參數為獲取的首部的名稱,eg. var sValue = oRequest.getResponseHeader(“Server”);

    l         setResponseHeader():設置XML HTTP請求的首部信息,eg. oRequest. setResponseHeader(“myheader”, “阿蜜果”).

    2.       實現的賦值品

    Mozilla第一個復制了XML HTTP實現,創建了名為XMLHTTPRequestJavaScript,行為完全與微軟的版本相同,Opera(7.6)Safari1.2)也復制了Mozilla的實現,創建了自己的XMLHTTPRequest對象。

    3.       進行GET請求

    Web上最常見的請求類型就是GET請求,下面讓我們來看一個GET請求的例子,代碼如下所示:

    首先為了添加參數的方便性,讓我們增加一個添加參數的方法,然后為請求構建一個URL,代碼如下所示:

    function addURLParam(url, sParamName, sParamValue) {

        url += (url.indexOf(“?”) == -1 ? “?” : “&”);

        url += encodeURIComponent(sParamName) + “=” + encodeURIComponent(sParamValue);

        return url;

    }

    var url =  “http://www.tkk7.com/amigoxie”;

    url = addURLParam(url, “gender”, “”);

    url = addURLParam(url, “age”, “25”);

    oRequest.open(“get”, url, false);

    4.       進行POST請求

    POST請求用于在表單中輸入數據后的提交過程,因為POST可以比GET方式發送更多數據(最多2GB)。讓我們來可看一個例子:

    function addPostParam(sParams, sParamName, sParamValue) {

        if (sParams.length > 0) {

           sParams += “&”;

    }

        return sParams + encodeURIComponent(sParamName) + “=” + encodeURIComponent(sParamValue);

    }

     

    Var sParams = “”;

    sParams = addPostParam(sParams, “gender”, “”);

    sParams = addPostParam(sParams, “age”, “25”);

    oRequest.open(“open”, “test.jsp”, false);

    oRequest.send(sParams);

     

    四.             LiveConnect請求

     LiveConnectNetscape Navigator引入,一般可以讓JavaScriptJava類實現交互的能力。用戶必須安裝JRE,并且還需在瀏覽器中啟用Java

    1.       進行GET請求

    使用Live Connect時,必須提供類的完整名稱,才能初始化一個Java對象。創建URL后,就可以打開一個輸入流并使用讀取器來讀取數據。最好的方法是創建一個InputStreamReader,然后再基于它創建一個BufferReader,實例代碼如下:

    function httpGet(url) {

        var ourl = new java.net.URL(url);

    var oStream = ourl.openStream();

    var oReader = new java.io.BufferedReader(new java.io.InputStreamReader(oStream));

    var oResponseText = “”;

    var sLine = oReader.readLine();

    while (sLine != null) {

           oResponseText += sLine + “\n”;

           sLine = oReader.readLine();

    }

    oReader.close();

    return oResponseText;

    }

    注意:與XML HTTP請求對象不通,LiveConnect要求輸入完整的請求的URL,從http://開始,因為,這個Java對象沒有任何解釋相對URL的上下文。

    2.       進行POST請求

    因為POST請求可看作是雙向的,所以必須使用setDoInput()setDoOutput()方法將連接設成接受輸入和輸出。另外,連接不應該使用任何緩存數據,所以要調用setUseCaches(false)。與XML HTTP請求對象一樣,還必須用setRequestProperty()方法將“Content-Type”設置為相應的值。代碼如下:

    function httpPost(url, sParams) {

        var ourl = new java.net.URL(url);

        var oConnection = ourl.openConnection();

     

        oConnection.setDoInput(true);

        oConnection.setDoOutput(true);

        oConnection.setUseCaches(false);

        oConnection.setRequestProperty(“Content-Type”,

    “application/x-www-form-urlencoded”);

     

           var output = new java.io.DataOutputStream(oConnection.getOutputStream());

           output.writeBytes(sParams);

           output.flush();

           output.close();

     

           var sLine = “”, sResponseText = “”;

           var input = new java.io.DataInputStream(oConnection.getInputStream());

           sLine = input.readLine();

           while (sLine != null) {

           sResponseText += sLine + “\n”;

                  sLine = input.readLine();

    }

     

    input.close();

    return oResponseText;

    }

     

    五.             智能HTTP請求

     對于兩種完全不同的HTTP請求方法,有一系列通用的函數會對開發很有幫助。

    1.       get()方法
     
    該方法用于對指定的URL進行一個GET請求。該方法有兩個參數:發送請求的URL和一個回調函數。回調函數在很多編程語言中是用于在請求結束時通知開發者的。整合后的通用的get()方法代碼如下:

    var bXmlHttpSupport = (typeof XMLHttpRequest == “object” || window.ActiveXObject);

    Http.get = function (url, fnCallback) {

           if (bXmlHttpSupport) {

           var oRequest = new XMLHttpRequest();

           oRequest.open(“get”, url, true);

           oRequest.onreadystatechange = function() {

           if (oRequest.readyState == 4) {

           fnCallback(oRequest.responseText);

    }

    }

    oRequest.send(null);

    } else if (navigator.javaEnabled() && typeof java != “undefined”

    && type java.net != “undefined”) {

    setTimeout(function() {

           fnCallback(httpGet(url));

    }, 10);

    } else {

           alert(“你的瀏覽器不支持HTTP請求!”);

    }

    }

    2.       post()方法

    除了需要三個參數(URL、參數字符串和回調函數)外,post()方法類似于get()方法。代碼如下:

    var bXmlHttpSupport = (typeof XMLHttpRequest == “object” || window.ActiveXObject);

    Http.post = function(url, sParams, fnCallback) {

            if (bXmlHttpSupport) {

           var oRequest = new XMLHttpRequest();

           oRequest.open(“post”, url, true);

           oRequest.setRequestHeader(“Content-Type”,

    “application/x-www-form-urlencoded”);

                         oRequest.onreadysatechange = function() {

           if (oRequest.readyState == 4) {

                  fnCallback(oRequest.responseText);

    }

    }

    } else if ((navigator.javaEnabled() && typeof java != “undefined”

    && type java.net != “undefined”) {

           setTimeout(function() {

           fnCallback(httpPost(url, sParams));

    }, 10);

    } else {

           alert(“你的瀏覽器不支持HTTP請求!”);

    }

    }

    注意:使用這個方法必須提供完整的URL.

    posted on 2007-08-15 08:43 阿蜜果 閱讀(4855) 評論(3)  編輯  收藏 所屬分類: Javascript


    FeedBack:
    # re: JavaScript學習筆記——客戶端與服務器端的通信
    2007-08-15 09:37 | dudu
    學習筆記不適合發表在首頁,javascript方面的文章建議放在其他技術區。  回復  更多評論
      
    # re: JavaScript學習筆記——客戶端與服務器端的通信[未登錄]
    2007-08-15 09:57 | 阿蜜果
    @dudu
    知道了,多謝提醒  回復  更多評論
      
    # re: JavaScript學習筆記——客戶端與服務器端的通信
    2007-08-20 10:01 | cresposhi
    dudu有偏見啊,javascript已經成為J2EE程序員必須熟練掌握的語言之一,重要性與java已經無異。
    希望dudu老大能夠與時俱進,共建和諧啊!  回復  更多評論
      
    <2007年8月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

          生活將我們磨圓,是為了讓我們滾得更遠——“圓”來如此。
          我的作品:
          玩轉Axure RP  (2015年12月出版)
          

          Power Designer系統分析與建模實戰  (2015年7月出版)
          
         Struts2+Hibernate3+Spring2   (2010年5月出版)
         

    留言簿(263)

    隨筆分類

    隨筆檔案

    文章分類

    相冊

    關注blog

    積分與排名

    • 積分 - 2294312
    • 排名 - 3

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 在线免费观看伊人三级电影| 亚洲精品永久在线观看| 久久噜噜噜久久亚洲va久| 亚洲香蕉网久久综合影视| 成人午夜亚洲精品无码网站| 2048亚洲精品国产| 国产午夜亚洲不卡| 久久亚洲精品无码| 亚洲综合婷婷久久| 亚洲制服丝袜一区二区三区| 亚洲不卡中文字幕| 亚洲日韩精品无码专区| 亚洲爆乳少妇无码激情| 国产精品成人亚洲| 一级做a爰片久久毛片免费陪| 国产成人无码精品久久久久免费| aa毛片免费全部播放完整| 今天免费中文字幕视频| 久久久精品2019免费观看| 1024免费福利永久观看网站| 嫩草影院免费观看| 亚洲精品国产电影| 国产成A人亚洲精V品无码性色| 内射少妇36P亚洲区| 亚洲中文无码卡通动漫野外 | 成熟女人特级毛片www免费| 午夜电影免费观看| 亚洲人午夜射精精品日韩| 亚洲AV综合色区无码一区| 亚洲中文字幕久在线| 国产亚洲综合久久| 视频免费在线观看| 国产在线jyzzjyzz免费麻豆| 日本人的色道www免费一区| 伊人婷婷综合缴情亚洲五月| 亚洲视频在线免费播放| 日韩亚洲人成在线综合| 久久免费国产精品一区二区| 日韩免费a级毛片无码a∨| 亚洲无码视频在线| 亚洲国产精品张柏芝在线观看|