Sortie de Wicket 6.1.0


Comme vous le savez peut-être, Wicket est sorti en version 6.0.0 récemment, apportant un grand nombre de nouveautés mais également un certain nombre d'API breaks.

Je vous invite d'ailleurs à consulter le guide de migration avant de l'entreprendre :

https://cwiki.apache.org/WICKET/migration-to-wicket-60.html

La première version de maintenance est aujourd'hui disponible :

http://wicket.apache.org/2012/10/04/wicket-6.1.0-released.html

Cette version apporte quelques nouveautés qui n'avaient pas pu être intégrées à temps dans la version 6.0.0, comme Wicket CDI. CDI est un mécanisme d'injection de dépendances, dont l'intégration avec Wicket est très proche de celle disponible avec wicket-spring.

Cette intégration avait été repoussée car certaines dépendances n'étaient pas disponibles dans le repository central maven.

Pour profiter de ces nouveautés ainsi que des nombreuses corrections de bugs, c'est par ici :

<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-core</artifactId>
    <version>6.1.0</version>
</dependency>

Make Ajax changes "bookmarkables" in Wicket


Have you ever noticed that when your application uses a lot of Ajax features to replace Panels, the user looses the ability to use the back/forward buttons of his browser, or even to bookmark the page?

If there was a lot of Ajax browsing (panel replacements), when the user clicks on the back or the refresh button the browser will take him to the last visited page, or even to his home page.

My goal here was to provide a set of functions allowing the developper to change the token in the URL, but also to add a behavior listening to the token changes.

1. If you call

TokenManager.changeToken("newtoken", target);

the new URL will be http://localhost:8080/home#newtoken

1. If you add a DefaultTokenValueChangeAjaxBehavior (requires IE8+) or a JqueryTokenValueChangeAjaxBehavior (requires jquery.js)

add(new DefaultTokenValueChangeAjaxBehavior() {
	@Override
	public void onTokenChanged(AjaxRequestTarget target, String token) {
		target.appendJavaScript("alert('ontokenchanged:" + token + "');");
	}
});

you will be notified each time the token changes; for example if the uses presses the back button, or if the TokenManager.changeToken method is called.

You can have a look at the project here : https://github.com/vmontane/wicket-ajax-bookmarks.

There is also a demo project with a simple

How to start the demo in a few command lines : - get the project on github

git clone git://github.com/vmontane/wicket-ajax-bookmarks.git wicket-ajax-bookmarks

- build wicket-ajax-bookmarks

cd wicket-ajax-bookmarks/wicket-ajax-bookmarks
mvn install

- build wicket-ajax-bookmarks-example

cd ../wicket-ajax-bookmarks-example
mvn install

- run the application with the jetty maven plugin

mvn jetty:run

That's all ! Now you can browse to http://localhost:8080 and start playing with the demo.
Here's what the demo does: An Ajax DropDownChoice allows you to change a panel. I added a DefaultTokenValueChangeAjaxBehavior to the page and overrode the onTokenChanged method, which is called each time the token changes in the browser (ie. when the user clicks the next/previous button, or when he switches panel). When the onTokenMethod is called, a JavaScript 'alert(token);' is called so you can see what has been caught on the server, and the current panel is changed.


Note that this projetct uses some elements of Wicket 1.5 and has not been tested with Wicket 1.6-beta. If you wish to contribute or ask for new requests don't hesitate to contact me.

Sortie de Wicket 6.0.0-beta2 et intégration du framework Atmosphere dans Wicket (server side push)


La sortie de la version 6.0.0-beta2 de Wicket hier apporte de nombreuses corrections de bugs, mais également une nouveauté au stade expérimental sous la forme d'un module: le support du push, c'est à dire la possibilité de déclencher des évènements côté serveur, et de modifier la vue.

Pour cela, le framework Atmosphere a été intégré dans Wicket.

Je vous avais parlé d'une tentative d'intégration de ce framework en Wicket : yeswicket

Cette intégration est désormais implémentée dans le module wicket-atmosphere :

<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-atmosphere</artifactId>
    <version>0.1</version>
</dependency>

Pour plus d'informations et pour un exemple d'utilisation: http://wicket.apache.org/2012/05/29/wicket-6.0.0-beta2-released.html

Nouvelle release Wicket : 6.0.0-beta1


La première release de la branche 6 en version beta vient de sortir

Cette nouvelle version apporte une dizaine de nouveautés.

Notamment l'utilisation de la librairie JQuery pour remplacer le moteur Ajax interne (wicket-ajax.js).

Cette release apporte quelques modifications pouvant nécessiter une migration de votre code 1.5.x.

Vous pouvez la récupérer en mettant à jour vos POM :

<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-core</artifactId>
    <version>6.0.0-beta1</version>
</dependency>

Wicket Component Debug


Lors d’un audit, d’une revue de code, ou simplement lors de la maintenance d’un projet Wicket, il est parfois difficile d'obtenir une vision claire des composants qui constituent une page.

Afin de résoudre ce problème, je vous propose un outil permettant de visualiser, directement dans votre navigateur, les différents composants présents sur votre page. Les composants sont représentés sous la forme d’un arbre permettant de comprendre leur hiérarchie.

Lire la suite...

Cas d'utilisation d'un évènement avec Ajax


Dans cet article, nous allons reprendre l'exemple fait avec ZenContact dans l'article précédent en ajoutant cette fois ci un peu d'Ajax dans notre application.

Lire la suite...

Gestion des évènements (Wicket 1.5+)


Wicket supporte les événements !

Depuis la version 1.5, il est désormais possible d'utiliser un mécanisme d’événements pour faire communiquer différents composants de l'application. Grâce à une API simple, il est désormais possible à n'importe quel composant Wicket d’émettre ou de recevoir un événement, quelle que soit sa position dans l'arbre des composants.

Quel besoin avons nous en Wicket d'un tel mécanisme d’événements ?

Lire la suite...

Wicket 1.5.1 released


La première release de la branche 1.5 est maintenant disponible

Vous pouvez d'ores et déjà la récupérer en mettant à jour vos POM :

<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-core</artifactId>
    <version>1.5.1</version>
</dependency>

Sortie officielle de Wicket 1.5


C'est officiel, la release 1.5 de Wicket est sortie aujourd'hui!

Vous pouvez la télécharger ici.

Ou plus directement en mettant à jour vos POM :

<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-core</artifactId>
    <version>1.5.0</version>
</dependency>

Il faudra également mettre à jour les autres modules wicket : wicket-extensions, wicket-ioc, wicket-spring,...

Vous pouvez retrouver tous les détails de cette release ici, mais voici quelques exemples :

  • Intégration de nouveaux composants compatibles HTML5 (EmailTextField, NumberTextField, UrlTextField and RangeTextField)
  • Un mécanisme d'événement inter-composant intégré directement dans le framework.
  • Simplification de la gestion du RequestCycle.
  • Meilleure gestion des pages accessibles uniquement en HTTPS (il suffit maintenant d'ajouter l'annotation @RequireHttps sur la page)

Un guide de migration est disponible pour vous aider à intégrer toutes ces nouvelles fonctionnalités.

Behavior qui affiche une info-bulle sur un bouton 'disabled'


Quoi de plus normal que d'afficher par une info-bulle la raison pour laquelle un bouton (ou autre : case à cocher, ...) n'est pas cliquable ?

<input type="button" name="valider" disabled="disabled" value="Valider"></input>

Problématique


Et bien force est de constater le comportement n'est pas celui-attendu sous Firefox ! Ce dernier n'affiche pas l'info-bulle !

Vous pouvez le vérifier ci-dessous ou ici

Solution


En pensant d'abord aux utilisateurs, j'ai cherché une solution de contournement, et il s'avère qu'afficher par dessus le bouton une div transparente avec l'info-bulle corrige notre problème.

Voici le résultat :

<div class="zindex-tips-container">
<div class="zindex-tips-label" title="Vous n'avez pas les droits d'effectuer cette action"></div>
    <input type="button" name="valider" disabled="disabled" value="Valider"></input>
</div>

Et le css associé :

.zindex-tips-container {
    height: 100%;
    position: relative;
    width: 100%;
}
.zindex-tips-label {
    background: transparent;
    position: absolute;
    bottom: 0;
    left: 0;
    right: 0;
    top: 0;
    z-index: 10;
}

Voici le résultat (lien) :

Il faut tout de même faire attention, car la superposition de la div bloque tous les événements, comme le clic avec la souris sur un bouton actif.

Maintenant faisons cela en Wicket :)

Implémentation dans Wicket


La mise en place est assez simple, il faut créer un behavior qui va ajouter le code html correspondant, et je vais donc directement vous donner le code correspondant :

public class ZindexTooltipBehavior extends AbstractBehavior {
 
	private StringResourceModel tooltip;
 
	public ZindexTooltipBehavior(StringResourceModel tooltip) {
		this.tooltip = tooltip;
	}
 
	@Override
	public void beforeRender(Component component) {
		super.beforeRender(component);
		Response response = component.getResponse();
		response.println("<div class=\"zindex-tips-container\">");
		response.println("<div class=\"zindex-tips-label\" title=\""+tooltip.getString()+"\"></div>");
 
	}
	@Override
	public void onRendered(Component component) {
		Response response = component.getResponse();
		super.onRendered(component);
		response.println("</div>");
	}
 
	public void setTooltip(StringResourceModel tooltip) {
		this.tooltip = tooltip;
	}
 
}

On remarque ici comment ajouter du contenu HTML avec les méthodes beforeRender et onRendered.

Ensuite, il faut ajouter le CSS correspondant dans la feuille de style de votre application ou directement dans le behavior grâce au code add(CSSPackageResource.getHeaderContribution(this.getClass(),"zindexTooltip.css")); .

Et voici un exemple d'utilisation sur une checkbox :

add(new Check<MonModel>("checkbox", model){
			@Override
			protected void onInitialize() {
				super.onInitialize();
				//On ajoute un zindex tooltip si la case est désactivée
				add(new ZindexTooltipBehavior(new StringResourceModel("button.action.forbidden.role")){
					@Override
					public boolean isEnabled(Component component) {
						return !isCheckboxEnabled();
					}
				});
			}
			@Override
			public boolean isEnabled() {
				return isCheckboxEnabled();
			}
 
			protected boolean isCheckboxEnabled() {
				return false; //Condition à implémenter
			}
		});

Voilà, c'est une astuce toute simple, mais qui montre la puissance d'utilisation des behaviors Wicket.

C'est nos utilisateurs qui vont être contents !

- page 1 de 7