Skip to content


Wicket Migration - Green Radish

Es ist ein schöner Moment, wenn man sich von Eigenentwicklungen trennen kann. In meinem Fall ist das ein Webframework für das ich lange keinen Ersatz gefunden habe. Nun habe ich meiner erste vollständig mit Wicket realierte Anwendung fertiggestellt. Die Migration von dem bestehenden Framework war nicht besonders schwer. Allerdings sollte sich die Wicketanwendung aus zwei Gründen genauso verhalten wie die alte Anwendung:

  1. Die Entwicklungszeit sollte so gering wie möglich gehalten werden, damit nicht zwei Versionen einer Anwendung zu pflegen sind.
  2. Die wichtigsten Seiten sollten an extakt gleicher Stelle auffindbar sein, damit keine Aufwendige Neuindizierung durch Google und andere Suchmaschinen notwendig wird. Der Austausch von Alt und Neu sollte jederzeit rücknehmbar sein, für den Fall, dass es zu Problemen kommt.

Heute ist der große Tag. Gerade habe ich die Anwendung auf den Server geschoben und jetzt wird umgeschalten: www.green-radish.de

In den nächsten Wochen werden dann verschiedene Funktionen hinzukommen, die mit Wicket so viel einfacher zu realisieren sind, dass ich mich schon auf diese Aufgaben freue. Bis dahin freue ich mich auf Feedback.

Michael:)

Tags:

Veröffentlicht in Allgemein, Wicket, .

Modell-Referenzen

Wie zeige ich eine Liste von Elementen und die Länge der Liste mit Wicket an, ohne dass ich die Liste zweimal erzeugen muss?

Für die Liste würde man ein LoadableDetachableModel benutzen und in load() das Ergebnis zurückliefern.

final LoadableDetachableModel<List<Something>> modelListe = new LoadableDetachableModel<List<Something>>()
{
  @Override
  protected List<Something> load()
  {
    return Something.asList();
  }
};

Für die Anzahl der Einträge würde ich jetzt auf dieses Modell zurückgreifen:

LoadableDetachableModel<Integer> modelAnzahl = new LoadableDetachableModel<Integer>()
{
  @Override
  protected Integer load()
  {
    return modelListe.getObject().size();
  }

  @Override
  public void detach()
  {
    modelListe.detach();
    super.detach();
  }
};

Wenn modelListe nicht mit einer Wicketkomponente verbunden wäre, würde detach für diese Modell nie aufgerufen und die Liste damit nicht neu erzeugt. Änderungen an der Liste würden sich nicht sofort in der Anzeige wiederspiegeln. Daher muss man in dem Modell, dass mit einer Wicketkomponente verbunden ist auch detach für alle referenzierten Modelle aufrufen. Es gibt eine einfachere Lösung:

public abstract class CascadingLoadableDetachableModel<M,P> extends LoadableDetachableModel<M>
{
  IModel<P> _parent;

  public CascadingLoadableDetachableModel(IModel<P> parent)
  {
    super();
    _parent=parent;
  }

  @Override
  public void detach()
  {
    super.detach();
    _parent.detach();
  }

  @Override
  protected M load()
  {
    return load(_parent.getObject());
  }

  protected abstract M load(P parentModelData);
}

Man übergibt die Modell-Referenz im Konstruktor, bekommt die Modell-Daten automatisch als Methodenparameter und detach wird auch automatisch aufgerufen:

CascadingLoadableDetachableModel<Integer,List<Something>> modelAnzahl = new CascadingLoadableDetachableModel<Integer,List<Something>>()
{
  @Override
  protected Integer load(List<Something> parentModelData)
  {
    return parentModelData.size();
  }
};

Schön kurz.

Tags:

Veröffentlicht in Wicket, .

Impressum

Michael Mosmann
Stoltenrieden 21
23843 Bad Oldesloe

E-Mail: michael (ät) mosmann.de

Inhaltlich Verantwortlicher gemäß § 10 Absatz 3 MDStV: Michael Mosmann (Anschrift wie oben)

Haftungshinweis: Trotz sorgfältiger inhaltlicher Kontrolle übernehmen wir keine Haftung für die Inhalte externer Links. Für den Inhalt der verlinkten Seiten sind ausschließlich deren Betreiber verantwortlich.

Erklärung zur Informationspflicht (Datenschutzerklärung)

Der Schutz Ihrer persönlichen Daten ist uns ein besonderes Anliegen. Wir verarbeiten Ihre Daten daher ausschließlich auf Grundlage der gesetzlichen Bestimmungen (DSGVO, TKG 2003). In diesen Datenschutzinformationen informieren wir Sie über die wichtigsten Aspekte der Datenverarbeitung im Rahmen unserer Website.

Kontakt mit uns

Wenn Sie per E-Mail Kontakt mit uns aufnehmen, werden Ihre angegebenen Daten zwecks Bearbeitung der Anfrage und für den Fall von Anschlussfragen sechs Monate bei uns gespeichert. Diese Daten geben wir nicht ohne Ihre Einwilligung weiter.

Cookies

Unsere Website verwendet KEINE Cookies.

Web-Analyse

Unsere Website verwendet KEINEN Webanalysedienst.

IP-Adressen

Ihre IP-Adresse wird erfasst, aber umgehend (z.B. durch Löschung der letzten 8 Bit) pseudonymisiert. Dadurch ist nur mehr eine grobe Lokalisierung möglich.

Newsletter

Es gibt KEINEN Newsletter.

Ihre Rechte

Ihnen stehen grundsätzlich die Rechte auf Auskunft, Berichtigung, Löschung, Einschränkung, Datenübertragbarkeit, Widerruf und Widerspruch zu. Wenn Sie glauben, dass die Verarbeitung Ihrer Daten gegen das Datenschutzrecht verstößt oder Ihre datenschutzrechtlichen Ansprüche sonst in einer Weise verletzt worden sind, können Sie sich bei der Aufsichtsbehörde beschweren.

Wicket Resourcen mit Jetty nachladen

Bei großen Wicket-Projekten kann das hotdeployment des maven jetty plugins schonmal dazu führen, dass aus dem Vorteil ein Nachteil wird. Dabei ist das Ziel recht einfach: Nur die Html-Templates für die Wicket-Komponenten sollen neu geladen werden, wenn sich da was verändert hat. Alle Vorschläge aus den Foren sind mir zu aufwendig Außerdem mag ich die Html-Dateien nicht in das selbe Verzeichnis wie die Quelltexte legen. Ich habe mir daher einen für das Problem angepassten ResourceStreamLocator geschrieben:

public class MavenDevResourceStreamLocator extends ResourceStreamLocator
{
  String _prefix="src/main/resources/";

  public IResourceStream locate(final Class clazz, final String path)
  {
    IResourceStream located=getFileSysResourceStream(path);
    if (located != null)
    {
      // alles ok
      return located;
    }
    // fallback
    located=super.locate(clazz, path);
    return located;
  }

  private IResourceStream getFileSysResourceStream(String path)
  {
    File f=new File(_prefix+path);
    if ((f.exists()) && (f.isFile()))
    {
      return new FileResourceStream(f);
    }
    return null;
  }
}

Eingebaut wird das dann in die init-Methode der Application-Klasse wie folgt:

if (DEVELOPMENT.equalsIgnoreCase(configurationType))
{
  getResourceSettings().setResourceStreamLocator(new MavenDevResourceStreamLocator());
}

Und schon werden alle Änderungen an den Html-Dateien sichtbar.

Tags:

Veröffentlicht in Maven, Wicket, .