我应该怎么做才能在 Struts 2 中的下一个请求上启动相同的操作实例?

问题描述 投票:0回答:1

我加载对象

userData
如下所示,以在 JSP 上显示它。 (稍后将从数据库加载)使用
Register()
方法类型
GET

接下来,我在 JSP 上填写

userData
的另一个字段,然后单击
register

然后方法

Register()
再次开始,但它不使用相同的
RegistrationAction

所以例如

attribute1
仍然是 1 而不是 2。

样品:

public class RegistrationAction extends ActionSupport{
       int attribute1=0;
       public String Register() throws Exception {
           attribute1++;
           if(request.getMethod().equals("GET")){  //load object to form
              user=new UserData();
              user.setName("lucas");
               return NONE;
           } 
            //else POST -> save()
      }
}

那么,我应该怎么做才能在下一个请求上启动相同的操作实例?

java struts2 prepared-statement httpsession struts2-interceptors
1个回答
3
投票

您不应该启动同一个实例。同一个实例将不是线程安全的。

每个请求都会创建一个新的操作实例,您必须在结果视图之前对其进行初始化。

您可以使用Preparable来完成。

拥有在调用之间共享数据的三个操作需要使用

Preparable
准备一个模型来填充会话中的字段,或使用会话对象引用为字段提供默认值以保存它们。

public class RegistrationAction extends ActionSupport implements Preparable, SessionAware {

  public void prepare() {
     user=new UserData();
     user.setName("lucas");
     attribute1 = session.get("attribute1");
  }

  private Map<String, Object> session;

  @Override
  public void setSession(Map<String, Object> session) {
     this.session = session;
  } 

   int attribute1=0;
   public String Register() throws Exception {
       attribute1++;
       session.put("attribute1", attribute1);
       if(request.getMethod().equals("GET")){  //load object to form          
           return SUCCESS;
       } 
        //else POST -> save()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.