Copy of https://perso.isima.fr/loic/java/exo_jee_jsp_bdd.php
tete du loic

 Loïc YON [KIUX]

  • Enseignant-chercheur
  • Référent Formation Continue
  • Responsable des contrats pros ingénieur
  • Référent entrepreneuriat
  • Responsable de la filière F2 ingénieur
  • Secouriste Sauveteur du Travail
mail
loic.yon@isima.fr
phone
(+33 / 0) 4 73 40 50 42
location_on
Institut d'informatique ISIMA
  • twitter
  • linkedin
  • viadeo

[JEE] JSP & BDD

 Cette page commence à dater. Son contenu n'est peut-être plus à jour. Contactez-moi si c'est le cas!

Date de première publication : 2012/05/12

Objectif et contexte

L'objectif de cet exercice est d'afficher des données issues d'une base de données dans une page JSP. On va faire cela à l'ancienne (disons comme en 2007), grâce à JDBC.

L'exercice nécessite un conteneur de servlet : celui de Glassfish ou Apache Tomcat. Côté moteur de bases de données, on peut utiliser Java DB (Apache DB/Derby) embarqué avec Glassfish ou MySQL ou encore tout autre moteur à votre goût.

Pour utiliser une base de données en Java avec JDBC, il faut utiliser un driver que l'on appelle également connecteur. Il faut installer le connecteur qui correspond pour le conteneur Web que l'on veut utiliser. Le driver pour MySQL connector/j se télécharge sur le site MySQL.

Préparation de l'environnement

Pour manipuler des données, il faut tout d'abord créer une base et injecter quelques données, voici comment faire ...

Avec une base MySQL

On se connecte à la base :

$ mysql -h localhost -u root -p

Il est également possible d'enregistrer un serveur MySQL dans Netbeans : il faudra entre autres donner le chemin d'un outil d'administration comme mysqladmin (ou un outil graphique si vous avez). On peut jouer avec le clic droit pour créer des connexions, créer des bases, ...

Quand une connexion est créée, elle apparait un peu en dessous de la liste des serveurs. Avec cette connexion, on dispose d'une interface graphique propre à Netbeans pour la manipulation/visualisation des données.

Et on crée la base de données, une table et des données avec les instructions SQL classiques suivantes :

create database exo1;
use exo1;
create table utilisateurs(nom char(50), mdp char(20), tel char(15)) type=innoDB;
-- alter table utilisateurs type innoDB;
alter table utilisateurs add primary key (nom);
desc utilisateurs;
insert into utilisateurs (nom, mdp, tel) values ('loic', '', '5042');
select * from utilisateurs;

Pour installer le connecteur avec une des dernières versions de Tomcat (Testé pour un Tomcat 7), il faut poser le fichier jar du connecteur dans le répertoire lib et redémarrer le serveur pour l'utiliser. C'est un tout petit plus compliqué pour des versions antérieures mais c'est bien expliqué dans la documentation du connecteur.

Pour installer le connecteur avec Glassfish, c'est également super simple : le fichier jar est à copie dans le répertoire glassfish/modules et il faut redémarrer le serveur.

Avec Apache Derby

Derby/Java DB, projet au sein d'Apache DB, est livré avec différents utilitaires

Lancer l'utilitaire ij en ligne de commande ou embarqué dans le jar (Derby est écrit en java!) et taper les lignes suivantes.

connect 'jdbc:derby://localhost:1527/exo1;create=true'
connect 'jdbc:derby://localhost:1527/exo1;create=true' user 'loic' password 'mdp'
show tables;
create table utilisateurs(nom char(50) not null, mdp char(20), tel char(15));
alter table utilisateurs add primary key (nom);
describe utilisateurs;
insert into utilisateurs (nom, mdp, tel) values ('loic', '', '405042');
insert into utilisateurs (nom, mdp, tel) values ('secretariat', '', '405000');
insert into utilisateurs (nom, mdp, tel) values ('stages', '', '405159');
select * from utilisateurs;
exit;

Avec Netbeans, dans l'onglet Services / Databases / Java DB, on peut aussi faire ce que l'on veut ...

Quelques remarques sur l'utilisation de ij

drop table loic.utilisateur;

Pour utiliser Derby avec Tomcat, j'ai placé le fichier derbyclient.jar dans le répertoire lib de Tomcat (il faut alors redémarrer Tomcat). Le driver JDBC se charge soit de la manière classique, soit avec le nom spécifique du driver

Class.forName("com.mysql.jdbc.Driver");
Class.forName("org.apache.derby.jdbc.ClientDriver");

J'ai utilisé le Derby installé avec Glassfish. Pour que Derby soit une application Tomcat, vous pouvez aller

Création de la page JSP

Pour créer une page jsp, il suffit de le demander en ajoutant un fichier de type Web Application / jsp.

La page doit être compilée et exécutée pour être affichée !

Le code java doit être encadré par <%  ...  %>

Les imports java sont un paramètre import de @page

Utilisation d'une base de données

Voilà comment on utilise une base de données à l'ancienne avec JDBC (on fera du JPA dans un autre TP).

Connexion à la base

Avant toute manipulation sur la base de données, il faut se connecter. C'est ce que permet le code suivant :

String URL = "jdbc:mysql://localhost:3306/exo1";
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection(URL, SCHEMA, MDP);

Toutes les classes JDBC se trouvent dans le package java.sql.

UTIL et MDP sont des chaînes de caractères qui correspondent au nom de l'utilisateur de la base de données qui peut accéder à la base exo1 et à son mot de passe.

Il n'est pas nécessaire de charger le driver pour utiliser Derby installé avec Glassfish.

Si vous êtes dans l'onglet Service :


jdbc:derby://localhost:1527/Donnees [loic on APP]

derby est le type de base de donnée, Donnees le nom de la base de données, loic est l'utilisateur et APP le schéma

Il ne faut pas oublier de mettre une page d'erreur car l'exception est vite arrivée (connexion impossible, opération illégale, ...)


<%@page errorPage="page_error.jsp" %>
<%@page isErrorPage="true/false" %>

Effectuer des requêtes

Voilà un exemple d'interrogation :

Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("select * from utilisateurs");
while (rs.next()) {
   String nom  = rs.getString("nom");
   String tel  = rs.getString("tel");
   out.println("
  • "+nom+" "+tel+"
  • "); }

    out est un objet implicite pour la sortie (JspWriter)

    La connexion doit être fermée : connection.close()

    La méthode executeUpdate() permet de faire des opérations d'insertion, de mise à jour et de suppression. Il est également possible d'écrire des requêtes paramétrées qui sont compilées, leur utilisation est très efficace.

    Amélioration

    Une amélioration que l'on peut faire sur cette page est de lire les informations de la base dans le fichier de configuration du site que l'on est en train de développer.

    Rappel : le contexte de servlet est commun à toutes les servlets d'une application alors que la configuration d'une servlet lui est spécifique.

    Il faut donc ajouter ces quelques lignes au fichier web.xml à la main ou par l'interface graphique de netbeans en ouvrant le fichier et en prenant l'onglet "general"
    <context-param>
       <description>url de connexion a la base mysql exo1</description>
       <param-name>url</param-name>
       <param-value>jdbc:mysql://localhost:3306/exo1</param-value>
    </context-param>
    

    Il est alors super facile de récupérer un tel paramètre :

    application.getInitParameter(url);
    

    Aller plus loin ...

    On a un petit exemple de connexion à une base mais on peut se demander comment être plus performant : partager une connexion entre plusieurs pages JSP ou alors comment utiliser un pool de connexions déjà ouvertes, c'est ce que l'on fera lors des exercices sur la persistance.