Introduction de qq Bases sur
ProgrammationWeb
Java Edition Entreprise
Les composants d’une application web
Pages Web dynamique
 Une page html pourrait être générée dynamiquement par un
script côté serveur,
 Les langages et les serveurs utilisés sont diverses,
 La technologie des servlets Java et page JSP fonctionnant avec
différents serveurs (Tomcat, Apache,..) et sur différentes
plate-formes (Windows, Linux),
 Une page html peut également contenir des scripts qui
seront exécutés par le navigateur,
 Les langages de script côté navigateur sont nombreux
PerlScript, JavaScript,..
Un script JSP
<%@ page import="java.util.*" %>
<% // code java%>
<%
Calendar calendrier = Calendar.getInstance();
int mn= calendrier.get(Calendar.MINUTE);
int h = calendrier.get(Calendar.HOUR_OF_DAY);
int s = calendrier.get(Calendar.SECOND);
%>
<% // code html %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page affichant l heure</title>
</head>
<body>
<h1>Il est <%=h%>:<%=mn%>:<%=s%></h1>
</body>
</html>
JavaScript côté navigateur
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page affichant l heure</title>
<script language="javascript">
function réagir(){
alert ("vous avez cliqué sur le bouton ok");
}
</script>
</head>
<body>
<form action="index.jsp" method="get">
<input type="submit" value="ok" onclick="réagir()">
</form>
<h1>Il est <%=h%>:<%=mn%>:<%=s%></h1>
</body>
</html>
Les échanges client/serveur
 Les couches des machines client et serveur utilisent le
protocole HTTP pour s’échanger des messages et se
comprendre. Ces messages sont normalisés et ont la forme
suivante:
Entêtes HTTP
LigneVide
Document
Les méthodes HTTP
 Le protocole HTTP dispose de « méthodes »; ce sont des mots que le navigateur utilise
pour dialoguer avec le serveur.
 Nous nous intéressons à trois en particulier: GET,POST et HEAD.
 GET: permet de récupérer une ressource web du serveur via une URL ou en cliquant sur un
lien. La réponse consiste à retourner la ressource demandée, accompagnée d'informations
diverses à son sujet (la taille des donnée, la date d ‘envoi…) dans ce qui s'appelle les en-têtes.
Des paramètres peuvent être placés dans l’URL ou dans des cookies pour ensuite être
transmises au serveur.
 POST: permet de soumettre au serveur des données de tailles variables et volumineuses,
parfait pour envoyer des fichiers par exemple.
 HEAD: Cette méthode est identique à la méthode GET, la réponse du serveur contient
seulement les en-têtes HTTP.
 La requête HTTP part du client et arrive sur le serveur.
 Alors le serveur HTTP (on parle également de serveur web) entre en jeu…
 Pour l’écoute de la requête sur un port (en générale 80), il la transmet ensuite à un autre
élément le conteneur …
Java Framework
 La plateforme Java est composée de trois éditions, destinées à des usages différents :
 Java ME : Java Micro Edition est prévu pour le développement d'applications embarquées,
notamment sur des terminaux mobiles ;
 Java SE : anciennement Java 2 Standard Edition est destiné au développement d'applications pour
ordinateurs personnels, poste de travail (Application clasique) ;
 Java EE : Java Enterprise Edition, destiné à des applications entreprises en fournissant un
ensemble de composants sous forme d’API.
Chaque édition propose un environnement complet pour le développement et l'exécution
d'applications basées sur Java et comprend notamment une machine virtuelle Java (Java virtual
machine) ainsi qu'un ensemble de classes.
Java EE (Java Enterprise Edition) est une norme proposée par la société Sun, portée par un
consortium de sociétés internationales, visant à définir un standard de développement
d'applications d'entreprises multi-niveaux, basées sur des composants.
 On parle généralement de la plateforme JEE pour désigner les services offerts (API), les
composants et l’infrastructure d’exécution.
La plateforme JEE
 La plateforme JEE comprend:
 Les spécifications du serveur d'application, c'est-à-dire de l'environnement d'exécution:
J2EE définit finement les rôles et les interfaces pour les applications ainsi que l'environnement dans
lequel elles seront exécutées. Ces recommandations permettent ainsi à des entreprises tierces de
développer des serveurs d'application conformes aux spécifications ainsi définies, sans avoir à
redévelopper les principaux services.
 Les service, c'est-à-dire des extensions Java indépendantes permettant d'offrir en
standard un certain nombre de fonctionnalités. Ils pouvent être classés par catégories :
Les services d'infrastructures : JDBC,JNDI…
Les services de communication : JavaMail,JAAS…
 Les composants, on distingue habituellement deux familles de composants :
 Les composants web : Servlet et JSP.
 Les composants métier : EJB (Enterprise Java Beans). Il s'agit de composants
spécifiques chargés des traitements des données propres à un secteur d'activité (on
parle de logique métier ou de logique applicative) et de l'interfaçage avec les bases de
données.
Architecture Java EE
Architecture Java EE
Typiquement c’est une architecture 3-tiers:
 Tiers présentation: affichage des données
 Tiers métier: gestion du métier de l’application
 Tiers donnée: persistance des données
Permet une séparation claire entre:
 L’interface homme-machine
 Les traitements métiers
 Les données
Basée sur des composants qui sont:
 Distincts
 Interchangeables
 distribués
un des composants de base pour le développement d'applicationsWeb;
Peut servir à créer dynamiquement des pages HTML;
Bien sûr d’autres solutions existent pour les pages web dynamiques;
Les servlets* peuvent servir à d’autres usages;
Ecrite sur le langage Java, elle a tous les avantages du langage:
Portabilité, l’accès aux APIs Java dont le JDBC…
API Servlet
* Sevlet est masculin selon le grand dictionnaire terminologique, féminin selon le livre Servlets Java: guide des programmeurs
Une servlet
 Un programme java qui s'exécute côté serveur:
la portabilité, l'accès à toutes les API de java dont JDBC pour l'accès aux bases de
données, ...
 Effectue les traitements et renvoie le résultat correspondant à la requête du client.
Elle agit selon le modèle requête/réponse.
 Cette interaction peut être directe ou via un serveur http, ftp, etc
 La principale utilisation actuelle est la génération de pages html dynamiques
utilisant le protocole http et donc un serveur web,
 Mais n'importe quel protocole reposant sur le principe de requête/réponse peut
faire usage d'une servlet.
 Une servlet peut être invoquée plusieurs fois en même temps pour répondre à
plusieurs requêtes simultanées.
 La servlet se positionne dans une architecture Client/Serveur trois tiers dans le
tiers du milieu entre le client léger chargé de l'affichage et la source de données.
 La version actuelle de la spécification servlet est 4.0.
Serveur d’application
 Un serveur d'application permet de charger et d'exécuter les servlets dans une
JVM. C'est une extension du serveur web qui a ses limites:
Pas de contenu dynamique, Pas de sauvegarde de données sur le serveur
 Ce serveur d'application contient entre autre un moteur de servlets qui se
charge de manager les servlets qu'il contient: un conteneur
 La notion de conteneur se retrouve dans de nombreuses technologies
– Servlet,Applet, MIDlet, Xlet, (*-let), EJB, …
 Un conteneur est un composant logiciel système qui contrôle d’autres
composants, dits métier
– Tomcat est un exemple de conteneur
– Les servlets n’ont pas de méthode main(), ils sont contrôlés par le
conteneurTomcat
– Les requêtes ne sont pas adressées aux servlets mais au conteneur
dans lequel ils sont déployés.
Pourquoi un conteneur ?
 Un conteneur web est un moteur de servlet prend en charge l’instanciation et le
chargement de la servlet, gestion de son cycle de vie, passage des requêtes et des
réponses ... Un conteur web peut être intégré dans un serveur d'application qui va
contenir d'autre conteneur et éventuellement proposer d'autres services..
 Pourquoi? Pour oublier le cours de « réseau » et faciliter la tâche du programmeur
 Un conteneur fournit pour les Servlets
– Un support pour la communication
– La gestion du cycle de vie
– Un support pour le Multithreading
– Un support pour la sécurité
– Un support pour les JSP
Notion de moduleWeb
 Un servlet ne peut pas être déployé directement dans un conteneur, il doit faire
partie d’un moduleWeb
 Un module Web est un ensemble de librairies, de fichiers de configurations, de code
Java (bytecode des servlets…), …
 Le moduleWeb est l’unité de déploiement dans le conteneur
Le fonctionnement d’une servlet
 Remarque 1: Le chargement et l'instanciation d'une servlet se font selon le paramétrage soit au lancement
du serveur soit à la première invocation de la servlet. Dès l'instanciation, la servlet est initialisée une seule
et unique fois avant de pouvoir répondre aux requêtes. Cette initialisation peut permettre de mettre en
place l'accès à des ressources tel qu'une base de données.
 Pour exécuter une servlet, il suffit de saisir une URL qui désigne la servlet dans un navigateur.
1. Le serveur reçoit la requête http qui nécessite une servlet de la part du navigateur
2. Si c'est la première sollicitation de la servlet, le serveur l'instancie. Les servlets sont stockées (sous
forme de fichier .class) dans un répertoire particulier du serveur. Ce répertoire dépend du serveur
d'application utilisé. La servlet reste en mémoire jusqu'à l'arrêt du serveur.
 Remarque 2: La servlet en mémoire, peut être appelée par plusieurs threads lancés par le serveur pour
chaque requête. Ce principe de fonctionnement évite d'instancier un objet de type servlet à chaque requête
et permet de maintenir un ensemble de ressources actives tel qu'une connexion à une base de données.
3. le serveur créé un objet qui représente la requête http et objet qui contiendra la réponse et les envoie à
la servlet
4. la servlet créé dynamiquement la réponse sous forme de page html transmise via un flux dans l'objet
contenant la réponse. La création de cette réponse utilise bien sûre la requête du client mais aussi un
ensemble de ressources incluses sur le serveur tels de que des fichiers (bean) ou des bases de données.
5. le serveur récupère l'objet réponse et envoie la page html au client.
Les outils pour développer
 Il faut utiliser le Java Server Development Kit (JSDK) qui est une extension du JDK.
 Pour exécuter des application web, il faut un serveur d’application: Netbeans
Versions commerciales mais aussi des versions libres telles queTomcat du projet GNU
Jakarta.
 Ce serveur d’application doit inclure un serveur web http dont le plus utilisé est
Apache.
 Le choix d’un serveur d’application doit tenir compte de la version du JSDK qu’il
supporte.
 Pour développer des servlets, le choix d’un des deux serveurs ApacheTomcat ou
Glassfish se justifie pleinement de part sa gratuité et sa « légèreté »
L'API servlet
L'API servlets est une extension du jdk de base, regroupe dans des packages préfixés par javax
Il en a deux:
 javax.servlet : contient les classes pour développer des serlvets génériques indépendantes d'un
protocole
 javax.servlet.http : contient les classes pour développer des servlets qui reposent sur le protocole
http utilisé par les serveurs web.
Servlet générique
Servlet HTTP
Servlets HTTP
GenericServlet fournie un niveau d'abstraction permettant de développer facilement des
servlets avec le protocole http.
Requêtes et Réponses HTTP
Entêtes d’une requête GET
public class ShowRequestHeaders extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
IOException {
//...
out.println(doctype +
"<html>n<head><title>" + title + "</title></head>n" +
"<body>n<h1>" + title + "</h1>n" +
"<b>Request Method: </b>" + request.getMethod() + "<br />n" +
"<b>Request URI: </b>" + request.getRequestURI() + "<br />n" +
"<b>Request Protocol: </b>" + request.getProtocol() + "<br />)
out.println("<table>n" +"<tr><th>Header Name</th><th>HeaderValue</th></tr>");
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
out.println("<tr><td>" + headerName + "</td>");
out.println("<td>" + request.getHeader(headerName) +"</td></tr>");
}
out.println("</table>n</body></html>");
out.close();
}
}
Méthode de type HttpServletRequest
getHeaderNames(), getHeader(String name)
Entêtes d’une requête GET (2) changer
Exemple de formulaire
Formulaire GET
<form action="Serv2">
<table border="0">
<tr>
<td>Nom: </td><td><input type="text" name="nom"></td>
</tr>
<tr>
<td>Prénom:</td><td><input type="text" name="prenom"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value=" Envoyer"
</td>
</tr>
</table>
</form>
Traitement formulaire GET
public class LogServlet extends HttpServlet {
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException {
String login = request.getParameter("nom") ;
String password = request.getParameter("prenom") ;
//WhatYouWant
if (checkUserAndPassword(login,password)) {
grantAccessTo(login);
} else {
sendAuthentificationFailure(login);
}
}
}
GET
Get http://localhost:8080/WebModule1/Serv2? nom=houda&prenom=Belmokadem HTTP/1.1
host:localhost:8080
user-agent:Mozilla/4.0
accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel,
application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
accept-language:fr
...
Formulaire POST
<form method="post" action="Serv2">
<table border="0">
<tr>
<td>Nom: </td><td><input type="text" name="nom"></td>
</tr>
<tr>
<td>Prénom:</td><td><input type="text" name="prenom"></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value=" Envoyer"
</td>
</tr>
</table>
</form>
Traitement formulaire Post
public class LogServlet extends HttpServlet {
public void doPost(HttpServletRequest request,HttpServletResponse response) throws
IOException {
doGet(request, reponse);
}
}
GET
Post http://localhost:8080/WebModule1/Serv2 HTTP/1.1
host:localhost:8080
user-agent:Mozilla/4.0
accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel,
application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
accept-language:fr
...
content-type:application/x-www-form-urlencoded
content-length:27
Paramètres de formulaires
public class ParametresFormulaire extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse reponse) throws IOException, ServletException{
…
out.println(doctype+ "<html><head><title>"+title+"</title><head>"+ "<body>");
Enumeration<?> paramètres = request.getParameterNames();
if(!paramètres.hasMoreElements())
out.println("il n'existe pas de paramètre dans la requête du client" +"</body>+</html>");
else{
out.println(request.getQueryString()+
"<br><table border="0"><tr><th>Paramètre</th><th>Valeur</th></tr>");
while(paramètres.hasMoreElements()){
String param = (String) paramètres.nextElement();
out.println("<tr><td>"+param+"</td>");
String[] paramValues = request.getParameterValues(param);
for(int i=0; i<paramValues.length ; i++){
out.println("<td>"+ paramValues[i]+ ";"+"</td>");
}
out.println("</tr>");
}
out.println("</table>");
}
out.println("</body></html>");
out.close();
}
Vérification de données manquantes
 Champ manquant dans le formulaire
• getParameter retourne null
 Champ renvoyé vide
• getParameter retourne une chaine vide (ou une chaine avec des espacements)
String param = request.getParameter("someName");
if ((param == null) || (param.trim().equals(""))) {
doSomethingForMissingValues(...);
} else {
doSomethingWithParameter(param);
}
Réponse HTTP (rappel)
 Une réponse HTTP peut contenir du HTML
 HTTP rajoute des (meta)informations en entête du contenu de la réponse
Les méthodes pour les Status Codes
response.setStatus(int statusCode)
– Utiliser les constantes, pas d’entiers directement
– Noms dérivés du message standard
• Ex : SC_OK, SC_NOT_FOUND, etc
• response.sendError(int code, String msg)
– Englobe le message dans un petit document HTML
• response.sendRedirect(String url)
– Le code de status est alors 301
– L’attribut « Location » est également généré dans
l’entête de la réponse
Exemple sendError
public class LogServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String login = request.getParameter("param1") ;
String password = request.getParameter("param2") ;
if ((login == null) || (login.trim().equals(""))) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,“champs login
vide");
return;
}
if (checkUserAndPassword(login, password)) {
grantAccessTo(login);
} else {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, “accès refuser
au compte" + login);
}
}
}
Ou bien
Exemple sendRedirect
public classWrongDestination extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String userAgent = request.getHeader("User-Agent");
if ((userAgent != null) &&(userAgent.contains("MSIE")) {
response.sendRedirect("http://home.netscape.com");
}
else {
response.sendRedirect("http://www.microsoft.com");
}
}
}
Même URL de départ ensuite une redirection ...
Générer un fichier Excel
public class FichierExcel extends HttpServlet {
public void doGet(HttpServletRequest requete, HttpServletResponse reponse) throws
IOException,ServletException{
reponse.setContentType("application/vnd.ms-excel");
PrintWriter out = reponse.getWriter();
out.println("tQ1tQ2tQ3tQ4tTotal");
out.println("Applest78t87t92t29t=SOMME(B2:E2)");
out.println("Orangest77t86t93t30t=SOMME(B3:E3)");
}
}
Upload de fichiers (avec Commons FileUpload )
 Formulaire HTML
– <input type="file" name="nameFile" />
– <form method="post" enctype="multipart/form-data" action="/servlet">
– Le choix du enctype impacte les autres champs du formulaire
• request.getParameter("name") ne fonctionne plus
 Côté Servlet
– utiliser une librairie
Commons FileUpload du projet Jakarta
(http://commons.apache.org/fileupload/)
 Développement
– import org.apache. tomcat.util.http.fileupload.*
– import org.apache. tomcat.util.http.fileupload.servlet.*
 Déploiement
– Dans le moduleWeb de l’application…
– …dans le répertoireWEB-INF/lib
• commons-fileupload-1.2.1.jar
• commons-io-1.4.jar
Exemple : Upload simple (½)
//Télécharger un fichier txt et l’afficher dans la réponse de la servlet
if ( ServletFileUpload.isMultipartContent(request) ) {
// create a factory for disk-based (large) file items
FileItemFactory varr = new DiskFileItemFactory() ;
((DiskFileItemFactory) fileItemFactory).setSizeThreshold(40960); //the unit is bytes
// create a new file upload handler
ServletFileUpload var = new ServletFileUpload(varr);
servletFileUpload.setSizeMax(81920); // the unit is bytes
Exemple : Upload simple (2/2)
try {
List<?> fileItemsList = var.parseRequest(request);
// Process file items
Iterator<?> it = fileItemsList.iterator();
while (it.hasNext()){
DiskFileItem fileItem = (DiskFileItem)it.next();
if (fileItem.isFormField()){ // classic form field (name=value)
out.println("<b>Champs:</b><br />n" + fileItem.getFieldName() +"=" +
fileItem.getString()+ "<br/>");
}
else{ // uploaded file
out.println("<b>Fichier:</b><br />n<pre>" + fileItem.getString() +
"</pre><br/>");
}
}
} catch (FileUploadException e) {
out.println("Impossible de télécharger ce fichier");
e.printStackTrace();}}

API Servletcourensatangerpourlesetudiantsdu2emeanneeecole.pptx

  • 1.
    Introduction de qqBases sur ProgrammationWeb Java Edition Entreprise
  • 2.
    Les composants d’uneapplication web
  • 3.
    Pages Web dynamique Une page html pourrait être générée dynamiquement par un script côté serveur,  Les langages et les serveurs utilisés sont diverses,  La technologie des servlets Java et page JSP fonctionnant avec différents serveurs (Tomcat, Apache,..) et sur différentes plate-formes (Windows, Linux),  Une page html peut également contenir des scripts qui seront exécutés par le navigateur,  Les langages de script côté navigateur sont nombreux PerlScript, JavaScript,..
  • 4.
    Un script JSP <%@page import="java.util.*" %> <% // code java%> <% Calendar calendrier = Calendar.getInstance(); int mn= calendrier.get(Calendar.MINUTE); int h = calendrier.get(Calendar.HOUR_OF_DAY); int s = calendrier.get(Calendar.SECOND); %> <% // code html %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page affichant l heure</title> </head> <body> <h1>Il est <%=h%>:<%=mn%>:<%=s%></h1> </body> </html>
  • 5.
    JavaScript côté navigateur <html> <head> <metahttp-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>JSP Page affichant l heure</title> <script language="javascript"> function réagir(){ alert ("vous avez cliqué sur le bouton ok"); } </script> </head> <body> <form action="index.jsp" method="get"> <input type="submit" value="ok" onclick="réagir()"> </form> <h1>Il est <%=h%>:<%=mn%>:<%=s%></h1> </body> </html>
  • 6.
    Les échanges client/serveur Les couches des machines client et serveur utilisent le protocole HTTP pour s’échanger des messages et se comprendre. Ces messages sont normalisés et ont la forme suivante: Entêtes HTTP LigneVide Document
  • 7.
    Les méthodes HTTP Le protocole HTTP dispose de « méthodes »; ce sont des mots que le navigateur utilise pour dialoguer avec le serveur.  Nous nous intéressons à trois en particulier: GET,POST et HEAD.  GET: permet de récupérer une ressource web du serveur via une URL ou en cliquant sur un lien. La réponse consiste à retourner la ressource demandée, accompagnée d'informations diverses à son sujet (la taille des donnée, la date d ‘envoi…) dans ce qui s'appelle les en-têtes. Des paramètres peuvent être placés dans l’URL ou dans des cookies pour ensuite être transmises au serveur.  POST: permet de soumettre au serveur des données de tailles variables et volumineuses, parfait pour envoyer des fichiers par exemple.  HEAD: Cette méthode est identique à la méthode GET, la réponse du serveur contient seulement les en-têtes HTTP.  La requête HTTP part du client et arrive sur le serveur.  Alors le serveur HTTP (on parle également de serveur web) entre en jeu…  Pour l’écoute de la requête sur un port (en générale 80), il la transmet ensuite à un autre élément le conteneur …
  • 8.
    Java Framework  Laplateforme Java est composée de trois éditions, destinées à des usages différents :  Java ME : Java Micro Edition est prévu pour le développement d'applications embarquées, notamment sur des terminaux mobiles ;  Java SE : anciennement Java 2 Standard Edition est destiné au développement d'applications pour ordinateurs personnels, poste de travail (Application clasique) ;  Java EE : Java Enterprise Edition, destiné à des applications entreprises en fournissant un ensemble de composants sous forme d’API. Chaque édition propose un environnement complet pour le développement et l'exécution d'applications basées sur Java et comprend notamment une machine virtuelle Java (Java virtual machine) ainsi qu'un ensemble de classes. Java EE (Java Enterprise Edition) est une norme proposée par la société Sun, portée par un consortium de sociétés internationales, visant à définir un standard de développement d'applications d'entreprises multi-niveaux, basées sur des composants.  On parle généralement de la plateforme JEE pour désigner les services offerts (API), les composants et l’infrastructure d’exécution.
  • 9.
    La plateforme JEE La plateforme JEE comprend:  Les spécifications du serveur d'application, c'est-à-dire de l'environnement d'exécution: J2EE définit finement les rôles et les interfaces pour les applications ainsi que l'environnement dans lequel elles seront exécutées. Ces recommandations permettent ainsi à des entreprises tierces de développer des serveurs d'application conformes aux spécifications ainsi définies, sans avoir à redévelopper les principaux services.  Les service, c'est-à-dire des extensions Java indépendantes permettant d'offrir en standard un certain nombre de fonctionnalités. Ils pouvent être classés par catégories : Les services d'infrastructures : JDBC,JNDI… Les services de communication : JavaMail,JAAS…  Les composants, on distingue habituellement deux familles de composants :  Les composants web : Servlet et JSP.  Les composants métier : EJB (Enterprise Java Beans). Il s'agit de composants spécifiques chargés des traitements des données propres à un secteur d'activité (on parle de logique métier ou de logique applicative) et de l'interfaçage avec les bases de données.
  • 10.
  • 11.
    Architecture Java EE Typiquementc’est une architecture 3-tiers:  Tiers présentation: affichage des données  Tiers métier: gestion du métier de l’application  Tiers donnée: persistance des données Permet une séparation claire entre:  L’interface homme-machine  Les traitements métiers  Les données Basée sur des composants qui sont:  Distincts  Interchangeables  distribués
  • 12.
    un des composantsde base pour le développement d'applicationsWeb; Peut servir à créer dynamiquement des pages HTML; Bien sûr d’autres solutions existent pour les pages web dynamiques; Les servlets* peuvent servir à d’autres usages; Ecrite sur le langage Java, elle a tous les avantages du langage: Portabilité, l’accès aux APIs Java dont le JDBC… API Servlet * Sevlet est masculin selon le grand dictionnaire terminologique, féminin selon le livre Servlets Java: guide des programmeurs
  • 13.
    Une servlet  Unprogramme java qui s'exécute côté serveur: la portabilité, l'accès à toutes les API de java dont JDBC pour l'accès aux bases de données, ...  Effectue les traitements et renvoie le résultat correspondant à la requête du client. Elle agit selon le modèle requête/réponse.  Cette interaction peut être directe ou via un serveur http, ftp, etc  La principale utilisation actuelle est la génération de pages html dynamiques utilisant le protocole http et donc un serveur web,  Mais n'importe quel protocole reposant sur le principe de requête/réponse peut faire usage d'une servlet.  Une servlet peut être invoquée plusieurs fois en même temps pour répondre à plusieurs requêtes simultanées.  La servlet se positionne dans une architecture Client/Serveur trois tiers dans le tiers du milieu entre le client léger chargé de l'affichage et la source de données.  La version actuelle de la spécification servlet est 4.0.
  • 14.
    Serveur d’application  Unserveur d'application permet de charger et d'exécuter les servlets dans une JVM. C'est une extension du serveur web qui a ses limites: Pas de contenu dynamique, Pas de sauvegarde de données sur le serveur  Ce serveur d'application contient entre autre un moteur de servlets qui se charge de manager les servlets qu'il contient: un conteneur  La notion de conteneur se retrouve dans de nombreuses technologies – Servlet,Applet, MIDlet, Xlet, (*-let), EJB, …  Un conteneur est un composant logiciel système qui contrôle d’autres composants, dits métier – Tomcat est un exemple de conteneur – Les servlets n’ont pas de méthode main(), ils sont contrôlés par le conteneurTomcat – Les requêtes ne sont pas adressées aux servlets mais au conteneur dans lequel ils sont déployés.
  • 15.
    Pourquoi un conteneur?  Un conteneur web est un moteur de servlet prend en charge l’instanciation et le chargement de la servlet, gestion de son cycle de vie, passage des requêtes et des réponses ... Un conteur web peut être intégré dans un serveur d'application qui va contenir d'autre conteneur et éventuellement proposer d'autres services..  Pourquoi? Pour oublier le cours de « réseau » et faciliter la tâche du programmeur  Un conteneur fournit pour les Servlets – Un support pour la communication – La gestion du cycle de vie – Un support pour le Multithreading – Un support pour la sécurité – Un support pour les JSP Notion de moduleWeb  Un servlet ne peut pas être déployé directement dans un conteneur, il doit faire partie d’un moduleWeb  Un module Web est un ensemble de librairies, de fichiers de configurations, de code Java (bytecode des servlets…), …  Le moduleWeb est l’unité de déploiement dans le conteneur
  • 16.
    Le fonctionnement d’uneservlet  Remarque 1: Le chargement et l'instanciation d'une servlet se font selon le paramétrage soit au lancement du serveur soit à la première invocation de la servlet. Dès l'instanciation, la servlet est initialisée une seule et unique fois avant de pouvoir répondre aux requêtes. Cette initialisation peut permettre de mettre en place l'accès à des ressources tel qu'une base de données.  Pour exécuter une servlet, il suffit de saisir une URL qui désigne la servlet dans un navigateur. 1. Le serveur reçoit la requête http qui nécessite une servlet de la part du navigateur 2. Si c'est la première sollicitation de la servlet, le serveur l'instancie. Les servlets sont stockées (sous forme de fichier .class) dans un répertoire particulier du serveur. Ce répertoire dépend du serveur d'application utilisé. La servlet reste en mémoire jusqu'à l'arrêt du serveur.  Remarque 2: La servlet en mémoire, peut être appelée par plusieurs threads lancés par le serveur pour chaque requête. Ce principe de fonctionnement évite d'instancier un objet de type servlet à chaque requête et permet de maintenir un ensemble de ressources actives tel qu'une connexion à une base de données. 3. le serveur créé un objet qui représente la requête http et objet qui contiendra la réponse et les envoie à la servlet 4. la servlet créé dynamiquement la réponse sous forme de page html transmise via un flux dans l'objet contenant la réponse. La création de cette réponse utilise bien sûre la requête du client mais aussi un ensemble de ressources incluses sur le serveur tels de que des fichiers (bean) ou des bases de données. 5. le serveur récupère l'objet réponse et envoie la page html au client.
  • 17.
    Les outils pourdévelopper  Il faut utiliser le Java Server Development Kit (JSDK) qui est une extension du JDK.  Pour exécuter des application web, il faut un serveur d’application: Netbeans Versions commerciales mais aussi des versions libres telles queTomcat du projet GNU Jakarta.  Ce serveur d’application doit inclure un serveur web http dont le plus utilisé est Apache.  Le choix d’un serveur d’application doit tenir compte de la version du JSDK qu’il supporte.  Pour développer des servlets, le choix d’un des deux serveurs ApacheTomcat ou Glassfish se justifie pleinement de part sa gratuité et sa « légèreté »
  • 18.
    L'API servlet L'API servletsest une extension du jdk de base, regroupe dans des packages préfixés par javax Il en a deux:  javax.servlet : contient les classes pour développer des serlvets génériques indépendantes d'un protocole  javax.servlet.http : contient les classes pour développer des servlets qui reposent sur le protocole http utilisé par les serveurs web.
  • 19.
  • 20.
  • 21.
    Servlets HTTP GenericServlet fournieun niveau d'abstraction permettant de développer facilement des servlets avec le protocole http.
  • 29.
  • 36.
    Entêtes d’une requêteGET public class ShowRequestHeaders extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { //... out.println(doctype + "<html>n<head><title>" + title + "</title></head>n" + "<body>n<h1>" + title + "</h1>n" + "<b>Request Method: </b>" + request.getMethod() + "<br />n" + "<b>Request URI: </b>" + request.getRequestURI() + "<br />n" + "<b>Request Protocol: </b>" + request.getProtocol() + "<br />) out.println("<table>n" +"<tr><th>Header Name</th><th>HeaderValue</th></tr>"); Enumeration<String> headerNames = request.getHeaderNames(); while(headerNames.hasMoreElements()) { String headerName = headerNames.nextElement(); out.println("<tr><td>" + headerName + "</td>"); out.println("<td>" + request.getHeader(headerName) +"</td></tr>"); } out.println("</table>n</body></html>"); out.close(); } } Méthode de type HttpServletRequest getHeaderNames(), getHeader(String name)
  • 37.
  • 44.
  • 46.
    Formulaire GET <form action="Serv2"> <tableborder="0"> <tr> <td>Nom: </td><td><input type="text" name="nom"></td> </tr> <tr> <td>Prénom:</td><td><input type="text" name="prenom"></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value=" Envoyer" </td> </tr> </table> </form>
  • 47.
    Traitement formulaire GET publicclass LogServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException { String login = request.getParameter("nom") ; String password = request.getParameter("prenom") ; //WhatYouWant if (checkUserAndPassword(login,password)) { grantAccessTo(login); } else { sendAuthentificationFailure(login); } } } GET Get http://localhost:8080/WebModule1/Serv2? nom=houda&prenom=Belmokadem HTTP/1.1 host:localhost:8080 user-agent:Mozilla/4.0 accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */* accept-language:fr ...
  • 48.
    Formulaire POST <form method="post"action="Serv2"> <table border="0"> <tr> <td>Nom: </td><td><input type="text" name="nom"></td> </tr> <tr> <td>Prénom:</td><td><input type="text" name="prenom"></td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value=" Envoyer" </td> </tr> </table> </form>
  • 49.
    Traitement formulaire Post publicclass LogServlet extends HttpServlet { public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException { doGet(request, reponse); } } GET Post http://localhost:8080/WebModule1/Serv2 HTTP/1.1 host:localhost:8080 user-agent:Mozilla/4.0 accept:image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */* accept-language:fr ... content-type:application/x-www-form-urlencoded content-length:27
  • 50.
    Paramètres de formulaires publicclass ParametresFormulaire extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse reponse) throws IOException, ServletException{ … out.println(doctype+ "<html><head><title>"+title+"</title><head>"+ "<body>"); Enumeration<?> paramètres = request.getParameterNames(); if(!paramètres.hasMoreElements()) out.println("il n'existe pas de paramètre dans la requête du client" +"</body>+</html>"); else{ out.println(request.getQueryString()+ "<br><table border="0"><tr><th>Paramètre</th><th>Valeur</th></tr>"); while(paramètres.hasMoreElements()){ String param = (String) paramètres.nextElement(); out.println("<tr><td>"+param+"</td>"); String[] paramValues = request.getParameterValues(param); for(int i=0; i<paramValues.length ; i++){ out.println("<td>"+ paramValues[i]+ ";"+"</td>"); } out.println("</tr>"); } out.println("</table>"); } out.println("</body></html>"); out.close(); }
  • 51.
    Vérification de donnéesmanquantes  Champ manquant dans le formulaire • getParameter retourne null  Champ renvoyé vide • getParameter retourne une chaine vide (ou une chaine avec des espacements) String param = request.getParameter("someName"); if ((param == null) || (param.trim().equals(""))) { doSomethingForMissingValues(...); } else { doSomethingWithParameter(param); }
  • 52.
    Réponse HTTP (rappel) Une réponse HTTP peut contenir du HTML  HTTP rajoute des (meta)informations en entête du contenu de la réponse
  • 53.
    Les méthodes pourles Status Codes response.setStatus(int statusCode) – Utiliser les constantes, pas d’entiers directement – Noms dérivés du message standard • Ex : SC_OK, SC_NOT_FOUND, etc • response.sendError(int code, String msg) – Englobe le message dans un petit document HTML • response.sendRedirect(String url) – Le code de status est alors 301 – L’attribut « Location » est également généré dans l’entête de la réponse
  • 54.
    Exemple sendError public classLogServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { String login = request.getParameter("param1") ; String password = request.getParameter("param2") ; if ((login == null) || (login.trim().equals(""))) { response.sendError(HttpServletResponse.SC_NOT_FOUND,“champs login vide"); return; } if (checkUserAndPassword(login, password)) { grantAccessTo(login); } else { response.sendError(HttpServletResponse.SC_UNAUTHORIZED, “accès refuser au compte" + login); } } }
  • 55.
  • 56.
    Exemple sendRedirect public classWrongDestinationextends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userAgent = request.getHeader("User-Agent"); if ((userAgent != null) &&(userAgent.contains("MSIE")) { response.sendRedirect("http://home.netscape.com"); } else { response.sendRedirect("http://www.microsoft.com"); } } } Même URL de départ ensuite une redirection ...
  • 57.
    Générer un fichierExcel public class FichierExcel extends HttpServlet { public void doGet(HttpServletRequest requete, HttpServletResponse reponse) throws IOException,ServletException{ reponse.setContentType("application/vnd.ms-excel"); PrintWriter out = reponse.getWriter(); out.println("tQ1tQ2tQ3tQ4tTotal"); out.println("Applest78t87t92t29t=SOMME(B2:E2)"); out.println("Orangest77t86t93t30t=SOMME(B3:E3)"); } }
  • 58.
    Upload de fichiers(avec Commons FileUpload )  Formulaire HTML – <input type="file" name="nameFile" /> – <form method="post" enctype="multipart/form-data" action="/servlet"> – Le choix du enctype impacte les autres champs du formulaire • request.getParameter("name") ne fonctionne plus  Côté Servlet – utiliser une librairie Commons FileUpload du projet Jakarta (http://commons.apache.org/fileupload/)  Développement – import org.apache. tomcat.util.http.fileupload.* – import org.apache. tomcat.util.http.fileupload.servlet.*  Déploiement – Dans le moduleWeb de l’application… – …dans le répertoireWEB-INF/lib • commons-fileupload-1.2.1.jar • commons-io-1.4.jar
  • 59.
    Exemple : Uploadsimple (½) //Télécharger un fichier txt et l’afficher dans la réponse de la servlet if ( ServletFileUpload.isMultipartContent(request) ) { // create a factory for disk-based (large) file items FileItemFactory varr = new DiskFileItemFactory() ; ((DiskFileItemFactory) fileItemFactory).setSizeThreshold(40960); //the unit is bytes // create a new file upload handler ServletFileUpload var = new ServletFileUpload(varr); servletFileUpload.setSizeMax(81920); // the unit is bytes
  • 60.
    Exemple : Uploadsimple (2/2) try { List<?> fileItemsList = var.parseRequest(request); // Process file items Iterator<?> it = fileItemsList.iterator(); while (it.hasNext()){ DiskFileItem fileItem = (DiskFileItem)it.next(); if (fileItem.isFormField()){ // classic form field (name=value) out.println("<b>Champs:</b><br />n" + fileItem.getFieldName() +"=" + fileItem.getString()+ "<br/>"); } else{ // uploaded file out.println("<b>Fichier:</b><br />n<pre>" + fileItem.getString() + "</pre><br/>"); } } } catch (FileUploadException e) { out.println("Impossible de télécharger ce fichier"); e.printStackTrace();}}