Chapitre 2
Développement Webavec les technologies
JSP/Servlets
JSP/Servlets
2M.Romdhani, INSAT, Mars 2009
Sommaire
Architecture d’une application Web
Installation et configuration du Conteneur Tomcat
Les servlets HTTP
Les Java Server Pages
Les JavaBeans
Les Filtres HTTP
Le design pattern MVC2
JSP/Servlets
3M.Romdhani, INSAT, Mars 2009
Architecture d’une application web
JSP/Servlets
5M.Romdhani, INSAT, Mars 2009
Architecture-type d’une application web
Navigateur
Conteneur Web
JSP
Servlet
Base
de
données
Http
HTML, XML
Couche présentation Couche applicative(logique métier)
Couche de données
Les applications web connaissent un engouement ces derniers temps
La J2EE Facilite le développement d’applications web
Composants métier (JavaBeans)
JSP/Servlets
6M.Romdhani, INSAT, Mars 2009
Structure d’une application Web
Une application Web possède dans un repertoire lui-même dans webapps une architecture spécifique
*.html, *.jsp
/WEB-INF/web.xml
/WEB-INF/classes/
/WEB-INF/lib/
Pages HTML et JSP
fichier de configuration (XML)
classes des servlets et de beans
fichiers jar des servlets et utilitaires
L’ensemble des fichiers et répertoire peut être mis dans un war (Web Archive) grâce à la commande jar. Le war est automatiquement dé-jarré s’il est placé dans le répertoire webapps.
/WEB-INF
MaWebApp
JSP/Servlets
7M.Romdhani, INSAT, Mars 2009
Installation et configuration du conteneur Web
Tomcat
JSP/Servlets
8M.Romdhani, INSAT, Mars 2009
Le conteneur Apache Tomcat
Tomcat 6 (Catalina) Projet Apache (Apache Apache Httpd) Open source Implantation de référence de la spécification Tomcat 6 : Servlet 2.5 et JSP 2.1 (Java EE 5)
Suite à l’installation de Tomcat, positionner les 2 variables d’environnement suivantes :JAVA_HOME : Elle doit pointer le répertoire
d’installation du JDK
CATALINA_HOME : Elle doit pointer le répertoire d’installation de Tomcat.
JSP/Servlets
9M.Romdhani, INSAT, Mars 2009
Arborescence de Tomcat
/bin/common/lib/conf/logs/server/lib/shared/lib/webapps
scripts startup & shutdown
jar utilisés par Tomcat (Ant, Servlet, etc.)
configuration: server.xml, web.xml, users.xml
fichiers de logs
fichiers jar propres à Tomcat
fichiers jar communs à toutes les servlets
zone de déploiement
JSP/Servlets
10M.Romdhani, INSAT, Mars 2009
Les Servlets HTTP
JSP/Servlets
11M.Romdhani, INSAT, Mars 2009
Programmation HTTP en J2EE
J2EE offre une spécification standard d'une API (javax.servlet.http) permettant de programmer HTTP. Les programmes traitant des reqêtes HTTP sont appelés servlets.
Un conteneur standard, open source, et gratuit appelé Tomcat est disponible dans le cadre du projet Apache
L'objet représentant la requête HTTP s'appèle HttpServletRequest. La réponse HTTP est représentée par l'objet HttpServletResponse.
Les programmes côté serveur récupèrent leurs entrées à partir de HttpServletRequest et écrivent leurs sorties dans HttpServletResponse
Pour retourner du code HTML, on doit définir un flôt séquentiel de caractères à partir de l'object HttpServletResponse
Browser Web
Conteneur de Servlets
/admin/*
/vignette/*.html
/examples/*.html
servlet 1
servlet 2
HttpServletRequest
Tomcat
HttpServletResponse
JSP/Servlets
12M.Romdhani, INSAT, Mars 2009
Rappels concernant HTTP
Hyper Text Transfert Protocol (HTTP) protocole de RPC pour le web, sans état accès et récupération de ressources nommage des ressources : URL les données transmises sont décrites au moyen des types MIME messages
HTTP 1.0 : GET, POST, HEAD HTTP 1.1 (depuis juin 1999) : Rajout de PUT, DELETE, OPTIONS,
TRACE
Requête(GET …)
Réponse
ServeurNavigateur
JSP/Servlets
13M.Romdhani, INSAT, Mars 2009
Structure d’une requête HTTP Anatomie d’une requête :
ligne de requête commande : GET, POST nom de la ressource version du protocole (ex. HTTP/1.1)
champs d’en-tête: informations additionnelles concernant la requête et le client (nom:valeur)
Ligne vide corps de la requête: informations supplémentaires (plutôt pour les POST)
Requêtes GET Variables visibles dans l'URL Limitation de la taille (dépend de l'OS) Simplicité d'extraction des données Données dans le fichier log
Requêtes POST Les variables ne sont pas visibles dans l'URL Les variables sont envoyées dans les entêtes HTTP Pas de limitation de la taille Possibilité d'upload
JSP/Servlets
14M.Romdhani, INSAT, Mars 2009
Structure d’une réponse HTTP
Anatomie d’une réponse : ligne de requête
version du protocole (ex. HTTP/1.0) statut de la réponse (ex. 404) explication du statut (ex. not found)
champs d’en-tête informations additionnelle concernant le serveur et le document retourné (syntaxe =
nom:valeur) corps de la requête
la ressource retournée (page HTML)
Statut des réponse 100-199 : informations 200-299 : Requête réussie
200 : OK, 204: No Content, 205: Reset Content 300-399 : Requête redirigée, ou d'autres actions nécessaires 400-499 : requête incomplète
401 : UnAuthorized, 403: Forbidden, 404 : Not Found, 407: Proxy Authentification Required 500-599 : Réponse incomplète ou erronée (erreur du serveur)
500 : Internal Server Error, 501 : Not Implemented
JSP/Servlets
15M.Romdhani, INSAT, Mars 2009
La ServletRequest et la ServletResponse
L'interface ServletRequest permet de récupérer les paramètres de la requête :
public abstract int getContentLength() public abstract String getContentType() public abstract String getProtocol() public abstract String getScheme() public abstract String getServerName() public abstract int getServerPort() public abstract String getRemoteAddr() public abstract String getRemoteHost() public abstract ServletInputStream getInputStream()
throws IOException public abstract String getParameter(String name) public abstract String[] getParameterValues(String name) public abstract Enumeration getParameterNames() public abstract Object getAttribute(String name)
L'interface ServletResponse permet de renvoyer une réponse :
public abstract void setContentLength(int length) public abstract void setContentType(String type) public abstract ServletOutputStream getOutputStream() throws IOException
JSP/Servlets
16M.Romdhani, INSAT, Mars 2009
HTTP : Informations sur la requête
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain"); PrintWriter out= response.getWriter(); out.println("Protocol: " + request.getProtocol()); out.println("Scheme: " + request.getScheme()); out.println("ServerName: " + request.getServerName()); out.println("ServerPort: " + request.getServerPort()); out.println("RemoteAddr: " + request.getRemoteAddr()); out.println("RemoteHost: " + request.getRemoteHost()); out.println("Method: " + request.getMethod()); out.println("requestuestURI: " + request.getRequestURI()); out.println("ServletPath: " + request.getServletPath()); out.println("PathInfo: " + request.getPathInfo()); out.println("PathTranslated: " + request.getPathTranslated()); out.println("QueryString: " + request.getQueryString()); out.println("RemoteUser: " + request.getRemoteUser()); out.println("AuthType: " + request.getAuthType()); }
GET, POST, PUT etc.
Chemin virtuel complet
Chemin de laressource
Chemin sur le serveur
Chemin de la servlet
JSP/Servlets
17M.Romdhani, INSAT, Mars 2009
Descripteur de déploiement
Le fichier web.xml
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">
<web-app> <display-name>Mon application Web</display-name> <servlet> <servlet-name>maServlet</servlet-name> <servlet-class>mRomdhani.MaServlet</servlet-class> </servlet>
<servlet-mapping> <servlet-name>maServlet</servlet-name> <url-pattern>*.test</url-pattern> </servlet-mapping>
<servlet-mapping> <servlet-name>maServlet</servlet-name> <url-pattern>/toto</url-pattern> </servlet-mapping></web-app>
nom de la servletnom de la servletnom de la servlet
URI d’accès
URI d’accès
JSP/Servlets
18M.Romdhani, INSAT, Mars 2009
Le cycle de vie d’une Servlet
1. la servlet est crée puis initialisée init()
2. le service du client est implémenté service()
3. la servlet est détruite destroy()
Cette méthode n’est appelée par le serveur qu’une seule fois lors du chargement en mémoire par le moteur (ou conteneur) de servlet
Cette méthode est appelée automatiquement par le serveur à chaque requête de client
Cette méthode n’est appelée par le serveur qu’une seule fois à la fin permet de libérer des ressources (allouées par init() )
JSP/Servlets
19M.Romdhani, INSAT, Mars 2009
Un exemple de Servlet
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>Mon adorable Servlet </title> </head>");
out.println("<body><h1>Bienvenue à l’INSAT </h1>");
out.println("</body>");
out.println("</html>");
}
}
JSP/Servlets
20M.Romdhani, INSAT, Mars 2009
Les méthodes doGet() et doPost()
Utiliser les objets HttpServletRequest et HttpServletResponse passés en paramètres de ces méthodes pour implémenter le service :
HttpServletRequest contient les renseignements sur le formulaire
HTML initial (utile pour doPost()) - La méthode getParameter() récupère les paramètres d’entrée
HttpServletResponse contient le flux de sortie pour la génération
de la page HTML résultat (getWriter() )
JSP/Servlets
21M.Romdhani, INSAT, Mars 2009
Les Java Server Pages(JSP)
JSP/Servlets
22M.Romdhani, INSAT, Mars 2009
Les JSP (Java Server Pages)
<HTML>
<HEAD>
<TITLE>Ma toute première JSP</TITLE>
</HEAD>
<BODY>
<H1> Ceci est ma toute première JSP </H1>
Nous sommes le :
<% java.util.Date d = new java.util.Date();
out.println(d.toString());
%>
<P>
Au revoir et à bientôt
</BODY>
</HTML>
JSP/Servlets
23M.Romdhani, INSAT, Mars 2009
Balises JSP dans HTML
1 – Les scriptlets : du code java
2 – Les directives : pour le contrôle de la structure
3 – Les actions : pour le contrôle de la logique lors de l'appel à la page
Trois types de balises:
JSP/Servlets
24M.Romdhani, INSAT, Mars 2009
Les scriptlets : Les expressions
Ceci permet d’intégrer des valeurs dans le code HTML
Les valeurs sont évaluées, converties en chaînes de caractères et affichées
Syntaxe : <%= expression %>
Exemple :Il est <%= new java.util.Date() %> <P>et votre hostname est <%= request.getRemoteHost() %>
Les objets implicites (request, response, session, out, ...) disponibles
JSP/Servlets
25M.Romdhani, INSAT, Mars 2009
Les scriptlets : Les Scriptlets
C’est un bloc de code Java
Il est placé dans _jspService() de la servlet générée ayant accès :
Syntaxe : <% code Java %> (scriplets)
Exemple :<% String nom = request.getParameter("nom"); ... out.println("Nom de l'utilisateur " + nom);%>
o aux variables et beans déclarés ( <%! … %> ) o aux objets implicites
JSP/Servlets
26M.Romdhani, INSAT, Mars 2009
Directives
page : informations relatives à la page
include : fichiers à inclure littéralement
Syntaxe : <%@ directive attribut1="valeur" attribut2="valeur"... %>
3 directives possibles :
taglib : importer des bibliothèques de balises
JSP/Servlets
27M.Romdhani, INSAT, Mars 2009
Actions
Inclure dynamiquement un fichier
- Permettent de faire des actions au moment où la page
est demandée par un client
Utiliser des JavaBeans
Rediriger vers une autre page
- Syntaxe à la XML
JSP/Servlets
28M.Romdhani, INSAT, Mars 2009
Inclusion au moment où la page est servie, pas au moment où elle est traduite en servlet.
permet d'instancier un bean depuis une page JSP. associé à <jsp:getProperty.../> et <jsp:setProperty.../>
<jsp:include page="relative URL" flush="true" />
<jsp:usebean id="name" class="package.class" />
<jsp:forward page="/unAutreURI" />
redirige vers un autre URI/URL
Actions (suite)
<jsp:plugin />
Appèle le plugin Java à l’intérieur du navigateur
JSP/Servlets
29M.Romdhani, INSAT, Mars 2009
Objets implicites
request : le HttpServletRequest
response : le HttpServletResponse
Ce sont des variables prédéfinies accessibles dans les scriptlets :
session : le HttpSession
out : flot de sortie (idem response.getWriter())
application : le ServletContext (idem)
config : le ServletConfig de la page
JSP/Servlets
30M.Romdhani, INSAT, Mars 2009
Les JavaBeans
JSP/Servlets
31M.Romdhani, INSAT, Mars 2009
Notion de JavaBean
Un JavaBean est un POJO qui définit des méthodes qui exécuteront la logique métier afin décharger la servlet ou la JSP de le faire.
Se conformer aux design pattern MVC qui vise la séparation des propos afin de faciliter la maintenance des applications Web
Un JavaBean est un composant Java permettant de réaliser un traitement métier spécifique
Attributs simples Méthodes set/get permettant l’introspection
En simplifiant, on peut voir les JavaBeans comme des classes semblables aux autres, si ce n'est qu'ils proposent des méthodes « accesseurs » pour accéder à leurs attributs.
Les JavaBeans sont crées automatiquement et gérées par le conteneur
Les JavaBeans sont déployés sous WEB-INF/classes
JSP/Servlets
32M.Romdhani, INSAT, Mars 2009
JSP et les JavaBeans
package produits;
public class Produit { private String marque; private int prix ;
public String getMarque() {return marque;
} public void setMarque(String marque) {
this.marque = marque; } public int getPrix() {
return prix; } public void setPrix(int prix) {
this.prix = prix; }}
Développer le Bean et le déployer sous WEB-INF/classes
Référencer le Bean dans la JSP avec l'action <jsp:usebean …/>
<HTML> <HEAD><TITLE>Test du Bean </TITLE></HEAD> <BODY> <jsp:useBean id="MonBean" scope="session"
class="produits.Produit" type="produits.Produit"/>
Définition de la marque et du prix :<P>
<jsp:setProperty name="MonBean" property="marque" value="Dell" /> <BR> <jsp:setProperty name="MonBean" property="prix" value="2900" /> <BR>
Récupération de la marque et du prix du produit :<P> La marque est:<jsp:getProperty name="MonBean" property="marque" /> <BR> Le prix est:<jsp:getProperty name="MonBean"
property="prix" /> <BR> </BODY><HTML>
JSP/Servlets
33M.Romdhani, INSAT, Mars 2009
Usebean et getProperty()/getProperty()
Mécanisme très puissant !
Pour lire une propriété du bean :
<jsp:usebean id="name" (référence l'instance du composant) class="paquetage.class" (nom qualifié de la classe) scope="page|request|session|application" (portée)/>
<jsp:getProperty name="name" property="property"
/>
Pour modifier une propriété du bean :
<jsp:setProperty name="name" property="property" value="valeur"
/>
Pour modifier tous les attributs avec les paramètres HTTP de même nom : <jsp:setProperty name="name" property= * />
JSP/Servlets
34M.Romdhani, INSAT, Mars 2009
Les Filtres HTTP
JSP/Servlets
35M.Romdhani, INSAT, Mars 2009
Les filtres
ServletFiltre Filtre
Requête
RequêteRequête
Réponse
RéponseRéponse
Hello World
Hello World Filtré
JSP/Servlets
36M.Romdhani, INSAT, Mars 2009
Les filtres
Il est possible d’ajouter des filtres qui seront exécutés avant les servlets
<filter> <filter-name>footer</filter-name> <filter-class>fr.umlv.servletdemo.FooterFilter</filter-class> </filter>
<filter-mapping> <filter-name>footer</filter-name> <url-pattern>/filter/*</url-pattern> </filter-mapping>
<filter-mapping> <filter-name>footer</filter-name> <servlet-name>hello</servlet-name ></filter-mapping>
Filtre à partir d’un URL
Filtre à partir d’une servlet
JSP/Servlets
37M.Romdhani, INSAT, Mars 2009
Les filtres
Des wrappers permettent d’interagir avec la servlet
public void doFilter(ServletRequest request,ServletResponse response, FilterChain chain) throws IOException, ServletException {
response.setContentType("text/html"); PrintWriter out=response.getWriter(); out.println("<html><body bgcolor=\"white\"><h1>");
HttpServletResponseWrapper newResponse=new HttpServletResponseWrapper( (HttpServletResponse)response) { public void setContentType(String contentType) { } }; chain.doFilter(request,newResponse);
// context.getRequestDispatcher("/footer.html").include(request,response);
out.println("</h1></body></html>"); }
Appelle les autres filtresou la servlet
Exécuté avant
Exécuté après
JSP/Servlets
38M.Romdhani, INSAT, Mars 2009
Le design pattern MVC2
JSP/Servlets
39M.Romdhani, INSAT, Mars 2009
MVC 1 et MVC 2
MVC Model 1 et MVC Model 2 différent essentiellement en ce qui concerne l'entité responsable au traitement de la requête.
Dans le Model 1, c'est la JSP qui se charge de la requête Dans le Model 2, c'est une servlet (Controller) qui fait le
travail Un seul contrôleur frontal Un ensemble de contrôleurs spécialisés
MVC Model 1 MVC Model 2
JSP/Servlets
40M.Romdhani, INSAT, Mars 2009
Application Web selon le MVC2
L ’architecture MVC (Model-View-Controller) a pour but d ’organiser une application interactive en séparant : les données -> le modèle constitué des objets
métiers la représentation des données -> la vue qui
restitue les informations vers l'utilisateur le comportement de l ’application -> le
contrôleur chargé de l'acquisition d'informations en provenance de l'utilisateur
Organisation du MVC1 (Model1)
Modèle : JavaBeans Vue : Pages JSP Contrôleur : Page JSP
Organisation du MVC2 (Model2)
Modèle : JavaBeans Vue : Pages JSP Contrôleur : Servlet qui dirige les actions à effectuer en fonction de la requête émise par le client