2012-04-03 9 views
0

Ich nehme Daten von einem Wicket-Formular an - jetzt möchte ich mein DAO-Objekt mit den Daten abfragen und die Filterergebnisse erhalten. Die Frage ist also, wie kann ich Parameter in Modellen übergeben? oder Kann ich Parameter im Modell übergeben? Das Modell ruft standardmäßig die Methode getObject() auf - die keinen Parameter annehmen kann - und wenn ich das Modell verwende, kann ich die andere Methode nicht aufrufen (getByDates (startDate, endDate)) was ist das? Der beste Weg, um Parameter an DAO zu übergeben und das Ergebnis im Frontend anzuzeigen. z. Dataprovider/Modelle etc ...Übergabe von Parametern an DAO, um gefiltertes Ergebnis in Wicket-Modell zu erhalten

 final AbstractReadOnlyModel<List<LogParsed>> listModel = new AbstractReadOnlyModel<List<LogParsed>>() 
     { 
      @Override 
      public List<LogParsed> getObject() { 
       // TODO Auto-generated method stub 
       return logParsedDao.findAll(); 
      } 

      public List<SyslogParsed> getObject(Date startDate, Date endDate) { 
       // TODO Auto-generated method stub 
       return logParsedDao.findByDates(startDate, endDate); 
      } 
     }; 
+0

Sie meinen: wie man den Anfang bekommt Datum, EndeDate in Ihrem obigen Code aus dem Wicket-Formular? Können Sie Ihren Formularcode anzeigen? – bert

+0

Überprüfen Sie die Antworten :) –

Antwort

4

Normalerweise, wenn die Daten sind nicht Teil Ihres Domain-Modell, sondern Elemente, die Sie in der Benutzeroberfläche benötigen, dann können Sie sie Teil Ihrer Seite, Panel oder Form, und dann verweisen sie in Ihrer anonymen inneren Klasse machen:

class MyPage extends Page { 
    private Date startDate; 
    private Date endDate; 

    public MyPage() { 
     Form form = new Form("form"){ ... submit logic etc ...}; 
     add(form); 
     form.add(new DateField("startDate", new PropertyModel<Date>(this, "startDate"))); 
     form.add(new DateField("endDate", new PropertyModel<Date>(this, "endDate"))); 

     IModel<List<Item>> itemsModel = new LoadableDetachableModel<List<Item>>(){ 
      @Override 
      protected List<Item> load() { 
       return logParseDao.findByDates(startDate, endDate); 
      } 
     }; 
     add(new ListView<Item>("items", itemsModel) { ... }); 
    } 
} 
+0

Danke für deine Antwort - da dies eher eine funktionierende Lösung ist - ich akzeptiere deine Antwort :) Prost –

1

Verwenden endgültigen Klassenvariablen (Attribute) oder endgültige Variablen, wo Sie in Ihrem Umfang sind (zB in Ihrem Konstruktor):

class MyPage { 
    final myClassVariable; 

    MyPage() { 
     final myMethodVariable; 

     IModel myModel = new Model() { 
      getObject() { 
       // access on myClassVariable and myMethodVariable 
      } 
     } 

    } 

} 
+1

Verwenden von 'final' ist eine gute Möglichkeit, schnell aus dem Speicher zu laufen. Während Sie bequem sind, müssen Sie wirklich sicher sein, wenn Sie mit dem Modifikator "final" keine unerwünschte Referenz erstellen. Und in Ihrem Beispiel muss die 'myClassVariable' nicht' final' sein, um in einer anonymen inneren Klasse referenziert zu werden. –

+0

Und wie ist die Beziehung zwischen der Verwendung von 'final' Variablen und dem Mangel an Arbeitsspeicher? –

+0

Vielen Dank - Ich habe das Finale nicht benutzt - aber ich habe die Idee von Ihrer Antwort - und löste mein Problem - :) keine Notwendigkeit, final zu verwenden :) –