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

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

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

    隨筆-59  評論-31  文章-0  trackbacks-0

    介紹JSONP之前,先簡單的介紹一些JSON。JSON是JavaScript Object Notation的縮寫,是一種輕量的、可讀的基于文本的數據交換開放標準。源于JavsScript編程語言中對簡單數據結構和關聯數組的展示功能。它是僅含有數據對和簡單括號結構的純文本,因此可通過許多途徑進行JSON消息的傳遞。

     

    1. JSONP定義
        JSONP是英文JSON with Padding的縮寫,是一個非官方的協議。它允許在服務器端生成script tags返回至客戶端,通過javascript callback的形式來實現站點訪問。 JSONP是一種script tag的注入,將server返回的response添加到頁面實現特定功能。

    2.JSONP由來

        要解釋JSONP的來由,先要說一下瀏覽器的“同源策略(SOP:Same Origin Policy)”。 簡而言之,就是瀏覽器限制腳本程序只能和同協議、同域名、同端口的腳本進行交互,這包括共享和傳遞變量等。cookie的傳遞也是遵從同樣策略。這就造成一些涉及到多個服務器的應用在整合時一些麻煩。跨域訪問的問題造成A站點的Ajax代碼無法訪問B站點的數據。

         如何解決跨域訪問呢?那就要借助瀏覽器的一個特性:盡管瀏覽器不允許頁面中的腳本程序跨域讀取數據,但卻允許HTML引用跨域的資源,如圖片,CSS和腳本程序。對于腳本程序的引用比較特殊,它被瀏覽器解析以后,就和本地的腳本程序別無二致且可立即進行解釋并執行。如在B站點的一個js文件,一個簡單的提示框:alert(“This is Victor!”);。在A站點引用這個js,這個腳本就會在B站點的應用中執行,顯示一個alert信息。由于站外腳本的引用是通過script tag來實現的,而腳本程序又可通過DOM的方式可以對HTML頁面的所有標簽進行控制(包括動態的創建script標簽),這就可以實現通過調用站外程序對本地資源進行更改了。另外,通過<script> 標記的使用,就可從服務端直接返回可執行的JavaScript函數調用或者JSON數據。

     

    3. JSONP原理與實現
        首先在客戶端注冊一個callback, 然后把callback的名字傳給服務器。此時,服務器先生成 JSON數據。然后以JavaScript 語法的方式,生成一個function, function名字就是傳遞上來的參數jsonp.  

        然后,將JSON數據直接以入參的方式,放置到function中,這樣就生成了一段 js 語法的文檔,返回給客戶端。 

        最后,在客戶端瀏覽器中解析script標簽,并執行返回的JavaScript文檔,此時數據作為參數,傳入到了客戶端預先定義好的回調函數里(動態執行回調函數) 。

     

     

    其實 JSONP是個很簡單的一個東西。主要是利用了 <script/>標簽對javascript文檔的動態解析來實現。(其實也可以用eval函數) 。

     

    4.下面分別用js和jquery實現代碼如下:

    test.jsp中的js代碼:

     

    js:

    1. <script type="text/javascript">    
    2.     function jsonpCallback(result){     
    3.        alert(result[1].name);     
    4.     }     
    5. </script>  
    6. <script type="text/javascript"src="http://localhost:8080/Jsonp/jsonp.jsp?callback=jsonpCallback"></script>  

     

     或jquery代碼:

     

    1. <script type="text/javascript">     
    2.     $.getJSON("http://localhost:8080/Jsonp/jsonp.jsp?callback=?"function(json){      
    3.         alert(json[0].name);     
    4.     });     
    5. </script>  

     

     

    jsonp.jsp代碼:

    1. <%  
    2.      String callback = request.getParameter("callback");  
    3.      out.print(callback+"([ { name:'John',age:'19'},{ name:'joe',age:'20'}] );");  
    4.      out.print(callback);  
    5. %>  

     

    當然,后臺可以用action或servlet等實現。

     

    最后,只要是瀏覽器輸入http://localhost:8080/Jsonp/test.jsp就會彈出John了。

     

    posted on 2011-12-10 19:14 RoyPayne 閱讀(577) 評論(0)  編輯  收藏 所屬分類: javascript
    主站蜘蛛池模板: 国产综合成人亚洲区| 亚洲av永久无码精品三区在线4 | 国产伦精品一区二区三区免费下载| 亚洲天堂一区在线| 四虎成年永久免费网站| 2020年亚洲天天爽天天噜| 在线观看免费人成视频色| 亚洲乱人伦中文字幕无码| 久久久久亚洲AV无码麻豆| 免费国产黄网站在线观看可以下载 | 亚洲色无码一区二区三区| 精品国产免费人成网站| 亚洲国产另类久久久精品小说| a毛片视频免费观看影院| 亚洲欧洲日韩国产综合在线二区| 久久免费视频99| 亚洲国产亚洲综合在线尤物| www在线观看免费视频| 无人影院手机版在线观看免费| 亚洲综合色区中文字幕| 精品久久久久久久免费人妻| 97久久精品亚洲中文字幕无码| 丰满妇女做a级毛片免费观看| 国产AV无码专区亚洲AWWW| 免费人成网站在线观看不卡| 亚洲美女一区二区三区| 天天天欲色欲色WWW免费| 野花视频在线官网免费1| 免费看少妇作爱视频| 一级做a爰片久久毛片免费陪| 日韩一区二区免费视频| 一级黄色毛片免费看| 久久久久久亚洲精品| 国产无遮挡裸体免费视频在线观看| 337p日本欧洲亚洲大胆精品555588 | 光棍天堂免费手机观看在线观看 | 久久一区二区免费播放| 亚洲av无码不卡久久| 亚洲第一区精品日韩在线播放| 国产精品免费无遮挡无码永久视频 | 一本无码人妻在中文字幕免费|