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:

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

Definieren wir uns eine neue WebPage.

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

Dazu das passende Html


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

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.

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

Nicht besonders schick, oder?

Package Mounts

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

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

http://localhost:8080/pages/MyPage
http://localhost:8080/pages/HomePage

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).

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

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:

parameters.get("category").toString()

Man kann auch mehrere Parameter übergeben.

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

Ein Aufruf könnte so aussehen:

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

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.

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

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

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

Optionale Parameter

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

Man könnte die Seite so aufrufen

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

Nein.. keine besonders gute Idee.

Optionale Parameter als Rettung!

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

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
Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s