日期:2014-05-19  浏览次数:20708 次

SSH框架令人头痛的数据残留问题
SSH开发,使用标准的方式,在显示和保存中都发现数据残留问题。

例1
bean:
User
private String name;
get{} set{} ......

Action:
Java code

    private String name;
    private User user;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User task) {
        this.user = user;
    }
    ......
    public String getUser() throws Exception {
        user=userService.findByName(name);
        return "show";
    }
    ......


Jsp:
HTML code

        <s:if test="user!=null">
            <s:property value="user.name" /> 
        </s:if>


先在这申明,Spring注入等之类都是正常的,并没有SSH框架衔接问题。
以上代码通过name取得User。这个Action并不是页面打开时就执行的,是需要人为点击才执行。
问题是,第一个用户打开这个页面,默认是没执行getUser的,这个页面也不显示user.name,这正常,当点击执行后,这个用户能正常得到数据。可另一个用户,即使不在同一台电脑,不是同一个帐号,打开同样的页面也显示出这个user.name值了,应该说第2个人并没有执行getUser(),<s:if test="user!=null">不该通过的,感觉好像user成了全体变量了。

例2
bean相同
处理User增加操作。

Action:(不是同一个Action)
Java code

    private String name;
    private User user;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User task) {
        this.user = user;
    }

         public String UserAdd() throws Exception {
              User user=new User();
              user.setName=name;
              userService.save(user);    
              return("add")
        {



JSP:
HTML code

      ......
     <form method="post" action="add" id="add">
           <s:textfield name="name"/>
           <button  type="submit">保 存</button>

     </form>
     .....



同样是2个人不同电脑操作,第一个点保存时一切正常,第2个人,直接打Url:"xxxx/add",发现虽然没输入任何数据,但同样将第1个人的数据重新保存进去了。

如果第2个人也正常操作添加记录,这时发现保存了自己相同的2条记录,我跟踪了一下,发现当第2个人保存时,这个UserAdd操作了2次。


真是头大了,不知道错在哪了?




------解决方案--------------------
多半是action属性共享了。
在配置struts的action bean时加一个scope="prototype"
如:

XML code


<bean id="a" class="cn.x.x.x.xAction" scope="prototype">