SSH整合開發時Scope為預設時現象與原理,sshscope
1.前提知識
1)scope預設值進行SSH整合開發時,Struts2的action需要用spring容器進行管理,只要涉及到類以bean的形式入到spring容器中,不管是xml配置還是使用註解方式進行配置,都會涉及到spring管理bean的scope,其一共有五種取值,而其預設值為singleton,也就是單例模型,所有對此bean引用為同一個對象。
2)action應為多例struts2作為MVC中視圖(View)層架構,其最主要任務就是接收使用者請求,然後調用商務邏輯層進行處理,這種特徵也就是意味著每個HTTP請求都必須對應一個單獨的action,不然會出現資料衝突。
3)那麼問題來了通過上述兩點可以看出兩者是矛盾的,所以當spring需要管理action時,就必須更改其scope為prototype,而不是使用其預設值-singleton。2.錯誤現象
進行使用者添加時,如果spring管理action的方式為預設值(singleton)就會造成添加完使用者後,當進行再次添加時探索資料進行自動回顯(前提使用了struts2標籤並且使用了ModelDriven),不管是關閉瀏覽器還是換其它瀏覽器都是如此,使用<s:debug>標籤調用時,發現值棧的root棧的棧頂就是之前添加的使用者(model)。
3.原因分析1)spring容器啟動spring容器啟動時,會建立添加使用者action的執行個體,因為其scope為singleton方式,所以以後每次請求此action都會調用同一個action對象,由此也埋下了滅亡的種子。
2)經過modelDriven攔截器使用者在輸入完資訊,點擊提交。因為添加使用者需要對錶單輸入資料進行封裝,此時採用了封裝資料最標準的做法實現ModelDriven介面,那麼當請求添加的action時,會經過modelDriven攔截器,此攔截器通過getModel方法擷取目標model然後push到valuestack的棧頂;
2)經過param攔截器當經過攔截器params時,其會對棧頂的model進行賦值。
3)執行action執行添加action進行添加操作,並且完成後續。
4)再次請求添加action轉寄此時又從spring容器中取出添加的action,由於其scope為singleton,所以此action與之前的action為同一個,而此前添加的還儲存在action中。
5)再次經過modelDriven攔截器再次經過攔截器modelDriven,此時action中的model再次被放到valuestack的棧頂,再次提醒model中是有值的。
6)到達介面到達介面時,就會根據model中值進行回顯。
ssh整合原理及其整合步驟
spirng管理對象,struts 管理頁面跳轉。及處理流程。hibernate 操作資料庫.
大家好,問ssh或者s2sh整合時那個bean配置的時scope怎填寫?
scope=prototype是多執行個體action,它會在該類型的對象被請求時建立一個新的action對象(這個你應該很明白了)。
但是spring建立的action預設是建立的是單一實例。如果你不配置scope=prototype則添加的時候不會建立一個action,他任然會保留上次訪問的過記錄的資訊。