RSS Feed

Archive de September, 2006

Appliquer le modèle MVC en Ajax

22 September 2006 par SeB 2 commentaires »

Je vous ai souvent parlé du modèle de conception MVC et de ses avantages.

Ajaxian vient de relater un article de PHPied sur la mise en application du modèle MVC avec Ajax.

Selon l’auteur, avec Ajax, la vue contient des pages HTML, des feuilles de style CSS et des scripts Javascript pour la mise à jour du HTML. Le contrôleur contient des scripts Javascripts pour les comportements et du code PHP pour aiguiller les requêtes. Et pour finir, le modèle contient la logique métier en PHP.

A partir de ce modèle, l’auteur a écrit une petite démonstration dont le code source est accessible. Il propose même un squelette de projet pour les nouveaux projets. La couche Ajax est implémentée avec YUI.

L’approche, même si elle reste simpliste, est réellement intéressante. Elle permet de se poser des questions sur l’organisation du code dans les applications qui utilisent Ajax.

 

Support de JOnAS dans Netbeans 5.5

21 September 2006 par SeB Pas de commentaire »

J’ai plutôt l’habitude de parler d’Eclipse. Cependant, aujourd’hui c’est l’IDE Netbeans qui est à l’affiche.

Effectivement, le projet JOnbAS est un nouveau module pour Netbeans 5.5 qui ajoute le support de JOnAS. Il permet :

  • Le démarrage et l’arrêt du serveur.
  • Le débuguage des JSP et du Java.
  • La génération des descripteurs de déploiement spécifiques.
  • Le déploiement des EAR, EJB et WAR.
  • L’exploration des modules déployés.

Ce module est rapide à installer et vraiment très simple à utiliser.

Ce travail est le résultat des efforts réalisés par Stepan Herolds. Tout retour d’expérience, rapport d’anomalie ou suggestion sont les bienvenus.

 

Struts 1.3 – la première version public avec Struts 1.3.5

20 September 2006 par SeB Pas de commentaire »

Jusqu’à présent la version version de Struts était la 1.2.9. La nouvelle version est la 1.3.5. Cette version correspond à la branche de développement de Struts 1.3[1].

Il existe d’importantes différences entre Struts 1.2 et Struts 1.3 :

  • Le projet est découpé en plusieurs JARs séparés correspondant à chaque sous-projet :
    • Core
    • Applications
    • EL
    • Extras
    • Faces
    • Scripting
    • Taglib
    • Tiles
  • Le projet est géré avec Maven 2.
  • Le RequestProcessor reprend le modèle de conception CoR et est configurable via un fichier XML avec Commons Chain.
  • Migration vers J2SE 1.4, Servlet 1.3 et JSP 1.2.
  • Intégration de Commons Validator 1.3.0.
  • Gestion des boutons annuler.
  • Support de l’héritage dans les fichiers de configurations.
  • Détermination des URLs de soumission des formulaires avec les postback actions.
  • Diverses améliorations sur la configuration.

L’annonce de la précédente version beta de Struts 1.3.5 donne plus de détails sur les nouveautés depuis Struts 1.2. L’annonce de la version officielle de Struts 1.3.5 présente également une grande partie des nouveautés.

Il ne vous reste plus qu’à migrer de Struts 1.2 vers 1.3 !

Et pour ceux qui souhaitent en savoir un peu plus sur Struts pour l’année 2006, allez lire de ce pas Struts 2006: An Embarrassment of Riches si vous ne l’avez pas encore fait.

Notes

[1] Annoncé en décembre 2005.

 

JSTL EL – utiliser des constantes Java

15 September 2006 par SeB Pas de commentaire »

Vous utilisez la JSTL et les EL. Vous avez banni les scriplets de vos pages JSP. Mais comment faire référence à une constante Java dans vos pages JSP ?

Jakarta Taglibs propose les unstandar tags. Parmi ces tags, il y a le tag <un:useConstants/>. Ce tag permet d’enregistrer dans un context les constantes d’une classe Java sous la forme d’une Map.

Puisqu’un exemple est plus efficace qu’un long discours. Voici une mise en application de l’utilisation de constante dans une page JSP :

Le code Java :
package com.company.project.MyConstants; public class MyConstants {
	public static final String PROJECT = "My Project";
	public static final String VERSION = "1.0.0";
}
La page JSP :
<?xml version="1.0" encoding="UTF-8" ?>
<jsp:root
	xmlns:jsp="http://java.sun.com/JSP/Page"
	xmlns:un="http://jakarta.apache.org/taglibs/unstandard-1.0"
	xmlns="http://www.w3.org/1999/xhtml"
	version="2.0">
<jsp:directive.page
	language="java"
	contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8" />
<jsp:output
	omit-xml-declaration="false"
	doctype-root-element="html"
	doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
	doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"/>
<html>
	<head>
		<title>Use of Java constants</title>
	</head>
	<body>
		<un:useConstants var="myconstants" className="com.company.project.MyConstants" />
		Welcome to ${myconstants.PROJECT} v${myconstants.VERSION} !
	</body>
</html>
</jps:root>

Comme vous pouvez le constater, ce tag facilite grandement la tâche et vous évitera quelques noeuds au cerveau. :-)

 

Polémique sur les votes collaboratifs

14 September 2006 par SeB Pas de commentaire »

Comme souligné par TechCrunch récement, les services comme Digg semblent rencontrer un sérieux problème sur les votes collaboratifs. En effet, certains groupes d’utilisateurs seraient assez influents pour promouvoir une nouvelle ou inversement pour la faire disparaître !

Suivant l’actualité de Fuzz de près, j’ai posé quelques questions à Eric Dupin pour connaître son avis sur le sujet. ;-)

SeB : Penses-tu que Fuzz est concerné par ce problème ? Si oui, comment comptes-tu le résoudre ? Si non, pourquoi Fuzz n’est pas touché par le vote de groupe influent ?

A ces questions, Eric m’a gentillement redirigé vers son commentaire sur TechCrunch.

En substance, deux fonctions semblent poser problème :

  • la liste des utilisateurs les plus populaires : non présente dans Fuzz, elle peut influer le comportement de ces utilisateurs.
  • l’enterrement de nouvelles par les utilisateurs : ce point précis est géré manuellement dans Fuzz et ne devrait pas poser de problème. A voir comment celà sera géré avec la croissance de Fuzz.

Eric :

J’ajoute que nous allons mettre en place une nouvelle fonction qui n’existe pas dans cette forme sur Digg ou ailleurs et qui permettra d’ajouter un filtre supplémentaire à l’algorithme de promotion des news en une.

SeB : As-tu une exclusivité sur Fuzz qui ne serait pas encore passée sur Fuzz[1] ?

Eric :

Allez, c’est bien parce-que c’est demandé gentiment ;-) Les Fuzznautes vont maintenant pouvoir insérer directement dans Fuzz (dans les news qu’ils proposent, donc) des fichiers Video et Audio. C’est fonctionnel, il reste juste deux trois réglages à peaufiner et ça devrait être prêt cette semaine.

Eric, merci d’avoir accepté de répondre à ces quelques questions[2]. Tout comme les acteurs français n’ont rien à envier aux anglophones[3], Fuzz n’a rien à envier à Digg. ;-)

Notes

[1] Je n’ai pas su résister !

[2] Réponses faites le 11/09/06.

[3] Mise à part la taille de leur marché respectif. :-/

 

Les services en ligne de mouse tracking

13 September 2006 par SeB 4 commentaires »

Le mouse-tracking

Il y a quelques mois, je vous avais présenté le concept du mouse-tracking. J’avais même initié un projet de mouse-tracking en ligne.

Si vous souhaitez mettre en place ce type de service sur votre site, il faut savoir que plusieurs solutions sont disponibles aujourd’hui.

Les trois premiers sont des services en mode ASP alors que le dernier est un projet open source distribué sous la licence libre GNU/GPL !

Les solutions

CrazyEgg

Overlay avec CrazyEgg

L’ergonomie de cet outil est redoutable. Après avoir collecter toutes les informations sur les clics des utilisateurs, CrazyEgg affiche des bulles d’informations sur les données statistiques de chaque lien de la page. Il propose également d’afficher la fameuse heatmap (ie. carte des zones de chaleurs). Heatmap avec CrazyEgg

ClickTale

Ce outil se démarque des autres par les données qu’il collecte. En effet, il ne se contente pas seulement des clics des utilisateurs, mais il collecte l’ensemble des événements de la souris et du clavier. Ensuite, il est possible de rejouer n’importe quel scénario utilisateur !

Clickdensity

Clickdensity est très proche de CrazyEgg tant au niveau des fonctionnalités que de l’ergonmie.

Heatmap avec Clickdensity

Clickmaps

Clickmaps est codé en Ruby et doit être installé sur votre serveur. Il permet de générer des zones de chaleur pour chacunes de vos pages à afficher en sur impression sur vos pages.

Heatmap avec Clickmaps

Conclusion

Aller plus loin

Tous ces outils ont déja été présenté par le site Web Analytique :

L’analyse et l’interprétation

En n’oubliant pas que la collecte de données statistique ne sert à rien sans l’analyse. Et comme le rappelle Fred Cavazza avec la règle des 90/10 : l’analyse[1] repésente 10% du travail contre 90% pour l’interprétation[2] de données.

A vos analyses de statitisques de votre site web !

Notes

[1] Je préfère parler de collecte ici.

[2] Ce que j’appelle analyse.

 

Les bonnes pratiques avec Struts – copier les données des formulaires vers les objets métiers

12 September 2006 par SeB Pas de commentaire »

Le quatrième billet dans la série sur Les bonnes pratiques avec Struts.

Introduction

Struts se révèle très pratique pour gérer les formulaires. En effet, il s’occupe de charger les données du formulaire pour l’afficher. Et il récupère les données dans la requête lorsqu’un formulaire est validé.

Côté code Java, cela se traduit par la manipulation de Java beans héritant de la classe ActionForm. Lors de l’appel à la couche métier, il est alors souvent nécessaire de transférer les données un formulaire vers un objet métier (le processus inverse est valable). Cette étape consiste à créer un objet métier, puis à faire appel successif aux getters du formulaire et aux setters de l’objet métier.

Pour être honnête, l’écriture de code n’est pas passionnant, prend de la place et doit être maintenu sérieusement lorsque des champs sont ajoutés ou supprimés.

Solutions

Heureusement pour les utilisateurs de Struts, il existe des outils pour automatiser cette procédure de transfert de données des objets de la vue vers les objets du domaine ou du métier.

BeanUtils

BeanUtils est une bibliothèque fournie par le projet Jakarta qui permet de manipuler simplement des Java beans. Struts l’utilise entre autre pour peupler les formulaires.

Avec BeanUtils, il est possible de copier les données d’un objet source vers un objet destination même s’ils n’ont pas la même classe. Par contre, seuls les attributs ayant les mêmes noms sont copiés.

Exemple de code :

SourceClass srcObject = new SourceClass();
//chargement les données de src
Object DestinationClass dstObject = new DestinationClass();
BeanUtils.copyProperties(dstObject, srcObject);

Dozer

Dozer est qualifié de framework de mapping objet-objet. Concrêtement, il permet de faire du mapping entre des objets de classes différentes. Donc, par exemple entre un objet de formulaire et un objet métier.

Là où Dozer devient intéressant, c’est que ce mapping est configurable et surtout supporte les objets imbriqués (objets en tant qu’attributs). Ainsi, les deux objets utilisés pour une copie ne sont pas obligé d’avoir des attributs avec les mêmes noms. Ils ne sont pas obligés non plus d’avoir la même structure.

Exemple de code :

SourceClass srcObject = new SourceClass();
//chargement les données de src
Object MapperIF mapper = new DozerBeanMapper();
DestinationClass dstObject = (DestinationClass) mapper.map(srcObject, DestinationClass.class);

Exemple de mapping pour faire correspondre les champs login et pwd avec les champs userName et password :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mappings PUBLIC "-//DOZER//DTD MAPPINGS//EN"    "http://dozer.sourceforge.net/dtd/dozerbeanmapping.dtd">
<mappings>
	<mapping>
 		<class-a>com.company.project.SourceClass</class-a>
  		<class-b>com.company.project.DestinationClass</class-b>
	  	<field>
 			<a>login</a>
 			<b>userName</b>
	 	</field>
	 	<field>
 			<a>pwd</a>
 			<b>password</b>
	 	</field>
	</mapping>
</mappings>

Exemple de mapping pour faire correspondre les champs commençant par address avec les champs respectifs de l’attribut address :

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mappings PUBLIC "-//DOZER//DTD MAPPINGS//EN"    "http://dozer.sourceforge.net/dtd/dozerbeanmapping.dtd">
<mappings>
	<mapping>
		<class-a>com.company.project.SourceClass</class-a>
		<class-b>com.company.project.DestinationClass</class-b>
		<field>
			<a>addressStreet</a>
			<b>address.street</b>
		</field>
		<field>
			<a>addressCity</a>
			<b>address.city</b>
		</field>
	</mapping>
</mappings>

Conclusion

Dans la plupart des cas, BeanUtils est amplement suffisant. De plus, il est directement intégré dans Struts et ne nécessite pas l’installation de bibliothèque externe pour un projet.

Cependant, il arrive que l’objet représentant un formulaire ne soit pas proche dans sa structure à l’objet métier ou aux objets métiers utilisés. Dans ce cas, Dozer se révèle être un puissant outil !

Ces outils permettent également de formater (convertir) les données brutes du formulaire pour les objets métiers.

 

Mysaifu JVM – support de MS Windows Mobile 5.0

9 September 2006 par SeB Pas de commentaire »

Mysaifu JVM continue d’évoluer tranquillement. Ainsi, c’est Mysaifu 0.3.0 qui vient d’être publiée.

Les nouveautés de cette dernière version concernent essentiellement l’organisation du code source et l’environnement de développement. Néanmoins, il est dès à présent possible de modifier le classpath et le répertoire courant par défaut via la base de registre.

Il faut noter que depuis la version 0.2.2[1] cette JVM a intégré la dernière version de GNU Classpath[2]. Et surtout, elle supporte la plateforme MS Windows Mobile 5.0 ! A chaque nouvelle version, de nombreux bugs sont corrigés et le support de JNI est constamment amélioré.

Notes

[1] Il y a tout de même eu huit versions !

[2] Passage de la version 0.91 à 0.92.

 

JOnAS XDoclet – accéder à l’interface locale des EJBs

8 September 2006 par SeB Pas de commentaire »

Vous générez vos EJBs avec XDoclet et les déployez dans JOnAS ? Et vous n’arrivez à pas accéder à l’interface locale ?

Dès que vous faites un appel à la méthode :

MyEJBServiceUtil.getLocalHome();

L’exception suivante est levée :

javax.naming.NameNotFoundException: MyEJBServiceLocal 	at
	com.sun.jndi.rmi.registry.RegistryContext.lookup(RegistryContext.java:95) 	at
	javax.naming.InitialContext.lookup(InitialContext.java:355) 	at
	org.objectweb.carol.jndi.spi.AbsContext.lookup(AbsContext.java:140) 	at
	org.objectweb.carol.jndi.spi.AbsContext.lookup(AbsContext.java:150) 	at
	javax.naming.InitialContext.lookup(InitialContext.java:351) 	at
	org.objectweb.carol.jndi.spi.MultiContext.lookup(MultiContext.java:118) 	at
	javax.naming.InitialContext.lookup(InitialContext.java:351) 	at
	com.company.project.ejb.MyEJBServiceUtil.lookupHome(MyEJBServiceUtil.java:22) 	at
	com.company.project.ejb.MyEJBServiceUtil.getLocalHome(MyEJBServiceUtil.java:64) 	at
	com.company.project.ejb.MyEJBServiceBean.myService(MyEJBServiceBean.java:112) 	at
	org.objectweb.jonas_gen.com.company.project.ejb.JOnASMyEJBService_69323337Remote.myService(JOnASMyEJBService_69323337Remote.java:56) 	at
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 	at
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 	at
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 	at
	java.lang.reflect.Method.invoke(Method.java:585) 	at
	sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294) 	at
	org.objectweb.carol.rmi.jrmp.server.JUnicastServerRef.dispatch(JUnicastServerRef.java:143) 	at
	sun.rmi.transport.Transport$1.run(Transport.java:153) 	at
	java.security.AccessController.doPrivileged(Native Method) 	at
	sun.rmi.transport.Transport.serviceCall(Transport.java:149) 	at
	sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466) 	at
	sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707) 	at
	java.lang.Thread.run(Thread.java:595)

En fait, JOnAS ne permet pas de configurer la référence JNDI de votre interface locale. Cette référence est obligatoirement égale à la référence JNDI de l’interface distante à laquelle il est ajouté la chaîne de caractère _L. Ainsi, si la référence distante JNDI de votre EJB est MyEJBService, la référence locale est MyEJBService_L.

Donc, pour cet exemple, les tags XDoclet à positionner sont :

/* * @ejb.bean
 *      name="MyEJBService"
 *      type="Stateless"
 *      view-type="local"
 *      jndi-name="MyEJBService"
 *      local-jndi-name="MyEJBService_L"
 * @jonas.bean
 *      ejb-name="MyEJBService"
 *      jndi-name="MyEJBService"
 */

Maintenant, vous êtes capable de récupérer l’interface locale d’un EJB généré avec XDoclet et déployé sous JOnAS.

 

eZ Components – la – boite à outils du développeur PHP

7 September 2006 par SeB 2 commentaires »

La société ez System propose depuis peu une suite de composants PHP très utile distribuée sous la nouvelle licence BSD : eZ components.

Ces composants sont très bien fait et permettent d’augmenter la productivité des développeurs. La liste contient plus de vingt composants des plus variés possibles : du moteur de template, à l’outil de manipulation d’image, en passant par le générateur de code PHP ou le moniteur système !

En version 1.1.1 actuellement, le carnet de route laisse présager de nouvelles fonctionnalités très intéressantes pour la fin de l’année.

Le générateur d’icône d’email, Email 2 icon 1.3.0, a été réécrit avec certain de ces composants comme :

  • Mail : pour la génération et l’émission de mail.
  • Template : pour le moteur de rendu à partir de template.
  • Translation : pour l’internationnalisation de l’application.

J’ai été très décu par Template. L’écriture des templates est beaucoup moins simple qu’avec Smarty. Par contre, les composants Mail et Translation sont très simples à utiliser et très efficaces (même si perfectible pour le second).

J’aurais bien aimé utiliser UserInput mais sa dépendance avec l’extension PHP filter me pose des problème avec mon hébergeur[1].

Je suis actuellement en train de tester :

  • Database : une API de communication avec les bases de données basée sur PDO.
  • PersistentObject : un outil de persistance des objets basé sur le composant précédent.

J’aimerai par la suite tester :

  • Dans un premier temps :
    • EventLog : pour générer des traces applicatives.
    • Feed : pour la gestion des flux RSS (pas encore disponible).
    • Url : pour manipuler des URLs.
  • Puis dans un second temps :
    • Archive : pour manipuler des fichiers d’archives dans différents format de compression.
    • Cache : pour la gestion d’un cache.
    • ImageConvertion : pour manipuler des images.

Ces composants sont très utiles car ce sont le type de service que l’on retrouve dans la plupart des applications web[2].

Notes

[1] Impossible d’installer des extensions PEAR, et le programme autoconf non disponible.

[2] Notez que certain de ces composants sont dédiés à l’utilisation de PHP en mode console.