servlet

publicité
Les Servlets
LPRO CMSII
Olivier FLAUZAC
[email protected]
http://cosy.univ-reims.fr/flauzac
lundi 21 novembre 11
Plan
• Généralités
• Architecture de base
• API standard
2
lundi 21 novembre 11
Généralités
3
lundi 21 novembre 11
Exécutions WEB
côté serveur
• Intégration du code dans du HTML
• approche Server Page
• PHP, ASP, JSP (Java J2EE)
• Approche «interface d’accès»
• CGI (Common Gateway interface)
• Servlet
4
lundi 21 novembre 11
Servlets
• Classe java autonome
• Exécutable sur un serveur étendu d’un moteur de
servlet
• Persistance des données
• Gestion des informations et flux WEB
• formulaires
• cookies
• sessions
• ...
5
lundi 21 novembre 11
Principe général des
Servlets
• Fichier .class sur le serveur
• Instanciation à la première utilisation
• attention à la latence
• Définit dans un contexte
• Accès par un URL :
• http://serveur/contexte/maServlet
• Exécution dans un thread
• Accès multiple simultanée
6
lundi 21 novembre 11
Motivation des servlets
• Efficacité (code semi compilé)
• Résidence
• Multithreadé
• Gestion du cache
• Portabilité
• Gestion de tous les aspects du WEB
7
lundi 21 novembre 11
Environnement
Requête
Serveur WEB
Conteneur de Servlets
Requête
ServletRequest
Client
Servlet
Réponse
Réponse ServletResponse
8
lundi 21 novembre 11
Cycle de vie
fin
début
chargement et
instanciation
init()
servlet
prête
service()
fin du thread
de traitement
9
lundi 21 novembre 11
traitement de
la requête
destroy()
fin de vie
Architecture de
base
10
lundi 21 novembre 11
Application WEB
11
lundi 21 novembre 11
Servlet élémentaire
• Classe : javax.servlet.Servlet
• Classe servlet générique
• pas lié à un contenu
• pas lié à un protocole
• Classe mère pour les servlet WEB
• Gestion du cycle de vie
• Gestion des traitements
• Objet requête
• Objet réponse
12
lundi 21 novembre 11
API servlet
• Initialisation
•
void init(ServletConfig config)
• Gestion du traitement
•
void service(ServletRequest req, ServletResponse res)
• Destruction
•
void destroy()
• Accès à la configuration
•
ServletConfig getServletConfig()
• Accès aux informations
•
String getServletinfo()
13
lundi 21 novembre 11
Servlet HTTP
• Classe : javax.servlet.http.HttpServlet
• Servlet adns le cadre HTTP
• Hérite de javax.servlet.Servlet
• Ajout de méthodes :
• gestion des requêtes POST
• gestion des requêtes GET
14
lundi 21 novembre 11
API
• Gestion des requêtes GET
•
void doGet(HttpServletRequest req, HttpServletResponse resp)
• Gestion des requêtes POST
•
void doGet(HttpServletRequest req, HttpServletResponse resp)
• Informations liées à la requête
•
String getRemoteUser()
•
String getRemoteAddr()
•
String getRemoteHost()
•
int getRemotePort()
15
lundi 21 novembre 11
Architecture des
fichiers
16
lundi 21 novembre 11
Architecture des
fichiers
•Adaptation en fonction de l’environnement :
•d’exécution (serveur)
•de développement
•de déploiement
16
lundi 21 novembre 11
Configuration et
contexte
• Définition d’une application WEB
• Définition de la liste des servlets
• association nom / URL
• mapping de d’accès
17
lundi 21 novembre 11
Exemple
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/
xml/ns/javaee/web-app_3_0.xsd">
</web-app>
18
lundi 21 novembre 11
Exemple
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/
xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>Toto</servlet-name>
<servlet-class>CoursServlets.Toto</servlet-class>
</servlet>
</web-app>
18
lundi 21 novembre 11
Exemple
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/
xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>Toto</servlet-name>
<servlet-class>CoursServlets.Toto</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Toto</servlet-name>
<url-pattern>/Toto</url-pattern>
</servlet-mapping>
</web-app>
18
lundi 21 novembre 11
Première servlet avec
NetBeans
• Utilisation du Wizard de développement
• création des descripteurs
• intégration des fichiers
• création du squelette de classe
• Déploiement
• Exécution et gestion du serveur
• Attention aux copier / coller !!!
19
lundi 21 novembre 11
Code généré
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import
import
import
import
import
import
java.io.IOException;
java.io.PrintWriter;
javax.servlet.ServletException;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
/**
*
* @author oflauzac
*/
20
lundi 21 novembre 11
Code généré
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import
import
import
import
import
import
java.io.IOException;
java.io.PrintWriter;
javax.servlet.ServletException;
javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest;
javax.servlet.http.HttpServletResponse;
/**
*
* @author oflauzac
*/
public class Hello extends HttpServlet {
20
lundi 21 novembre 11
Code généré (suite)
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Hello</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet Hello at " + request.getContextPath () + "</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
21
lundi 21 novembre 11
Code généré (suite)
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign
on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
22
}
lundi 21 novembre 11
Code généré (fin)
/**
* Returns a short description of the servlet.
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
23
lundi 21 novembre 11
API Standard
24
lundi 21 novembre 11
Gestion des formulaires
• Gestion des méthodes POST et GET
• Récupération des noms des champs
• Accès aux données
25
lundi 21 novembre 11
Formulaire API
Accès aux noms des paramètres
Enumeration getParameterName()
Accès aux valeurs des paramètres
String[] getParameterValues(String name)
String getParameter(String name)
26
lundi 21 novembre 11
Formulaire : exemple
Le formulaire :
...
<form name="f" method="GET" action="http://localhost:8084/LPRO/Form">
<p> Entrez votre nom <input type="text" name="nom"> </p>
<p> <input type="submit"> </p>
</form>
...
Le traitement :
...
// récupération de la valeur du paramètre
String s = (String) request.getParameter("nom");
...
// récupération de quelques informations
out.println("<p> La méthode utilisée est : " + request.getMethod() + "</p>");
out.println("<p> La requête est issue de " + request.getRemoteAddr() +"</p>");
out.println("<p> la valeur entrée est : " + s + "</p>");
...
27
lundi 21 novembre 11
Gestion des cookies
• Cookies : élément du protocole HTTP
• Stockage d’informations sur le client
• Information = chaînes de caractères
• dépose dans HttpServletResponse
• récupération dans HttpServletRequest
• gestion javax.servlet.http.Cookie
28
lundi 21 novembre 11
COOKIE API
Dépôt et récupération
void addCookie(Cookie c)
Cookie[] getCookie()
L’objet cookie
Cookie(String name, String value)
String getName()
int getMaxAge()
String getValue()
void setMaxAge(int expir)
29
void setValue(String
newValue)
lundi 21 novembre 11
Cookie : exemple
Le dépôt :
...
Cookie c = new Cookie("monCookie", "Bonjour");
c.setMaxAge(3600);
response.addCookie(c);
...
La lecture :
...
Cookie[] tabCook = request.getCookies();
...
// récupération de quelques informations
out.println("<p> Il y a " + tabCook.length + " cookie(s) </p>");
out.println("<p> les cookies sont : </p>");
for(int i=0;i<tabCook.length;i++){
out.println("<p> nom du cookie " + tabCook[i].getName());
out.println(" valeur du cookie : " + tabCook[i].getValue() + "</p>");
}
...
30
lundi 21 novembre 11
Gestion des sessions
• Gestion de l’information sur le serveur
• Suivi de navigation
• Transmission de l’id de session !
• réencodage des l’URL
• javax.servlet.http.HttpSession
31
lundi 21 novembre 11
Session API
Gestion de l’URL
String encodeURL(String URL)
L’objet HttpSession
Object getAttribute(String name)
Enumeration getAttributeNames()
String getId()
void setAttribute(Sting name, Object value)
void RemoveAttribute(String name)
32
lundi 21 novembre 11
Session : exemple
Création de la session :
HttpSession sess = request.getSession(true);
Poursuite de la session :
HttpSession sess = request.getSession(false);
Test de la session :
if(sess == null){ ... }
else{ ... }
Encodage de l’URL :
String lien = response.encodeURL("http://localhost:8084/LPRO/Session2");
out.println("<a href=\"" + lien + "\"> pour la suite </a>");
33
lundi 21 novembre 11
Session : exemple
Enregistrement des données :
String s = (String) request.getParameter("nom");
....
sess.setAttribute("nom",s);
Lecture des données :
String s = (String) sess.getAttribute("nom");
out.println("<p> Bonjour " + s + "</p>");
Id de session :
out.println("<p> id de session " + sess.getId() + "</p>");
34
lundi 21 novembre 11
Inclusion
• Inclusion du résultat d’une requête
• inclusion de html
• inclusion d’une autre servlet
• Utilisation d’un RequestDispatcher
• méthode de ServletRequest
35
lundi 21 novembre 11
Inclusion API
Récupération du dispatcher
RequestDispatcher
getRequestDispatcher(String path)
Inclusion
void include (ServletRequest request,
ServletResponse response)
Ne pas fermer les flux dans la servlet incluse !
36
lundi 21 novembre 11
Inclusion : exemple
Récupération d’un RequestDispatcher :
// cas d’une inclusion
RequestDispatcher r1 =
// cas d’une inclusion
RequestDispatcher r2 =
HTML
request.getRequestDispatcher("incluse.html");
de servlet
request.getRequestDispatcher("Incluse");
Réalisation de l’inclusion «simple» :
r1.include(request,response);
Inclusion avec paramètres :
request.setAttribute("nom","Olivier");
r2.include(request,response);
37
lundi 21 novembre 11
Délégation
• Délégation de l’exécution à une autre
servlet
• Création de chaînes d’exécutions
• Réponse depuis la servlet déléguée
• Utilisation d’un RequestDispatcher
• méthode de ServletRequest
38
lundi 21 novembre 11
Délégation API
Récupération du dispatcher
RequestDispatcher
getRequestDispatcher(String path)
Délégation
void forward (ServletRequest request,
ServletResponse response)
39
lundi 21 novembre 11
Délégation : exemple
Récupération d’un RequestDispatcher
// cas d’une inclusion
RequestDispatcher r1 =
// cas d’une inclusion
RequestDispatcher r2 =
HTML
request.getRequestDispatcher("Delegue");
de servlet
request.getRequestDispatcher("err.html");
Réalisation de la délégation :
r1.forward(request,response);
r2.forward(request,response);
40
lundi 21 novembre 11
Téléchargement