web_dynamique(j2ee)
TRANSCRIPT
1
Développementd’applications Web :
Java EE
Java Server Pages (JSP)
2
support
public/www
index.html
Le répertoire
3
2
Serveur http
1
4
client
Comment ça fonctionne sans JSPComment ça fonctionne sans JSP
3
public/www
Conteneur3
2
1
4
fichier.jsp
FichierServlet.class
Serveur http
client
SGBDMySQL
Génération du code html
Comment ça fonctionne avec JSP Comment ça fonctionne avec JSP
4
• Il existe différents serveurs http– Apache
http://httpd.apache.org– IIS
www.microsoft.com– Information sur le protocole http
www.w3.org/Protocols/• Echange d’information entre serveur et clients
– Pour echanger des informations entre le serveur et, les clients on utilise le protocole HTTP (ensemble de règles de codes).
– Nestcape Navigator, Microsoft Internet Explorer, lynx, iCab, …
Serveur httpServeur http
5
JSP est un langage de script exécuté du côté serveur (comme les scripts CGI, ASP, ...) et non du côté client (un script écrit en Javascript ou une applet Java s'exécute sur votre ordinateur...). La syntaxe du langage provient de celles du langage C, du Perl et de Java. Ses principaux atouts sont: Une grande communauté de développeurs partageant des centaines de milliers d'exemples de script JSP
La gratuité et la disponibilité du code source (JSP est distribué sous licence GNU GPL)
La simplicité d'écriture de scripts
La possibilité d'inclure le script JSP au sein d'une page HTML (contrairement aux scripts CGi, pour lesquels il faut écrire des lignes de code pour afficher chaque ligne en langage HTML)
La simplicité d'interfaçage avec des bases de données (de nombreux SGBD sont supportés, mais le plus utilisé avec ce langage est MySQL, un SGBD gratuit disponible sur de nombreuses plateformes : Unix, Linux, Windows, MacOs X, Solaris, etc...)
L'intégration au sein de nombreux serveurs web (Apache, etc.).
Introduction Introduction
H. Mouncif, Dep. Info. FSAC 2005 Notes de cours : Technologies du web
6
Conteneur de servlet Conteneur de servlet
7
Jakarta TomcatJakarta Tomcat
Tomcat 6.x respecte la spécification Servlet 2.5 et JSP 2.1
Écrit entièrement en Java, il peut donc être utilisé sur n’importe quel système disposant d’une machine virtuelle Disponible gratuitement sous forme d’une licence Open Source
Nécessite obligatoirement une machine virtuelle respectant la spécification 5.0 (jre 1.5.0)
Implémentation de référence de la spécification Java EE.
Il fournit donc les librairies de façon à concevoir des Servlets(javax.servlet.http.HttpServlet)
8
Hiérarchie des répertoires Tomcat
9
Architecture de développement d'une application WEB
Une application WEB est contenue dans un répertoire physique sur le serveur
Une application WEB possède une hiérarchie de répertoires et de fichiers
10
Les instructions JSP peuvent être insérées dans les commandes HTML, ce qui facilite le développement des sites web dynamiques. Lorsque JSP commence à traiter un fichier, il ne fait qu'afficher le texte HTML qu'il rencontre. Un fichier, qu’il soit « .html » ou « .jsp », fonctionnera exactement de la même façon. Si on veut insérer des commandes JSP dans un fichier, il faut indiquer à JSP le début d'une telle séquence, en passant en mode JSP comme tel :
<% /* Scriplet */ %>
<%! /* Declaration */ %>
<%= /* Expression*/ %>
<%@ /* Directive*/ %>
Tout ce qui se trouve entre ces balaises sera considéré par le serveur Web comme étant des commandes JSP.
Syntaxe de baseSyntaxe de base
11
Code Source 1: Affichage du texte
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> <head> <title>Notre première instruction : echo</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <body> <h2>Affichage de texte avec PHP</h2> <p> Cette ligne a été écrite entièrement en (x)HTML.<br /> <%
out.println("Bienvenue sur ma première page JSP"); %> </p> </body></html>
Affichage du texte
Syntaxe de baseSyntaxe de base
Le code de baseLe code de baseJSPJSP
Le code de baseLe code de baseJSPJSP
12
L’objet outout : flot de sortie permet l’écriture sur la réponse
Syntaxe :out.println(texte)
Le séparateur d’instruction En JSP, toutes les instructions doivent se terminer par un point-
virgule.Exemple : <% out.println ("Bonjour"); out.println ("Olivier"); %>
Syntaxe de baseSyntaxe de base
13
Plusieurs manières de définir des zones de commentaires : /*forme de commentaires 1 */
Attention pas d’imbrication Comme en langage C
<%-- formme de commentaires 2 --%>
// forme de commentaires 3 Comme en langage C++
Les commentaires Les commentaires
14
FormulairesFormulaires 1 Introduction
Les formulaires servent essentiellement pour la gestion interactive d’un site.
Les formulaires sont à la base des pages web dynamiques. 2 Mise en œuvre d’un formulaire
Un formulaire XHTML est défini entre les balises <form> et </from>Exemple:<form method="post" action="traitement.php"> <p>Texte à l'intérieur du formulaire</p></form> action : le script qui va traiter le formulaire. method : Mode de transmission vers le serveur des informations
saisies dans le formulaire. Get : les données du formulaire sont transmises dans
l’URL. Post : les données du formulaire sont transmises dans le
corps de la requête.
15
Transmission de paramètres à un JSP : l’objet request
Un formulaire dispose de deux façons pour lancer une requête du client au serveur :
• la méthode GET : les paramètres éventuels sont transmis dans l’URL fournie au navigateur,
• la méthode POST : les paramètres éventuels sont transmis séparément.
Dans une page JSP, on peut utiliser un certain nombre d’objet prédéfinis, en particulier l’objet request, qui sert à identifier le client et sa requête.
FormulairesFormulaires
16
Objet Request est type classe HttpServletRequest Cet objet encapsule la requête HTTP et fournit des méthodes pour accéder aux informations du client et de l'environnement du serveur.
Exemples de méthodes :
String getMethod() : retourne le type de requête String getServeurName() : retourne le nom du serveur String getParameter(String name) : retourne la valeur d'un paramètre String[] getParameterNames() : retourne le nom des paramètres String getRemoteHost() : retourne l'IP du client String getServerPort() : retourne le port sur lequel le serveur écoute String getQueryString() : retourne la chaîne d’interrogation
… (voir l'API Servlets pour le reste)
FormulairesFormulaires
17
FormulairesFormulaires La méthode Get
La méthode GET envoie les données sous forme d’une suite de couples nom/valeur ajoutés à l’URL de la page appelée. La partie d’une URL précédée par le caractère point d’interrogation (?) est appelée chaîne de requête. Si la chaîne de requête contient plusieurs éléments, alors chaque élément/valeur doit être séparé par le caractère &. Par ailleurs, elle ne peut pas dépasser 255 caractères. Les données transmises au serveur par la méthode GET sont visibles par les utilisateurs directement dans la barre d’adresse du navigateur.Exemple:http://www.monsite.com/infos.php?jour=27&mois=07&annee=2003&titre=Informations
4 variables seront créées
18
FormulairesFormulaires Exemple :
infos.html<html><body><p>Lien vers la page appel.php, avec des variables aux
valeurs différentes:</p><p><a href="appel.jsp?
nom=Yossef&prenom=Amine">Lien vers appel.jsp?nom=YossefDupont&prenom=Amine</a></p></body></html>
appel.jsp<p>Bonjour !</p>
<p>Votre nom est <% String nom = request.getParameter ("nom") ;out.println ("BONJOUR " + nom) ; %> , et votre prénom est <% String prenom = request.getParameter ("prenom") ; out.println("prenom"); %>.</p><p>Faites un autre essai, <a href="infos.html">cliquez ici</a>
pour revenir à infos.php</p>
19
PHP : Les bases PHP : Les bases FormulairesFormulaires La méthode Post
La méthode POST place les informations directement à la suite de l’adresse URL de la page appelée. La partie d’une URL regroupe les informations dans l’en-tête d’une requête HTTP. Ainsi, les données transmises par un formulaire restent confidentielles et n’apparaissent pas dans l’URL. La fonction isset() est très pratique lorsqu’on écrit des traitements de formulaires. Elle permet de déterminer si une variable est affectée (0 compris mais ni NULL ni FALSE). En utilisant cette fonction, il est possible de déterminer les champs d’un formulaire n’ayant pas été renseignés par l’utilisateur. Mais isset() présente une difficulté : le test d’une chaîne de caractères vide renvoie TRUE.
20
FormulairesFormulaires
Exemple : Transmettre en utilisant un formulaire form.html<form action="cible.jsp" method="post"><label>Entrer votre nom:<input type="text" name="nom" /> <input type="submit" value="Valider" /></label></form>
cible.jsp
<p>Bonjour !</p><p>Je sais comment tu t'appelles. Tu t'appelles <% String nom = request.getParameter ("nom") ;out.println ("BONJOUR " + nom) ; %> !</p><p>Si tu veux changer de prénom, <a href="form.html">clique
ici</a> pour revenir à form.php</p>
21
FormulairesFormulaires 4 LE FORMULAIRE ET LE SCRIPT PHP
PHP peut intervenir à deux endroits par rapport au formulaire : Pour la construction du formulaire, si ce dernier doit contenir
des informations dynamiques ; Pour le traitement du formulaire ;
Les méthodes utilisables pour faire interagir un formulaire et un script PHP sont :
Placer le formulaire dans un document xHTML, dans ce cas le formulaire ne contient aucun élément dynamique, et indiquer le nom de script qui doit traiter le formulaire dans l’option action de la balise <form>
Placer le formulaire dans un script PHP et faire traiter le formulaire par un autre script PHP ;
Placer le formulaire dans un script PHP et le faire traiter par le même script PHP.
22
Exemple :<%
out.println ("<html>");out.println ("<head>");out.println ("<title> calcul du factoriel </title>");out.println ("</head>");out.println ("<body>");out.println ("<head>");out.println ("<form method=\"post\"
action=\"traitement.php\">");out.println ("<label> Entrer entier: <input type=\"text\" name=\"nombre\" size=\"30\"/></label>");out.println ("<input type=\"submit\" /> <input
type=\"reset\" />");out.println ("</form>");out.println ("</html>");
%>
FormulairesFormulaires
23
traitement.php<!%int factoriel(int n){ if(n==0) return 1 ; else return n*(factoriel(n-1));} %><% String E = request.getParameter ("entier") ;Int var= Integer.parseint(E);out.println("factoriel=" +factoriel(var)); %>
FormulairesFormulaires
24
FormulairesFormulairesExemple: Variables de formulaires complexes
<% String E = request.getParameter("action"); if (E!=null) { out.println("<pre>"); String nom = request.getParameter("nom"); String email = request.getParameter("email"); String ville = request.getParameter("ville"); out.println("nom = "+nom); out.println("email = "+email); out.println("vile = "+ville); out.println("</pre>"); } else { %>
25
<form action="cible.jsp" method="post"> Nom : <input type="text" name="personal[name]" /><br /> Email : <input type="text" name="personal[email]" /><br /> ville : <br /> <select multiple name="ville[]"> <option value="casa">casa</option> <option value="fes">fes</option> <option value="meknes">meknes</option> </select><br /> <input type="hidden" name="action" value="submitted" /> <input type="submit" name="submit" value="submit me!" /></form><?php}?>
FormulairesFormulaires
26
Les sessions sont un moyen de sauvegarder et de modifier des variables tout au cours de la visite d’un internaute sans qu’elles ne soient visibles dans l’URL et quelque soient leurs types (tableau, objet…).
Cette méthode permet de sécuriser un site, d’espionner le visiteur, de sauvegarder son panier (e-commerce), etc.
Les informations de sessions sont conservées en local sur le serveur tandis qu’un identifiant de session est posté sous la forme d’un cookie chez le client (ou via l’URL si le client refuse les cookies).
Quelques fonctions :• Object getAttribut(String name) : retourne l’objet associé au nom• setAttribut(String na, Object va) : modifie na par la valeur va• removeAttribut(String na) : supprime l’attribut associé à na• invalidate() : expire la session• logout() : termine la session
Sessions
27
SessionsLe mécanisme des sessions est vraiment extrêmement simple. Prenons un premier exemple pour voir comment s'enregistre une variable dans une session avec un formulaire simple pour sauvegarder le nom du client qui s'est connecté.
<html><body><form method="POST" action="page2.jsp">Entrez votre nom : <input type="TEXT" name="nom"><input type="SUBMIT" value="OK"></form></body></html>
Vous avez un simple formulaire HTML qui va poster au script page2.jsp le
contenu de la variable nom.
28
Sessionspage2.php
<%HttpSession session = request.getSession();
String nom = request.getParameter("nom");
If(nom!=null)
session.setAttribute("nom", nom);
%><html><body>Bienvenue sur ce site <% out.println(nom); %>.<br />Regardons ce qui
se passesur la <a href="page3.jsp">page</a> suivante.<br /></body></html>Dans ce script, nous avons donc le démarrage de la session puis
l'enregistrementdans une variable nom de la valeur postée par le formulaire. Enfin, nousenregistrons nom dans une variable de session.
29
Sessions(Initialisation)Page 3.jsp<%HttpSession session = request.getSession();
String nom = session.getAttribute("nom");%><html><body>Vous êtes toujours parmi nous<% out.println(nom); %>.<br /></body></html>
Dans ce script nous avons toujours le démarrage de session avec cette fois, la
récupération de la variable nom depuis la session.
30
L'effacement d'une variable de session se fait à l’aide de la fonction
removeAttribut:
Page4.jsp<% HttpSession session = request.getSession(); String nom = session.getAttribut("nom");%><html><body><%removeAttribut("nom"]);if (nom!=null) {out.println("La suppression a échouée ."); }else {out.println("Votre nom a été effacé.)"; }%><br />Repartons en <a
href="page3.jsp">arrière</a>.<br/></body></html>
Sessions (Effacement)
31
Sessions (Destruction) Page5.php
<?phpHttpSession session = request.getSession();session.logout();?><html><body>
votre session a été détruite</body></html>
Session détruite. . .
32
PHP et les bases de donnéesPHP et les bases de données
33
PHP offre un interfaçage très simple entre plusieurs base de données :– Oracle, MySQL, SQLServer– Sybase, Empress, FilePro– Interbase, mSQL, PostgreSQL– ODBC(Acess, MS-SQL, …)
La communication avec les bases de données se fait à l’aide du langage
SQL.
Présentation
• CREATE TABLE : Pour la création d’une table• DELETE : Pour la suppression de lignes d’une table• INSERT : Pour l’insertion d’une nouvelle ligne• SELECT : Pour récupérer des lignes d’une table ou d’une vue• UPDATE : Pour modifier les valeurs dans des champs
34
MySQL• MySQL est une base de données implémentant le langage de requête
SQL un langage relationnel très connu. Cette partie suppose connue les principes des bases de données relationnelles.
• Il existe un outil libre et gratuit développé par la communauté des programmeurs libres : phpMyAdmin qui permet l’administration aisée des bases de données MySQL avec php. Il est disponible sur : http://sourceforge.net/projects/phpmyadmin/ et http://www.phpmyadmin.net.
• Avec MySQL vous pouvez créer plusieurs bases de données sur un serveur. Une base est composée de tables contenant des enregistrements.
• Plus d'informations sont disponibles à http://www.mysql.com/.
• La documentation de MySQL est disponibles à http://www.mysql.com/documentation/, ainsi qu'en français chez nexen : http://dev.nexen.net/docs/mysql/.
35
Pour traiter une base de données, MySQL offre trois manières : Utilisation des lignes de commandes Utilisation de l’interface phpMyAdmin Utilisation du langage php
Les opérations de base : Création d’une base de données Création de différentes tables
Gestion du BD avec MySQL
36
A l’aide des commandes en ligne
37
38
39
40
41
java.sql.Connection connect=null; // connexion avec la basejava.sql.Statement S=null; // objet d'émission des requêtesjava.sql.ResultSet RS=null; try{ // connexion à la baseClass.forName("sun.jdbc.odbc.JdbcOdbcDriver"); connect=java.sql.DriverManager.getConnection("jdbc:odbc:"+"gestion","","");out.println("Connexion avec la base " + "gestion" + " établie");out.println("<br>"); // création d'un objet StatementS=connect.createStatement(); // exécution d'une requête selectString ss = "insert into user(nom, prenom, mail,code,sexe,pays) values('"+n+"','"+p+"','"+m+"','"+c+"','"+s+"','"+p+"')"; S.executeUpdate(ss); } catch (Exception e){ // erreur("Erreur " + e,2); }// fermeture de la basetry{connect.close();System.out.println("Base " + "gestion" + " fermée");} catch (Exception e){}
En utilisant des scripts jsp
42
En utilisant des scripts jsp
java.sql.Connection connect=null; // connexion avec la base java.sql.Statement S=null; // objet d'émission des requêtes java.sql.ResultSet RS=null; // table résultat d'une requête try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); connect=java.sql.DriverManager.getConnection("jdbc:odbc:"+"gestion","",""); out.println("Connexion avec la base " + "gestion" + " établie"); out.println("<br>"); // création d'un objet Statement S=connect.createStatement(); // exécution d'une requête select RS=S.executeQuery("select * from client");
// exploitation de la table des résultats while(RS.next()){ // tant qu'il y a une ligne à exploiter out.println(RS.getString("id")+", "+RS.getString("nom")+", " + RS.getString("embauche")+", "+RS.getString("salaire")); out.println("<br>");} } catch (Exception e){ // erreur("Erreur " + e,2); }
try{ connect.close();System.out.println("Base " + "gestion" + " fermée");} catch (Exception e){}
43
JDBC est une API du niveau SQL, elle permet d’exécuter des instructions SQL et de retrouver les résultats (s’il y en a) L’API est un ensemble d’interfaces et de classes conçues pour effectuer des actions sur toute base de données (mySQL, ORACLE,SYBASE, ODBC, Derby) Utilisation d’un gestionnaire de pilotes JDBC
Un pilote JDBC spécifique à une base de données implémente l’interface java.sql.Driver Peut dialoguer avec tout pilote conforme à l ’API JDBC où les pilotes sont disponibles à java.sun.com/products/jdbc
JDBC en quatre étapes :• Charger le pilote• Se connecter à la base• Créer et exécuter une requête SQL• Traiter le résultat si nécessaire
Base de données
44
Le pilote est obligatoire, il convertit les appels JDBC en appels natifs. Il est nécessaire de connaître le nom de la classe du pilote JDBC que l’on veut utiliser :
Pilote ORACLE : oracle.JDBC.driver.OracleDriver
Pilote JDBC/ODBC : sun.jdbc.odbc.JdbcOdbcDriver
Pilote mySQL : com.mysql.jdbc.Driver
Pilote Derby : org.apache.derby.jdbc.ClientDriver
Le chargement du pilote se fait en utilisant la méthode
Class.forName(String Pilote) throws ClassNotFoundException
Base de données
La librairie du pilote doit être placé dans le
repertoire WEB-INF
45
Pour se connecter à une base de données il faut fournir une URL qui indique où se trouve la base URL ORACLE : jdbc:oracle:thin:host:port:idbase URL ODBC : jdbc:odbc:IDDSN URL mySQL : jdbc:mysql:host URL Derby : jdbc:derby:host
La connexion à la base se fait en utilisant la méthodeDriverManager.getConnection("URL","user","pass") throws SQLException
Connection ma_connexion =DriverManager.getConnection("jdbc:mysql://localhost/Gestion","user","pass");
Connexion à une basemySQL nommée Gestion
Base de données
46
47
Application : Création de classe SGBD
Tableau des différentes classes, attributs et méthodes :
class SGBD Nom de la classe mère.
class MySQL Nom de la classe fille, destinée pour le SGBD MySQL.
$SGBD_login Attribut contenant le login de la base de donnée
$SGBD_password Attribut contenant le password de la base de donnée
$SGBD_host Attribut contenant l'hôte de la base de donnée
$SGBD_base Attribut contenant le nom de la base de donnée
function connect() Méthode de connection au SGBD
function requete() Méthode d'envoi de requête au SGBD
function deconnect() Méthode de déconnection au SGBD
$connect Attribut contenant la connection au SGBD
48
<?php/* Fichier : SGBD.class.php */
class SGBD // Création de la classe mère { var $SGBD_login; // Attribut du login du SGBD var $SGBD_password; // Attribut du password du SGBD
var $SGBD_host; // Attribut de l'hôte du SGBD
var $SGBD_base; // Attribut du nom de la BD var $connect; // Attribut de connection
var $requete; // Attribut de requête
Classe de base : SGBD
49
// Définition du constructeur function SGBD ($login, $password, $host, $base) { // Vérification des variables if (empty ($login) || empty ($host) || empty ($base)) { // Affichage du message d'erreur echo"<b>Erreur :</b> Variable(s) non renseignées!!!"; exit; }
else { // Initialisation des attributs $this->SGBD_login = $login; $this->SGBD_password = $password; $this->SGBD_host = $host; $this->SGBD_base = $base; } } }?>
Classe de base : SGBD
50
<?php/* Fichier : MySQL.SGBD.class.php */
class MySQL extends SGBD // Création de la classe fille {
function connect (){ $connect = mysql_pconnect ($this->SGBD_host, $this-
>SGBD_login, $this->SGBD_password);
if (!$connect) { echo "<b>Erreur :</b> Connection à MySQL impossible."; exit; } if (!mysql_select_db ($this->SGBD_base, $connect)) { echo "<b>Erreur :</b> Connection à la base de données impossible."; exit; } $this->connect = $connect; }
}//Fin de la fonction connect()
Classe MySQL expansion de la classe SGBD
51
function requete ($requete) { // Exécution de la requête $result = mysql_query ($requete, $this->connect); // Vérification de la requête if (!$result) { // Affichage du message d'erreur echo "<b>Erreur :</b> Impossible d'effectuer la requête."; exit; } else { // Initialisation de l'attribut de requête $this->requete = $result; } } //Fin de la fonction requete()
function deconnect () { mysql_close ($this->connect); // Déconnection de la base de données
} //Fin de la fonction deconnect()
} //Fin de la classe MySQL ?>
Classe MySQL expansion de la classe SGBD
52
<?php/* Fichier : SGBD.php */
include ("SGBD.class.php"); // Inclusion de la classe mère
/* Initialisation de la variable du SGBD correspondant */$SQL = "MySQL";
// Inclusion de la classe fille du SGBD correspondantinclude ($SQL.".SGBD.class.php");
/* Création d'un nouvel objet de la classe fille + lancement du constructeur */ /* Les informations sont adaptés à mon serveur, à vous de les modifier pour quelles correspondent avec votre SGBD */
$database = new $SQL('root', '', 'localhost', 'test');
// Connection à la base de données$database->connect();
Classe MySQL expansion de la classe SGBD
53
/* Exécution d'une requête (création d'une nouvelle base de données). Attention, pour créer une nouvelle base de données, il faut que votre utilisateur ai touts les droits. Ceci n'est qu'un exemple parmi tant d'autres, vous pouvez effectuer n'importe quel requête MySQL avec cette méthode */
$database->requete ("CREATE DATABASE newBase");
// Déconnection de la base de données$database->deconnect();?>
Classe MySQL expansion de la classe SGBD