細談Struts2框架(二)Struts2框架之Scope屬性

我們這次工作的項目用到的是傳統的SSH框架,同時沒有采用註解的方式進 行開發,都是純手工的xml配置文件。原來都是仿造已經配好的一條線配置文件,Action、manage、service、entity每一層都加一個 配置文件。但是今天遇到了一個bug,費了好長時間才找到什麼問題。

在項目中對養老金錶的增刪改操作都是用一個action,這個 action有add、update、delete、save方法,添加和修改是共用一個頁面,當頁面得到id時代表進行的更新操作,反之添加操作。今天 這些功能基本上都實現了,但是當我點擊修改的時候,返回去再點添加,發現修改的回顯數據出現在添加里,也就是說添加的時候還是顯示上一次的訪問記錄。出現 問題,首先把問題的根源定位在Action變量作用域上,找了很長時間都不知道是哪出的問題?後來想,我是不是在哪更改了Action的作用域?如果我要 更改的話,我會去哪改?一拍腦袋,想起來了,在配置養老金Action配置文件時,沒有添加 scope="prototype" 屬性。在配置文件中添加 scope="prototype"就好了!

後來,反思了一下,爲什麼這一個小小問題,自己需要解決那麼長時間?主要的原因還是對原理不清楚,對Scope 的作用不了解! 下面就來學習一下什麼是scope?在框架中起到什麼作用?

Scope 是作用域的意思,一段程序中一個變量的名稱並不是什麼時候都有效的,它只在某個範圍內有效,限定這個變量在哪段範圍內有效。

Scope ="prototype" 代表會在該類型的對象被請求時創建一個新的action對象。如果沒有配置,則不會在添加的時候新建一個action,會保留上一次訪問過的記錄信息。 如果沒有配置,默認是scope="singleton" singleton模式指的是對某個對象的完全共享,如果一個類是singleton的,假如這個類有成員變量,那麼這個成員變量的值是各個線程共享的, 類似於static.當線程A給變量付了一個值以後,線程B就能讀出這個值。因此對於前臺Action,肯定不能使用singleton模式,必須是一個 線程請求對應一個獨立的實例。

在web狀態下中,請求時多線程的,全局變量可能會被不同的線程修改,尤其在併發時會帶來意想不到bug。而在開發時,訪問量小,不存在併發、多線程的問題,程序員極有可能忽視這個問題。例如這次我就犯了這麼個錯誤。。。。

所 以在配置action時,應使用scope="prototype",爲每一次request創建一個新的action實例,這符合struts2的要 求,struts2爲每一個request創建一個新的action實例。當request結束,bean就會被jvm銷燬,作爲垃圾收回。例如,添加、 修改、查詢和刪除雖然都是對應一個action。但是每次的請求應該都是一個全新的實例。這樣也就不會出現上面我出現的那個問題了。

當然,也可以設置scope="session",也能避免web中action併發問題,但是它代表只爲當前用戶創建一次bean,直至session消失。這種情況下,對當前用戶而言,bean是有狀態的,好處是可以少創建bean的實例。

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