Académique Documents
Professionnel Documents
Culture Documents
APPLICATIONS WEB :
SERVLETS, JSP
Introduction
Applications Web
http/HTML
Scripts cgi
Servlets
JSP
Tag lib
Applications « Web »
Protocole http :
Repose sur TCP [Au cours Réseaux tu te
réfèreras]
Contenu du fichier
/…/info.html
Protocole HTTP
Une Piqure de « rappel » tu auras
Le Protocole HTTP
HyperText Transfer Protocol
Protocole d’échanges d’information sur le web
Basé sur TCP
Version courante 1.1
Maintenant 2.0
URL
Unique Resource Location
Identifie les ressources de manière unique sur le Web
5 parties
Protocole (http, ftp, mail, …)
Host (google.com)
Port (8080, 80)
Path (Chemin vers la ressource sur le serveur)
Paramètres
http://server:port/path/to/resource?p1=v1&p2=v2
http://server:port/path/to/resource?p1=v1&p2=v2
Protocole Nom du serveur et Chemin de la Paramètres
port ressource
Enchainements Client - Serveur
Requête HTTP
Permet à un client d’envoyer des
messages à un serveur
Format d’un message HTTP
Request Message Header
Request Line
Request Headers [Optional]
Une démo ?
Autre exemple : Request
Request Line
POST /bibliotheque/faces/views/categorie/Create.xhtml HTTP/1.1
Request Headers
Host: localhost:8080
Connection: keep-alive
Content-Length: 176
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/
*;q=0.8
Origin: http://localhost:8080
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_0)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/
39.0.2171.65 Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:8080/bibliotheque/faces/views/categorie/List.xhtml
Accept-Encoding: gzip, deflate
Accept-Language: fr,fr-FR;q=0.8,en;q=0.6
Cookie: JSESSIONID=d64a9484e61761662575b5d14af1
Autre exemple : Request
Request Message Body
j_idt13:nom:Toto
j_idt13:description:Hello
Response Message Header
Response Line
HTTP/1.1 200 OK
Response Headers
HTTP/1.1 200 OK
X-Powered-By: Servlet/3.1 JSP/2.3 (GlassFish
Server Open Source Edition 4.0 Java/Oracle
Corporation/1.8)
Server: GlassFish Server Open Source Edition 4.0
Content-Type: text/html;charset=UTF-8
Date: Sun, 23 Nov 2014 16:05:39 GMT
Content-Length: 2274
Response Message Body
Response Body
<html xmlns="http://www.w3.org/1999/xhtml"><html
xmlns="http://www.w3.org/1999/xhtml">
<head><link
type="text/css" rel="stylesheet"
href="/bibliotheque/faces/javax.faces.resource/theme.css?
ln=primefaces-aristo" />
<link type="text/css" rel="stylesheet"
href="/bibliotheque/faces/javax.faces.resource/css/jsfcrud.css" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Create New Categorie</title></head><body>
<h1>Create New Categorie
</h1>
<p><div id="messagePanel"><table><tr style="color: green"><td>Categorie
was successfully created. </td>
</tr></table></div>
</html>
Retours d’information
Une fiche mémo :
http://authoritylabs.com/blog/common-http-respo
nse-codes-and-what-they-mean/
<<interface>> <<interface>>
HttpServlet
HttpServletRequest HttpServletResponse
MaServlet
Architecture d’une Servlet
La classe HttpServlet
Rôle = traiter la requête HTTP
Pour chaque méthode HTTP : GET, POST, PUT,
DELETE, etc. il y a une méthode
correspondante :
doGet(…) – répond aux requêtes HTTP GET
G e n e r ic S e r v le t
C lie n t
S erv er
req u est
resp o n se
s e r v ic e ( )
H T T P S e r v le t
B ro w ser
H T T P S erver
req u est
doG et ( )
resp o n se
s e r v ic e ( )
d o P o s t( )
Architecture d’une Servlet (2)
serveur,
Si jamais il s’agit de l’envoi d’un formulaire, taille des
données < 255 caractères,
On veut pouvoir bookmarker l’URL
La méthode HTTP POST est utilisée quand :
Le traitement change l’état du serveur : exemple
classique = un insert dans une base de données.
La quantité de données à envoyer est importante,
On veut cacher dans l’URL les paramètres (ex : mot
de passe)
Servlets API
Fonctions principales d’une Servlet :
Traiter les paramètres HTTP reçus dans la
requête (GET ou POST)
HttpServletRequest.getParameter(String)
Récupérer un paramètre de configuration de
l’application web (dans le descripteur web.xml)
ServletConfig.getInitParameter()
Récupérer un élément de l’en-tête HTTP
HttpServletRequest.getHeader(String)
Servlets API (2)
Spécifier dans le header de réponse le type
HttpServletResponse.setHeader(<name>, <value>) /
HttpServletResponse.setContentType(String)
<body>
<form method="get" action="TraiteFormulaire">
Titre : <select name="titre">
<option>Mr</option><option>Mme</option>
</select><br>
Prénom : <input name="prenom"><br>
Nom : <input name="nom"><br>
Mot de passe : <input name="motdepasse" type="password"><br>
<input type="submit"><input type="reset">
</form>
</body>
</html>
Servlet : traitement du formulaire
public class TraiteFormulaire extends HttpServlet {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE>Deuxième servlet</TITLE></HEAD>");
out.println("<BODY><H1>Bonjour ");
String titre = request.getParameter("titre");
if (titre.equals("Mr")) {
out.println("monsieur ");
} else if (titre.equals("Mme")) {
out.println("madame ");
} else throw new RuntimeException("Mauvais titre");
out.println(request.getParameter("nom")+",<br>");
String motdepasse = request.getParameter("motdepasse");
out.println("Votre mot de passe comprend "+motdepasse.length()+ "
caractères.");
out.println("</H1></BODY>");
out.println("</HTML>");
}
Servlet qui construit et sert une image
import javax.servlet.*;
import javax.servlet.http.*;
...
RenderingHints.VALUE_ANTIALIAS_ON);
g.setFont(new Font("Monospaced", Font.PLAIN, 14));
g.setColor(Color.BLUE);
g.fillRect(0, 0, 50, 20);
g.setColor(Color.YELLOW);
g.drawString(msg, 0, 20);
return buffer;
Résultat
Renvoyer un zip depuis une
Servlet
Exemple de http://www.kodejava.org/examples/590.html
protected void doGet(HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
try {
String path = getServletContext().getRealPath("data");
File directory = new File(path);
String[] files = directory.list();
if (files != null && files.length > 0) {
byte[] zip = zipFiles(directory, files);
ServletOutputStream sos = response.getOutputStream();
response.setContentType("application/zip");
response.setHeader("Content-Disposition", "attachment;
filename=\"DATA.ZIP\"");
sos.write(zip); sos.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
Servlets : contexte Request
HttpServletRequest hérite de ServletRequest
Cet objet encapsule la requête HTTP et fournit des
méthodes pour accéder aux informations
du client
de l'environnement du serveur
Exemples de méthodes
String getMethod() : retourne le type de requête
String getServerName() : retourne le nom du serveur
String getParameter(String name) : retourne la valeur d'un
paramètre
String[ ] getParameterNames() : retourne le nom des les
paramètres
String getRemoteHost() : retourne l'IP du client
String getServerPort() : retourne le port sur lequel le serveur
écoute
… (voir l'API Servlets pour le reste)
Servlets : exemple de contexte
Récupérer l’URL relatif de la
servlet
Permet d’obtenir des informations depuis le
header de la requête. Ex : chemin relatif
utilisé pour appeler la servlet :
public class ContextPathDemo extends HttpServlet {
protected void doGet(HttpServletRequest req,
HttpServletResponse res) throws ServletException,
IOException {
// HttpServletRequest.getContextPath() returns the
// portion of the request URI that indicates the
//context of the request.
String contextPath = req.getContextPath();
}
}
URI relatif à quoi cela sert-il ?
Dans le cas où une même servlet est
mappé sur plusieurs URLs,
Exemple, une Servlet qui streame des
fichiers mp3 dans /mp3/* a besoin de
récupérer le nom des fichiers…
/mp3/toto.mp3, /mp3/titi.mp3, on a
besoin de récupérer toto.mp3 pour
l’ouvrir…
req.getRequestURI().substring(req.getCo
ntextPath().length()) renvoie la fin de
l’URI sans le contexte de déploiement
Servlet : contexte Response
HttpServletResponse hérite de ServletResponse
Cet objet est utilisé pour construire un message de
réponse HTTP renvoyé au client, il contient
les méthodes nécessaires pour définir le type de contenu, en-
tête et code de retour
un flot de sortie pour envoyer des données (par exemple
HTML) au client
Exemples de méthodes
void setStatus(int) : définit le code de retour de la réponse
void setContentType(String) : définit le type de contenu MIME
ServletOutputStream getOutputStream() : flot pour envoyer
des données binaires au client
void sendRedirect(String) : redirige le navigateur vers l'URL
Conteneur de Servlets =
serveur
Une application WEB peut contenir plusieurs
Servlets
Pour tester et déployer une Servlet, il faut un
système d'exécution appelé conteneur de
Servlets
Le conteneur réalise le lien entre la Servlet et le
serveur WEB
Transforme code Java (bytecode) en HTML
Associe à des URL's virtuels une Servlet
Conteneur de Servlet
Plusieurs implémentations possibles :
Apache Httpd
Apache Tomcat
Jetty
Weblogic
Websphere
Wildfly
…
On démarre un serveur puis on déploie une ou plusieurs
applications
Souvent par copie du fichier war dans un répertoire du serveur
La plupart des serveurs proposent une interface web
d’administration qui permet de le faire
Conteneur de Servlets
Une application WEB est contenue dans un
répertoire physique sur le serveur (exploded) ou
dans un WAR [<packaging>war</packaging>]
Une application WEB possède une hiérarchie de
répertoires et de fichiers :
Et pour nous ?
pom.xml !
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >
<modelVersion>4.0.0</modelVersion>
<groupId>fr.miage.orleans.ihm</groupId>
<artifactId>monprojet</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
Fichier descripteur web.xml
</listener>
Classe de remplissage de la BD au
déploiement
public class InitApplication implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("##### BASE CREE ######");
compteBancaireFacade.creerComptesDeTest();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
…
}
SessionListener : compter les personnes
online. Dans le web.xml
<listener>
<listener-class>
demo.SessionCounter
</listener-class>
</listener>
Classe écouteur
public class SessionCounter implements HttpSessionListener {
private List sessions = new ArrayList();
public SessionCounter() { }
${activeSessionsNumber}
</body>
</html>
REMARQUE : ${activeSessionsNumber} va
chercher une propriété activeSessionsNumber
dans la page, la requête, la session, le contexte,
jusqu’à la trouver. Appelle
getActiveSessionsNumber()… Si page JSF,
Servlet : paramètres d’init
Possibilité d’utiliser des paramètres
d’initialisation
TRES utile pour la mise en production
Les paramètres d’initialisation sont définis
dans le fichier web.xml de l’application WEB
Exemple de paramètres d’initialisation
<init-param>
<param-name>compressionThreshold</param-name>
<param-value>10</param-value>
</init-param>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
Récupération des initParams, ici dans un
écouteur, au déploiement
doPost() doPut()
@WebServlet(asyncSupported = false,
name = "HelloAnnotationServlet",
urlPatterns = {"/helloanno"},
initParams = {@WebInitParam(name="param1",
value="value1"),
@WebInitParam(name="param2",
value="value2")} )
public class HelloAnnotationServlet extends HttpServle
{..}
<html>
<head><title>Login</title></head>
<body>
<form method="POST" action="LoginServlet">
Please login:<br>
Username:
<input type="text" name="username"><br>
Password:
<input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>
LoginServlet
LoginServlet.java
public class LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest req,
HttpServletResponse resp)
throws IOException, ServletException {
<html>
<head>
<title>Error</title>
</head>
<body>
<h1>Invalid login!</h1>
Please <a href="LoginForm.html">try again</a>.
</body>
</html>
Problèmes avec le cache du navigateur
La joie retrouvée
JSP
Equivalent JAVA de
ASP (Application Server Pages de
Microsoft)
et de PHP
Fonctionnement
JSP = Servlet !
JSP = Servlet !
Tags JSP
<% … %>
Tags de scripting
insertion de code java dans la servlet
<jsp:… >
Tags d’actions
facilitent l’utilisation de composants
Les directives
Syntaxe :
<%@directive attribut="valeur" …>
Syntaxe :
<%@include file="chemin relatif du fichier" %>
chemin relatif par rapport au répertoire qui contient la page JSP ou
relatif par rapport au contexte de l’application Web si il débute par /
Inclus le fichier dans le source JSP avant que celui-ci ne soit
interprété (traduit en servlet) par le moteur JSP
Le fichier peut être un fragment de code JSP, HTML ou Java
Tag utile pour insérer un élément commun à plusieurs
pages (en-tête, pied de page)
out : javax.servlet.jsp.JspWriter
Flux en sortie de la page HTML générée
request : javax.servlet.http.HttpServletRequest
Contient les informations de la requête
response :
javax.servlet.http.HttpServletResponse Contient
les informations de la réponse
session : javax.servlet.http.HttpSession
Gère la session
exception : java.lang.Throwable
L'objet exception pour une page d'erreur
Exemple de page JSP
<%@ page language="java" contentType="text/html;
charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-
8859-1">
<title>JSP simple : date</title>
</head>
<body>
<%java.text.DateFormat df = new
java.text.SimpleDateFormat("dd/MM/yyyy"); %>
Résultat
Tags de scripting
Exemple de page JSP avec formulaire
Tags de scripting
Exemple de page JSP avec formulaire
Commentaires
arguments
Regroupe un ensemble de propriétés
L’attribut scope :
page [valeur par défaut] : bean utilisable dans
toute la page JSP ainsi que dans les fichiers statiques
inclus.
request : bean accessible durant la durée de vie de la
requête. La méthode getAttribute() de l'objet request
permet d'obtenir une référence sur le bean.
session : bean utilisable par toutes les JSP de la même
session que la JSP qui a instanciée le bean. Le bean est
utilisable tout au long de la session par toutes les pages
qui y participent. La JSP qui créé le bean doit avoir
l'attribut session = "true" dans sa directive page
application : bean utilisable par toutes les JSP qui
appartiennent à la même application que la JSP qui a
instanciée le bean. Le bean n'est instancié que lors du
rechargement de l'application
Utiliser un Bean dans les JSP
Exemple :
Exemple :
<jsp:useBean id="utilisateur"
class="test.Personne" scope="session"/>
...
<jsp:setProperty name="utilisateur"
property="nom" value="Toto"/>
<jsp:setProperty name="utilisateur"
property="age" value="34"/>
Utilisation :
Pour pouvoir être utilisée dans une page JSP, une
bibliothèque de Tags doit être déclarée avec la
directive <%@ taglib>
Exemple :
<html>
<c:import url="header.jsp"/>
<body>
<c:import url="MenuGauche.jsp"/>
<c:import url="main.jsp"/>
<c:import url="footer.jsp"/>
</body>
</html>
Exemple : header.jsp
<head>
<title>DOS NDAO BANK</title>
<meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" />
<meta http-equiv="content-language" content="fr" />
… CSS
<link href="style.css" title="Défaut"
rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="roundies.js"/>
</script>
… autres scripts
</head>
Autre exemple : Struts Tag Lib
http://struts.apache.org
EL (Expression Language)
langage particulier constitué d'expressions qui
permet en particulier d'utiliser et de faire référence
à des objets java accessibles dans les différents
contextes (page, requête, session ou application)
d'une JSP
Initialement introduit avec la JSTL
Supporté de manière standard à partir de la version
1.4 J2EE (Servlets 2.4, JSP 2.0) =>web.xml en
2.3 !!
une expression EL peut être utilisée directement
dans n'importe quelle page JSP (à la place d'une
expression <%=expressionJava%> )
EL (Expression Language)
... public class Utilisateur {
Exemple : accès à un attribut
model.Utilisateur u = new private String nom;
private String prenom;
model.Utilisateur();
u.setNom("DUPONT"); public User() {
u.setPrenom("Jean"); }