Développement d’une application web de
gestion de l’instruction professionnelle des
opérateurs et contrôleurs aériens utilisant Java et
Struts
Auteur Cyril MottierMaître De Stage Sgt Michel Gavois
Entreprise Armée de l’AirEtablissement INSA de Rennes
Année 3Département Informatique
Période 02.07.07 – 31.08.07
Version : 07 septembre 2007
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
2 | P a g e
Table des matières Remerciements ....................................................................................................................................... 3
I. Introduction ..................................................................................................................................... 4
A. Présentation de l’entreprise ........................................................................................................ 4
B. Le réseau SIGAPAIR ..................................................................................................................... 5
C. Le sujet du stage .......................................................................................................................... 6
II. Giproca : une application web utilisant Struts ................................................................................ 6
A. Présentation du besoin ............................................................................................................... 6
B. Etude de l’existant ....................................................................................................................... 7
C. Analyse du problème ................................................................................................................... 8
D. Développement de l’application ................................................................................................. 8
1. Choix des technologies utilisées .............................................................................................. 8
2. Préparation de l’environnement de travail ............................................................................. 9
3. Réalisation d’un template complet ......................................................................................... 9
4. Développement de l’application ........................................................................................... 10
i. Le framework Struts .......................................................................................................... 10
ii. La démarche de développement d’une application utilisant Struts .................................. 11
iii. Exemple de développement d’un formulaire de recherche ............................................... 11
iv. Notions supplémentaires utilisées ..................................................................................... 12
III. Conclusion ................................................................................................................................. 13
IV. Annexes ..................................................................................................................................... 14
Diagramme des classes UML de l’application (Fig 1) ........................................................................ 15
Diagramme des classes UML de la partie ressources humaines (Fig 2) ............................................ 16
Copie d’écran de l’interface graphique de Giproca (Fig 3) ................................................................ 17
Diagramme de Gantt de mon stage (Fig 4) ....................................................................................... 18
Diagramme des cas d’utilisation (Fig 5) ............................................................................................ 18
RechercheActionServlet.java (Code 1) ............................................................................................... 19
Les différents JavaBean (Code 2) ....................................................................................................... 21
RechercheMulticriteresAction.java (Code 3) ..................................................................................... 23
Les vues de la recherche (Code 4) ...................................................................................................... 28
Struts‐config.xml (Code 5) ................................................................................................................. 29
V. Références ..................................................................................................................................... 29
VI. Glossaire .................................................................................................................................... 30
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
3 | P a g e
Remerciements
Mes remerciements vont aux personnes suivantes :
Tout d’abord le Lcl (Lieutenant Colonel) Wulfran Vanneron sans lequel ce stage n’aurait pu être réalisé. Il m’a sympathiquement accueilli dans son unité et m’a confié une part non négligeable de la réalisation d’un projet conséquent. Il a été d’un grand soutien lors de la relecture de ce rapport de stage.
Le Sgt (Sergent) Michel Gavois pour son attention lors de la réalisation du projet. Sa réactivité et la qualité de son écoute ont été motivantes et instructives. Il a su répondre à mes questions, tant techniques que conceptuelles ou fonctionnelles, et a examiné mes codes sources et mes écrits.
Le Cdt (Commandant) Lerousseau, le Cne (Capitaine) Lajoie et le Maj (Major) Valade pour leur présentation de l’existant et leurs réponses aux questions sur le projet final souhaité.
L’ensemble des membres de l’ASSI 01.617 qui m’ont gentiment accueilli. Ils ont également su répondre à mes interrogations concernant leurs activités sur le réseau SIGAPAIR en conservant une atmosphère de travail conviviale et détendue.
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
4 | P a g e
I. Introduction
A. Présentation de l’entreprise
L’Armée de l’Air fait partie, au même titre que la Gendarmerie Nationale, l’Armée de Terre et la Marine Nationale, du Ministère de la Défense. Créée en 1933, elle dispose aujourd’hui de plusieurs bases aériennes en métropole ainsi qu’en outre‐mer et à l’étranger.
Mon stage s’est déroulé sur le site de Cinq Mars La Pile rattaché à la BA 705 (Base Aérienne) de Tours. Situé à 25km à l’Ouest de Tours, ce site regroupe sur 25 hectares, 2 missions principales :
La surveillance et le contrôle aérien, La gestion des entrepôts de l’Armée de l’Air ;
Cette première mission est garantie par le CDC 07.927 (Centre de Détection et de Contrôle). Il as‐sure les missions de sûreté aérienne ainsi que le contrôle de la circulation aérienne militaire. Il est également chargé de la coordination des sauvetages en cas d’accidents d’aéronefs civils ou militaires.
L’EAA 00.609 (Entrepôt de L’Armée de l’Air) réceptionne, stocke et redistribue en fonction des besoins et demandes, une partie des matériels servant aux unités de l’Armée de l’Air : pneumatiques d’aéronefs, matériels électroniques et informatiques…
Le site de Cinq Mars La Pile est également chargé, depuis 1994, de la zone aérienne de défense Nord.
L’ASSI 01.617 de Cinq Mars La Pile (Antenne de Soutien des Systèmes d’Informations) m’a donc accueilli pendant 2 mois. Depuis 2001, l’Armée de l’Air s’est dotée d’un système d’information des ressources humaines appelé SIGA‐PAIR (Système de Gestion et d’Administration du Personnel de l’armée de l’AIR). Ce système relie les organismes de direction des ressources humaines des bases
aériennes, des commandements et de l’administration centrale. L’ASSI a pour missions prioritaires d’assurer la cohérence et la mise à jour du système d’information global et de veiller à la disponibilité et à la performance des serveurs informatiques SIGAPAIR. Pour ce faire, l’antenne est séparée en deux sections :
la section « Données » qui tente de conserver la pertinence et la cohérence des informations en corrigeant les collisions de données détectées sur le réseau SIGAPAIR. Elle a donc un rôle d’administrateur de données en assurant le suivi et la réplication des lignes,
la section « Système » qui soutient et administre l’ensemble des serveurs et assure le sup‐port technique national SIGAPAIR. Elle est aussi chargée de distribuer et d’appliquer toutes évolutions des applications de production et d’interrogation sur les serveurs et sur les postes
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
5 | P a g e
clients. Elle joue enfin le rôle de développeur logiciel ou système lorsque le commandement a besoin d’une application d’importance raisonnable à l’opposé des projets importants géné‐ralement sous‐traité à des industriels. C’est donc dans le cadre du développement d’une ap‐plication de taille moyenne que mon stage a été effectué.
Organigramme de l’ASSI
B. Le réseau SIGAPAIR
SIGAPAIR représente un ensemble de bases de données distribuées et répliquées.
Représentation du réseau SIGAPAIR
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
6 | P a g e
Ce réseau met ainsi à disposition des 2500 cadres chargés de la gestion et de l’administration d’environ 100 000 personnes (militaires actifs ou de réserve), un outil présentant toutes les garanties de fiabilité, de sécurité et de disponibilité.
Sur le plan fonctionnel, il s’agit de :
Disposer d’informations individuelles et collectives complètes et fiables, Réaliser les travaux d’administration, de gestion ou des études prévisionnelles.
Sur le plan technique, il s’agit de :
Mieux utiliser les ressources (matérielles, logicielles, personnelles), Responsabiliser les utilisateurs.
Le mode de fonctionnement de SIGAPAIR est de type client/serveur en mode client léger. L’ensemble du système est déployé sur 62 sites et comprend 60 bases de données, 60 serveurs d’application, 120 serveurs de réseaux et 1500 postes clients répartis en France et à l’étranger (Dji‐bouti, Sénégal, La Réunion …). Les systèmes d’exploitation sont de type UNIX (AIX 4.3) pour les ser‐veurs de données et Windows NT pour les serveurs bureautiques. Enfin, le SGBD utilisé est Ingres II 2.0 (Intelligent Graphic RElational System). Ce dernier est considéré comme un SGBD de classe en‐treprise (au même titre que le très renommé Oracle).
C. Le sujet du stage
Le CDC de la base de Cinq Mars La Pile est composé de deux escadrons constitués d’une centaine de personnes chacun. Afin de mieux gérer les informations sur chacun des militaires de l’unité (une unité est le regroupement de plusieurs escadrons), le commandement a demandé à l’ASSI de déve‐lopper une application permettant d’accéder facilement à l’ensemble des informations propres à chaque contrôleur et opérateur (informations générales, grades, licences, stages effectués …).
L’application, dans un souci de portabilité, a été développée en utilisant le langage Java et le ser‐veur applicatif Tomcat le tout étant monté sur une plateforme Linux. Le regroupement de ces deux technologies permet de créer une application fonctionnant par interface web.
La réalisation d’une telle application était un projet assez conséquent. Ce dernier était également voué à être modifié régulièrement afin de satisfaire aux demandes du commandement et de suivre les évolutions des différentes modalités de la banque de ressources humaines militaires (migration de SIGAPAIR vers sa version 6 prévue pour début 2008). Afin de faciliter le développement et de sa‐tisfaire aux contraintes précédemment citées, le framework Struts (version 1.3.8) a donc été utilisé.
II. Giproca : une application web utilisant Struts
A. Présentation du besoin
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
7 | P a g e
L’unité du CDC est composée d’environ 200 hommes et femmes se relayant chaque jour et 24 heures sur 24 afin d’effectuer le contrôle et la surveillance de l’espace nord aérien français. Le com‐mandement du CDC s’occupe donc d’effectuer le management de l’ensemble de ces militaires. Cha‐cun d’entre eux sont munis d’informations personnelles qui définissent son niveau au sein de l’unité (grade, licences obtenues, statut, stages effectués, …). Ces informations étant modifiées assez régu‐lièrement (une licence doit en moyenne être mise à jour tous les ans), il devenait indispensable au commandement de se procurer une application unique donnant accès à l’ensemble des informations des contrôleurs et opérateurs aériens présents sur le site de détection de Cinq Mars La Pile.
Suite à un entretien d’environ 3 heures avec les intéressés (Cdt Lerousseau et Cne Lajoie), il a été décidé de réaliser cette application en utilisant une interface web. Cela permettait une visualisation efficace et simple sur un navigateur web. Le client web Firefox 2.x étant disponible sur de nom‐breuses machines, autorisé par l’Armée de l’Air et simple à installer, il a été choisi comme plateforme client. L’application de Gestion de l’Instruction PRofessionnelle des Opérateurs et Contrôleurs Aé‐riens (Giproca) devait fournir au commandement des informations déjà existantes sur le réseau SI‐GAPAIR (nom, prénom, situation familiale, visite médicale, passeport, …) et en inclure de nouvelles (licences, stages, formation militaire, …).
Le commandement du CDC étant soucieux du parcours de leurs membres, il avait également de‐mandé une historisation de la plupart des propriétés des militaires (escadron, grade, situation fami‐liale, statut, …).
Pour des raisons de sécurité et de secret militaire (données classées confidentielles person‐nelles), le commandant Lerousseau avait demandé que l’application permette de définir plusieurs niveaux d’accès. Certains profils devaient par exemple avoir tous les droits (écriture et lecture de l’ensemble des informations) alors que d’autres ne devait accéder qu’en lecture à certaines informa‐tions (un sous‐officier ne devait accéder qu’à ses propres informations par exemple). Dans une même optique de sécurité, il a été décidé de séparer totalement les informations entre la base de données de l’Armée de l’Air (SIGAPAIR) et Giproca. La saisie des informations dites générales ne res‐tait donc faisable qu’à partir du réseau SIGAPAIR alors que l’ensemble des informations propres au CDC devait se faire à l’aide de la nouvelle application. Enfin, une comparaison des deux tables aurait lieu de manière quotidienne afin de conserver la cohérence entre les deux systèmes d’informations (au jour près).
B. Etude de l’existant
Comme expliqué ci‐dessus, l’application de suivi peut être séparée en deux parties distinctes. La première regroupe l’ensemble des informations personnelles et communes à chaque militaire de l’Armée de l’Air (nom, prénom, grade, date d’entrée en service …). Ces informations étaient dispo‐nibles sur le réseau des ressources humaines de l’Armée de l’Air. La seconde partie s’occupe quant à elle de données propres aux militaires du CDC (licences, stages, statut, formation militaire, …). Il n’existait en revanche aucune donnée numérique concernant cette partie. Afin de saisir l’ensemble des informations, il avait donc été demandé de créer une interface de saisie pour remplir et modifier ces informations.
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
8 | P a g e
D’un point de vue applicatif, le projet est parti de zéro : en effet, aucune application de suivi des informations concernant les militaires du CDC à interface web n’existait lors de la création de Gipro‐ca. Il a tout de même était possible de réutiliser une partie du modèle conceptuel de donnée de SI‐GAPAIR afin de modéliser la première partie du projet.
C. Analyse du problème
Suite à l’entretien avec le commandement du CDC et à l’étude de l’existant, nous avons débuté l’analyse du problème. Cette analyse consistait simplement à créer le diagramme de classe UML des données nécessaires à l’application Giproca. Ce diagramme devait néanmoins présenter une archi‐tecture permettant un développement propre et facile de notre interface web. Comme le montre le schéma de la figure 1 (voir Annexe), le modèle de l’application comportait un ensemble important d’objets différents. Mon stage ne durant que 9 semaines, il m’a donc été demandé de ne réaliser qu’une partie de l’application. Cette partie est représentée sur la figure 2 (voir Annexe) et ne con‐cerne en réalité que les données directement rattachées à une personne disponibles sur le réseau des ressources humaines de l’Armée de l’Air.
A l’aide d’un logiciel de génie logiciel (PowerAMC), ce diagramme UML a ensuite été transformé en un modèle conceptuel de donnée (MCD). Ce même logiciel a finalement permis de générer d’une part les tables de la base de données et d’autre part les classes Java (classes métiers) permettant le développement de Giproca.
D. Développement de l’application
1. Choix des technologies utilisées
Giproca a été réalisée à l’aide du langage Java. Cette technologie qui jouit en outre d’une noto‐riété indéniable dispose d’un modèle objet parmi les meilleurs du marché. Elle permet également aux logiciels d’être exportables sur n’importe quelle plateforme (Windows Nt, Linux, …). Le Java dis‐pose ensuite d’un framework conséquent et permettant l’accès aux bases de données relationnelles telle que PostgreSQL grâce au JDBC (Java DataBase Connectivity). Enfin, le projet ne nécessitait abso‐lument pas de manipulation système. Il s’en suit donc que l’utilisation d’un langage dit bas niveau comme le C ou C++ n’était pas utile ou bénéfique.
Le SGBD (Système de Gestion de Base de Données) choisit était donc PostgreSQL. Cette base de donnée est autorisée par l’Armée de l’Air est fait figure d’exemple parmi les différents SGBD libres du marché. Pour finir, PostgreSQL est toujours maintenu par une communauté active d’informaticiens.
Le serveur applicatif exploité pour réaliser Giproca se nomme Tomcat. Il a été utilisé pour les même raisons que PostgreSQL.
Enfin, dans le but d’obtenir un code dit propre et séparant au mieux le design du contenu dyna‐mique, le développement s’est posé sur le framework Struts dans sa version 1.3.8. L’utilisation de cette technologie permet par la suite une modification simple de l’application puisqu’elle suit le mo‐dèle MVC (voir explication plus bas).
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
9 | P a g e
2. Préparation de l’environnement de travail
Afin de réaliser le projet, il a fallu installer un environnement de travail complet puisque l’équipe de développement de l’ASSI ne programmait principalement ses applications web qu’en PHP‐MySQL. La préparation de notre environnement de travail s’est donc décomposée en deux étapes :
la création d’un serveur web, l’installation d’un IDE sur station de développement.
L’installation du serveur a débuté par la mise en place de l’OS Linux (distri‐bution Mandriva 2006) sur une machine de la marque Bull. Il a ensuite été né‐cessaire de créer le serveur applicatif Java. Nous avons donc commencé par installer la machine virtuelle Java. L’application Tomcat a ensuite été mise en
place. Couplée à la machine virtuelle Java, elle permet, à l’instar d’Apache, de faire office de serveur Java (et non PHP ou http comme le fait couramment Apache).
Nous étions maintenant pourvu d’un serveur applicatif mais sans grand inté‐rêt puisque ce dernier ne disposait d’aucune base de donnée relationnelle. Nous avons donc intégrer le SGBD PostgreSQL à notre plateforme Linux. Suite à l’installation de cette base de données, la création d’identifiants et de mots de passe de connexion a été réalisée afin de gérer les droits d’accès au SGBD de notre serveur applicatif.
Enfin, dans le but de faciliter notre travail au sein de l’équipe, j’ai pro‐posé un utilitaire de travail collaboratif utilisé lors du projet de fin de troisième année: Subversion (successeur de CVS). Les membres de l’équipe ont alors décidé d’essayer cette application facilitant le travail en groupe et facilitant les retours et changements de version. Pour ce faire, nous avons installé le serveur Subversion sur notre machine Linux.
Dans un deuxième temps, j’ai débuté l’installation des stations de développement. Dans le but de faciliter et d’optimiser le déve‐loppement, j’ai monté un serveur local Tomcat sur chacune des ma‐chines de travail. Cela évitait des pertes de temps inutiles de connexion ftp ou ssh et de redémarrage du serveur.
Finalement, l’interface de développement utilisée a été le célèbre IDE Eclipse. Cet IDE a fait ses preuves dans le monde professionnel et est également autorisé par l’Armée de l’Air. Afin d’orienter l’interface de développement vers la création d’applications web, j’ai intégré le plugin WTP (Web Tools Platform) ainsi que Struts à l’ensemble des
stations de travail. Le plugin Subclipse faisant office de client Subversion a été installé afin d’autoriser le travail collaboratif.
3. Réalisation d’un template complet
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
10 | P a g e
Contrairement à une entreprise dite classique, l’Armée de l’Air se doit de créer intégralement ces applications. L’ensemble des technologies utilisées dans l’Armée de l’Air ont, au préalable, été vali‐dées par un organisme spécial. C’est la raison pour laquelle il a fallu créer l’esthétique complète du site. Etant déjà accoutumé à ce genre de développement et puisque l’analyse du problème (création des diagrammes de classes UML, MCD, …) était en cours, on m’a demandé de créer un template complet. Ce template devait présenter une interface web ergonomique et claire. Vu l’importance de l’application, il semblait indispensable que l’interface soit munie d’un grand nombre de menus. J’ai donc choisi de créer un menu horizontal constitué d’onglet eux même munis de sous menus. La réali‐sation de ce template a été effectuée en suivant les normes XHTML Strict 1.1 et CSS 2.1 du W3C (World Wide Web Consortium). Fonctionnant sous Opera 9 et Internet Explorer 7, ce template n’avait besoin d’être compatible qu’avec le navigateur Firefox 2.x. Pour satisfaire aux différentes résolutions des écrans du CDC, le template s’adapte à la résolution de l’écran sur lequel il s’affiche à condition que cette dernière soit supérieure ou égale à 800x600 pixels. Une copie d’écran est dispo‐nible en annexe sur la figure 3.
4. Développement de l’application i. Le framework Struts
Struts est un framework du développement d’application web du projet Jakarta Struts de l'Apache Software Foundation. Il cherche à fournir un cadre standard de développement d'applica‐tion web en Java respectant l'architecture dite MVC (Modèle‐Vue‐Contrôleur). Struts utilise des technologies standards : Java Servlets, JavaBeans, ResourceBundles, et XML.
Le modèle MVC cherche à définir une méthode de programmation permettant de séparer les trois aspects principaux d’un projet : le modèle qui représente l’ensemble des bases de données et/ou objets contenant l’information utile à l’application, la vue qui représente l’esthétique du site et l’ensemble des données graphiques fournies à l’utilisateur par l’interface web et le contrôleur qui fait office de passerelle entre le modèle et la vue en effectuant les opérations de connexion nécessaires. On peut donc représenter ce modèle à l'aide du schéma représenté ci‐dessous.
Schéma de l’architecture type d’une application utilisant Struts
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
11 | P a g e
Le développement d’une application à l’aide de Struts s’effectue par héritage de classes. Le fra‐mework fournit un ensemble de classes qui sont facilement extensibles. Pour créer une nouvelle action personnalisée, il suffit donc de créer une nouvelle classe héritant de la classe définie dans le framework Struts et nommé de façon évidente "Action".
En ce qui concerne le modèle, le framework peut interagir avec les technologies standards d’accès aux données comme JDBC (technologie utilisée lors de mon stage) ou EJB ainsi que tous les packages tierce partie comme Hibernate, iBATIS ou Object Relational Bridge. Enfin, la vue fonctionne en utilisant XML, XSLT, XHTML, CSS, Java Server Pages (ces trois dernières technologies ont été utili‐sées lors de mon stage), et d’autres systèmes de présentation.
ii. La démarche de développement d’une application utilisant Struts
Le développement d’une application utilisant Struts suit, en général, la démarche décrite ci‐dessous :
la définition des vues. On distingue les vues qui sont des formulaires et les autres.
• chaque vue formulaire donne naissance à une définition dans le fichier struts‐config.xml. On y définit les informations suivantes : le nom de la classe Bean qui contiendra les données du formulaire ainsi que l'in‐
dication d’état de validation des données (vérifiées ou non). Si elles doivent être vérifiées et qu'elles s'avèrent invalides, on doit indiquer la vue à envoyer en ré‐ponse au client dans ce cas.
le nom de la classe Action chargée de traiter le formulaire. le nom de toutes les vues susceptibles d'être envoyées en réponse au client une
fois que la requête a été traitée. La classe Action choisira l'une d'elles selon le ré‐sultat du traitement.
• chaque vue fait l'objet d'une page JSP. Les exemples de vues, notamment les vues formulaires, illustrent l’utilisation d’une bibliothèque de balises propres à Struts.
l'écriture des classes Javabean correspondant aux vues formulaires l'écriture des classes Action chargées de traiter les formulaires l'écriture des éventuelles classes métier ou d'accès aux données
iii. Exemple de développement d’un formulaire de recherche
Dans le but de présenter succinctement le développement d’une application web utilisant Struts, étudions l’exemple suivant. Cet exemple traite d’un formulaire de recherche de militaires et adopte l’architecture représentée sur ce schéma :
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
12 | P a g e
Schéma de la partie recherche de Giproca
Il y avait trois vues (voir Code 5) Le contrôleur est défini manuellement. Cela permet de définir des constantes extraites de la base de données comme les grades ou les escadrons existants (qui sont des critères de re‐cherche). Le servlet n’étant instancié qu’une seule et unique fois, cela limite les accès au SGBD comme le montre le code source Code 1
ListePersonneBean présent en annexe Code 2 est la classe qui mémorise la réponse dite mul‐tiple : l’ensemble des personnes correspondant aux critères de recherche.
InfosPersonneBean, en annexe Code 3, mémorise les informations propres à une seule et unique personne (cas d’une recherche à réponse unique)
Enfin RechercheMulticriteresAction (Code 4) est la classe analysant les données du formu‐laire présent sur Recherche.Multicriteres.jsp et redirige sur :
• Affichage.Infos.Unique.jsp si réponse unique
• Recherche. Multicriteres.jsp si réponse multiple ou aucun résultat
• Erreurs.Systeme.jsp si une erreur système survient (erreur SQL ou exception Java)
Les sources Code6 donnent l’extrait du fichier struts‐config.xml permettant la coordination des trois entités : modèle, vue et contrôleur.
iv. Notions supplémentaires utilisées
Durant la création de Giproca, j’ai également utilisé différentes technologies adjacentes à Struts. Ces plugins additionnels apportaient plusieurs avantages sur le développement et sur l’utilisation de notre application :
Utilisation des Tiles : ce plugin a permis d’approfondir et de faciliter la séparation de l’esthétique et de la programmation interne. Cette technologie permettait de définir un template réutilisable pour l’ensemble du site. Il n’était ainsi plus nécessaire de dé‐finir une entête de page (contenant le menu et le titre de la page) et un pied de page à chaque vue, le modèle de chaque page étant défini dans un fichier XML : tiles‐defs.xml
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
13 | P a g e
Utilisation de Validator : ce plugin permet de générer automatiquement les mé‐thodes de validation d’un formulaire. Il autorise également la génération automa‐tique d’une pré‐validation JavaScript du coté client. Cela évite ainsi des transferts inutiles d’informations avec le serveur applicatif et soulage le réseau. La définition des formats s’effectue à l’aide d’expressions régulières également dans des fichiers XML : validator.xml et validator‐rules.xml.
III. Conclusion
Ces neuf semaines au sein de l'Armée de l'Air française ont été plus qu'enrichissantes pour moi. En tant que futur ingénieur, il me paraissait indispensable d'effectuer un stage me permettant de découvrir de nouvelles technologies, de nouvelles méthodes de travail et un nouvel environnement de développement. Mon séjour à l'ASSI a concrétisé mes attentes en répondant à ces contraintes. Cela fut d'autant plus facile que l'équipe a su m'intégrer et m'aider dans ma progression sur le projet Giproca. Tout en me supervisant, Michel GAVOIS, mon maître de stage, m'a laissé une marge de ma‐nœuvre importante (résolution de problèmes, implémentation de solutions personnelles).
Le projet de ce stage était composé d'un ensemble de technologies actuelles. Bien que la plupart de ces technologies soient déjà acquises (CSS, XHTML, Java, ...) cela m'a permis de me perfectionner dans des domaines assez peu utilisés lors de ma formation (JDBC). J'ai également découvert de nou‐velles technologies telles que Struts ou les JavaServerPages. Ces technologies ayant une approche entrepreneuriale d'un développement d'application, j'ai découvert une toute autre manière de déve‐lopper. Je me suis donc retrouvé confronté à une programmation beaucoup plus globale et divisée en couches. Cela permet une modification plus aisée et une retouche du code plus facile pour les successeurs reprenant le projet.
J'ai également approfondi mes connaissances sur certains logiciels de développement comme Eclipse, Notepad++ ou Firefox. En effet, je pense réellement être devenu beaucoup plus productif avec l'environnement de développement intégré Eclipse qu'avant ce stage. J'ai découvert un en‐semble de fonctionnalités totalement inconnues à mon arrivée dans l'équipe de développement. Ce stage a bien sûr été l'occasion de découvrir de nouveaux logiciels. J'ai notamment utilisé le logiciel propriétaire de génie logiciel PowerAMC. Ce dernier nous a permis de créer les diagrammes de classe et de générer le MCD, le MLD et le framework de Giproca.
Ce stage m'a ensuite permis d'avoir une nouvelle approche du développement logiciel industriel. En effet, je ne pensais pas qu'autant d'applications étaient développées en utilisant une interface web. J'ai également eu la chance de réaliser ce projet en passant par toutes les phases de dévelop‐pement (analyse des besoins, étude de l'existant, analyse du problème, développement, tests et rédaction de documentation).
Enfin, d'un point de vue un peu plus technique, ce stage m'a permis de découvrir une "autre" in‐formatique. J'ai eu l'occasion d'assister et d'aider à l'installation d'un serveur de production utilisant le système d'environnement Linux (Mandriva 2006). Les visites de la base lors de mon arrivée m'ont également montré un environnement qui m'était totalement inconnu : les gros systèmes ou le sys‐
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
14 | P a g e
tème UNIX. En effet, j'ai pu découvrir des serveurs totalement différents (au niveau hardware et software) de nos machines classiques. Ils utilisaient des OS comme AIX 4.3.3 ou GCOS 7.
En conclusion, je suis très satisfait d'avoir participé à la création d'une application en assistant à l'ensemble des phases de développement. La découverte du framework Struts m'a également beau‐coup plu car c'est une approche très industrielle et très ordonnée d'un projet. Ce stage m'a donc permis de toucher à des notions que je n'aurais probablement jamais abordé dans le cadre d'un pro‐jet personnel ou scolaire.
IV. Annexes
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
15 | P a g e
Diagramme des classes UML de l’application (Fig 1)
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
16 | P a g e
Diagramme des classes UML de la partie ressources humaines (Fig 2)
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
17 | P a g e
Copie d’écran de l’interface graphique de Giproca (Fig 3)
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
18 | P a g e
Diagramme de Gantt de mon stage (Fig 4)
Diagramme des cas d’utilisation (Fig 5)
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
19 | P a g e
package assi.struts.eots.recherche; import javax.servlet.ServletException; import org.apache.struts.action.*; import assi.struts.eots.globals.VariablesGlobales; import assi.struts.eots.sql.*; @SuppressWarnings("serial") public class RechercheActionServlet extends ActionServlet{ private ActionErrors erreursServlet = new ActionErrors(); public void init() throws ServletException{ super.init(); //On initialise l'ensemble des informations nécessaire //à la partie recherche de l'application try { GradeSQL graSQL = new GradeSQL(); EscadronSQL escSQL = new EscadronSQL(); SituFamilleSQL sitSQL = new SituFamilleSQL(); SexeSQL sexSQL = new SexeSQL(); VariablesGlobales.ensGrades = graSQL.getEnsembleGrades(); VariablesGlobales.ensEscadrons = escSQL.getEnsembleEscadrons(); VariablesGlobales.ensSituations = sitSQL.getEnsembleSituationDeFamille(); VariablesGlobales.ensSexes = sexSQL.getEnsembleSexes(); getServletContext().setAttribute("g_listeGrades", VariablesGlo‐bales.ensGrades); getServletContext().setAttribute("g_listeEscadrons", VariablesGlo‐bales.ensEscadrons); getServletContext().setAttribute("g_listeSituations", VariablesGlo‐bales.ensSituations); getServletContext().setAttribute("g_listeSexes", VariablesGlo‐bales.ensSexes); } catch (Exception e) { erreursServlet.add(ActionMessages.GLOBAL_MESSAGE, new ActionMes‐sage("InitServletError", e.toString())); } } public ActionErrors getErreursServlet() { return erreursServlet; } }
RechercheActionServlet.java (Code 1)
ListePersonneBean.java : package assi.struts.eots.recherche;
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
20 | P a g e
import java.util.*; import assi.struts.eots.metiers.Personne; public class ListePersonneBean implements java.io.Serializable { //Cette table contiendra plusieurs lignes //Chaque ligne sera composée des propriétés suivantes // et dans cet ordre : grade, nom d'usage, prénom, nia private String[][] table = null; public ListePersonneBean(LinkedList<Personne> ens) { table = new String[ens.size()][4]; //Enfin, on remplit avec les infos de la personne Iterator<Personne> it = ens.iterator(); int i = 0; while (it.hasNext()) { int j = 0; Personne current = it.next(); table[i][j++] = current.getGradeActuel().lcGrade; table[i][j++] = current.nomUsage; table[i][j++] = current.prenom; table[i][j++] = current.nia + " " + current.cle_nia; i++; } } public String[][] getTable() { return table; } public String[] getTable(int i) { return table[i]; } } InfosPersonneBean.java : package assi.struts.eots.recherche; import assi.struts.eots.metiers.PersonneInfosSimple; public class InfosPersonneBean implements java.io.Serializable { private String[] infosPersonne; private String referer; public InfosPersonneBean(PersonneInfosSimple pers, String ref) { infosPersonne = pers.toArray(false);; referer = ref; } public String getInfosPersonne(int i) { return infosPersonne[i]; } public String[] getInfosPersonne() { return infosPersonne; } public String getReferer() { return referer; } }
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
21 | P a g e
Les différents JavaBean (Code 2)
package assi.struts.eots.recherche; import java.io.IOException; import javax.servlet.ServletException; import java.sql.*; import java.util.LinkedList; import javax.servlet.http.*; import org.apache.struts.action.*; import assi.struts.eots.exception.SQLConnectionBaseException; import assi.struts.eots.metiers.Personne; import assi.struts.eots.sql.*; public class RechercheMulticriteresAction extends Action { public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { //Récupération et vérification des erreurs de la servlet ActionErrors errors = ((RechercheActionServlet)this.getServlet()).getErreursServlet(); if (!errors.isEmpty()) { this.saveErrors(request, errors); return mapping.findForward("afficherErreursSysteme"); } // Déclaration d'un tableau d'erreurs permettant de les enregistrer // si une erreur survient. ActionErrors tabErreurs = new ActionErrors(); // Récupération des données du formulaire String nom = (String) ((RechercheMultiForm) form).get("nom"); String prenom = (String) ((RechercheMultiForm) form).get("prenom"); String grade = (String) ((RechercheMultiForm) form).get("grade"); String escadron = (String) ((DynaActionForm) form).get("escadron"); String sexe = (String) ((DynaActionForm) form).get("sexe"); String situation = (String) ((DynaActionForm) form).get("situation"); // On nettoie les chaines de caractères ci‐dessus afin qu'elles // ne provoque pas d'erreur SQL. (attention au apostrophes simples // par exemple). nom.replaceAll("'","''"); prenom.replaceAll("'","''"); // On se connecte à la base maintenant et on effectue une recherche // en fonction des paramètres non nulls. PersonneSQL persSQL = null; try { persSQL = new PersonneSQL(); } catch (ClassNotFoundException exc1) {
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
22 | P a g e
tabErreurs.add(ActionErrors.GLOBAL_MESSAGE, new ActionMes‐sage("ProgError", "ClassNotFoundException lancée")); saveErrors(request, tabErreurs); return mapping.findForward("afficherErreursSysteme"); } catch (SQLConnectionBaseException exc2) { tabErreurs.add(ActionErrors.GLOBAL_MESSAGE, new ActionMes‐sage("SQLConnectionError")); saveErrors(request, tabErreurs); return mapping.findForward("afficherErreursSysteme"); } catch (SQLException exc3) { tabErreurs.add(ActionErrors.GLOBAL_MESSAGE, new ActionMes‐sage("ProgError", "SQLException lancée par la création du statement")); saveErrors(request, tabErreurs); return mapping.findForward("afficherErreursSysteme"); } try { // Suivant le nombre de résultat on affiche une vue différente // En effet, si on a un seul résultat on affiche les infos de la // personne en question, sinon (on a plusieurs résultats) on reste // sur la vue recherche multicritères et on affiche le tableau des // personnes correspondantes aux critères. LinkedList<Personne> ensPersonne = persSQL.getEnsemblePersonnesParCriteres(nom, prenom, grade, escadron, sexe, situation); persSQL.setHistoriqueGrades(ensPersonne); int nb_lignes = persSQL.getNbPersonnesParCriteres(nom, prenom, grade, escadron, sexe, situation); if (nb_lignes == 0) { tabErreurs.add(ActionErrors.GLOBAL_MESSAGE, new ActionMes‐sage("NoResultsFound")); saveErrors(request, tabErreurs); return mapping.findForward("afficherErreursRecherche"); } else if (nb_lignes == 1) { String nia_personne = ensPersonne.getFirst().nia; request.setAttribute("infosPersonne", new InfosPersonne‐Bean(persSQL.getPersonneParNIA(nia_personne), "multi")); return mapping.findForward("afficherInfoUnique"); } else { request.setAttribute("listePersonnes", new ListePersonne‐Bean(ensPersonne)); return mapping.findForward("afficherInfosMultiples"); } } catch (SQLException e) { tabErreurs.add(ActionErrors.GLOBAL_MESSAGE, new ActionMes‐sage("SQLQueryError",e.toString()));
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
23 | P a g e
e.printStackTrace(); saveErrors(request, tabErreurs); return mapping.findForward("afficherErreursSysteme"); } } }
RechercheMulticriteresAction.java (Code 3)
Recherche.Multicriteres.jsp : <%@ page language="java" contentType="text/html; charset=ISO‐8859‐1" pageEncoding="ISO‐8859‐1"%> <%@ taglib uri="/WEB‐INF/struts‐html.tld" prefix="html" %> <%@ taglib uri="/WEB‐INF/struts‐bean.tld" prefix="bean" %> <%@ taglib uri="/WEB‐INF/struts‐logic.tld" prefix="logic" %> <p>Le formulaire ci‐dessous vous permet d'accéder à une recherche s'effectuant sur l'ensemble du personnel. L'ensemble des informations à renseigner sont bien entendu faculta‐tives.</p> <p class="warning">La recherche sur les noms et prénoms s'effectue en suivant une régle simple et précise : seul les noms/prénoms contenant le mot donné sont conservés à l'issue de la recherche. Ainsi si vous tapez seulement 'AL' dans la champ 'NOM', vous obtiendrez tous les noms contenant par 'AL' (par exemple 'ALBERT' ou 'RIALBET'). La recherche est également insensible à la casse des caractères.</p> <html:form action="/rechercheMulticriteres" styleId="boite_recherche"> <html:xhtml/> <table class="left"> <tr> <td class="titre_champ">Nom :</td> <td class="champ"><html:text name="rechercheMultiForm" property="nom" /><span class="exemple">ex : MARTIN, dup ...</span></td> </tr> <tr> <td class="titre_champ">Prénom :</td> <td class="champ"><html:text name="rechercheMultiForm" property="prenom" /><span class="exemple">ex : Céline, Mic ...</span></td> </tr> <tr> <td class="titre_champ">Grade :</td> <td class="champ"> <html:select name="rechercheMultiForm" proper‐ty="grade"> <html:option value="Sans Importance">Sans Importance</html:option> <html:options collection="g_listeGrades" property="nomGrade"/> </html:select> </td> </tr>
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
24 | P a g e
<tr> <td class="titre_champ">Escadron :</td> <td class="champ"> <!‐‐<select size="3"> <option selected>Sans importance</option> <option>Premier escadron</option> <option>Second escadron</option> </select>‐‐> <html:select name="rechercheMultiForm" proper‐ty="escadron"> <html:option value="Sans Importance">Sans Importance</html:option> <html:options collection="g_listeEscadrons" property="nomEscadron"/> </html:select> </td> </tr> <tr> <td class="titre_champ">Sexe :</td> <td class="champ"> <table style="width:auto"> <tr> <td>Sans importance : </td> <td><html:radio property="sexe" value="I" /></td> </tr> <tr> <td>M : </td> <td><html:radio property="sexe" value="M" /></td> </tr> <tr> <td>F : </td> <td><html:radio property="sexe" value="F" /></td> </tr> </table> </td> </tr> <tr> <td class="titre_champ">Situation familiale :</td> <td class="champ"> <!‐‐<select> <option selected>Sans importance</option> <option>Célibataire</option> <option>En Concubinage</option> <option>Pacsé</option> <option>Marié</option> <option>Divorcé</option> </select>‐‐> <html:select name="rechercheMultiForm" proper‐
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
25 | P a g e
ty="situation"> <html:option value="Sans Importance">Sans Importance</html:option> <html:options collection="g_listeSituations" property="lcSituation"/> </html:select> </td> </tr> <tr><td style="text‐align:center" cols‐pan="2"><html:submit>Rechercher</html:submit></td></tr> </table> </html:form> <html:errors/> <logic:present name="listePersonnes"> <div class="box"> <h2>Résultats de la recherche</h2> <table style="width: 100%;"> <tr> <td> <strong>Grade</strong> </td> <td> <strong>Nom</strong> </td> <td> <strong>Prénom</strong> </td> <td> <strong>Nia</strong> </td> </tr> <logic:iterate id="indice_i" name="listePersonnes" proper‐ty="table"> <tr> <logic:iterate id="indice_j" name="indice_i"> <td> <bean:write name="indice_j"/> </td> </logic:iterate> </tr> </logic:iterate> </table> </div> </logic:present> Affichage.Infos.Personne.jsp : <%@ page language="java" contentType="text/html; charset=ISO‐8859‐1" pageEncoding="ISO‐
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
26 | P a g e
8859‐1"%> <%@ taglib uri="/WEB‐INF/struts‐html.tld" prefix="html" %> <%@ taglib uri="/WEB‐INF/struts‐bean.tld" prefix="bean" %> <%@ taglib uri="/WEB‐INF/struts‐logic.tld" prefix="logic" %> <%@ page import="assi.struts.eots.recherche.InfosPersonneBean" %> <div class="box"> <h2>Informations générales sur <bean:write name="infosPersonne" property="infosPersonne[0]" /> <% String[] tab = ((InfosPersonne‐Bean)request.getAttribute("infosPersonne")).getInfosPersonne(1).split(" "); out.print(tab[0]); %> </h2> <img src="http://annuv2.air.defense.gouv.fr/images/anonyme.jpg" style="float:right;height:150px;width:120px;"/> <div class="sous_bloc"> <h3>Noms</h3> <div class="forma_ligne"> <span class="titre_ligne">Nom d'usage ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[0]" /></span> </div> <div class="forma_ligne"> <span class="titre_ligne">Nom patronymique ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[3]" /></span> </div> <div class="forma_ligne"> <span class="titre_ligne">Prénoms ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[1]" /></span> </div> </div> <div class="sous_bloc"> <h3>Identifiants</h3> <div class="forma_ligne"> <span class="titre_ligne">NIA ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[2]" /></span> </div> <div class="forma_ligne"> <span class="titre_ligne">Clé NIA ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[4]" /></span> </div> <div class="forma_ligne"> <span class="titre_ligne">NID ::</span> <span class="valeur_ligne"><bean:write
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
27 | P a g e
name="infosPersonne" property="infosPersonne[5]" /></span> </div> <div class="forma_ligne"> <span class="titre_ligne">Badge ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[6]" /></span> </div> </div> <div class="sous_bloc"> <h3>Contact</h3> <div class="forma_ligne"> <span class="titre_ligne">Numéro téléphone fixe ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[8]" /></span> </div> <div class="forma_ligne"> <span class="titre_ligne">Numéro teléphone portable ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[9]" /></span> </div> <div class="forma_ligne"> <span class="titre_ligne">Courriel ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[10]" /></span> </div> </div> <div class="forma_ligne"> <span class="titre_ligne">Date de naissance ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[7]" /></span> </div> <div class="forma_ligne"> <span class="titre_ligne">Volantaire OPEX ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[11]" /></span> </div> <div class="forma_ligne"> <span class="titre_ligne">Volantaire OPIN ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[12]" /></span> </div> <div class="forma_ligne"> <span class="titre_ligne">Volantaire Outre‐Mer ::</span> <span class="valeur_ligne"><bean:write name="infosPersonne" property="infosPersonne[13]" /></span> </div> </div> <logic:equal name="infosPersonne" property="referer" value="nia"> <html:link page="/retourRechercheNIA.do">Retour à la recherche
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
28 | P a g e
NIA</html:link> </logic:equal> <logic:equal name="infosPersonne" property="referer" value="multi"> <html:link page="/retourRechercheMulticriteres.do">Retour à la recherche multicritères</html:link> </logic:equal> Erreurs.Sytemes.jsp : <%@ page language="java" contentType="text/html; charset=ISO‐8859‐1" pageEncoding="ISO‐8859‐1"%> <%@ taglib uri="/WEB‐INF/struts‐html.tld" prefix="html" %> <p>Les erreurs système suivantes se sont produites :</p> <html:errors/> <html:link page="/retourRechercheMulticriteres.do">Retour à la re‐cherche</html:link>
Les vues de la recherche (Code 4)
<?xml version="1.0" encoding="iso‐8859‐1" ?> <!DOCTYPE struts‐config PUBLIC "‐//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://36.74.12.66:8080/projet/dtds/struts‐config_1_3.dtd"> <struts‐config> <form‐beans> <form‐bean name="rechercheMultiForm" type="assi.struts.eots.recherche.RechercheMultiForm"> <form‐property name="nom" type="java.lang.String" /> <form‐property name="prenom" type="java.lang.String" /> <form‐property name="grade" type="java.lang.String" /> <form‐property name="escadron" type="java.lang.String" /> <form‐property name="sexe" type="java.lang.String" /> <form‐property name="situation" type="java.lang.String" /> </form‐bean> </form‐beans> <global‐forwards> <forward name="aller_vers_index_recherches" path="indexRecherches.do" /> </global‐forwards> <action‐mappings> <!‐‐ Début des actions pour la recherche multicritères ‐‐> <action path="/rechercheMulticriteres" name="rechercheMultiForm"
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
29 | P a g e
validate="false" scope="session" type="assi.struts.eots.recherche.RechercheMulticriteresAction"> <forward name="afficherErreursSysteme" path="erreurs.systeme" /> <forward name="afficherInfoUnique" path="infos.personne" /> <forward name="afficherInfosMultiples" path="recherche.multicriteres" /> <forward name="afficherErreursRecherche" path="recherche.multicriteres" /> </action> <action path="/retourRechercheMulticriteres" parameter="recherche.multicriteres" type="org.apache.struts.actions.ForwardAction" /> <action path="/accesRechercheMulticriteres" parameter="recherche.multicriteres" type="org.apache.struts.actions.ForwardAction" /> <!‐‐ Fin des actions pour la recherche multicritères ‐‐> </action‐mappings> <message‐resources parameter="assi.struts.eots.recherche.AppsResources" null="false" /> <plug‐in className="org.apache.struts.tiles.TilesPlugin"> <set‐property property="definitions‐config" value="/WEB‐INF/tiles‐defs.xml" /> <set‐property property="moduleAware" value="true" /> <set‐property property="definitions‐parser‐validate" value="true" /> </plug‐in> <plug‐in className="org.apache.struts.validator.ValidatorPlugIn"> <set‐property property="pathnames" value="/WEB‐INF/validator‐rules.xml,/WEB‐INF/validator.xml" /> </plug‐in> </struts‐config>
Struts‐config.xml (Code 5)
V. Références
Apache Software Foundation (http://www.apache.org) Le framework Struts (http://struts.apache.org) Site officiel de l'Armée de l'Air ‐ Ministère de la Défense (http://www.defense.gouv.fr/air/) PostgreSQL, le SGBD Open Source de référence (http://www.postgresqlfr.org) Subversion : Tigris.org (http://subversion.tigris.org) Apache Tomcat (http://tomcat.apache.org) W3C, The World Wide Web Consortium (http://www.w3c.org)
Rapport de stage – Cyril Mottier
3INFO – année 2006/2007
30 | P a g e
VI. Glossaire
ASSI : Antenne de Soutien des Systèmes d’Informations CDC : Centre de Détection et de Contrôle Cdt : Commandant Cne : Capitaine Giproca : Gestion de l’Instruction PRofessionnelle des Opérateurs et Contrôleurs Aériens (nom donnée à l’application permettant cette gestion)
JDBC : Java DataBase Connectivity JSP : Java Server Pages Lcl : Lieutenant Colonel Maj : Major MCD : Modèle Conceptuel de Données MVC : Modèle – Vue – Contrôleur OS : Operating System (système d’exploitation) SGBD : Système de Gestion de Base de Données Sgt : Sergent SIGAPAIR : Système d’Information de Gestion et d’Administration du Personnel de l’armée de l’AIR (Nom du réseau des ressources humaines de l’Armée de l’Air)
W3C : World Wide Web Consortium WTP : Web Tools Platform