Etant donnée la hiérarchie de classes et d`interfaces suivante :

Transcription

Etant donnée la hiérarchie de classes et d`interfaces suivante :
Master Pro Compétence Complémentaire en Informatique
Programmation et Langages - Applications Internet
Examen : jeudi 28 mars 2013
Durée 3h
Documents autorisés
Bien que le sujet forme un tout cohérent, les questions peuvent être traitées de manière indépendante.
La compagnie IM2AG-AIRLINES développe pour la gestion de ses vols aériens une application Web qui entre autres
permet à ses passagers de choisir leurs places sur les vols et de s'enregistrer en ligne.
La couche métier
Pour réaliser cette application IM2AG-AIRLINES a choisi d'utiliser des technologies Java. Pour modéliser les différentes
entités impliquées dans l'application, un ensemble de classes ont été définies. Le diagramme de classes UML donné en
annexe 1 montre les différentes classes de ce modèle et les relations qui les relient.
La classe Passager représente un voyageur. Un voyageur possède les attributs suivants :
 String id : identifiant du voyageur (qui lui a été attribué lorsqu'il a été enregistré dans le système),
 String nom : le nom du voyageur,
 String prenom : le prénom du voyageur,
 List<Billet> billets : la liste des billets que le voyageur a acheté à la compagnie.
Un billet, représenté par la classe Billet est défini par les informations suivantes :
 Vol vol : le vol correspondant à ce billet,
 int noPlace : le numéro de place sur ce vol.
Pour chaque vol les attributs suivants sont définis dans la classe Vol :
 String id : l’identifiant du vol (une chaîne de caractères),
 Aeroport depart : l’aéroport de départ,
 Aeroport arrivee : l’aéroport d’arrivée,
 dateDepart : la date de départ (jour et heure),
 int duree: la durée du vol (en minutes),
 String[] places : un tableau de chaînes de caractères de taille le nombre de places du vol qui permet de
gérer l'affectation des places aux passagers : places[i] vaut null si la place de numéro i+1 est libre, sinon
elle contient la chaîne identifiant le passager qui l’occupe,
 List<Zone> zones : la liste des différentes zones de répartition des places.
Sur un vol, les places sont réparties selon différentes zones. A chaque zone est associé un tarif de base particulier. Chaque
zone est définie par le numéro de la place à laquelle elle débute et le nombre de places consécutives qu’elle contient.
Deux types de zones sont distingués : les zones affaires (business) qui bénéficient des meilleures prestations et les zones
économiques aux prestations moindres. Pour les zones économiques les prestations considérées sont la mise à disposition
ou non d’un système de vidéo individuel et le nombre de repas servis durant le vol. Pour les zones business, certaines
peuvent offrir un accès internet durant le vol, d’autres non. Ces prestations conduisent à un supplément qui vient s’ajouter
au tarif de base pour le calcul du tarif d’une place. Le calcul de ce supplément est le suivant :
 Zone économique : 20 € par repas servi en vol auxquels s’ajoutent 10 € si un système de vidéo individuel est
disponible.
 Zone business : 30 € si accès à internet
Page 1/6
Les attributs définis dans la classe Zone sont :
 int noPlaceDebut : le numéro de la première place de la zone.
 int nbPlaces : le nombre de places de la zone
 double tarifBase : le tarif de base de la zone
Outre les accesseurs (getNbPlaces(),getNoPlaceDebut(),getTarifBase()) la classe Zone définit les méthodes
suivantes :
 getNoPlaceFin() : qui retourne le numéro de la dernière place de la zone.
 getSupplement() : qui retourne le supplément à payer pour cette zone selon les prestations offertes.
 getTarif() : qui retourne le tarif des billets pour cette zone.
La classe ZoneBusiness définit un attribut supplémentaire, boolean internet qui indique si internet est accessible
en vol pour les sièges de cette zone; attribut consultable par la méthode hasInternet().
La classe ZoneEco définit deux attributs supplémentaires :
 int nbreRepas qui indique le nombre de repas qui seront servis durant le vol (et facturés en supplément) et est
consultable par la méthode getNbreRepas().
 boolean videoIndiv qui indique si les sièges de cette zone disposent ou non d’un système de vidéo
individuelle (facturé en supplément dans le cas où il est présent). Cet attribut est consultable par la méthode
hasVideoIndiv().
Finalement, la classe Aeroport définit les attributs suivants :
 String code : le code AITA1 (ou code IATA) de l'aéroport,
 String nom : le nom de l'aéroport,
 String pays : le nom du pays où est situé l'aéroport.
Par exemple l'aéroport de Vancouver (Canada) a pour nom Vancouver International Airport et pour code YVR.
Question 1 : les annexes 2 et 3 donnent une partie du code Java des classes Zone et ZoneEco. Complétez ce code sur les
feuilles annexe 2 et annexe 3 que vous joindrez à votre copie
Question 2 : l'annexe 4 contient le squelette de la classe Vol. A quoi servent les instructions import situées en début de
ce code ? Que se passerait-il si elles étaient absentes ?
Question 3 : Complétez le code de la classe Vol sur la feuille annexe 4 que vous joindrez à votre copie.
1
l'Association Internationale du Transport Aérien
Page 2/6
La couche de persistance des données
Les informations relatives aux passagers, billets, vols, etc., sont stockées dans une base de données relationnelle. Parmi
les tables définies, nous nous intéresserons plus particulièrement aux tables PASSAGERS et BILLETS.
La table PASSAGERS contient la description des différents aéroports :
 ID (VARCHAR(7)) : l'identifiant du passager,
 NOM (VARCHAR) : le nom du passager,
 PRENOM (VARCHAR) : le prénom du passager.
La table BILLETS contient la description des différents billets :
 NO_VOL (VARCHAR(6)) : le numéro du vol correspondant à ce billet,
 ID_PASSAGER (VARCHAR(7)) : l'identifiant du passager,
 NO_PLACE (INTEGER) : le numéro de la place du passager si il en a une d'attribuée, 0 sinon.
La table VOLS contient la description des différents vols, nous ne rentrerons pas dans les détails concernant cette table et
les autres tables du système.
Le code pour les classes DAO chargées de faire les échanges entre le code Java et la base de données a commencé à être
écrit en utilisant l’API JDBC. Une super-classe AbstractDatabaseDAO a été définie, toutes les classes de DAO en
héritent.
package im2ag.airlines.com.dao;
import java.sql.Connection;
import java.sql.SQLException;
import javax.sql.DataSource;
public abstract class AbstractDataBaseDAO {
protected DataSource dataSource;
protected AbstractDataBaseDAO (DataSource dataSource) {
this.dataSource = dataSource;
}
protected void closeConnection(Connection c) throws SQLException {
if (c != null) {
c.close();
}
}
}
Page 3/6
Concernant les passagers, une classe PassagerDAO a été définie, mais son code n’a pas été terminé.
package im2ag.airlines.com.dao;
import
import
import
import
import
im2ag.airlines.com.model.Passager;
im2ag.airlines.com.model.Billet;
java.sql.Connection;
java.sql.SQLException;
javax.sql.DataSource;
/** DAO (Data Acces Object) : cherche dans la base de données les informations relatives
* aux Passagers */
public class PassagerDAO extends AbstractDataBaseDAO {
public PassagerDAO(DataSource ds) {
super(ds);
}
/**
* construction d'un objet Passger à partir des informations contenues dans les
* tables PASSAGERS et BILLETS de la base de données.
* @param idPassager l'identifiant du passager à charger
* @return un objet Passager représentant le Passager considéré, null si il n'y a pas
*
de passager identifié par idPassager.
* @throws SQLException si un problème lors de l'accès aux données.
*/
public Passager loadPassager(String idPassager) throws SQLException {
Connection conn = null;
try {
conn = dataSource.getConnection();
//
//
//
//
//
//
//
A COMPLETER
chercher dans la table PASSAGERS les infos relatives au passager idPassager 2
construire un objet passager
chercher dans la tables BILLETS les infos relatives aux billets de ce passager3
pour chaque billet du passager construire un objet Billet et le rajouter
à liste des billets du passager.
retourner l'objet Passager.
}
finally {
closeConnection(conn);
}
}
}
Question 4 : Selon vous, quel est l’intérêt de la classe AbstractDataBaseDAO ?
Question 5 : Dans la méthode loadPassager de la classe PassagerDAO une connexion JDBC est obtenue par un
message getConnection envoyé à la dataSource définie dans la classe AbstractDataBaseDAO.
a) L’objet représentant la connexion JDBC à la base de donnée est accédé au travers d’une référence conn. Celle-ci est
déclarée avec le type java.sql.Connection qui est une interface Java. Quelle est la classe réelle de l’objet référencé
par conn ? Où est-elle définie ? Pourquoi typer conn avec l’interface java.sql.Connection plutôt qu’avec cette
classe réelle ?
b) Pourquoi cette connexion est-elle fermée dans une clause finally ? Que se passerait-il si cette instruction de
fermeture était absente ?
Question 6 : Complétez le code de la méthode loadPassager de la classe PassagerDAO.
La documentation de la classe Passager vous est donnée en annexe 5. Pour créer les objets Billets, on utilisera les
services de la classe BilletFactory dont la documentation vous est donnée en annexe 6.
2
La requête SQL pour sélectionner le passager d'identifiant X234ZTY :
SELECT * FROM PASSAGERS WHERE ID ='X234ZTY'
3
La requête SQL pour sélectionner les billets du passager d'identifiant X234ZTY :
SELECT * FROM BILLETS WHERE ID_PASSAGER ='X234ZTY'
Page 4/6
Application WEB
La page d'accueil du site affiche un formulaire qui permet à un utilisateur de se connecter en fournissant son identifiant.
La demande de connexion est transmise à une servlet (ConnexionServlet) qui se charge de récupérer les informations
associé à l'utilisateur et de le rediriger vers une page (Billets.jsp). Cette page affiche la liste des billets du passager
avec la possibilité de modifier son numéro de place.
Question 7 : L'identifiant donné dans le formulaire de connexion est une suite de 7 caractères alphanumériques (lettre ou
chiffre). Comment vérifier que l'utilisateur respecte cette contrainte ?
Le code de la Servlet ConnexionServlet a commencé à être écrit. Il vous est donné en annexe 7.
Question 8 : Lignes 14 et 17 de ce code se trouvent deux annotations :
@WebServlet(name = "ActionsConnecter", urlPatterns = {"/connexion"})
@Resource(name = "jdbc/im2agAirlines")
Expliquez en quelques phrases à quoi servent ces annotations.
Question 9 : La ligne 34, provoque une erreur de compilation. Le message affiché est le suivant :
Quelle est la cause de ce message ? Indiquez en quelques mots la correction que vous proposeriez.
Question 10 : Certains traitements sont simplement décrits sous la forme de commentaires.
ligne 33 : String id = ""; // TODO recupérer l'identifiant de l'utilisateur
ligne 36 : // TODO sauvegarder l'objet passager comme attribut du contexte adéquat
// (application, session, requête)
// rediriger vers la page Billets.jsp
ligne 40 : // TODO revenir sur la page d'accueil avec le message d'erreur
Page 5/6
Ecrire le code Java correspondant à ces différents traitements. Pour le traitement ligne 36, vous justifierez en quelques
mots le choix effectué pour le contexte de sauvegarde de l'objet Passager.
L'affichage de la liste des billets d'un passager est effectué par la page Billets.jsp, dont le squelette vous est donné en annexe 8.
Les billets sont affichés comme éléments d'un liste non numérotée (balise <ul>). L'aéroport de départ, l'aéroport d'arrivée, la durée
du vol, le numéro de la place, le bouton permettant de la modifier sont également affichés à l'aide d'une liste non numérotée. La figure
ci-dessous donne un aperçu de ce que serait l'affichage sans l'application de styles CSS.
Le bouton Modifier associé à chaque billet, permet à l'utilisateur de choisir/modifier sa place sur le vol correspondant. Ce bouton
est un bouton de type submit qui envoie une requête HTTP à une servlet (ChoixPlaceServlet) qui récupère comme attribut du
contexte d'application l'objet Java représentant le vol concerné et redirige la requête vers une page JSP ( choixPlace.jsp). Cette
page affiche un plan de la cabine sur lequel l'utilisateur pourra choisir son siège.
Question 11 :
a) Quel(s) paramètre(s) est-il nécessaire d'insérer à la requête HTTP transmise à la servlet ChoixPlaceServlet ?
b) A votre avis pourquoi les objets correspondant aux vols sont-ils stockés comme attributs de l'application ?
Question 12 : Complétez le code de la page JSP Billets.jsp (voir annexe 8) en y intégrant le code correspondant à
l'affichage dynamique des données du passager connecté.
On s'intéressera uniquement au code JSP et HTML, la mise en forme étant assurée par une feuille de styles CSS
(im2agAirlines.css) qui vous est donnée.
Page 6/6

Documents pareils