Struts 2 Acion类多个实例

时间:2016-04-14 19:43:48

标签: java struts2

我像下面一样加载对象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()
      }
}

那么我应该怎样做才能启动同一个动作实例?

1 个答案:

答案 0 :(得分: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()
    }
}