struts2 Action里面的getter方法會在Action結束后被自動調用,例如有此情況:
<package extends="struts-default">
<action name="MyAction">
<action name="AnotherAction" method="getSomething">
...
在Action中
public String execute(){
System.out.println("execute");
return SUCCESS;
}
public String getA() {
System.out.println("getA");
return SUCCESS;
}
public String geta() {
System.out.println("geta");
return SUCCESS;
}
public String getaa() {
System.out.println("getaa");
return SUCCESS;
}
public String getaA() {
System.out.println("getaA");
return SUCCESS;
}
public String getB() {
System.out.println("getB");
return SUCCESS;
}
public String gotA() {
System.out.println("gotA");
return SUCCESS;
}
當調用MyAction的時候,輸出結果為:
execute
geta
getaA
getaa
getB
也就是說,即使你沒有調用AnotherAction,getSomething仍然會執行。
---------------------------------------------------------------------------
090520更新
這個問題確實很惱人,這兩天又被此事折騰的崩潰。
再次提醒,在struts2的Action中慎起get打頭的函數!
出錯的整個過程是這樣的(錯的花了..):
在測試程序的過程中,發現后臺Hibernate不時的發生讀取臟數據的情況。
為此專門編寫了測試文件進行測試,并沒有發現讀取臟數據的現象。眾所周知Session不是線程安全的,可系統是用ThreadLocal來管理Session的,按說不應該出現這個問題。
我也曾懷疑過是sf緩存出的錯,可去掉緩存后還是有問題。
在打開了Session創建和銷毀的Log后,發現程序在Action返回后,又創建了新的Session(沒有關閉)。
注:系統在Action層對Service層做了IOC,在Service層對DAO層做了IOC。
結果就是,Action結束時調用了getXXXService函數,而又
神奇的調到了當前Service所有get打頭的函數。
最后的解決辦法是,此處的IOC并不需要getter,把getter刪除就行了。