您好,登錄后才能下訂單哦!
AJAX 教程
AJAX = Asynchronous JavaScript and XML(異步的 JavaScript 和 XML)。
在應用時主要是創建XMLHttpRequest對象,調用指定服務地址。
但是IE中各個版本支持的不太一樣,所以在創建次對象時可能要特殊處理下。
一般如下:
function createXMLHttpRequest(){ var xmlhttp; try{ xmlhttp = new XMLHttpRequest();//ie7及以上,其他瀏覽器 }catch(e){ try{ xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");//ie6 }catch(e){ try{ xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");//ie6以下 }catch(e){ throw "創建AJAX對象失敗!"; } } } return xmlhttp; } var xmlhttp = createXMLHttpRequest(); xmlhttp.open("GET","http://localhost:8080/SimpleBlog/AjaxTest",true); xmlhttp.send(null); xmlhttp.onreadystatechange = function(result){ if(xmlhttp.readyState==4 && xmlhttp.status == 200){ alter(result.test); } };
但是瀏覽器再執行javascript代碼時,有個著名的同源策略,這使得跨域請求就不是那么方便了。
那一般都是用什么方式支持跨域呢?
1、通過中間代理服務器,獲取要跨域請求的數據。
2、通過iframe內嵌帶請求域的頁面,來解決跨域訪問問題。
3、通過jsonp方式。
4、不過現在已經提出了XMLHttpRequest Level2(XHR2)允許跨域請求,不過要在server的返回頭中顯示聲明允許跨域請求(瀏覽器的支持情況:http://caniuse.com/#feat=xhr2)。
下面簡單說下jsonp與xtr2。
jsonp:
jsonp簡單的說就是利用<script>標簽來實現跨域請求的調用,因為瀏覽器中腳本的加載是不受同源策略影響的。
function get() { var url = 'http://localhost:8080/SimpleBlog/AjaxTest?callback=callback'; var script = document.createElement('script'); script.setAttribute("type","text/javascript"); script.src = url; document.body.appendChild(script); } function callback(va){ alert(va.test); }
服務端(java):
boolean jsonP = false; String cb = this.request.getParameter("callback"); if (cb != null) { jsonP = true; response.setContentType("text/javascript"); } else { response.setContentType("application/x-json"); } PrintWriter out = response.getWriter(); if (jsonP) { try { out.println(cb + "({\"test\":\"1\"})"); out.flush(); out.close(); } catch (Exception e) { throw e; } }
這樣就可以實現跨域調用了。
而我們經常用的jquery已經實現了此類方式的封裝,使用起來更簡單。
$(document).ready(function (){ $('#jqueryajax').bind('click', function(){ $.ajax({ type: 'get', async: false, url: 'http://localhost:8080/SimpleBlog/AjaxTest1', dataType: 'jsonp', jsonp: 'callback', success: function(json){ alert(json.result); }, error: function(){ alert('fail'); } }); }); });
服務端(java):
我用了struts是這樣寫的:
public class AjaxTest1 extends ActionSupport { private String result; public String getResult() { return result; } public String execute() { this.result = "1"; return "jqueryajax"; } }
配置文件:
<action name="AjaxTest1" class="AjaxTest1"> <result name="jqueryajax" type="json"> <param name="callbackParameter">callback</param> </result> </action>
下面說說xtr2:
這個就更簡單了,直接創建調用即可。
function createCORSRequest(method,url){ var xhr=new XMLHttpRequest(); if('withCredentials' in xhr){ xhr.open(method,url,true); }else if(typeof XDomainRequest!='undefined'){ xhr=new XDomainRequest(); xhr.open(method,url); }else{ xhr=null; } return xhr; } function xhr2(){ var request=createCORSRequest('GET','http://localhost:8080/SimpleBlog/AjaxTest1'); if(request){ request.onload=function(){ alert(request.responseText); } request.onerror=function(e){ alert('error'); } request.send(); } }
服務端:其實只要在返回response中設置
httpResponse.addHeader("Access-Control-Allow-Origin", "*");
即可。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。