5 juillet 2007
Transactions Distribuées en dehors d’un container Java EE
21 mai 2007
Trouver l’explication d’une erreur Oracle
Par exemple, pour le code erreur
ora-00906 le lien est http://ora-00906.ora-code.com.Il y a même une rubrique qui indique l'action a entreprendre pour régler le problème. ça peut servir ....
21 mars 2007
Ericsson sort son “Mobile JSF Kit”
D'après la présentation accompagnant ce Kit, MobileFaces est une surcouche de JSF compatible avec n'importe quelle implémentation de JSF. Le framework détecte le type de client(mobile ou pc) et fait le rendu en conséquence (cf. schéma, source Ericsson). Il également noté que MobilesFaces est open source mais je n'ai pas vu de licence qui le confirme.
JSF s'étend désormais aux mobiles et tien donc ses promesses! Reste à vérifier à tester la qualité de cette bibilothèque.
Vous pouvez télécharger le Mobile JSF Kit ici
, mais il faut s'enregistrer au préalable.
17 mars 2007
Le Value Object
le rendant ainsi sujet à diverses interprétations.Dans un contexte J2EE, Value Object est synonyme de Data Transfert Object,
alors que dans un contexte Programmation Orienté Objet, il a une tout autre signification.Le but de cet article est de faire la lumière sur les Value Objects en donnant une définition claire et non ambiguë et en expliquant l'origine de la confusion.
Quel est le rôle des Values Object dans le modèle objet ?
Comme je l'ai précisé plus haut, un value object est un objet qui est définit par la valeur de ces attributs, cela veut dire que deux instances qui ont les même valeurs sont égales et interchangeables.Le rôle principal d'un value object est d'encapsuler des données plutôt que de fournir un comportement.
Exemples
Prenons l'exemple d'une tâche désigné par l'objet Tache, dont l'intervalle d'exécution est représenté par l'objet Intervalle. L'objet Intervalle a deux attributs dateDebut et dateFin, et il est possible de retarder une tâche d'un certain nombre de jours grâce à la méthode retarder(int nbrJours).
L'objet Intervalle est un value object, car il est centré sur les données (dates de début et de fin de l'exécution de la tâche) et il n'a pas un vrai comportement.
Si je veux, par exemple, savoir si deux tâches ont le même intervalle d'exécution, j'écrirai de façon intuitive le code suivant :
if (tache1.getIntervalle().equals(tache2.getIntervalle())) {
faireQuelqueChose();
}Il y a des exemples connus de values object. On retrouve, hormis l'intervallede temps, un salaire, une Somme d'argent, une adresse, etc. Dans l'API standard de Java, les objets String, Integer et tous les objets représentant les types primitifs sont considérés comme des values objets.
Propriétés des values objects
1 Un value object doit surcharger les méthodes equals() et de hashcode()
Les méthodes equals() et hashcode() permettent de dire si deux instances sont égales. Par défaut, elles sont calculées sur la base de l'adresse mémoire de l'objet.Pour les values objects ces deux méthodes sont basées sur les valeurs de attributs de l'objet.
En parallèle, les méthodes equals() et hashcode() des entités métier persistantes sont basées sur les valeurs des attributs constituant la clé primaire.
2 Un value object doit être immuable
Un object value doit être immuable et ce pour éviter le phénomène de « l'aliasing ». Un aliasing se produit dans le cas suivant :A et B partagent une propriété x, si B modifie x alors cette modification se répercute sur l'objet A, ce qui provoque des effets indésirables. Voici un exemple concret repris de [1] :
La méthode retarder() permet de retarder une tâche un certain nombre de jours :
void retarder(int nbrJours) {
this.intervalle.setDateDebut(this.intervalle.getDateDebut() + nbrJours);
}Quel est le problème dans le code suivant ?
Tache tache1 = new Tache();
Tache tache2 = new Tache();
tache1.setIntervalle(new Intervalle("4 mars 2007", "29 mars 2007");
tache2.setIntervalle(tache1.getIntervalle());
tache2.retarder(5);
En observant le code attentivement, on remarque que la tache1 a également été retardée de cinq jours, et ce de manière totalement inaperçue et involontaire!
Pour corriger l'exemple précédent, on interdit la modification des attributs de l'objet, et on créé à la place un nouvel objet avec les nouvelles valeurs. La méthode retarder() deviendrait :
void retarder(int nbrJours) {
this.intervalle = new Intervalle(this.intervalle.getDateDebut() + nbrJours);
}Sachez enfin, que rendre un objet immuable a des propriétés intéressantes, notamment le partage du même objet entre plusieurs threads sans recourir à la synchronisation. Elles rendent le design robuste et améliorent les performances [2][3].On comprend maintenant pourquoi, par exemple, la classe java.lang.String est immuable. En effet, une fois l'objet créé il n'est plus modifiable, il peut être partagée sans aliasing et sans aucun problème de multi-threading car les méthodes telles que substring() ou concat() retournent toujours un nouvel objet.
3 Un value object peut être persisté sous certaines conditions
Bien entendu, un value object peut être persisté. Cependant, il ne doit pas correspondre à une ligne entière dans une table [4]. Les colonnes qui correspondent à ses attributs, s'ajoutent aux colonnes d'une entité persistante. Hibernate offre cette possibilité via le mécanisme de component [5].Pourquoi la confusion entre un value object et un DTO
Pour rappel, un Data Transfert Object est utilisé dans les architectures distribuées, pour transporter les données entre la couche cliente et la couche métier (représentée par des EJB). Le but est de recevoir et d'envoyer un paquet de données (DTO) en un seul appel plutôt que des faire de multiples appels distants très coûteux en performance. Le seul point commun entre un value object et un DTO c'est qu'ils sont tous les deux centrés sur les données.L'origine de la confusion vient, en réalité, des premières versions des J2EE Core patterns de sun. En effet, en 2001 le DTO était appelé Value Object. Il ne l'est plus maintenant fort heuresement!
Références
26 février 2007
Lambda Probe, une console d’administration pour Tomcat
Enfin, si vous voulez vous forger une opinion, vous pouvez essayer la démo sur le site http://lambdaprobe.org/.
Bonne nouvelle! J'ai testé Lambda Probe sur JBoss 4.0.2, ça marche et ça nous change de la JMX-Console!
17 février 2007
Woodstock : Un nouvel arrivant dans la famille des Composants JSF
- Le lien du projet : https://woodstock.dev.java.net/
- Demo live des composants :
30 janvier 2006
A-t-on besoin d’un éditeur graphique pour faire des pages JSF ?
Cependant, l'utilisation d'un éditeur visuel est souvent profitable pour le développeur mais dans des cas bien précis.
Pour vous permettre de vous forger une idée sur la nécessité d'un éditeur visuel, je présente ici les avantages et inconvénients de l'utilisation d'un tel outil.
Les avantages d'un développement manuel
Si on n'utilise pas d'éditeur visuel, on ajoute ses composants JSF à la page JSP d'une manière manuelle. Au fur et à mesure, le développeur maîtrisera les composants ainsi que leurs propriétés, il y aura donc un effort d'apprentissage supplémentaire mais le développeur appréhendera rapidement cette technologie.
Voici par exemple une page de login simple, elle est suivit du code source qui a permit de donner un tel rendu :
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<f:view>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<title>login</title>
<link type="text/css" rel="stylesheet" href="resources/main.css"/>
</head>
<body>
<h1><h:outputText value="Please log-in"/></h1>
<h:form>
<h:panelGrid columns="2">
<h:outputLabel value="Login"/>
<h:inputText/>
<h:outputLabel value="Password"/>
<h:inputSecret/>
<h:commandButton value="Login" type="submit" action="#{loginBean.login}"/>
</h:panelGrid>
</h:form>
</body>
</html>
</f:view>
On remarquera dans le source que le code est accessible, et il ressemble fortement au langage HTML, il est doc tout à fait possible de l'écrire à la main.
En résumé, ne pas utiliser un éditeur graphique, ne constitue en aucun cas un handicap, au contraire le développeur aura un contrôle total sur le contenu de sa page, une page JSP garantit sans fioritures (apportées généralement par un éditeur visuelle).
Le seul inconvénient que je connaisse est que il faut déployer l'application Web pour voir le résultat de la page.
Les avantages d'utiliser un éditeur visuel
L'avantage est évident, on utilise la souris et on dépose ses composants sur la page, une parti du code est écrite automatiquement, on aura même un rendu de la page de façon instantanée.
Les éditeurs visuelles permettent aussi de visualiser le flux de navigation de votre application, il permettent d'avoir une vue globale sur l'application.
L'inconvénient est que parfois l'utilisateur passe beaucoup de temps à cliquer de la souris pour des actions qui ne requièrent pas autant d'effort lorsque cela se fait à la main, l'éditeur visuel utilisé d'une manière mal à propos devient alors contre productif.
En résumé
Si vous voulez apprendre rapidement JSF, évitez un outil WYSIWYG, préférer plutôt la façon manuelle.
Une fois que vous aviez appréhendé la technologie, vous pourriez dès lors utiliser d'une manières conjointe les deux méthodes. Vous auriez généralement à :
- Créer la page d'une manière visuelle.
- Revoir le source, éventuellement le nettoyer.
- Et enfin raffiner à la main le source des propriétés manquantes.
Quid des outils JSF ?
Le nombre d'outils JSF n'est pas très élevé vu la jeunesse de la technologie, dans les gratuits on peut citer Sun Java Creator 2, on trouve aussi des produits commerciaux tels que Exadel Studio et BEA Workshop, le monde libre s'est doté aussi d'un plugin Eclipse prometteur dénommé Amateras Faces IDE.