Archive pour la catégorie 'J2EE'

Hibernate - attention aux injections SQL !

Mardi 21 août 2007

J’avoue que le titre de cette note est quelque peu alarmiste. C’est avant tout pour retenir l’attention et marquer les développeurs qui se croient à l’abri de ce genre d’attaque parce qu’ils utilisent Hibernate.

En effet, l’utilisation de ce framework ne vous protège pas forcément des SQL">injections SQL comme le rappelle TSS dans son article intitulé “Une légende urbaine à propos d’Hibernate“.

L’auteur explique que la création de requête SQL par concaténation de chaîne de caractères rend possible les attaques par injection de code SQL. Et ce même si vous utilisez Hibernate (contrairement à ce que certaines personnes semblent croire) ! Alors, comment s’en protéger ?

Pour empêcher les injections SQL, il suffit d’utiliser les paramètres nommés lors de la création de requête SQL. Ce genre de pratique est une bonne habitude à avoir.

Donc n’oubliez pas d’utiliser les paramètres SQL plutôt que de construire la requête SQL à la main ! Ce message ne s’adresse pas seulement aux utilisateurs d’Hibernate, ni qu’aux développeurs Java par ailleurs. ;-)

Mais où est donc l’API de requête pour les EJB3 ?

Jeudi 8 février 2007

Pour rappel, les EJB3 sont le résultat du mariage entre les EJB2 et Hibernate et XDoclet Hibernate Annotation.

Lorsque les développeurs travaillent avec Hibernate, ils prennent vite l’habitude d’utiliser le HQL pour les requêtes statiques et l’API Criteria pour les requêtes dynamiques[1]. Cependant, le passage d’Hibernate aux EJB3 Entities provoque quelques frustrations. En effet, mis à part le JPQL[2] qui est l’équivalent du HQL chez Hibernate, il n’y a aucune API pour générer dynamiquement des requêtes sur les EJB3 Entities ! :-/

Faut-il attendre les EJBs 3.1 ou 4 ? Au moins de quelqu’un nous sorte de son châpeau une petite API Criteria pour les EJB3;-)

 

Notes

[1] Comme expliqué dans SQL natif, HQL ou API Criteria ?">le comparatif SQL, HQL et API Criteria.

[2] Pour lequel il existe un tutorial et une documentation de référence du language.

Servlet - téléchargement d’un fichier PDF

Lundi 18 décembre 2006

Il est courant d’utiliser une servlet qui permet de générer à la volée des fichiers PDF. Pour que ce flux de données retourné par la servlet soit reconnu en tant que fichier PDF par le navigateur, il est nécessaire de positionner quelques entêtes HTTP :

HttpServletResponse.setContentType("application/pdf");

HttpServletResponse.setHeader("Content-Disposition","attachment; filename=mydocument.pdf");

Cette solution fonctionne très bien avec n’importe quel navigateur sauf avec le couple IE6/Acrobat. Dans ce cas, Acrobat s’ouvre mais affiche le message d’erreur ci-dessous :

une erreur est survenue lors de l’ouverture de ce document

Pour résoudre ce problème, il faut ajouter la ligne suivante dans le code de la servlet qui génère le flux de données du fichier PDF :

 HttpServletResponse.setHeader("Cache-Control","private, must-revalidate");

Maintenant le plugin Acrobat est capable d’ouvrir les documents PDF généré par la servlet. Notez que cette astuce n’est pas seulement valable pour le Java. Vous pouvez l’utiliser pour n’importe quel language puisque que le problème se situe au niveau du protocole HTTP.

A vos PDF !

Java 6 - un vrai mustang !

Lundi 11 décembre 2006

Le terme mustang est souvent utilisé aux Etats-Unis pour désigner des produits de haute performance. Le nom de code choisi pour Java 6 annoncait les enjeux de la version. Java 6 est sorti aujourd’hui, et il semble bien que le défi soit relevé !

En effet, d’après Alexis[1], Java 6 offre des performances d’environ 30% supérieures à Java 5. Bien entendu, ce n’est pas la seule nouveauté de la toute fraiche mouture de Java. adiGuba ayant déja fait le travail, je vous redirige vers son article expliquant de façon très détaillée les nouveautés de Java 6 telles que :

  • support de language de script
  • mise à disposition de l’API de compilation
  • amélioration de l’API de traitement des annotations[2]
  • ajout de nouvelles annotations
  • nouveau format des classes compilées
  • passage à JDBC 4.0[3]
  • intégration des Web Services
  • pleins d’autres choses…

Si vous cherchez plus de lecture sur le sujet, je ne saurais trop que vous conseillez le Java 6 - top ten.

Notes

[1] Qui semble bien éreinté par cette publication.

[2] Apparue avec Java 5.

[3] Dont je vous ai déja parlé JDBC - Les nouveautés de JDBC 4">ici et JDBC - les améliorations de JDBC 4 dans Java SE 6">là.

Java Open Source - mais où va-t-on ?

Mercredi 15 novembre 2006

Quel meilleur sujet que le passage sous license Open Source de Java pour reprendre l’activité de ce weblogue ?

Effectivement, Java passe sous la license GPL. A cette occassion Developpez.com retrace l’historique de cette affaire.

Mis à part IBM, tout le monde se fécilite de ce passage de Java en license Open Source. IBM aurait préféré l’utilisation de la license Apache mais Sun a retenu la GPL. La license Apache était souhaitée pour une hypothétique fusion avec le projet Harmony.

Cet événement est très important pour les utilisateurs et pour les développeurs. Effectivement, on peut espérer une meilleure réactivité quant à la correction des anomalies. Le point positif c’est que le projet Classpath n’est pas distribué sous la GPL. Ainsi, les produits écrit en Java ne seront pas obligés d’être distribués sous la même license. Notez cependant que la marque Java est toujours la propriété de Sun.

L’intégration douloureuse de Java dans les distributions GNU/Linux m’empêchait d’écrire des applications de bureau en Java. Le problème était d’autant plus génant lorsque l’on souhaitait être intégré dans la distribution GNU/Debian[1]. Ce problème devrait être résolu.

Et si l’on se dirigait vers GNU/Linux Java inside ? :-)

Si vous souhaitez en savoir un peu plus sur les conséquences de ce changement de license, n’hésitez pas à lire l’interview Guillaume Boget sur ce qui va changer.

Notes

[1] Même si l’installation de la JVM sous Debian est possible.

Support de JOnAS dans Netbeans 5.5

Jeudi 21 septembre 2006

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

Mercredi 20 septembre 2006

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

Vendredi 15 septembre 2006

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. :-)

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

Mardi 12 septembre 2006

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, celà 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.

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

Vendredi 8 septembre 2006

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.