今天写代码时,遇到个问题,问题大概如下:在写一个新增模块,当各文本框等输入值后,提交存入数据库,跳到其它页面,当再次进入该新增页面时,上次输入的数据还存在。
经过检查发现是,spring配置文件中,配置的<bean id="pActionVO" name="pActionVO" class="com.wisdom.lxgz.purchases.model.vo.PurchasesActionVO"/>没有写 scope="prototype"。默认是singleton单列模式,每次访问时不会新建一个pActionVO,他任然会保留上次访问的过记录的信息。所以,我们在Spring配置Bean时,需要加上属性scope=”prototype”或singleton=”false”。
singleton模式指的是对某个对象的完全共享,包括代码空间和数据空间,说白了,如果一个类是singleton的,假如这个类有成员变量,那么这个成员变量的值是各个线程共享的(有点类似于static的样子了),当线程A往给变量赋了一个值以后,线程B就能读出这个值。因此,对于前台Action,肯定不能使用singleton的模式,必须是一个线程请求对应一个独立的实例。推而广之,只要是带数据成员变量的类,为了防止多个线程混用数据,就不能使用singleton。对于我们用到的Service、Dao,之所以用了singleton,就是因为他们没有用到数据成员变量,如果谁的Service需要数据成员变量,请设置singleton=false。
在新增页面,原来s:property显示的数据,要再后台取到,我是配置了s:hidden.