Apache Wicket – Readable URLs mit Mount-Pathes

Heute bin ich in meinem aktuellen Projekt vor einem interessanten Problem gestanden. Nehmen wir an, wir haben ein Webprojekt, basierend auf Apache Wicket.

Ein Archetype lässt sich für die Version 6 so generieren:

[code]
mvn archetype:generate -DgroupId=de.effectivetrainings -DartifactId=wicket-6-mountpathes -DarchetypeGroupId=org.apache.wicket -DarchetypeArtifactId=wicket-archetype-quickstart -Dversion=1.0-SNAPSHOT
[/code]

Definieren wir uns eine neue WebPage.

[code]
/**
* @author Martin Dilger
*/
public class MyPage extends WebPage {
public MyPage(PageParameters parameters){
super(parameters);
add(new Label(parameters.get("category").toString()));
}
}
[/code]

Dazu das passende Html

[code]

MyPage rendert :</pre>
<div wicket:id="category"></div>
<pre>
[/code]

Direktsprung auf die Seite

Nehmen wir an, wir möchten per Direkteinsprung auf die MyPage springen. Ohne weiteres würde das über diesen Link
funktionieren.

[code]

http://localhost:8080/wicket/bookmarkable/de.effectivetrainings.MyPage

[/code]

Nicht besonders schick, oder?

Package Mounts

[code]
@Override
public void init()
{
super.init();
mountPackage("pages",MyPage.class);
}
[/code]

Damit sind alle Pages im Package der Klasse MyPage über folgenden Link aufrufbar

[code]

http://localhost:8080/pages/MyPage

http://localhost:8080/pages/HomePage

[/code]

Der Mount-Pfad ist hierbei einfach der Klassenname

Parameter

Eine Seite lässt sich auf mit Parametern rendern (man liest oft Restful.. hat aber nicht viel miteinander zu tun).

[code]
/**
* @see org.apache.wicket.Application#init()
*/
@Override
public void init()
{
super.init();
mountPackage("pages",MyPage.class);
mountPage("/pages/parameter/${category}", MyPage.class);
}
[/code]

Wir machen die Page MyPage zugreifbar unter /pages/parameter/sport zum Beispiel, der Parameter sport wird hiermit als GET-Parameter über die übergebenen PageParameter zur Verfügung gestellt. Der Zugriff funktioniert einfach so:

[code]
parameters.get("category").toString()
[/code]

Man kann auch mehrere Parameter übergeben.

[code]
@Override
public void init()
{
super.init();
mountPackage("pages",MyPage.class);
mountPage("/pages/parameter/${category}/${weekday}", MyPage.class);
}
[/code]

Ein Aufruf könnte so aussehen:

[code]

http://localhost:8080/pages/parameter/sport/montag

http://localhost:8080/pages/parameter/sport/montag/

[/code]

Ein Beispiel für dieses Mounting wäre eine Online-TV Zeitschrift, die alle Sportsendungen am Montag anzeigen soll.
Um alle Sportsendungen anzuzeigen gilt weiterhin dieser Link, der auch funktioniert.

[code]

http://localhost:8080/pages/parameter/sport

[/code]

Was aber, wenn wir alle Sendungen am Montag anzeigen möchten?
Ein Aufruf wäre

[code]

http://localhost:8080/pages/parameter/montag

[/code]

Optionale Parameter

Wie soll Wicket unterscheiden, ob der Parameter montag jetzt die Kategorie oder der Wochentag ist?

Man könnte die Seite so aufrufen

[code]

http://localhost:8080/pages/parameter//montag/

[/code]

Nein.. keine besonders gute Idee.

Optionale Parameter als Rettung!

[code]
mountPage("/pages/parameter/#{category}/${weekday}", MyPage.class);
[/code]

Einfach ein # statt des $ verwenden, und schon sind diese Parameter optional und werden auch so behandelt.


War dieser Blogeintrag für Sie interessant? Evtl. kann ich noch mehr für Sie tun.

Trainings & Know-How aus der Praxis zu

  • Apache Wicket 1.4.x, 1.5.x, 1.6.x
  • GIT – Best Practices, Einsatz, Methoden
  • Spring
  • Java
  • Scrum & Kanban
  • Agiles Arbeiten
Consulting & Softwareentwicklung

  • Requirements Engineering
  • Qualitätssicherung
  • Software-Entwicklung
  • Architektur
  • Scrum & Kanban

Effective Trainings & Consulting - Martin Dilger



Hat Ihnen dieser Blog-Eintrag gefallen? Ich stelle in diesem Blog Informationen über Tools, Frameworks und Werkzeuge zur Verfügung, die mich produktiver machen. Vielleicht kann ich auch Ihnen helfen, produktiver zu werden.


Ich unterstütze Sie als freier Mitarbeiter bei der Entwicklung von Software-Projekten, Agiler Arbeit sowie Schulungen / Fortbildungen.


Jeden Tag ein bisschen produktiver - ab heute