一些理解-過濾器,攔截器,ajax提交後不跳轉,document.location.href無效,回調函數。

1.struts2中過濾器和攔截器的工做流程:css

request-->執行自定義過濾器doFilter方法中的chain.doFilter()方法的代碼-->執行默認過濾器doFilter方法中的chain.doFilter()方法的代碼-->執行默認攔截器-->執行自定義攔截器-->訪問服務器資源(action,css,html,jsp...)-->執行自定義攔截器-->執行默認攔截器-->執行默認過濾器的doFilter方法中chain.doFilter()方法的代碼-->執行自定義過濾器doFilter方法中的chain.doFilter()方法的代碼-->客戶端開始執行響應responsehtml

注:①上面的自定義的過濾器在默認過濾器以前執行只是一個假設的順序,這其中光光默認的過濾器這個執行過程就有不少細節,這個網上資料或者源碼剖析有不少。web

  ②自定義過濾器有多個的話,它的執行順序和你在web.xml中佈置的前後順序有關,前者先執行。ajax

  ③注意請求和響應這個來回中,多個過濾器的先後執行和攔截器的先後執行順序是對稱的。服務器

2.ajax的同步是ajax的事沒作完前,其餘的事不能作,要等着它。異步相反,同時性互不影響地執行。異步

3.注意起來一個狀況:ajax+submit+同步----就是你用ajax請求服務器,並且用的是同步的方式,而且你是經過點擊了type類型爲submit的按鈕來觸發這個ajax。jsp

這個時候,首先你點擊了submit,它會提交表單,可是因爲你用了ajax的同步操做,submit的提交被阻塞,ajax先執行,這個時候,若是你在ajax的回調函數(如:success)中寫了document.location.href='xxx.html',它是執行了,的確是去執行了跳轉的,因而ajax完成了,那接下來就要把剛纔的submit提交的請求完成。因而呢又要從xxx.html跳回到剛纔那個頁面(不管你submit有沒有提交具體的數據,總之提交了以後若是後臺沒有執行跳轉/重定向,它就要回到原來的頁面。)函數

即:ajax就是如你所想那樣執行了,也從A頁面跳到了B頁面,可是因爲submit這種類型的特殊性,又讓B頁面跳回了A頁面,因爲這個ajax執行完再執行submit請求的過程處理的很快,你會感到好像沒有效果,可是你仔細觀察,會發現這個過程頁面會刷新的,其實就是B頁面跳回到A頁面。spa

因此當用ajax去請求時,咱們要用button,而不是submit,更要慎用同步。xml

4.回調函數理解:

不嚴謹地用ajax來講吧:ajax提交了一個請求,好比去請求了一個action,這個時候ajax跟這個action說,老哥你幫我辦個事唄(我給你個地址,你去幫我拿個東西,而後好了交給我),而後action答應了而且把要處理的業務處理完。這個時候,action想告訴ajax你叫我作的我完成了,而且你跟我要的東西我也準備好了,可是我怎麼給你呀??

①:你們想下怎麼回頭告訴ajax你叫我作的我作好了,而且要把東西給ajax?難道又要弄個請求,去請求這個東西?這樣的話,那這個請求怎麼知道前面請求了什麼,怎麼知道要去拿什麼?就像ajax在叫他的朋友ajaxBBBB去幫他去到Action那裏拿,但是此次ACtion又怎麼告訴這個ajaxBBBB說東西在哪,你過來拿。這個又怎麼通知ajaxBBBB,難道又要弄個請求,這個請求問問他東西放哪??這不是陷入無限循環了嘛,因此就有了回調函數。

②:回調函數這個函數是存在於ajax裏面定義的,只是有了藉口可以給別人調用。好比Action完成了請求的業務,因而調用了ajax的success回調函數,把數據回傳給ajax,而後success回調函數去處理這些數據。

  這就好像:ajax以爲剛纔這事不行,很煩。因此他花了大價錢,買了一輛小貨車,這個車就是屬於ajax的,而後每次ajax叫action辦事,他只要跟action說要辦的事,而後就在家裏等着,action作好了,只要去把ajax的貨車開過來,把東西裝上,給ajax送過去。這個車就是回調函數,他屬於發出請求的一方,而調用他的是被請求的一方,由於回調函數是在請求一方的體內,請求方能夠知道能夠獲得能夠訪問這個函數,也就能夠獲得這個函數體內的信息了。

③:爲了幫助記憶,用一句話來講。-------A對象有2個方法,一個方法是用於發送請求到B的,另外一個是B完成請求去用來傳送信息和數據的。A發請求,B接收並完成,B再調用A中的回調函數,A執行這個回調函數。

其實說這個B調用了A中的回調函數是很不嚴謹甚至錯誤的,由於B的目的是傳回消息和數據給A,B只是說把數據做爲回調函數的一個參數,等A執行回調函數的時候用罷了。這個過程還有不少細節。我只是爲了你們好理解。

我只是盡力地闡述了個人理解。有不對的地方望指正,至於一些很細很細的源碼,過程之類的剖析能夠百度,這些網上不少的。

相關文章
相關標籤/搜索