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

來源:互聯網
上載者:User

標籤:自訂   struts2   源碼   工作   處理   這不   按鈕   chain   並且   

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無效,回呼函數。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.