※ajax()
@WebServlet(urlPatterns = { "/xxx" }) public class XxxServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html; charset=UTF-8"); PrintWriter out = resp.getWriter(); // try { // Thread.sleep(2000); // } catch (InterruptedException e) { // e.printStackTrace(); // } out.print("username=" + req.getParameter("username") + "<br />"); out.print("password=" + req.getParameter("password")); } } ---------- var ajaxTest = function(){ $.ajax({ url : "xxx", type : "POST", // data : { // username:'u', // password:$('input[name="password"]').val() // }, // async : false, data : $.param({ username: $('input[name="username"]').val(), password: 'p' }), success : function(data, textStatus, jqXHR){ alert(data); // username=user<br />password=p alert(textStatus); // success for(xhr in jqXHR){ alert('xhr=' + xhr); // readyState、getResponseHeader、getAllResponseHeaders、setRequestHeader、overrideMimeType、statusCode、abort、state、always、then、promise、pipe、done、fail、progress、complete、success、error、responseText、status、statusText // alert('jqXHR[xhr]=' + jqXHR[xhr]); } } }); alert('think'); } ---------- <form action="xxx" method="post"> 使用者:<input type="text" name="username" value="user" /><br /> 密碼:<input type="password" name="password" value="pass" /><br /> <input type="submit" /> </form> <input onclick="ajaxTest()" type="button" value="test" />
※最下面的form不是ajax,是一般的寫法,整批一起丟到controller
※按鈕test是ajax寫法,async預設是true,是非同步,至少要有url和type才可以運作(雖然預設是GET,但我不寫就是不行),但總是要看結果回傳什麼,所以我加了success;而data是傳過去的json資料,「:」左邊等同name名稱,controller是抓這個名稱的
data我用了兩種方法
※如果將async設為false,就是同步
※注意think印出的時機,如果沒將controller的sleep打開,我試的結果它都是最後執行
但打開時,也就是停2秒,這兩秒的意思是模擬後端有很多工作
這時async為true時think會先執行,所以才叫非同步;false就變成最後執行,所以才叫同步
※另外還有可能會用到的還有error和statusCode,其他就很少用到了,要用時再研究
※ajaxPrefilter()、ajaxSetup()
var ajaxTest = function(){ $.ajaxSetup({ config1: 123, config2: "c2", config3: false, config4: 4.5, config5: {'c1': 1, 'c2': false}, url: "zzz" }); $.ajaxPrefilter(function(options, originalOptions, jqXHR) { alert(options.url);//xxx options.url = "http://localhost:8080/TestServletXXX/xxx/ooo/zzz"; alert(options.url); alert('options=' + options); alert('config1=' + options.config1); // 123 alert('config5=' + options.config5.c2); //false for(o in options){ alert('o=' + o); // url、type、isLocal、global、processData、async、contentType、accepts、contents、responseFields、converters、flatOptions、jsonp、jsonpCallback、xhr、data、success、dataTypes、crossDomain } for(oo in originalOptions){ alert('oo=' + oo); // url、type、data、success } }); $.ajax({ url : "xxx", type : "POST",//async : false, data : $.param({ username: $('input[name="username"]').val(), password: 'p' }), success : function(data, textStatus, jqXHR){ // ... } }); alert('think'); }
※使用ajaxPrefilter表示要在$.ajax前過濾,所以將$.ajax註解後,ajaxPrefilter也不會執行
※ajaxPrefilter的第一個參數是個選項,可以是xml html text json jsonp script,預設是「*」,像上面的範例,是沒有第一個參數的,這個參數表示還要特定的類型才會過濾,也就是說$.ajax有一個dataType的屬性,兩個對應才會過濾,隨便打也行,兩個有對應就ok
※ajaxSetup是設定options用的,在ajaxPrefilter的第二個參數的第一個option去點就有了,可以用自訂的、也可以用options本來就有的
理論上ajaxSetup是設options的預設值,我設sync有成功,但url居然失敗了,不知道為什麼,而致於其他的我也沒試
※像上面的ajaxPrefilter,我在呼叫前過濾一下,將xxx轉成另外一支叫xxx/ooo/zzz的servlet了
※ajaxTransport
$.ajaxTransport('abc', function(options, originalOptions, jqXHR) { for(o in options) { alert('o=' + o); // url、type、isLocal、global、processData、async、contentType、accepts、contents、responseFields、converters、flatOptions、jsonp、jsonpCallback、xhr、dataType、data、success、dataTypes、crossDomain、hasContent } for(oo in originalOptions) { alert('oo=' + oo); // url、type、dataType、data、success } for(xhr in jqXHR) { alert('xhr=' + jqXHR.xhr);// readyState、getResponseHeader、getAllResponseHeaders、setRequestHeader、overrideMimeType、statusCode、abort、state、always、then、promise、pipe、done、fail、progress、complete、success、error、[Object object]、completeCallback=function done(... } return { send: function(headers, completeCallback) { alert('headers=' + headers); alert('completeCallback=' + completeCallback); }, abort: function() { alert('abort function'); } }; });
※ajaxTransport的第一個參數是必填,否則不會執行,所以$.ajax的dataType也要一樣才會執行
※這個功能是用在ajaxPrefilter也無法滿足需求時,實際的用法我也不清楚
※快速方法
官網連結※post、get、getJSON
$.post( 'xxx', $.param({ username: $('input[name="username"]').val(), password: 'p' }), function(data, textStatus, jqXHR){ alert(data); alert(textStatus); alert(jqXHR); }, 'html' );
※總共4個參數,第一個參數一定要,其他都是選項,最後一個參數是dataType,就是從server返回的格式是哪一種,如xml、json、script、text、htm,不給的話會自己猜測
※和另外一個$.get完全一樣,只差在要對應後端的doGet
※$.getJSON,差在沒有最後的dataType參數,因為就是json
※load
$('input[name="username"]').load( 'xxx', $.param({ username: $('input[name="username"]').val(), password: 'p' }), function(responseText, textStatus, XMLHttpRequest){ alert(responseText); alert(textStatus); alert(XMLHttpRequest.status); alert(XMLHttpRequest.statusText); } );
※事件也有一個方法叫load,兩個是不一樣的
※總共3個參數,第一個參數一定要,其他都是選項
※getScript
$.getScript( 'xxx.js', function(script, textStatus, jqXHR){ alert(script); alert(textStatus); alert(jqXHR); } );
※前面的一定要連到server,這個不用
※第一個參數抓javascript,像我是將xxx.js和寫getScript這一支放在同一個目錄,所以這樣子就抓到了
※總共2個參數,第一個參數一定要
沒有留言:
張貼留言