Struts2如何顯示已經更新的模型資料

2021-07-04 14:52:10 字數 1576 閱讀 9775

struts2作為封裝前後臺模型資料的優良框架,會發生一些如在模型在action中被偷梁換柱而顯示不了正確的模型資料的錯誤。

首先我們來分析一下struts2模型資料在從前台到後台再到前台的流程。如下:

第一步:action例項初始化,在執行完strutsprepareandexecutefilter後,struts2開始通過配置檔案生成目標action的**物件actionproxy,同時將action例項壓入值棧,同時根據模型資料生成對應例項model

第二步:開始執行actioninvocation類的interceptor()方法一步一步執行***中的方法,當執行到modeldriveninterceptor***後,通過getmodel方法的返回值將model物件的引用壓入值棧,此時值棧的棧頂元素是根據前台資料得到的model

第三步:執行action的目標方法,呼叫service中的方法得到新的模型資料,然後賦給model物件,此時model不在指向原始的模型資料,而指向新的模型資料model,這樣棧頂元素仍然是舊的模型資料,在前台使用ognl表示式顯示的時候仍然是舊的資料,而不是從資料庫中獲取的新資料。

那麼如何讓前台頁面顯示新資料呢

有如下解決方法:

1),手動壓入值棧 valuestack.push(model).

這種簡單粗暴,但是並不好有幾個原因:一,struts2標榜耦合度低的特點,這樣手動操作struts2的後置物件,會增加耦合度。

二,valuestack是struts2後台默默執行的機制,最好不要自己操作,值棧是資料傳遞的中心,其作用就是希望使用的程式設計人員更加方便的使用資料的傳遞封裝。三,棧中的模型資料過多

2),屬性複製的方式,將新模型的資料乙個個賦值給就模型

但是這樣很麻煩,通過get,set乙個個設定,雖然可以使用beanutil工具包,這樣就需要額外映入jar包,還要通過反射,效能較低

3),通過prepare***,struts2預設***defaultstack,在modeldriven***前面還有乙個prepare***,在每個目標方法呼叫prepare()方法,也可以說是為每個目標方法準備模型資料,通過prepare***x()可以再制定目標方法前呼叫,可以再這裡面替換模型資料,然後再待用modeldriven***時壓入值棧的就是新模型。但是這樣就接受不了前台傳遞的引數,需要使用另外乙個***棧paramsprepareparamsstack,引數準備引數***棧執行順序:params—>prepare—>modeldriven—>params。缺點就是乙個目標方法前就要增加乙個prepare方法,會造成方法的**。

4)使用重新整理機制,進行賦值。

還是使用defaultstack預設棧,通過檢視模型驅動***原始碼我們發現其有乙個屬性refreshmodelbeforeresult,在結果之前重新整理屬性,其預設false,我們看其實現機制

在執行intercept方法時,如果refreshmodelbeforeresult是true,會給model增加乙個監聽,從action獲取模型資料,然後遍歷值棧,如果發現棧頂元素不是newmodel則取出舊資料放入新模型。這是最好的實現解決方法。

Struts2字尾 深入Struts2

一 將action字尾變成html字尾 xmlversion 1.0 encoding utf 8 doctype struts public apache software foundation dtd struts configuration 2.1 en struts include file...

struts2實現顯示等待頁面

在struts2 中我們使用executeandwaitinterceptor 實現顯示等待頁面,execandwait 能夠讓乙個執行時間較長的action 在後台執行,並向使用者顯示進度資訊。當action 的執行時間會超過5 或10分鐘時,它可以防止http 請求超時。execandwait ...

struts2如何獲取資料

在struts2裡,所有的資料都放在actioncontext裡。用 struts2技術內幕 裡面的話來說,就是actioncontext從它的名字看就可以知道它是用來儲存資料的 因為是上下文嘛 actioncontext裡面的資料分2種,一種是根物件,一種當然是非根物件。1 根物件,訪問的時候不需...