在action类中定义一个 public xxx x=new xxx(); 生成get和set方法
在页面中,例如一个表单控件的name="x.属性",这样提交表单时可以set到action里的x属性中去。
我是用struts和spring集成,发现一个问题,这个action中的x对象永远都是一个对象。我关闭浏览器之后从新打开,之前set进去的x的属性还是没变.除非我从新启动浏览器,此时x才是一个新的对象,这是spring创建的问题吗?怎么解决?

解决方案 »

  1.   

    这个问题我也发现了:
    要么是浏览器的功能;要么是struts2的功能,这个与spring无关哈,除非你自己去写。
    解决办法:不需要的数据及时清除即可。
      

  2.   

    楼主这问题与你的ioc容器配置有关,因为你的struts2和spring集成了,那action的创建是由spring给你提供的,而spring的ioc默认给你创建的action都是单实例,所以不是你的set进去的属性没变,而是action一直是同一个,那它里面的属性肯定也就是同一个,所以楼主在配置文件中加个属性使得action的创建不是单实例就行了,配置如下(比如有个UserAction):
    <bean id="userAction" class="com.mwt.action.UserAction" scope="prototype"/>
      

  3.   

    默认的bean配置是单例的
    把bean设置成prototype就可以了
    代码看2L
      

  4.   

     <bean name="PruductClassAction" class="com.octmami.py.action.PruductClassAction" scope="prototype"></bean>
      

  5.   

    感谢mawentao728的回答。
    刚刚又查了查,有这样说的。在web.xml中加入这样一段
    <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    </listener>
    请问管用吗?
    大家做开发的时候这段是否一般都有?
    因为本人是初学者,对这种东西部太理解,只能是先走一些大家通常都走的套路,慢慢去理解
      

  6.   

    在spring的bean文件中,将action 配置为 prototype
     scope="prototype"
      

  7.   

    貌似明白一点了,只有action的bena设置一下scope就可以了。其他的就让他单例就好了
      

  8.   

    继续讨论下去,这个问题把scope改成prototype了,之后问题又来了,之前更新对象的时候可以直接用属性里德对象,因为DAO中get得到后这个对象从页面做了相应修改之后,其他值还是存在的。所以可以直接update。现在值除了页面set的其他都不存在了,大家是怎么做的?一个个的set?还是通过隐藏域?
      

  9.   

    Spring集成Struts2的Action有两种形式, 一种是Struts2自己创建Action,第二种是Spring创建Action的实例, 因为我们都知道,在Struts2中, 每个请求对应一个Action的实例, 而Spring创建bean默认是单例, 所以应该修改scope=prototype  如果用Struts2自己创建则无任何问题,这个有朋友会问了,如果我拿Struts2自己创建Action,那么怎么注入对象呢? 如果你能问出这个问题,那么你学得还算好了.在default.properties文件里面配置了一个常量,struts.objectFactory.spring.autoWire = name,就是说只要Action的属性与Spring创建的bean的name相同,就会自动给装配  !Spring集成Struts2只需要添加一个插件包, 那个插件包里面会有一个struts-plugin.xml的配置文件, 里面配置了ObjectFactory(具体名称是否是这个自己去查).!  具体这方面的配置,真的建议自己去参照官方的Struts2文档去学习