TP7 Applications web : utilisation d'une base de données

De $1

Version de 17:09, 24 Avr 2024

cette version.

Revenir à liste des archives.

Voir la version actuelle

Introduction

Création d'un projet

A l'aide de netbeans 6.8, vous allez créer un nouveau projet de type "java web/web application". Lors de la création une des étapes correspond à l'écran suivant. Précisez bien que vous allez utiliser glassfish v3, que vous allez faire du Java EE 6 (pas 5 !) et que vous voulez utiliser l'injection de code dans les sources du projet. Rappel : l'injection de code est le fait d'utiliser des annotations de code et de pouvoir utiliser des variables sans les avoir initialisées au préalable.

Snap12.jpg

Création d'une base de données vide

Dans ce TP nous allons réaliser une version modifiée du TP3 sur le gestionnaire d'utilisateurs, à la différence près que nous allons utiliser une vraie base de données relationnelle en lieu et place de la base de données XML du TP3. Nous allons donc créer une base de données vide (sans tables) pour nos utilisateurs.

Allez dans l'onglet "services" et cliquer avec le bouton de droite sur l'icone "JavaDB" qui est le SGBD livré d'origine avec le JDK. Il s'agit d'un véritable SGBD, complet, écrit en java. Il s'appelle Derby. Pour information, les bases sont stockées sous windows dans le répertoire .netbeans-derby situé sous documents and settings/user/<votre nom>...

Snap2.jpg

Appelez la base comme vous voulez, je l'ai appelée "utilisateurs". Mettez un login et un mot de passe, c'est fortement recommandé, et vous évitera des déboires par la suite (notez que la dernière ligne vous indique le chemin du répertoire de la base)

Snap3.jpg

Une connexion est automatiquement ajoutée à la liste des connexions dans l'onglet "services", cette "connexion" vous permettra d'administrer la base de données depuis netbeans, qui contient un outil très pratique pour cela (et qui marche avec tout type de SGBD : MySQL, etc.). Faites clic droit / se connecter :

Snap4.jpg

La connexion est maintenant exploitable en cliquant sur le petit "+", pour le moment, rien d'intéressant dedans, elle est vide ! Pas de tables, rien !

 

Création d'un modèle (classe entité) d'Utilisateur et d'un gestionnaire de persistence

Nous allons maitenant ajouter une classe "modèle" à notre projet. On l'appellera "Utilisateur". Les modèles ont toujours un nom, en gros le nom de la table dans laquelle les instances de ce modèle seront stockées. Pour créer un modèle : clic droit sur le projet et nouveau/classe entité :

Snap5.jpg

Vous appelerez ce modèle "Utilisateur" (et pas User car User est un mot clé reservé SQL et cela peut poser problème), le placerez dans le package utilisateurs.modeles, lui donnerez comme clé primaire un type int, et pour finir vous allez créer une "unité de persistence" :

Snap13.jpg

L'unité de persistence est l'outil qui va faire la connexion avec la base de données et qui servira à générer automatiquement les requêtes SQL. Il utilisera en coulisse un outil de mapping relationnel / objet (ici EclipseLink, mais déroulez le menu, vous verrez qu'on a le choix) :

Snap14.jpg

On précise ensuite pour la nouvelle source de données que le serveur va connecter, un nom "logique", qui est libre, c'est le nom "au sens de JNDI", l'API de Java qui permet de "nommer" des ressources. On choisit parmi les connexions ouvertes dans netbeans celle qui correspond à la base sur laquelle l'application va travailler. Ici on dit que le base dont le nom est "BaseUsers" est en réalité une base Derby, sur localhost, port 1527. Le login et le password seront récupérés par netbeans et seront ajouté à un fichier de config xml que nous verrons un peu plus loin.

Snap15.jpg

Enfin, on peut indiquer à l'unité de persistence sa "stratégie" : lorsqu'on déploie l'application on lui demande de supprimer les tables et de les recréer automatiquement. Cette stratégie est utile lorsque les tables sont créées à partir des classes et que le contenu des classes modèles peut évoluer. Une fois les modèles figés, en général on passe en mode "ne rien modifier", ou juste "créer" ce qui ne permettra que de rajouter des tables lorsqu'on crééera de nouveaux modèles :

Snap16.jpg

Finalement, après ces étapes, on obtient à la fois une classe modèle pour les utilisateurs (on les appelle des "classes entités", Entity en anglais) et des fichiers de description XML à la fois pour l'unité de persistence et pour la source de données qu'on va déployer sur le serveur.

Code de l'entité générée, noter les annotations de code @Entity (qui dit : attention, se mappe sur une table ayant le même nom, mais tout en majuscule, ici la table UTILISATEUR), @Id qui indique la clé primaire, et @GeneratedValue(...) qui indique que l'on veut une clé auto-incrémentée :

@Entity
public class Utilisateur implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String firstname;
    private String lastname;
    private String login;

    public User() {
    }

    public Utilisateur (final String login, final String lastname, final String firstname) {
        this.login = login;
        this.lastname = lastname;
        this.firstname = firstname;
    }
...

Notons également les fichiers XML générés. Persistence.xml correspond au gestionnaire de persistence. Vous pouvez double-cliquer dessus pour obtenir la fenêtre d'édition, aller voir le source XML :

Snap17.jpg

persistence.xml est un fichier standard JavaEE, alors que le fichier sun-resource.xml est propriétaire et spécifique au serveur glassfish v3. Le lien entre les deux c'est le nom JNDI de la base. Regardez les sources des fichiers XML pour vous faire une idée !

Complétons la classe entité avec des constructeurs, des accesseurs, des modifieurs

 Ajoutez maitenant un constructeur avec paramètres et un constructeur sans paramètre (obligatoire pour les beans), des accesseurs et des modifieurs (clic droit, insérer du code/getter and setter) :

@Entity
public class Utilisateur implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    private String firstname;
    private String lastname;
    private String login;

       public Utilisateur() {
    }

    public Utilisateur(final String login, final String lastname, final String firstname) {
        this.login = login;
        this.lastname = lastname;
        this.firstname = firstname;
    }

    public String getFirstname() {
        return firstname;
    }

    public void setFirstname(String firstname) {
        this.firstname = firstname;
    }

...

En général dans les modèles ont ne rajoute pas grand chose à part des getters et des setters...

Ajout d'un gestionnaire d'utilisateurs

Vous devez commencer à être habitués à ce genre d'architecture. Devant un modèle on met un "handler" ou "une façade" ou un "Data Access Object (DAO)", ou un "gestionnaire"...  Ici on va créer une classe GestionnaireUtilisateur. Comme on fait du java EE "moderne", on va utiliser un composant spécial appelé un Enterprise Java Bean stateless (cours complet l'an prochain), c'est en gros une classe que l'on aura pas besoin d'instancier.