Beruflich Dokumente
Kultur Dokumente
Etude du Web-tier
3 catégories :
– 1- fonctions de présentation
• interface utilisateur…
– 3- fonctions de stockage
07/11/2002 © P. Itey - INRIA 5
Rappels : fonction de présentation
– présentation,
– outils métiers,
– CGI,
– servlets…
Simplifier le développement
Gain en productivité :
Maintenance et sécurité :
Un composant :
– exporte des attributs, propriétés et
méthodes,
– peut être configurable,
– est capable de s’auto-décrire (introspection)
Composants
– nommage,
– sécurité,
– transaction,
– persistance, ….
Structures d'accueil
– Espaces d’exécution des conteneurs et des
composants
Principes de J2EE
– au développement,
– au déploiement,
– à l’exécution
– les Applets,
Les Servlets
Client autonome
Application Web
Application Business-to-business
JNDI (suite)
Topologie(s) du Web-Tier
Technologies “traditionnelles”
Technologies "traditionnelles"
Conteneur Conteneur
web EJB
Navigateur Web
Serveur WEB
Client
Requête (http) H JVM
Tier Web
T
Réponse XML
T Servlet
P
maServlet.class
Navigateur Web
Conteneur
web
http://host/servlets/maServlet
07/11/2002 © P. Itey - INRIA 88
API Servlet
Les classes et les interfaces pour les Servlets
sont définies dans 2 packages :
– javax.servlet
• package générique indépendant des protocoles
– javax.servlet.http
• spécifique à HTTP
• permet la gestion des sessions
2 classes abstraites :
– javax.servlet.GenericServlet
– javax.servlet.http.HttpServlet
void service()
void service()
void doXXX()
import javax.servlet.*;
– javax.servlet.ServletRequest
• encapsule la requête du client
• contient le flot d'entrée dans lequel lire les
données en provenance du client
– javax.servlet.ServletResponse
• contient le flot de sortie pour répondre au client
javax.servlet.http.HttpServlet
Méthodes de HttpServlet
Une servlet est une sous-classe de HttpServlet
dans laquelle on surcharge la ou les méthodes
doXXX() appropriées :
– requête GET, HEAD : doGet()
– requête POST : doPost()
–…
Structure de base
// La traiter
// Répondre
Les méthodes de
HttpServletRequest
String getMethod()
– retourne la méthode HTTP
String getHeader(String name)
– retourne le paramètre name de l'entête
HTTP de la requête
String getRemoteHost()
– retourne le nom d'hôte du client
String getRemoteAddr()
– retourne l'adresse IP du client
07/11/2002 © P. Itey - INRIA 101
Les méthodes de
HttpServletRequest
String getServerName()
– retourne le nom du serveur
String getServerPort()
– le port sur lequel le serveur écoute
07/11/2002 © P. Itey - INRIA 102
Répondre au serveur
HttpServletResponse hérite de
ServletResponse :
– utilisé pour construire un message de
réponse HTTP renvoyé au navigateur client
– contient les méthodes nécessaires pour
définir : type de contenu, en-tête et code de
retour
– contient un flot de sortie pour envoyer des
données (HTML ou autre) au navigateur
07/11/2002 © P. Itey - INRIA 103
Les méthodes de
HttpServletResponse
Les méthodes de
HttpServletResponse
PrintWriter getWriter()
– pour envoyer des données texte au client
ServletOutputStream
getOutputStream()
– flot pour envoyer des données binaires
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
response.setContentType("text/html");
import javax.servlet.*;
import javax.servlet.http.*;
void init() :
Initialisation
Affecter une requête à un thread Appeler la méthode service()
Requête HTTP 1
Exécution
Affecter une requête à un thread Appeler la méthode service() service
Requête HTTP 2
Implémenter SingleThreadModel
javax.servlet.SingleThreadModel
– interface vide, ne contient aucune méthode
<FORM
METHOD="POST"
ACTION="http://host/servlet/demandeServlet"
>
Nom :
<INPUT type="text" name="Nom" />
<BR>
<INPUT type="submit" value="Envoyer" />
</FORM>
URL?nom1=val1&nom2=val2&...
Dans le formulaire :
String n = req.getParameter("nom")
Partie Description
Cookie et sécurité ?
Jamais interprété ou exécuté : pas de virus
Méthodes de Cookie
Pour les fixer des attributs supplémentaires
public void
doGet(HttpServletRequest req,
HttpServletResponse rep) {
Cookie c = new Cookie ("nom", "toto");
c.setMaxAge(365*24*60*60); // 1 an
rep.addCookie( c );
rep.setContentType("text/html"); …
}
Techniques de mémorisation
Réécriture d'URL
Limitations :
– données volumineuses,
– caractères autorisés,
– longueur URL,
– données visibles (sécurité)
Limitations :
– idem la "réécriture d'URL" sauf pour la
sécurité (utilisation de POST)
L'interface HttpSession
Pseudo-algorithme :
– si GET : regarder la requête
– si POST : regarder dans l'en-tête HTTP
– Sinon, rechercher un cookie "sessionid"
Pseudo-algorithme (suite) :
Utiliser HttpSession
– HttpSession getSession() :
retourne la session courante, si elle n'existe
pas, elle est créée
– HttpSession getSession(boolean
create) :
idem sauf que la session n'est créée que si
create = true, sinon retourne null
HttpSession session =
request.getSession();
session.putValue( "table",
newArrayList());
ArrayList tab =
(ArrayList)session.getValue("table");
boolean isNew() :
retourne true si nouvelle session
void invalidate() :
invalide la session et supprime les associations
nom / valeur
int getMaxInactiveInterval() :
retourne l'intervalle maximal d'inactivité en
secondes
void setMaxInactiveInterval :
définit l'intervalle maximal d'inactivité en
secondes
boolean
isRequestedSessionIdFromCookie()
retourne true si l'ID de session a été passé
dans un cookie
boolean
isRequestedSessionIdFromURL()
retourne true si l'ID des session a été passé
dans l'URL
07/11/2002 © P. Itey - INRIA 155
Utiliser HttpSession sans cookies
L'implémentation par défaut de HttpSession
utilise les cookies
– si les cookies ne sont pas autorisés par le
navigateur, la mémorisation des sessions ne
fonctionne pas
Réécriture d'URL
Méthodes de HttpServletRequest :
String encodeRedirectURL(String
url)
encode l'URL avant de rediriger le Navigateur
3 types :
<%
String[] noms = {"titi", "toto"};
for(int i = 0; i < noms.length; i++){
out.println(noms[i]);
}
%>
<%
String[] noms = {"titi", "toto"};
for(int i = 0; i < noms.length; i++){
%>
Le nom <%= i %> ième nom est
<%= noms[i] %>
<%
}
%>
<%!
private int accessCount = 0;
private int incrementCount() {return
accessCount++;}
%>
…
Directives
Valeurs possibles :
– <%@ page language="java"
– <%@ page import="java.util.*, java.net.*" %>
– <%@ page contentType="text/plain" %>
– <%@ page session="true|false " %>
– <%@ page errorPage="pathToErrorPage" %>
– <%@ page isErrorPage="true|false" %>
– <%@ page …
<html><body>
Information d'exception :
<strong> <%= exception %> </strong>
<pre>
<%
java.io.PrintWriter monWriter =
new java.io.PrintWriter(out);
exception.printStackTrace(monWriter);
%>
</pre></body></html>
Variables prédéfinies
Ou "objets implicites", ils sont accessibles dans
les balises JSP :
– request : le HttpServletRequest
– response : le HttpServletResponse
– session : le HttpSession
– out : flot de sortie (idem
response.getWriter())
– application : le ServletContext (idem
getServletConfig().getContext() )
– config, pageContext, page... : peu utiles
Cookie :
<%
Cookie c = new Cookie("Sport", "Foot");
response.addCookie(c);
%>
Sessions :
– toutes les pages JSP disposent
automatiquement d'un objet session
<%
String val =
(String)session.getValue("Sport");
%>
Syntaxe XML
PLAN
Les Servlets
Cycle de vie d'une servlet
Traitement des données de formulaires
Gestion de l'état avec cookies et sessions
Introduction aux JSP
Intégrer JSP, Servlets et JavaBeans
Les JSP en XML
Les balises JSP personnalisées
Règles de conception
<jsp:useBean
id="nom de l'instance du Bean"
class="nom qualifié de la classe du Bean"
scope="request | session | application | page"
/>
L'attribut "scope" :
La page JSP :
<html> ...
<jsp:usebean id="test" class="inria.SimpleBean"/>
<jsp:setProperty name="test"
property="message"
value="Hello !!" />
<h1>Le message est : <i>
<jsp:getProperty name="test" property="message"/>
</i></h1>…
</html>
package inria;
public class SimpleBean {
private String message = "no message";
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
Résumé (suite)
<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:prefix1="URI-for-taglib1"
xmlns:prefix2="URI-for-taglib2" ...version="1.2">
<jsp:text>
<html>
<head>
<title> Simple JSP Document </title> </head>
<body> <h1>Hello World</h1> </body>
</html>
</jsp:text> </jsp:root>
Avantages
– sont réutilisables
Avantages (suite)
db_failed.jsp:
<html>
<body>
<br><font color="red">Unable to Connect</font>
<br>Confirm that your database is running
</body>
</html>
Redirections et inclusions
– void forward(…)
– void include(...)
Principe de MVC
Servlet
JSP files
<jsp:include
page="/servlets/currentUserInfoServlet"/>
<%
String creditCard =
request.getParameter("creditCard");
if (creditCard.equals("Visa")){
%>
<jsp:forward page="/processVisa.jsp" />
<%}else if (creditCard.equals("American
Express")){%>
<jsp:forward page="/processAmex.jsp"/>
<%}%>
Résumé (2/4)
– transactions,
– sécurité et distribution.
Résumé (4/4)