JSP Servlets - Web Services 33

publicité
Chapitre 2
Développement Web
avec les technologies
JSP/Servlets
Sommaire
JSP/Servlets
 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
M.Romdhani, INSAT, Mars 2009
2
JSP/Servlets
Architecture
d’une application web
M.Romdhani, INSAT, Mars 2009
3
JSP/Servlets
Architecture-type d’une application web
Couche présentation
Couche applicative
(logique métier)
Couche de données
Conteneur Web
Http
Navigateur
JSP
Servlet
HTML, XML
Base
de
données
Composants métier (JavaBeans)
 Les applications web connaissent un engouement ces derniers temps
 La J2EE Facilite le développement d’applications web
M.Romdhani, INSAT, Mars 2009
5
JSP/Servlets
Structure d’une application Web
Une application Web possède dans un repertoire luimême dans webapps une architecture spécifique
MaWebApp
*.html, *.jsp
Pages HTML et JSP
/WEB-INF
/WEB-INF/web.xml
fichier de configuration (XML)
/WEB-INF/classes/
classes des servlets et de beans
/WEB-INF/lib/
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.
M.Romdhani, INSAT, Mars 2009
6
JSP/Servlets
Installation et
configuration du
conteneur Web
Tomcat
M.Romdhani, INSAT, Mars 2009
7
JSP/Servlets
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.
M.Romdhani, INSAT, Mars 2009
8
JSP/Servlets
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
M.Romdhani, INSAT, Mars 2009
9
JSP/Servlets
Les Servlets HTTP
M.Romdhani, INSAT, Mars 2009
10
JSP/Servlets
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
Tomcat
HttpServletRequest
/admin/*
servlet 1
HttpServletResponse
/vignette/*.html
/examples/*.html
M.Romdhani, INSAT, Mars 2009
servlet 2
Conteneur de Servlets
11
JSP/Servlets
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
Navigateur
M.Romdhani, INSAT, Mars 2009
Serveur
12
JSP/Servlets
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
M.Romdhani, INSAT, Mars 2009
13
JSP/Servlets
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
M.Romdhani, INSAT, Mars 2009
14
JSP/Servlets
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
M.Romdhani, INSAT, Mars 2009
15
JSP/Servlets
HTTP : Informations sur la requête
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
GET, POST, PUT etc.
PrintWriter out= response.getWriter();
out.println("Protocol: " + request.getProtocol());
out.println("Scheme: " + request.getScheme());
out.println("ServerName: " + request.getServerName());
out.println("ServerPort: " + request.getServerPort());
Chemin virtuel complet
out.println("RemoteAddr: " + request.getRemoteAddr());
out.println("RemoteHost: " + request.getRemoteHost());
out.println("Method: " + request.getMethod());
out.println("requestuestURI: " + request.getRequestURI());
Chemin de la servlet
out.println("ServletPath: " + request.getServletPath());
out.println("PathInfo: " + request.getPathInfo());
out.println("PathTranslated: " + request.getPathTranslated());
Chemin de la
out.println("QueryString: " + request.getQueryString());
out.println("RemoteUser: " + request.getRemoteUser());
ressource
out.println("AuthType: " + request.getAuthType());
}
Chemin sur le serveur
M.Romdhani, INSAT, Mars 2009
16
JSP/Servlets
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>
nom de la 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>
M.Romdhani, INSAT, Mars 2009
URI d’accès
URI d’accès
17
JSP/Servlets
Le cycle de vie d’une Servlet
1. la servlet est crée puis initialisée init()
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
2. le service du client est implémenté service()
Cette méthode est appelée automatiquement par le
serveur à chaque requête de client
3. la servlet est détruite destroy()
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() )
M.Romdhani, INSAT, Mars 2009
18
JSP/Servlets
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>");
}
}
M.Romdhani, INSAT, Mars 2009
19
JSP/Servlets
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() )
M.Romdhani, INSAT, Mars 2009
20
JSP/Servlets
Les Java Server Pages
(JSP)
M.Romdhani, INSAT, Mars 2009
21
JSP/Servlets
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>
M.Romdhani, INSAT, Mars 2009
22
JSP/Servlets
Balises JSP dans HTML
Trois types de balises:
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
M.Romdhani, INSAT, Mars 2009
23
JSP/Servlets
Les scriptlets : Les expressions
Syntaxe : <%= expression %>
Exemple :
Il est <%= new java.util.Date() %> <P>
et votre hostname est <%= request.getRemoteHost() %>
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
Les objets implicites (request, response, session, out, ...)
disponibles
M.Romdhani, INSAT, Mars 2009
24
JSP/Servlets
Les scriptlets : Les Scriptlets
Syntaxe : <% code Java %> (scriplets)
Exemple :
<%
String nom = request.getParameter("nom");
...
out.println("Nom de l'utilisateur " + nom);
%>
C’est un bloc de code Java
Il est placé dans _jspService() de la servlet générée ayant
accès :
o aux variables et beans déclarés ( <%! … %> )
o aux objets implicites
M.Romdhani, INSAT, Mars 2009
25
JSP/Servlets
Directives
Syntaxe : <%@ directive attribut1="valeur" attribut2="valeur"... %>
3 directives possibles :
page : informations relatives à la page
include : fichiers à inclure littéralement
taglib : importer des bibliothèques de balises
M.Romdhani, INSAT, Mars 2009
26
JSP/Servlets
Actions
- Syntaxe à la XML
- Permettent de faire des actions au moment où la page
est demandée par un client
Inclure dynamiquement un fichier
Utiliser des JavaBeans
Rediriger vers une autre page
M.Romdhani, INSAT, Mars 2009
27
JSP/Servlets
Actions (suite)
<jsp:include page="relative URL" flush="true" />
Inclusion au moment où la page est servie, pas au moment où
elle est traduite en servlet.
<jsp:usebean id="name" class="package.class" />
permet d'instancier un bean depuis une page JSP.
associé à <jsp:getProperty.../> et <jsp:setProperty.../>
<jsp:forward page="/unAutreURI" />
redirige vers un autre URI/URL
<jsp:plugin />
Appèle le plugin Java à l’intérieur du navigateur
M.Romdhani, INSAT, Mars 2009
28
JSP/Servlets
Objets implicites
Ce sont des variables prédéfinies accessibles dans les scriptlets :
request : le HttpServletRequest
response : le HttpServletResponse
session : le HttpSession
out : flot de sortie (idem response.getWriter())
application : le ServletContext (idem)
config : le ServletConfig de la page
M.Romdhani, INSAT, Mars 2009
29
JSP/Servlets
Les JavaBeans
M.Romdhani, INSAT, Mars 2009
30
JSP/Servlets
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
M.Romdhani, INSAT, Mars 2009
31
JSP/Servlets
JSP et les JavaBeans
 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 …/>
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;
}
}
M.Romdhani, INSAT, Mars 2009
<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>
32
JSP/Servlets
Usebean et getProperty()/getProperty()
 Mécanisme très puissant !
<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)
/>
 Pour lire une propriété du bean :
<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"
M.Romdhani, INSAT, Mars 2009
property= * />
33
JSP/Servlets
Les Filtres HTTP
M.Romdhani, INSAT, Mars 2009
34
JSP/Servlets
Les filtres
Requête
Requête
Requête
Réponse
Réponse
Réponse
Filtre
Filtre
Servlet
Hello World
Hello World Filtré
M.Romdhani, INSAT, Mars 2009
35
JSP/Servlets
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>
M.Romdhani, INSAT, Mars 2009
Filtre à partir d’un URL
Filtre à partir d’une servlet
36
JSP/Servlets
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>");
Exécuté avant
HttpServletResponseWrapper newResponse=new HttpServletResponseWrapper(
(HttpServletResponse)response) {
public void setContentType(String contentType) {
}
Appelle les autres filtres
};
ou la servlet
chain.doFilter(request,newResponse);
// context.getRequestDispatcher("/footer.html").include(request,response);
out.println("</h1></body></html>");
}
Exécuté après
M.Romdhani, INSAT, Mars 2009
37
JSP/Servlets
Le design pattern
MVC2
M.Romdhani, INSAT, Mars 2009
38
JSP/Servlets
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
M.Romdhani, INSAT, Mars 2009
MVC Model 2
39
JSP/Servlets
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
M.Romdhani, INSAT, Mars 2009
40
Téléchargement