2016-04-14 7 views
3

Ich lade Objekt userData wie unten, um es auf JSP anzuzeigen. (Später wird es aus der Datenbank geladen), indem Sie die Methode "GET" der Registermethode verwenden.Struts 2 Acion-Klasse mehrfache Instanz

Als nächstes fülle ich weitere Felder von userData auf Jsp und klicken Sie auf Register. Dann Methode Register neu starten, aber nicht das gleiche verwenden RegistrationAction. Also z.B.

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

Also, was ich sollte dieselbe Instanz von Aktion zu starten tun: attribute1 wird noch 1 statt 2.

Probe sein?

+0

[XY Problem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) zu seinem Maximum, IMHO. Bitte definieren Sie, was Sie * wirklich * tun müssen, und ich vertraue darauf, dass Sie nicht auf dieselbe Instanz einer ThreadLocal-Einwegaktion zugreifen müssen. Wenn Sie sich die Werte mehrerer Anrufe merken müssen, ist die Sitzung Ihr Freund. –

+1

Neue Anfrage = neue Aktionsinstanz. Speichern Sie die Daten irgendwo oder übergeben Sie sie an eine neue Anfrage. –

+0

Ich würde Ihnen auch empfehlen, die Sitzungsattribute für diese Anforderung zu verwenden. – Mohan

Antwort

3

Sie sollten nicht die gleiche Instanz starten. Dieselbe Instanz ist nicht Thread-sicher.

Jede Anfrage erstellt eine neue Aktionsinstanz und Sie müssen sie vor der Ergebnisansicht initialisieren.

Sie können es mit Preparable tun.

Mit drei Aktionen, die ein Datum zwischen den Anrufen teilen erfordert ein Modell vorbereitet Preparable mit Feldern von Sitzung zu füllen oder ein Sitzungsobjekt Referenz verwenden Standardwerte für die Felder, um sie gespeichert zu halten.

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

upvoted für die Augenschmaus –

+0

: D Es hat einige Compilerfehler (wie üblich), aber der Punkt ist, andere Dinge zu erklären. –