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

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

客戶 發送 觀察 要去 jaxb 源碼 流程 type類 攔截器的工作流程

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

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

的代碼-->客戶端開始執行響應response

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

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

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

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

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

這個時候,首先你點擊了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頁面。

所以當用ajax去請求時,我們要用button,而不是submit,更要慎用同步。

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執行回調函數的時候用罷了。這個過程還有很多細節。我只是為了大家好理解。

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

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