Chapitre 4. Aperçu du développement d'une application OpenLaszlo

Table des Matières

1. Le cycle de développement d'un programme en quelques mots
1.1. Démarrer le Serveur OpenLaszlo
1.2. Créer le fichier programme
1.3. Mettre le fichier dans le dossier approprié
1.4. Compiler l'application
1.5. Déboguer et modifier le programme
1.6. Itérer
1.7. Optimiser
1.8. Deployer
2. De "Hello, World" à de vrais programmes
2.1. Structures principales
2.2. La toile (Canvas)
2.3. Les Vues (View)
2.4. Liaison de données
2.5. Inclusions et bibliothèques
2.6. Commentaires
2.7. Debogage

Ce chapitre résume la structure des applications OpenLaszlo ainsi que les mécanismes qu'un programmeur expérimenté doit connaître pour commencer à jouer avec le code. 

Cette discussion est nécessairement succinte et incomplète; le but est essentiellement de vous orienter. Quand vous commencerez à écrire des programmes LZX, vous devrez également parcourir les tutoriels.

1. Le cycle de développement d'un programme en quelques mots

Le cycle de développement d'un programme diffère suivant que vous déployez votre application en mode Proxy ou SOLO. Développer des applications Proxy est plus simple, c'est pourquoi nous allons commencer par là. 

Le processus de développement d'une application OpenLaszlo peut être résumé ainsi :

  1. démarrer le serveur OpenLaszlo

  2. à l'aide d'un éditeur de texte, écrire le code du programme; sauver le fichier avec l'extension .lzx

  3. mettre le fichier dans le répertoire approprié

  4. compiler l'application

  5. deboguer et modifier le programme

  6. répéter les étapes de 2 à 5 jusqu'à ce que le programme soit parfait

  7. déployer l'application

Chacune de ces étapes est décrite ci-dessous.

1.1. Démarrer les Serveur OpenLaszlo

La façon de démarrer le Serveur OpenLaszlo (OLS) dépend de la façon avec laquelle il a été installé et du système d'exploitation. Sur Windows, vous démarrez OLS à partir du menu démarrer; sur Mac OS X l'installation par défaut place une icône de démarrage sur le bureau. Si vous n'avez pas de Serveur OpenLaszlo installé sur votre machine, vous pouvez le télécharger à l'adresse http://www.laszlosystems.com/developers/

1.2. Créer le fichier programme

Puisque les fichiers LZX sont des documents XML, vous pouvez utiliser n'importe quel éditeur de texte ou de XML pour modifier le code. Les noms de fichiers doivent se terminer par l'extension .lzx. Pendant l'écriture, vous pourrez avoir besoin de consulter le Manuel de Référence LZX. Nous verrons plus bas comment utiliser efficacement ce document.

1.3.  Mettre le fichier dans le dossier approprié

Pour pouvoir être compilé par le Serveur OpenLaszlo, les fichiers doivent être placés dans des sous-dossiers du dossier suivant :

[Windows]

c:\Program Files\Laszlo Presentation Server 3.2\jakarta-tomcat-5.0.24\webapps\lps-3.2\

[MacOS]

Macintosh HD:/Applications/Laszlo Presentation Server 3.2/jakarta-tomcat-5.0.24/webapps/lps-3.2:

Typiquement, vous allez créer un dossier avec un nom tel que mon-appli pour contenir les programmes en cours de développement. Vous pouvez aussi ajouter des sous-dossiers, par exemple :

mon-appli/exercices/exemples

tant qu'ils restent dans le bon dossier du Serveur OpenLaszlo. 

1.4. Compiler l'application

Il y a deux façons différentes de compiler une application :

  • Vous pouvez la charger dans un navigateur internet, le Serveur OpenLaszlo le compile automatiquement lorsque le programme est chargé pour la première fois et à chaque fois qu'il change; ou

  • Vous pouvez invoquer le compilateur séparément.

La façon la plus simple et la plus commode pour compiler les applications, surtout quand vous commencez à vous habituer à OpenLaszlo, est de laisser le Serveur OpenLaszlo s'en charger. Les deux façons sont décrites ci-dessous. 

1.4.1. Compilation par chargement de l'application dans un navigateur internet

Pour exécuter votre programme, chargez-le simplement dans votre navigateur. L'URL exacte dépend de la configuration de votre serveur, mais devrait ressembler à quelque chose comme :

http://localhost:8080/lps-3.2/chemin vers votre répertoire

Le Serveur OpenLaszlo vérifie la syntaxe des fichiers source, les compile, met en cache les exécutables et rend l'application immédiatement visible dans le navigateur :

1.4.2. Utilisation du compilateur lzc

Le compilateur séparé est appelé lzc. Il se situe dans le dossier $LPS_HOME/WEB-INF/lps/server/bin/lzc.

Voici les paramètres de compilation disponibles :

Options:

-D<name>=<value>

Assignation d'une valeur à un nom de variable/propriété (voir Compiler.getProperties).

-D<name>

Abrégé de -Dname=true.

-v

Affichage des informations de progression sur la sortie standard.

--mcache on|off

Marche (on) /arrêt (off) de la mise en cache de média. Arrêt (off) par défaut.

--onerror [throw|warn]

Action en cas de problèmes de compilation. Avertissement (warn) par défaut. 

--help

Affiche la liste de toutes les options.

--flush-script-cache

N'envoie pas le script en cache avant la compilation.

Options de sortie :

--runtime=[swf6|swf7|swf8]

Compile vers swf6, swf7, swf8.

--dir outputdir

Dossier de sortie.

-g | --debug

Ajoute des informations de débogage à l'objet résultant.

-p | --profile

Ajoute des informations de suivi détaillé à l'objet résultant.

Options de Log :

-l<loglevel>

Niveau de log (voir org.apache.log4j.Level)

-l<loggerName>=<loglevel>

Niveau de log (voir org.apache.log4j.Level)

-lp file

Fichiers de propriétés Log4j

--log logfile

Fichier de sortie spécifique (la sortie continue d'aller également vers la console)

--schema

Ecritue du schéma sur la sortie standard.

--script

Ecriture du JavaScript sur la sortie standard.

1.5. Deboguer et modifier le programme

Si le serveur détecte des erreurs qui empèchent la compilation, des messages d'erreurs sont affichés dans le navigateur :

Si le compilateur détecte des erreurs non critiques qui n'empèchent pas la compilation, des messages d'avertissement sont affichés dans le navigateur, sous l'application (vous devrez peut-être faire descendre l'ascenseur vertical pour les voir) :

Les erreurs d'exécution s'affichent dans la fenêtre de débogage (debugger), si elle est affichée.

Voir See Section 2.7, “Débogage” pour une brève discussion sur la fenêtre de débogage. Voir Chapitre 45, Déboguer pour une description complète.

1.6. Itérer

Après avoir fait des changements dans votre code, appuyez simplement sur le bouton 'Actualiser' de votre navigateur. Le Serveur OpenLaszlo revérifie alors automatiquement la syntaxe du source, le recompile, le remet en cache et l'affiche de nouveau dans le navigateur.

1.7. Optimiser

Optimisez votre programment en utilisant les techniques décrites au Chapitre 37, Suivi de la Performance et Optimisation.

1.8. Déployer

Voir le See Chapitre 22, Applications en mode Proxy et SOLO pour plus d'informations sur comment rendre disponible votre application.

2. De "Hello, World" à de vrais programmes

Le fameux programme "Hello, World" peut s'écrire de la façon suivante avec LZX:

Exemple 4.1. Hello, world

<canvas height="40"> 
  <text>Hello, World!</text> 
</canvas> 

Ce programme illustre trois fonctionnalités fondamentales de toute application Laszlo :

  • Les fichiers LZX sont des documents XML syntaxiquement corrects

  • <canvas> est la balise racine; les programmes commencent avec une balise <canvas> et finissent avec une balise </canvas>

  • A l'intérieur de la toile (canvas), des vues (views) sont affichées. Comme nous le verrons, un élément <text> est simplement un type particulier de vue.

La section suivante décrit les ingrédients principaux d'une application typique Laszlo. Vous pouvez aussi consulter les exemples de programmes, et les programmes offerts par la communauté sur http://www.mylaszlo.com, pour mieux comprendre la structure générale des applications LZX.

2.1. Structures pincipales

Les applications Laszlo typiques contiennent les parties suivantes, détaillées dans les sections ci-dessous

2.2. La toile (canvas)

Le noeud racine de toute application Laszlo est canvas; il y a une balise canvas unique par application LZX. La balise 'canvas' est le conteneur logique de tous les autres noeuds du programme; visuellement, c'est un rectangle qui est affiché dans la zone de contenu du navigateur internet. Vous pouvez définir explicitement la hauteur et la largeur de la toile en pixels, en affectant des valeurs à des attributs dans la balise ouvrante :

Exemple 4.2. canvas invisible

<canvas height="20" width="30> 
</canvas>

Si vous ne spécifiez pas la hauteur et la largeur, la toile - comme d'autres vues - se redimensionne en fonction des vues qu'elle contient. Contrairement à d'autres vues, par défaut, la toile a une largeur et une hauteur non nulles : elle prend la taille de la page HTML qui la contient. Du coup, l'application LZX vide suivante

Exemple 4.3. toile vide

<canvas/>

définit un objet invisible de la taille de la page.

En plus de la hauteur et de la largeur, la toile a plusieurs autres attributs. La couleur de fond, définie par l'attribut bgcolor, est très utile pour apprendre la structure visuelle des applications LZX.

2.2.1. La balise <script>

A l'intérieur des applications LZX, vous pouvez inclure un nombre indéfini de fonctions JavaScript en les plaçant dans la balise <script>. C'est très utile pour définir des fonctions (globales) qui seront utilisées par différentes classes. La balise <script> doit être une balise fille de <canvas>. C'est à dire que,

Exemple 4.4. balise <script> au niveau de la balise <canvas>

<canvas>
  <script>
    var Constant = 1;
  </script> 
</canvas>

est autorisé alors que

Exemple 4.5. balise <script> non autorisée à l'intérieur de <view>

<canvas> 
  <view> 
    <script> 1
      var Constant = 1;
    </script> 
  </view> 
</canvas>
1

Interdit ! La balise <script> n'est pas autorisée à l'intérieur d'une vue !

est interdit.

2.2.2. name ou id

Avec LZX, l'attribut id d'un objet est un identifiant global qui est visible depuis l'ensemble du programme, tandis que name est un attribut comme un autre, l'objet devant alors être appelé en utilisant le chemin complet (avec une exception pour les noeuds fils de canvas, comme précisé ci-dessous). Considérons :

Exemple 4.6. noms et ids

<canvas> 
  <view id="v1" name="outer_view"> 
    <view id="v2" name="inner_view" bgcolor="blue"/> 
  </view> 
</canvas>

La valeur de la couleur de fond de la vue externe peut être référencée par v1.bgcolor ou outer_view.bgcolor. La couleur de fond de la vue interne peut être référencée par v2.bgcolor de n'importe où dans l'application. Pour utiliser le nom pour la référencer en dehors de inner_view il faut indiquer outer_view.inside_view.bgcolor.

2.2.3. Noeuds fils de canvas

Les objets qui sont des noeuds fils de canvas peuvent être appelés simplement. Par exemple, dans :

Exemple 4.7. référencer un noeud fils de canvas par son nom

<canvas>
  <view name="artichoke">
  <!-- on peut rajouter du code -->
</canvas>

La vue artichoke peut être référencée de n'importe où dans l'application en tant que artichoke. C'est à dire qu'il n'est pas nécessaire de la référencer comme canvas.artichoke.

2.3. Vues

La vue est l'élément visible basique des applications OpenLaszlo. Tout ce qui est affiché sur la toile (canvas) est une vue (ou un objet instance d'une classe héritant de view). 

2.3.1. Vues visibles et invisibles

Une vue est seulement visible si elle a une couleur, du texte ou une image associée, et si la hauteur et la largeur de la vue sont supérieurs à zéro. Par exemple, le code suivant n'affiche qu'une vue, même si trois vues sont définies. La seconde et la troisième vue existent mais sont complètement invisibles. La seconde n'a pas de couleur et la troisième a une largeur de zéro. Par contre, elle affectent toujours l'arrangement des autres.

Exemple 4.8. vues visibles ou invisibles

<canvas height="100"> 
  <!-- affiche un carré rouge --> 
  <view width="50" height="50" bgcolor="red"/>
  <!-- rien n'est affiché, mais la vue existe quand même--> 
  <view width="50" height="50"/>
  <!-- rien n'est affiché, mais la vue existe quand même --> 
  <view width="0" height="50" bgcolor="blue"/>
</canvas> 

2.3.2. Vues conteneurs d'autres vues

Des vues peuvent aussi contenir d'autres vues, ce qui vous permet de créer des effets visuels complexes. Chaque vue 'mère' peut avoir un nombre indéfini de filles. Par défaut, chaque vue fille est positionnée relativement au coin supérieur gauche de sa vue mère.

Bien qu'il soit toujours possible de positionner la valeur horizontale (x) et verticale (y) de l'origine en pixels, relativement à sa mère, il est souvent plus simple de laisser le système positionner les éléments pour vous. Différents types de gestionnaires de mise en page (layouts) sont inclus par défaut dans le système : <simplelayout>, <stableborderlayout>, <constantlayout>, <resizelayout> et <wrappinglayout>.

2.3.3. Dimensionnement des vues et découpage

Soit l'applications suivante :

Exemple 4.9. Dimensions des parents et enfants

<canvas height="200"> 
  <view bgcolor="red" x="50" y="50" width="100" height="100"> 
    <view bgcolor="yellow" x="50" y="50" width="60" height="105"/> 
  </view> 
</canvas> 

En faisant fonctionner l'exemple ci-dessus, on voit que la largeur et la hauteur d'une vue peuvent être différentes de la zone entourant les vues filles. Aucun découpage ne s'est effectué pour la vue "jaune" (yellow), même si elle sort de la zone définie par sa mère. 

Si aucune largeur ou hauteur n'est spécifiée pour une vue, alors elle prendra pour valeur de largeur et hauteur celles de la zone entourant les vues filles. Si un découpage est souhaité, alors l'attribut clip="true" peut être ajouté au parent, ce qui donnerait ceci :

Example 4.10. clipping

<canvas height="200">
  <view bgcolor="red" x="50" y="50" width="100" height="100" clip="true"> 
    <view bgcolor="yellow" x="50" y="50" width="60" height="105"/> 
  </view> 
</canvas> 

2.3.4. Images et autre ressources

En plus d'afficher du texte et des couleurs, les vues peuvent être utilisées pour afficher ou jouer des médias dans différents formats tels que .gif, .jpeg, .png, .swf et .mp3 par exemple. Ces ressources peuvent être compilées dans l'application ou importées pendant l'exécution; elles peuvent être sur le serveur OpenLaszlo ou sur un serveur distant, et peuvent être référencées en utilisant des chemins relatifs ou des ids absolus.

2.4. Liaison de données

La puissance de LZX vient en grande partie de son implémentation unique des liaisons de données, dans laquelle le contenu d'une vue est déterminé par le contenu d'un ensemble de données (dataset). Un ensemble de données (dataset) est simplement une hiérarchie nommée de données XML qui possède un noeud racine unique. Toutes les données des applications LZX sont contenues dans des ensembles de données (datasets).

Le concept de liaison de données va plus loin que la simple utilisation de vues pour afficher des données XML; les données elles-mêmes peuvent déterminer la taille, la couleur, la position, ... des vues et même induire la création ou la suppression de vues.

Considérez le programme suivant :

Exemple 4.11. simple liaison de données

<canvas height="100"> 
  <dataset name="ds"> 
    <record x="10" y="20" name="first" color="332136432"/> 
    <record x="5" y="5" name="second" color="56521236432"/> 
    <record x="20" y="2" name="third" color="1565336432"/> 
  </dataset> 
  <simplelayout axis="y"/>
  <view datapath="ds:/record"> 
    <text datapath="@name" bgcolor="$path{'@color'}" x="$path{'@x'}"/> 
  </view> 
</canvas> 

Dans l'exemple ci-dessus, la ligne

<view datapath="ds:/record"> 

commande la création de trois vues, et la ligne

<text datapath="@name" bgcolor="$path{@color}" x="$path{@x}"/>

détermine le texte de chaque vue, sa couleur d'arrière plan et sa position x en fonction du contenu du groupe de données.

2.5. Inclusions et bibliothèques

Le code source d'une application LZX peut être contenu dans un seul fichier; de tels fichiers peuvent grossir énormément et ainsi devenir difficiles à manipuler et maintenir. En divisant l'application en un certain nombre de plus petits fichiers, vous pouvez cependant améliorer la maintenabilité et faciliter la compréhension de l'application. Vous pouvez même découper des hiérarchies de vues profondes en de multiples fichiers pour améliorer la modularité, la clarté et l'organisation du code source. 

2.5.1. La balise <include>

Cette balise vous permet de spécifier le nom d'un fichier à inclure à n'importe quel endroit de votre application. Le fichier à inclure peut être une bibliothèque, une vue ou du texte. 

Quand la cible est un fichier bibliothèque (un fichier XML dont le noeud racine est <library>), le contenu du fichier bibliothèque est inclus dans l'application. Tout le contenu tel que les vues, scripts, polices de caractères, ressources, fichiers sons, sources de données, groupes de données, définitions de classes, ... est inclus dans l'application. Un fichier bibliothèque peut aussi inclure d'autres bibliothèques, mais une bibliothèque est incluse dans l'application une seule fois, quel que soit le nombre de balises <include> la référençant. Par exemple,

Exemple 4.12. app.lzx

<canvas> 
  <include href="library.lzx"/> 
  <mywindow/> 
</canvas> 

Exemple 4.13. library.lzx

<library> 
  <class name="mywindow" extends"window" 
         title="Mon Titre"> 
    <button> Appuyez! </button> 
  </class> 
</library> 

La sémantique pour inclure des vues et du texte est analogue mais légèrement différente. Contrairement aux bibliothèques, à chaque fois que le fichier décrivant le texte ou la vue est inclus, il est ajouté.

2.6. Commentaires

2.6.1. Commentaires XML

Ils s'écrivent

<!--  commentaire -->

et peuvent apparaître entre (mais pas à l'intérieur) les balises XML. Le XML n'a pas de syntaxe particulière pour les lignes de commentaires, et ne permet pas de commentaires imbriqués. 

Souvent pendant le débogage, vous devrez commenter des sections de code. Comme il est interdit d'imbriquer des commentaires XML à l'intérieur de commentaires XML, cette technique ne fonctionne pas pour des zones déjà commentées de code LZX. Une bonne façon de contourner ce problème est d'utiliser les instructions d'exécution XML de la forme :

<?ignore

?>

Ainsi, pour commenter les vues bleue et verte ci-dessous,

Exemple 4.14. Commenter du code

<canvas height="100">
  <simplelayout/> 
  <!-- Voici une vue rouge --> 
  <view bgcolor="red" width="100" height="20"/> 
  <?ignore 1
  <!-- Voici une vue bleue --> 
  <view bgcolor="blue" width="100" height="20"/> 
  <!-- Voici une vue verte --> 
  <view bgcolor="green" width="100" height="20"/> 
  ?>       2
  <!-- Voici une vue jaune --> 
  <view bgcolor="yellow" width="100" height="20"/> 
</canvas>  
1

Les lignes entre <?ignore et ?> sont ignorées

2

Fin de la zone ignorée

2.6.2. Commentaires de Script

Dans le script, les zones de commentaires sont de la forme

/* commentaire */

Les lignes de commentaires commencent par // et continuent jusqu'à la fin de la ligne :

// ligne de commentaire
<script> 
  /* les commentaires de script ressemblent à cela */ 
  some.method() // C'est un exemple de syntaxe de commentaire
  <!-- ERREUR!  ne pas inclure de commentaires XML dans le script ! --> 
</script>  // ERREUR! Ne pas inclure de commentaires script dans le XML !

2.7. Débogage

Le système OpenLaszlo comprend un débogueur intéractif qui peut être inclus dans l'application. Le débogueur affiche les erreurs d'exécution et peut être utilisé de façon intéractive pour inspecter ou modifier n'importe quel attribut de balise ou des champs JavaScript.

Vous pouvez utiliser la méthode JavaScript Debug.write() pour commander l'affichage de messages dans le débogueur. Par exemple,

Exemple 4.15. utilisation du débogueur pour afficher des messages

<canvas height="200" debug="true"> 
  <script> 
    Debug.write("Alors, qu'en pensez-vous ?") 
  </script> 
</canvas> 

Pour invoquer le débogueur, préciser l'attribut debug="true" dans la balise <canvas>. Vous pouvez modifier l'apparence et la position de la balise <debug>. Remarquez cependant que cette balise n'invoque pas le débogueur.

Pour utiliser le débogueur de façon intéractive pour inspecter une valeur, taper une expression dans le panneau d'évaluation. Par exemple,

Exemple 4.16. définir des attributs avec le débogueur

<canvas height="200" bgcolor="red" debug="true"> 
  <debug y="60"/> 
  <view name="sam" bgcolor="blue" height="50" width="50"/> 
</canvas> 

Dans le panneau d'évalution, tapez

sam.setAttribute('x', 50)

et validez. La vue appelée sam (le carré bleu) apparaît maintenant 50 pixels plus à droite.

Voir Chapitre 45, Débogage pour une explication détaillée sur le débogage.

2.7.1. Le visualiseur de code OpenLaszlo

Le Serveur OpenLaszlo contient un visualiseur de code que vous pouvez utiliser pour inspecter n'importe quel fichier XML du dossier lps, dont bien sûr les fichiers source .lzx. Quand il affiche les fichiers .lzx, le visualiseur colorise le code en fonction de la syntaxe, et donne une liste des références croisées telles que les classes, les bibliothèques et les éléments graphiques. Pour invoquer le visualiseur, taper dans un navigateur l'URL /lps-3.2/lps/utils/viewer/viewer.jsp en précisant le nom du fichier à visualiser avec le paramètre file=, comme dans l'exemple suivant :

http://localhost:8080/lps-3.2/lps/utils/lps/viewer.jsp?file=/my-apps/copy-of-hello.lzx