Wicket est un framework novateur en fournissant une navigation de page entièrement en langage Java. Il s’agit d’une d’approche différente des framewoks classiques comme Struts qui fournissent des fichiers XML de mapping URL/Classe d’action.
En réponse à des événements de type onClick() ou onSubmit(), Wicket traite l’événement côté serveur et spécifie la page de l’application Wicket en retour. Cette redirection est basée sur la méthode "setResponsePage()", définit dans la classe "org.apache.wicket.Component". Tous les composants Wicket (Form, Link, …) étendent cette classe et c’est pourquoi cette méthode est toujours disponible. En réalité, nous utilisons la méthode setResponsePage() uniquement quand nous souhaitons naviguer vers une autre page que la page courante.
Quelques détails sous le capot
Côté serveur une requête est traitée en deux phases
- Phase de l'appel du listener de la requête pour traiter la requête
- Phase du render qui renvoie la réponse vers la page courante, vers une nouvelle page, vers une image, vers un document PDF, …
C’est durant la première phase de traitement qu’il est nécessaire de spécifier à Wicket sur quelle page sera retournée la réponse. Et si aucune réponse n’est spécifiée, Wicket renvoie versla page courante.
Il existe deux types de méthodes setReponsePage
- La première utilisation crée une instance de la page de retour
- La deuxième instrumente Wicket pour créer la page et générer une URL bookmarkable
Première forme
La signature de la méthode utilisée est "setResponsePage(final Page page)".
Link linkMesContatcs= new Link("contactlink"){ public void onClick(){ setResponsePage(new ListContactPage()); } }; linkMesContatcs.add(new Label("labelLink", "Mes contacts")); add(linkMesContatcs);
Nous obtenons une url générée comme ceci
http://localhost:8080/zencontact/?wicket:interface=:3::::
Cette URL est complètement relative à la session utilisateur. Et elle ne contient aucune information sur la page sélectionnée. Plus précisément, l’état de la page est stocké en session côté serveur. Elle ne peut donc pas être partagée entre plusieurs utilisateurs ou être mise dans les favoris. Nous dirons donc qu’elle n’est pas "bookmarkable".
Si nous avions voulu passer des paramètres, ceux-ci auraient été passés au constructeur de l’objet de la page.
Deuxième forme
Dans cette deuxième forme, deux signatures de la méthode sont disponibles
- setResponsePage(final Class cls)
- setResponsePage(final Class cls, PageParameters parameters)
Avec cette utilisation, à la réception par le navigateur de la redirection, celui-ci va soumettre une requête sur la page. Wicket créera alors une classe de la page.
Link linkMesContatcs= new Link("contactlink"){ public void onClick(){ setResponsePage(ListContactPage.class); } }; linkMesContatcs.add(new Label("labelLink", "Mes contacts")); add(linkMesContatcs);
Voici l’url générée
http://localhost:8080/zencontact/?wicket:bookmarkablePage=:com.zenika.wicket.ui.ListContactPage
Nous avons une URL indépendante de l’utilisateur et bookmarkable.
Note: des mécanismes existes pour personnaliser l’url.
Néanmoins, cette forme est peu employée. A la pace, il est couramment utiliser un BookmarkablePageLink
BookmarkablePageLink pageLink = new BookmarkablePageLink("contactlink", ListContactPage.class); pageLink.add(new Label("labelLink", "Mes contacts")); add(pageLink);
Voici l’url générée identique au cas précédent
http://localhost:8080/zencontact/?wicket:bookmarkablePage=:com.zenika.wicket.ui.ListContactPage


Commentaires
Bonjour,
ton article est intéressant, mais je me posait de la question sur la première forme. Quels sont ces cas d'utilisations?
Et la classe BookmarkablePageLink propose t'elle d'autres avantage qu'un "sucre syntaxique"?
Bonne continuation dans la rédaction de tes articles sur wicket
Bonjour,
Pour répondre à votre question j'ajouterai que Wicket propose différentes stratégies de liens pour chaque cas d'utilisation.
Pour le cas de la première forme le lien généré est sécurisé, c'est à dire qu'il est associé à une et une seule session utilisateur. Si il est mis en favoris, il ne pourra pas être rejouer ultérieurement.
Ce cas d'utilisation n'est pas intéressant pour les pages publiques d'une application (comme par exemple les menus, la HomePage, ...), il est préférable dans ce cas d'utiliser des BookmarkablePageLink.
Dans le cas d'un BookmarkablePageLink Wicket optimisera la session utilisateur et ne conservera pas d'état pour cette page.
Le BookmarkablePageLink n'est pas un "sucre syntaxique" ;-). Il peut être utilisé par exemple dans une approche REST-ful
où tous les liens laissent apparaître clairement les informations de navigation ou d'actions de l'utilisateur.
Par exemple : /ZenContact/?wicket:bookmarkablePage=:com.zenika.wicket.zencontact.EditContactPage&contactId=27
Les paramètres sont ajoutés via un objet de type PageParameters.
PageParameters parameters = new PageParameters();
parameters.add("contactId", contact.getId());
add(new BookmarkablePageLink("edit", EditContactPage.class, parameters));
La page doit bien évidemment déclarer un constructeur avec un PageParameters en argument.
public EditContactPage(PageParameters parameters) {
Long contactId = parameters.getLong("contactId");
}
Pour finir, Wicket prévoit également la personnalisation des URLs avec la notion d'URLCodingStrategy pour obtenir des URLs de la forme :
/ZenContact/edit/contact/27
Bonjour,
Merci pour ces réponses rapides