ValueStack 工作原理

今天在爲同事解決問題的時候,發現了自己以前對valuestack的理解有點偏差,通過問題的解決,也體驗了一把溫故而知新  

廢話少說,步入正題

當訪問一個action的時候,此時struts2會把整個action壓入valuestack的頂部,此時valuestack就一個action對象  

 我們通常會寫stack.set(key1,value1) 或者statck.setvalue(key2,value2) 這兩個是有區別的,前者會在valuestack壓入一個hashmap,並將key1,value1植入該hashmap 那麼此時valuestack會有兩個對象,頂部是hashmap,底部是action   後者 會 將key2,value2直接植入到頂部的對象,通常是action,如果action沒有相應的set方法,那麼執行這個方法等於白搭,你如果此時執行valuestack.findvalue就會爲空  

我們通常會在多個攔截器傳遞數據,正如前面所說,你必須得再action中寫入set方法,否則無效,如果你不想寫,那麼請用valuestack.set,這樣就不用改寫action. 但又存在一個隱患,如果攔截器1中你寫了valuestack.set,然後你在攔截器2中同findvalue獲取了該值,這沒有問題,假設你突然想在攔截器2中傳一個值給action ,問題就暴露了,你會在攔截器2中像平常一樣寫statck.setvalue,然後在action 中加上 set,滿以爲可以傳遞過去,其實不行,因爲此時棧頂是一個map,而非action,你此時是將值植入到map,而非action,所以傳值失敗。

valuestack作爲攔截器、action,甚至頁面傳遞數據的一個數據結構,特別是當棧中存在多個對象的時候,必須注意棧中對象的順序以免產生一些惱人的問題。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章