08 lutego 2008

Nawigacja w Wicket

Pora na kwestię nawigacji w Wicket. Waldi już Wam wszystko zdradził w Wicket po godzinnej przygodzie - moje trzy grosze..., ale ja lubię po malutku.

Porównując Wicketa do najbliższego znanego mi partnera, który odpowiadałby spojrzeniu na kwestię strona vs akcja w podobny sposób, czyli JSF, w Wicket próżno by szukać pliku z nawigacją typu faces-config.xml, gdzie definiujemy nawigację między stronami deklaratywnie. W przypadku Wicketa mamy do dyspozycji programistyczną nawigację.

Do aktualnej aplikacji, którą rozwijam od kilku dni rozpoznając Wicketa (Wicket i jego podejście zorientowane na widok, Wicket prościej z mavenowym archetypem wicket-archetype-quickstart czy Pierwsze kroki z Apache Wicket 1.3) dodaję nową stronę Powitanie.html
<html>
<head>
<title>Powitanie</title>
</head>
<body>
Witaj <span wicket:id="login"></span>!
</body>
</html>
oraz odpowiadającą jej klasę pl.jaceklaskowski.wicket.Powitanie.
package pl.jaceklaskowski.wicket;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;

public class Powitanie extends WebPage {

private static final long serialVersionUID = 1L;

public Powitanie(String login) {
add(new Label("login", login));
}
}
Wiadomo, dlaczego konieczna jest para html-java do reprezentacji pojedyńczej strony w Wicket i klasa Powitanie nie powinna nastręczać problemów w zrozumieniu, co autor miał na myśli. Novum aplikacji polega na skorzystaniu z metody org.apache.wicket.Component.setResponsePage(Page page), która instruuje Wicketa o widoku do wyświetlenia. Podobnie jak ma to miejsce w JSF brak strony (dokładniej: wskazanie na nieistniejący identyfikator bez związanej z nim strony) lub zwrócenie null powoduje powrót do strony inicjującej żądanie, w Wicket brak wskazania kolejnej strony poprzez metodę Component.setResponsePage skutkuje powrotem do strony inicjującej żądanie.

Dla kompletnej prezentacji zmian klasa pl.jaceklaskowski.wicket.HomePage reprezentująca stronę HomePage.html. Należy zwrócić uwagę na użycie setResponsePage() w metodzie onSubmit(), która wywoływana jest jako wynik zatwierdzenia formularza loginForm.
package pl.jaceklaskowski.wicket;

import org.apache.wicket.PageParameters;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.PropertyModel;

public class HomePage extends WebPage {

private static final long serialVersionUID = 1L;

private String login;

public HomePage(final PageParameters parameters) {

add(new Label("message", "If you see this message wicket is properly configured and running"));
Form loginForm = new Form("loginForm") {
public void onSubmit() {
setResponsePage(new Powitanie(getLogin()));
}
};
loginForm.add(new TextField("login", new PropertyModel(this, "login")));
add(loginForm);
}

public String getLogin() {
return login;
}

public void setLogin(String login) {
this.login = login;
}
}
Jedną z istotnych cech Wicketa jest dowolność w konstruowaniu stron reprezentowanych przez klasy Java. W przypadku klasy Powitanie konstruktor wymagał podania parametru typu String, który następnie wykorzystałem do zainicjowania parametru login, podczas gdy klasa HomePage udostępniała konstruktor public HomePage(final PageParameters parameters). W jaki sposób i kiedy tworzymy stronę decydujemy my. Z tym, że jeśli chcielibyśmy wywołać stronę z przeglądarki konieczne jest udostępnienie bezparametrowego konstruktora lub konstruktora z pojedyńczym parametrem typu org.apache.wicket.PageParameters, jak to ma miejsce w przypadku strony HomePage.

Wywołanie wybranej strony polega na podaniu jej w adresie URL - http://localhost:8080/wicket-demo/?wicket:bookmarkablePage=:pl.jaceklaskowski.wicket.HomePage, gdzie wartością wicket:bookmarkablePage jest strona do wyświetlenia. Próba wywołania strony Powitanie zakończy się błędem.

p.s. Kontynuując moje p.s.-owanie odnośnie konkursu Blog Roku 2007 muszę przyznać, że ostatnimi czasy bardzo jesteście pracowici. Z 9. miejsca z 49 głosami Notatnik przesunął się na 7. miejsce z 57 głosami! Należą się podziękowania wszystkim, którzy zechcieli brać udział w konkursie. Dziękuję! Gdyby jednak porównać to ze statystykami poczytności Notatnika, gdzie do ponad 100 skrzynek trafia streszczenie brakuje mi kolejnej 50-tki bez wysłanego SMSa (treść B00248 pod numer 71222). Gdyby do tego dodać, że każdy ma dziewczynę, chłopaka, dzieci, znajomych i wszyscy mają komórki to możnaby tak spróbować przesunąć Notatnik ponad robale i ipoda. Niewiele brakuje, ale i czasu coraz mniej.