2016-04-14 3 views
3

Я загружаю объект userData, как показано ниже, чтобы показать его на JSP. (позже он будет загружен из базы данных), используя метод метода Register «GET».Struts 2 Несколько экземпляров класса Acion

Далее Я заполняю еще поля userData на jsp и нажимаю регистр. Затем метод Зарегистрируйтесь снова, но не используйте это же 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() 
     } 
} 

Так что я должен сделать, чтобы начать этот же экземпляр действия?

+0

[Проблема XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) до максимума, ИМХО. Пожалуйста, определите, что вам действительно нужно делать, что, я уверен, не будет привлекать к тому же экземпляру одноразового действия ThreadLocal. Если вам нужно запомнить значения для нескольких вызовов, сеанс - ваш друг –

+1

Новый запрос = новый экземпляр действия. Храните данные где-то или передайте их на новый запрос. –

+0

Я также предлагаю вам использовать атрибуты сеанса для этого требования. – Mohan

ответ

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() 
    } 
} 
+0

, поддержанный для глазной конфеты –

+0

: D у него есть некоторые ошибки компилятора (как обычно), но дело в том, чтобы объяснить другие вещи. –

Смежные вопросы