Académique Documents
Professionnel Documents
Culture Documents
Serveur d’applications
• Une servlet est un objet qui peut être manipulé
par le conteneur via l’interface suivante: Client Conteneur de servlets
Requête HTTP
«interface» Servlet
Servlet
void destroy() Réponse HTTP Serveur
constructor destroy() HttpServletRequest HttpServletResponse
ServletConfig getServletConfig() HTTP
init()
String getServletInfo()
void init(ServletConfig)
void service(ServletRequest, Ready
ServletResponse)
service()
GenericServlet
Créer une première servlet avec Structure des fichiers d’une application
Web sous Eclipse
Eclipse (4)
5.Déployez votre servlet sur votre serveur d'application :
•Cliquez sur votre projet dans l'explorateur de projets.
•Cliquez sur "Run" > "Run on Server".
•Sélectionnez votre serveur d'application cible et cliquez
sur "Finish".
•Accédez à votre servlet à partir de votre navigateur web
en utilisant l'URL appropriée.
12
Une servlet en 3 étapes (1/3) Une servlet en 3 étapes (2/3)
import java.io.*;
import javax.servlet.*; •Ecrire une servlet et le mettre
import javax.servlet.http.*; dans src (ici Clock.java )
• Servlet existe --> comment l’associer à
public class Clock extends HttpServlet{
public void doGet (HttpServletRequest request, Servlet classique:
redéfinit doGet()
l’application?
HttpServletResponse response)
throwsIOException{ de HttpServlet • Associer la servlet à une URL
PrintWriter out= response.getWriter();
java.util.Date today=new java.util.Date(); web.xml
String docType= "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "+ • /WEB.INF
"Transitional//EN\">\n";
out.println(docType); • Le contenu est impérativement placé
out.println("<html>");
out.println("<head>\n<title>Clock</title>\n</head>"); entre <web-app> et </web-app>
Code HTML out.println("<body>\n"+
incorporé "<h1>Time on server</h1>\n"+
dans Java "<p>"+ today+ "</p>\n"+
"</body>");
out.println("</html>");
} 10
14
}
<servlet>
<servlet-name>The Clock</servlet-name>
<servlet-class>telecom.Clock</servlet- <servlet-name> permet de lier
</servlet>
class>
classe Java <servlet> et <servlet-mapping>
<servlet-mapping>
<servlet-name>The Clock</servlet-name>
<url-pattern>/testclock</url-pattern>
</servlet-mapping> nom utilisé par le client
</web-app> dans sa requête 11 16
En résumé Les différents contextes
• Le client envoie des req au serveur grâce aux méthodes du protocole
HTTP (GET, POST et HEAD).
• Le conteneur Web place chaque req dans un objet HttpServletRequest • Lorsqu’une requête est prise en charge par une
et chaque réponse qu’il initialise dans objet HttpServletResponse.
servlet, le traitement peut demander l’usage
• Le conteneur transmet chaque couple req/réponse à une servlet : objet
Java assigné à une requête et capable de générer une réponse d’informations se situant dans différents contextes.
La servlet est le point d’entrée d’une application Web et se déclare
• 1er contexte: l’application en question
dans son fichier de configuration web.xml
• Pour pouvoir traiter une req de type Get , une servlet doit implémenter • 2ème contexte: la session
la méthode doGet()
• 3ème contexte: la requête
• Une servlet n’est pas chargée de l’affichage des données (HTML, CSS,
etc)
17 18
Contexte de la requête
• L’objet de type HttpServletRequest passé en HttpServletRequest
String getContextPath()
HttpServletResponse
paramètre des méthodes doXXX() permet d’accéder Cookie[] getCookies() void addCookie(Cookie cookie)
String getHeader(String) void addHeader(String, String)
aux informations de la requête String getMethod() String encodeRedirectURL(String)
String getQueryString() void sendError(int, String)
HttpSession getSession() void setStatus(int)
// Other methods not listed here… // Other methods not listed here…
8
19
Lecture des informations de l’URL Lecture de l’en-tête de la requête
HttpServletRequest méthodes d’accès aux différents composants de
Méthode Rôle
l’URL.
Méthode Rôle getcharacterEncoding () L’encodage utilisé pour le corps de la req ou null si la req
getScheme () Protocole utilisé (http/https) ne définit pas d’encodage
getServerName () Nom de l’hôte de la machine (nom domaine, …) getContentLength () et Taille en octet des informations situées dans le corps de la
getContentLenghtLong () req ou -1 si la taille n’est pas connue
getServerPort () Port utilisé par la req HTTP getContentType () Retourne le type de média ou null si le type n’est pas
getContextPath () Nom de l’application (nom du projet) connu
getServletPath () Chemin d’accès à la servlet getLocale () Retourne un objet de type java.util.Locale (Langues à
utiliser au niv du navigateur)
getQueryString () Chaîne de carac correspondant à tous les param
getMethod () Méthode utilisée par la req (GET, POST, …)
passés à la req
getHeader (String name) Retourne la valeur de l’entête passée en paramètre
getRemoteAddr @ IP de l’émetteur de la req HTTP
() getHeaders (String name) Retourne la valeur de l’entête passée en paramètre
sous la forme d’une collection (Accept-Language)
getRemoteHost () Nom de l’hôte de l’émetteur de la req HTTP
getIntHeader (String name) Valeur de l’entête sous la forme d’un entier ou -1 si
getLocalAddr () @ IP de la carte réseau du serveur par la quelle la l’entête n’est pas présent
req HTTP a été reçue
getDateHeader (String name) Pour l lecture des paramètres comme If-Modified-Since
getLocalName () Le nom d’hôte de la carte réseau du serveur par la
getHeaderNames (String name) Collection de l’ensemble des en-têtes présents sur la req.
quelle la req HTTP a été reçue
getLocalPort () Le port sur lequel a été reçue la req HTTP 21 22
Exemple: Affichage des entêtes d’une requête 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 />\n"+
"<table>\n"+
"<tr><th>Header Name</th><th>Header Value</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>");
} 17 24
}
Lecture des paramètres Lecture des paramètres dans la servlet
Exemple : getParameterValues
Exercice d’application
Développer une application Web basée sur une Servlet pour
vérifier si un utilisateur est éligible au vote ou non.
Prenez un formulaire HTML et obtenez des commentaires de
l’utilisateur.
Sur la base de la vérification de l’âge saisie, il / elle est
éligible pour voter ou non? Affichez le message approprié à
l’utilisateur final. Supposons que 18 ans est l’âge minimum
pour voter.
test
34
L’en-tête de la réponse
Entête réponse HTTP HttpServletResponse
• Ex: Ligne de statut Méthode Rôle / Signification
HTTP/1.1 200 OK
Date: Wed,8 Oct 2008 16:19:13 GMT setStatus (int sc) Code de statut de la réponse
Server: Apache-Coyote/1.1 HttpServletResponse.SC_SWITCHING_PROTOCOLS 101: communication va changer de
Content-Type: text/html Entête protocole communiquer avec
Content-Lenght: 1234 WebSocket (protocole réseau +
Connection: close interface de programmtion)
<html> HttpServletResponse.SC_OK 200
... Corps HttpServletResponse.SC_MOVED_PERMANTLY 301. Ressource demandée a changé
</html> d’URL
HttpServletResponse.SC_FORBIDDEN 403. Serveur a refusé de traiter la req
• Quelques codes réponses HttpServletResponse.SC_INTERNAL_SERVER_ERROR 500. Erreur de traitement côté
– 200 OK serveur
– 301 MOVED setHeader (String name, String value) Appliquer une valeur à un en-tête
– 403 FORBIDDEN donné
– 404 NOT FOUND
setDateHeader (String name, long date) L’écriture des en-têtes de type Date
– 503 SERVICE UNAVAILABLE 31
setIntHeader (String name, int value) L’écriture des en-têtes de type int 36
Status Codes Exemple sendError
public class LogServlet extends HttpServlet{
• response.setStatus(int statusCode) public void doGet (HttpServletRequest request,
– Utiliser les constantes, pas d’entiers directement HttpServletResponse response) throws IOException{
String login=request.getParameter("param1");
– Noms dérivés du message standard String password=request.getParameter("param2");
Exemple sendRedirect
public class WrongDestination 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");
}
}
}
39