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删除就行了。