| Développez à la mode J2EE en utilisant .NET avec le SnippetStore (Chapitre III) par Julien Brunet (j.brunet@cross-systems.com) | ||
Chapitre 3/3
Impression papier : environ 8 pages
Version 1.1
Ce chapitre décrit le portage de Java PetStore en .NET utilisant le framework SnippetStore.
- Si vous êtes arrivé ici par erreur, vous pouvez reprendre au
chapitre 1.
- Si vous n'avez pas encore assemblé le framework SnippetStore, vous pouvez aller au
chapitre 2 et réaliser les labs 1 à 8 sans lire
les explications détaillées.
Lab 9. Préparation de la conversion Java PetStore - Ouvrez un Command Prompt dans C:\SnippetStore - Exécutez setenv.cmd dans ce Command Prompt - Conservez le Command Prompt ouvert pendant toute la durée des labs
Lab 10. Préparation de l'environnement ASP.NET pour Java PetStore C:\SnippetStore> nant jps-reset
Cette target NAnt :
- recopie les ressources Web dans le répertoire out de l'application
ASP.NET (C:\SnippetStore\samples\jps1.1.2\out)
- crée/remplace les fichiers global.asax et global.asax.jsl contenant
l'initialisation du conteneur Web
- crée/remplace le fichier Web.Config du répertoire out avec des valeurs
pré-paramétrées (connections MSDE, etc...)
- recopie les assemblies requises du framework SnippetStore dans le répertoire
out\bin de l'application ASP.NET.
Nous avons beaucoup parlé de la toolkit, mais elle n'est toujours pas compilée !
Lab 11. Compilation de la toolkit SnippetStore C:\SnippetStore> nant SnippetStore.Design C:\SnippetStore> nant SnippetStore.Design.NAntTasks C:\SnippetStore> nant SnippetStore.Tracer
Cette target NAnt :
- Compile la toolkit de conversion EJB/Servlets/TagLib/JSP en C#
- Compile la couche d'extension NAnt
- Compile le traceur visuel de SnippetStore
La partie Components de Java PetStore est située dans le répertoire C:\SnippetStore\samples\jps1.1.2\src\components. Elle contient notamment 9 EJBs, et plusieurs classes d'accès aux données (DAO).
Lab 12. Compilation J# de la partie Components de Java PetStore C:\SnippetStore> nant jps-comp-1
Cette target NAnt compile les sources Java en utilisant le compilateur J# (vjc.exe)
Elle produit l'assembly components.dll dans le répertoire out
Lab 13. Génération des wrappers pour la partie Components de Java PetStore C:\SnippetStore> nant jps-comp-2
Cette target NAnt :
- charge dynamiquement la couche d'extension NAnt de la toolkit SnippetStore
- invoque la tâche de conversion EJB <ejbimp> en lui indiquant notamment le
manifeste XML d'entrée et le fichier Web.config de sortie
Elle produit le code source C# AL_ejb.cs dans le répertoire src et enrichit le fichier Web.config
Lab 14. Compilation des wrappers pour la partie Components de Java PetStore C:\SnippetStore> nant jps-comp-3
Cette target NAnt compile les sources générés des wrappers en utilisant le compilateur C# (csc.exe)
Elle produit l'assembly components.AL.dll dans le répertoire out
La partie Web de Java PetStore est située dans le répertoire C:\SnippetStore\samples\jps1.1.2\src\petstore. Elle contient notamment 1 EJB, 2 Servlets, 1 TagLibs d'environ 10 tags, plusieurs classes Java pour gérer le modèle MVC, et environ 75 pages JSP.
Des modifications manuelles doivent être apportées au code Java PetStore avant compilation, essentiellement à cause des lacunes de J# expliquées dans le chapitre 2.
| Problème | Action | Emplacement(s) |
|---|---|---|
| 1) Le ClassLoader de J# renvoie null | Utiliser le wrapper LAME pour simuler ClassLoader | com\sun\j2ee\blueprints\petstore\control\web\MainServlet.java (line 78) new LAME.ClassLoader() com\sun\j2ee\blueprints\petstore\control\web\RequestProcessor.java (line 105) idem com\sun\j2ee\blueprints\petstore\control\web\ScreenFlowManager.java (line 141) idem |
| 2.a) Affichage incorrect de la page cart.aspx | Modifier le nom du champ HTML input itemQuantity_ par itemQuantity(espace) | com\sun\j2ee\blueprints\petstore\control\web\handlers\CartHandler.java (line 48) remplacer par "itemQuantity " (line 51) idem |
| 3) Un opérateur est apparu dans le J2SE 1.2 | Utiliser le wrapper LAME pour transformer le vecteur en collection |
com\sun\j2ee\blueprints\petstore\taglib\list\SearchListTag.java (line 41) new LAME.Vector2Collection( JSPUtil.parseKeywords(...) ) |
Lab 15. Corrections manuelles de la partie Web de Java PetStore - Appliquez les correctifs mentionnés ci-dessus
Lab 16. Compilation J# de la partie Web de Java PetStore C:\SnippetStore> nant jps-estore-1
Cette target NAnt compile les sources Java en utilisant le compilateur J# (vjc.exe)
Elle produit l'assembly estore.dll dans le répertoire out
Lab 17. Génération des wrappers pour la partie Web de Java PetStore C:\SnippetStore> nant jps-estore-2
Cette target NAnt :
- charge dynamiquement la couche d'extension NAnt de la toolkit SnippetStore
- invoque les tâches de conversion EJB <ejbimp>, TagLib <taglibimp> et
Servlet <webappimp> en leur indiquant notamment les
manifestes XML d'entrée et le fichier Web.Config de sortie
Elle produit les code source C# AL_ejb.cs, AL_TagLib.cs et AL_WebApp.cs dans le répertoire src et enrichit le fichier Web.config
Lab 18. Compilation des wrappers pour la partie Web de Java PetStore C:\SnippetStore> nant jps-estore-3
Cette target NAnt compile les sources générés des wrappers en utilisant le compilateur C# (csc.exe)
Elle produit l'assembly estore.AL.dll dans le répertoire out
Lab 19. Conversion JSP->ASP.NET C:\SnippetStore> nant jps-estore-4
Cette target NAnt transforme les pages JSP en pages ASP.NET. Les fichiers JSP d'origine ne sont pas modifiés.
Elle produit des fichiers .aspx dans le répertoire out
Des modifications manuelles doivent être apportées au code JSP de Java PetStore avant exécution.
| Problème | Action | Emplacement(s) |
|---|---|---|
| 4) La version Japonaise n'est pas supportée | Supprimer la référence dans le fichier requestmappings.xml | WEB-INF\xml\requestmappings.xml (line 5) supprimer ou commenter la ligne "<screen-definition ... language="ja_JP"/> |
| 5) Les pages devraient être des fragments JSP | Renommer les fichiers avec l'extension .jspf | mylist.jsp renommer en mylist.jspf sideindex.jsp renommer en sideindex.jspf splash.jsp renommer en splash.jspf changeaddressform.jsp renommer en changeaddressform.jspf changepreferencesform.jsp renommer en changepreferencesform.jspf |
| 6) Références de pages incorrectes | Référencer les nouvelles pages que vous avez renommées | annotated-index.html (line 7) remplacer par ann_overview_j2ee.aspx index.aspx (line 15) remplacer par sideindex.jspf (line 18) remplacer par splash.jspf cart.aspx (line 28) remplacer par mylist.jspf enteruserdata.aspx (line 183) remplacer par changeaddressform.jspf editaccount.aspx (line 62) remplacer par changeaddressform.jspf (line 67) remplacer par changepreferencesform.jspf |
| 7) Les balises serveur ne peuvent pas contenir des constructions <% ... %> | Donner un ID au WebControl à chaque WebControl problématique et déclarer un script Page_Load() | productcategory.aspx (line 14) déclarer un script Page_Load() product.aspx (line 28) déclarer un script Page_Load() search.aspx (line 14) déclarer un script Page_Load() exemple: |
| 8) Scope de bloc inférieur en ASP.NET | Modifier les blocs <% ...%> par <script runat=server>...</script> | product.aspx (line 33) Name 'product' is not defined in current context remplacer le bloc <% ... %> par <script runat="server">...</script> |
| 9) Exceptions non checkées par le CodeDom ASP.NET | Modifier les blocs <%=...%> par <script runat=server> try { ... } catch (Exception e) {} </script> |
populate_install.aspx (line 30) VJS1237: Exception 'java.io.IOException' is not caught and does not appear in throws clause remplacer le bloc petfooter.aspx (line 34) VJS1237: Exception 'com.sun.j2ee.blueprints.personalization.profilemgr.exceptions.ProfileMgrAppException' is not caught and does not appear in throws clause remplacer le bloc |
| 2.b) Affichage incorrect de la page cart.aspx | Modifier le nom du champ HTML input itemQuantity_ par itemQuantity(espace) | mylist.jspf (line 14) ajouter l'attribut runat="server" (line 26) idem (line 47) idem (line 42) idem (line 28-30) remplacer par <a href="product?product_id=<j2ee:productAttribute runat="server" attribute="id"/>" ><j2ee:productAttribute runat="server" /> </a> (<j2ee:productAttribute runat="server" attribute="id"/>) (line 62) remplacer par <input name="itemQuantity <j2ee:cartAttribute runat="server" attribute="itemid"/>" |
Lab 20. Corrections manuelles de conversion JSP->ASP.NET - Appliquez les correctifs mentionnés ci-dessus
Initiative très heureuse de la part de Sun, l'application Java PetStore n'a besoin que d'une base vide pour démarrer. Elle commence par vérifier l'existence de tables du schéma, et vous propose de les créer à la volée, directement depuis l'interface Web.
Pour créer une base MSDE, pas besoin des outils clients de SQL Server tels que Enterprise Manager. ASP.NET Web Matrix vous permet très facilement de créer une nouvelle base de données.
Lab 21. Création de la base de données MSDE - Assurez-vous que votre instance MSDE est configurée et qu'elle s'exécute - Dans ASP.NET WebMatrix, cadre "WorkSpace", onglet "Database", cliquez sur l'icône "New Connection" - Dans la boite de dialogue "Connect to Database", cliquez sur le lien "Create a new database" - Entrez ESTOREDB comme nom de base de données et validez
Java PetStore tournant indifféremment sur des bases Oracle, Sybase et Clouscape, trois scripts de génération de schéma sont fournis. Nous nous interesserons au script Sybase, car il est techniquement le plus proche de SQL Server. Pour autant, il faut le modifier pour qu'il soit compris intégralement par notre pont JDBC/ADO.NET
Lab 22. Modification du script de création de schéma pour MSDE - Editez le fichier C:\SnippetStore\samples\jps1.1.2\out\WEB-INF\sql\Sybase.sql - Supprimez toutes les commandes DROP - Enregistrez le fichier
Les applications basées sur le framework SnippetStore tournant sous Cassini, comment afficher une trace de déboguage ?
Lab 23. Lancement du traceur visuel SnippetStore - Lancez C:\SnippetStore\bin\SnippetStore.Tracer.exe
Cassini est un mini-serveur Web limité aux appels locaux (sauf si vous le "débridez" :-)), faisant office de conteneur ASP.NET. Contrairement à IIS (Internet Information Services), il transmet toutes les requêtes Web au moteur ASP.NET, tandis que IIS fait un premier filtrage sur la base d'extensions de fichiers. Problème, les extensions de fichiers n'existent pas dans Java PetStore puisqu'elle est controllée par des servlets (/populate/... et /control/...)
Pour lancer un serveur Cassini, il faut fournir la racine virtuelle, le port HTTP et le chemin physique de l'application
Lab 24. Lancement de Cassini avec l'application ASP.NET générée note: La variable d'environnement %Cassini% est supposée désigner son répertoire d'installation C:\SnippetStore> %Cassini%\WebServer" /port:8080 /path:C:\SnippetStore\samples\jps1.1.2\out /vpath:/estore
D'avance, ne soyez pas déçus si ça ne marche pas du premier coup, vous n'avez peut-être pas appliqué tous les correctifs manuels cités dans ce chapitre. Les correctifs JSP peuvent se faire au fil de l'exécution de l'application, puisque les pages ASP.NET sont rechargées dynamiquement comme leurs homologues J2EE.
Lab 25. Lancement de l'application ASP.NET générée
- Démarrez Internet Explorer (ou votre navigateur favori)
- Ouvrez l'adresse http://localhost:8080/estore/index.html
- Cliquez sur le lien "Enter the store". Le Traceur visuel SnippetStore doit commencer a afficher quelques lignes
C'est un peu pressé par le temps que je dois conclure ce dossier qui m'a passionné... J'espère que vous y aurez trouvé, quelle que soit votre "religion", une comparaison honnête des deux plateformes techniques. Personnellement, je ne revendique qu'une culture .NET, mais cette expérience fut un formidable tremplin pour approfondir la plateforme J2EE.
Les sources de SnippetStore seront téléchargeables sur SourceForge dans la journée.
Auteur : Julien Brunet
Bio: Entré chez Cross Systems en 1998 en qualité de consultant, Julien Brunet intervient auprès des grands comptes sur l'accompagnement à la définition et la mise en place d'architectures logicielles.
Mention légale : Les propos tenus n'engagent que son auteur et ne reflètent pas les méthodologies et autres pratiques de Cross Systems.
Merci à Charline, Hans, Laurent, Gilles et Sami pour leur soutien !
Copyright © Juin 2003
Ressources
Site officiel SnippetStore : http://snippetstore.sourceforge.net/
Téléchargez les sources et les binaires
SnippetStore (Sources) : Snippetstore (Fichier zip)
Licence GPL
Tous fichiers sont fournis sous la licence Lesser-GPL.