Licence professionnelle « Management des organisations » Option « Systèmes d’information et Réseaux » Internet et applications dans l’entreprise (3) Serveur Tomcat et pages JSP O. Auzende 2010-2011 Servlets java et Java Server Pages........................................................................................................................... 3 Tests de servlets et de pages JSP ......................................................................................................................... 3 Utilisation de variables ........................................................................................................................................ 3 Insertion de fichier .............................................................................................................................................. 4 Elément spécifique à la programmation JSP ....................................................................................................... 4 L’objet request ................................................................................................................................................ 4 Connexion aux bases de données ........................................................................................................................ 5 Principe ........................................................................................................................................................... 5 Exemple : connexion à une base de données mySQL ..................................................................................... 5 Exercices ......................................................................................................................................................... 7 2 Internet et applications dans l’entreprise O. Auzende Servlets java et Java Server Pages Un servlet est un petit morceau de code Java qui étend les fonctionnalités d'un serveur Web. Sun a développé un serveur entièrement en Java, le Java Web Server, qui fonctionne à base de servlets et est disponible pour les plates-formes Windows et Solaris. Par ailleurs, Tomcat (issu du projet open source jakarta) implémente, sous différents systèmes d’exploitation, un serveur HTTP simple comportant un moteur de servlets. Tomcat est souvent couplé avec Apache. Les Java Server Pages d’extension .JSP sont construites par-dessus les servlets : le moteur Java transforme les fichiers .JSP en servlets (étape de traduction) puis exécute le servlet résultant qui génère la page HTML (étape de requête). Tests de servlets et de pages JSP Le serveur Tomcat, issu du projet jakarta-tomcat et libre de droits, est téléchargeable sur Internet. Il nécessite un JDK et peut être utilisé seul ou être couplé à Apache, sous Window ou sous Unix. L’icône TOMCAT5 figure sur le bureau. Effectuer un double-clic sur l’icône ouvre une fenêtre de dialogue. Un clic sur le bouton Start lance le serveur. Le dossier pages de la disquette doit être recopié dans le dossier C:\Program Files\Apache Software Foundation\Tomcat5.5\webapps, à côté de ROOT (alors que c’est gnéralement dans ROOT). L’appel des pages via le serveur se fait par http://localhost:8080/pages/ Attention : PORT 8080 L’arrêt de Tomcat se fait en appyant sur le bouton Stop. Utilisation de variables La page date.jsp fait appel au constructeur et aux méthodes de la classe Date de java.util : Page date.jsp <HTML> <HEAD> <TITLE>Utilisation de variables</TITLE> </HEAD> <BODY> <%! java.util.Date maintenant = new java.util.Date(); %> <P>Date du jour : nous sommes aujourd'hui le <%= maintenant.getDate() %>/ <%= maintenant.getMonth() +1 %>/<%= maintenant.getYear() +1900 %></P> </BODY> </HTML> 3 La page compteur.jsp définit une variable globale de type int, incrémentée et testée : Page compteur.jsp <%! int count =0; %> <HTML> <HEAD><TITLE>Un compteur</TITLE></HEAD> <BODY> <% count = count + 1; %> <P>Cette page a été visitée <%= count %> fois.</P> <% if (count == 1) { out.print("<p>Vous &ecirc;tes le premier visiteur !</p>"); } %> </BODY> </HTML> Insertion de fichier Page fonctions.jsp <%! int somme(int[] tab) { int s = 0 ; for (int z = 0; z < tab.length ; z++) s += tab[z] ; return s ; } %> Page sommetab.jsp <HTML> <HEAD><TITLE>Exemple d'inclusion</TITLE></HEAD> <BODY> <%@include file="fonctions.jsp"%> <%java.util.Random r = new java.util.Random();%> <p>Voici un tableau de 20 entiers rempli par des nombres tir&eacute;s au sort entre 0 et 100 : </p> <%int t[] = new int[20] ;%> <%for (int i = 0 ; i < 20 ; i++) { t[i] = r.nextInt(100); } %> <%for (int i = 0 ; i < 20 ; i++) {%> <%=t[i]%> &nbsp;*&nbsp; <%}%> <p>On calcule sa somme en utilisant la fonction d&eacute;finie dans le fichier inclus. </p> <p>La somme vaut : <%=somme(t)%> </p> </BODY> <%! int carre(int n) { return n*n ; } %> <%! int cube(int n) { return n*n*n ; } %> </HTML> Exercice En réalisant la même inclusion que ci-dessus, écrire la page carretab.jsp qui réalise l’affichage ci-contre. Elément spécifique à la programmation JSP L’objet request L'objet request permet de récupérer les valeurs des champs des formulaires. La syntaxe est : request.getParameter("nom de la variable"), que la méthode soit GET ou POST. La page formulaire.jsp propose un formulaire faisant appel à la page requete.jsp pour générer la réponse. 4 Internet et applications dans l’entreprise O. Auzende Page formulaire.jsp <html> <head><title>Un formulaire</title></head> <body> <form method="get" action="requete.jsp"> <p>Exemple de formulaire</p> <table> <tr><td>Nom :</td><td><input type="text" name="nom"></td> </tr><tr><td>Pr&eacute;nom :</td> <td><input type="text" name="prenom"></td> </tr><tr><td>Ordinateur : </td> <td> <input type="radio" name="supp" value="mac" checked>Mac <input type="radio" name="supp" value="pc"> PC </td> </tr><tr> <td>Syst&egrave;me d'exploitation : </td> <td><select name="sys"> <option value="win">Windows <option value="linux">Linux <option value="macos">Mac-OS </select></td></tr> </table> <p><input type="submit" value="Confirmer"></p> </form> </body> </html> Page requete.jsp <html> <body> <p>Vous avez repondu : </p> <table> <tr><td>Nom : </td><td> <%=request.getParameter("nom")%></td></tr> <tr><td>Pr&eacute;nom : </td> <td> <%=request.getParameter("prenom")%> </td></tr> <tr><td>Ordinateur : </td> <td> <%=request.getParameter("supp")%> </td></tr> <tr><td>Syst&egrave;me d'exploitation : </td> <td> <%=request.getParameter("sys")%> </td></tr> </table> </body> </html> Connexion aux bases de données Principe Quatre classes java permettent de réaliser la connexion aux bases de données et de réaliser des requêtes : o DriverManager permet de créer les connexions (objets de la classe Connection). o Connection permet de créer un canal de communication vers une BD dont l’URL est connue. Un objet de type Connection a pour attributs username et password, crée les Statements (requêtes SQL) et gère les transactions. o Statement permet de gérer les requêtes SQL simples, avec les méthodes executeQuery admettant une chaîne SQL en paramètre et retournant un objet ResultSet, et executeUpdate() permettant la mise à jour et renvoyant le nombre de rangées modifiées. o Enfin, un objet de type ResultSet contient une rangée de données extraite de la base par une requête SQL. La méthode next() permet d’accéder à la rangée suivante. Exemple : connexion à une base de données mySQL Lancer easyPHP sous Windows. Copier le fichier produits.dump fourni dans C:\program files\easyPHP18\mysql\bin. Dans une fenêtre d’invite de commandes, se placer dans le dossier C:\program files\easyPHP1-8\mysql\bin Y créer et remplir la base de données produits : Création de la base : mysqladmin –u root create produits Remplissage de la base : mysql –u root produits < produits.dump 5 Pour pouvoir interroger la base via une page JSP, il faut l’enregistrer comme sources de données ODBC : Démarrer Paramètres Panneau de configuration Outils d’administration Sources de données ODBC. A noter : il faut déclarer la base de données mySQL en Sources de données Système : - Ajouter une nouvelle source de données - choisir le driver MySQL ODBC 3.51 Driver et valider Dans la nouvelle fenêtre (voir ci-contre), préciser : - Data Source Name : produits - Description : ne pas remplir - Server : localhost - User : root - Password : aucun - Database : produits Pour l’exécution des pages interrogeant la base par http://localhost:8080/pages/….jsp, il faut que les deux serveurs (easyPHP et Tomcat) soient actifs. Fichier lectureproduits.jsp <% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); %> <% java.sql.Connection con = java.sql.DriverManager.getConnection("jdbc:odbc:produits","","");%> <% java.sql.Statement statement = con.createStatement(); %> <% java.sql.ResultSet rs; %> <HTML> <HEAD> <TITLE>Requete</TITLE> </HEAD> <BODY> <H3>Lecture de la base de donn&eacute;es mySQL produits par une page JSP</h3> <p><b>Lecture de la table Fournisseurs</b></p> <table border=1> <tr><td><b>Num&eacute;ro</b></td><td><b>Nom</b></td> <td><b>Adresse</b></td></tr> <% rs = statement.executeQuery("SELECT * FROM fournisseurs"); %> <% while (rs.next()) { %> <tr> <td><%= rs.getString("num") %></td> <td><%= rs.getString("nom") %></td> <td><%= rs.getString("adresse") %></td> </tr> <% } %> </table> <p><b>Lecture de la table Produits</b></p> <table border=1> <tr><td><b>Num&eacute;ro</b></td><td><b>D&eacute;signation</b></td> <td><b>Fournisseur</b></td></tr> <% rs = statement.executeQuery("SELECT * FROM produits"); %> <% while (rs.next()) { %> <tr> <td><%= rs.getString("num") %></td> <td><%= rs.getString("nom") %></td> <td><%= rs.getString("fournisseur") %></td> </tr> <% } %> </table> <p><b>Lecture de la table Prix</b></p> <table border=1> <tr><td><b>Num&eacute;ro du produit</b></td><td><b>Prix</b></td></tr> <% rs = statement.executeQuery("SELECT * FROM prix"); %> <% while (rs.next()) { %> <tr> <td><%= rs.getString("numproduit") %></td> <td><%= rs.getString("prix") %></td> </tr> <% } %> </table> </BODY> </HTML> <% rs.close(); %> <% statement.close(); %> <% con.close(); %> 6 Internet et applications dans l’entreprise O. Auzende Exercices 1) Lecture de la basqe Ecrire la page lectureproduits1.jsp faisant afficher, dans une table, les désignations des différents produits et leurs prix. On utilisera les tables produits et prix de la base de données produits. Résultat attendu : 2) Insertion dans la base Faire exécuter la page nouveauproduit.jsp suivante qui appelle la page insertproduit.jsp insérant effectivement le nouveau produit à la fois dans les tables produits et prix. Page nouveauproduit.jsp <% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); %> <% java.sql.Connection con = java.sql.DriverManager.getConnection("jdbc:odbc:produits","","");%> <% java.sql.Statement statement = con.createStatement(); %> <% java.sql.ResultSet rs; %> <HTML> <HEAD><TITLE>Requete</TITLE></HEAD> <BODY> <H3>Demande d'insertion d'un nouveau produit</h3> <form method="get" action="insertproduit.jsp"> <p>D&eacute;signation : <input type="text" name="designation" size="30"></p> <p>Fournisseur : <select name="fourn"> <% rs = statement.executeQuery("SELECT * FROM fournisseurs"); %> <% while (rs.next()) { out.print ("<option value='"+ rs.getString("num")+"'>"+rs.getString("nom")+"</option>") ; } %> </select></p> <p>Prix : <input type="text" name="px" size="6"></p> <input type="submit" value="OK"> </form> </BODY> </HTML> <% rs.close(); %> <% statement.close(); %> <% con.close(); %> Page insertproduit.jsp <% Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); %> <% java.sql.Connection con=java.sql.DriverManager.getConnection("jdbc:odbc:produits","","");%> <% java.sql.Statement statement=con.createStatement(); %> <HTML> <HEAD><TITLE>Requete</TITLE></HEAD> <BODY> <h2>Insertion d'un produit</h2> <%String prod=request.getParameter("designation"); %> <%int numf=new Integer(request.getParameter("fourn")).intValue() ; %> <%int prix=new Integer(request.getParameter("px")).intValue() ; %> 7 <%String sql = "INSERT into produits(nom, fournisseur) VALUES('"+prod+"','"+numf+"')" ; <% statement.executeUpdate(sql); %> <p>Le produit est inséré dans la table produits.</p> <%sql = "INSERT into prix(prix) VALUES('"+prix+"')" ; <% statement.executeUpdate(sql); %> <p>Le prix est inséré dans la table prix.</p> %> %> </BODY> </HTML> <% statement.close(); %> <% con.close(); %> 3) Suppression d'enregistrement de la base Ecrire une page suppressionproduit.jsp qui affiche en liste de sélection les désignations des produits existants et permet de demander la suppression d’un produit. Ecrire la page supprimeproduit.jsp qui supprime le produit à la fois de la table produits et de la table prix. 8