12
1 21/10/2019 S. Elkosantini 23 Plan Partie 1: Rappel Chapitre 1 : Plateforme JEE - Introduction Chapitre 2 : Servlets Chapitre 3 : JSP Partie 2: Chapitre 3 : EJB Chapitre 4 : Le modèle MVC Chapitre 5 : Framework MVC Chapitre 6 : Persistance en Java : EJB et JPA S. Elkosantini 24 Servlets Servlets , GenericServlet et HttpServlet , Servlets indépendante du protocole Servlets qui réagissent au protocole HTTP S. Elkosantini 25 Servlets HTTPServlet Une Servlet est un composant J2EE fonctionnant du coté serveur. Permet de développer des pages web dynamiques coté serveurs (comme PHP, ASP) Ils s'exécutent dans un conteneurs web comme Tomcat Permet l'extension des fonctions du serveur web Certaines catégorie de servlets permettent la gestion des requêtes HTTP et de fournir au client une réponse HTTP HttpServletRequest. HttpServletResponse S. Elkosantini 26 Servlets Cycle de vie d’une servlet Code Servlet Serveur Chargement Code Servlet Serveur Déchargement Code Servlet Serveur Client Client Traitement des requêtes clientes par thread init() : initialisation de la servlet chargement du code. Souvent effectué lors de la première requête cliente (doGet, doPost) Allocation d’un pool de threads doGet () : Traitement des requêtes HTTP GET doPost () :Traitement des requêtes HTTP POST destroy () : destruction de la servlet par le serveur

Programmation orientée objet 2e année T.R.I

  • Upload
    others

  • View
    10

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Programmation orientée objet 2e année T.R.I

1

21/10/2019

S. Elkosantini 23

Plan

Partie 1: Rappel

Chapitre 1 : Plateforme JEE - Introduction

Chapitre 2 : Servlets

Chapitre 3 : JSP

Partie 2:

Chapitre 3 : EJB

Chapitre 4 : Le modèle MVC

Chapitre 5 : Framework MVC

Chapitre 6 : Persistance en Java : EJB et JPA

S. Elkosantini 24

Servlets

Servlets, GenericServlet et HttpServlet,

Servlets indépendante du protocole

Servlets qui réagissent au protocole HTTP

S. Elkosantini 25

Servlets

HTTPServlet

Une Servlet est un composant J2EE fonctionnant du coté serveur.

Permet de développer des pages web dynamiques coté serveurs (comme PHP,

ASP)

Ils s'exécutent dans un conteneurs web comme Tomcat

Permet l'extension des fonctions du serveur web

Certaines catégorie de servlets permettent la gestion des requêtes HTTP et de

fournir au client une réponse HTTP

HttpServletRequest.

HttpServletResponse

S. Elkosantini 26

Servlets

Cycle de vie d’une servlet

CodeServlet

Serveur

Chargement

CodeServlet

Serveur

Déchargement

CodeServlet

ServeurClient

Client

Traitementdes requêtesclientes par thread

•init() : initialisation de la servlet

chargement du code.

Souvent effectué lors de la première

requête cliente (doGet, doPost)

Allocation d’un pool de threads

• doGet () : Traitement des requêtes

HTTP GET

• doPost () :Traitement des requêtes

HTTP POST

•destroy () : destruction de la servlet

par le serveur

Page 2: Programmation orientée objet 2e année T.R.I

2

21/10/2019

S. Elkosantini 27

public class HelloWorld extends HttpServlet {private int count;private String message;

public void init(ServletConfig config) throws ServletException {super.init(config);

…. // Traitement exécuté au chargement de la servletcount = 0;message = 0;

}

public void destroy() {…. // Traitement exécuté à la desctruction de la servlet par le serveur

message=null;}

Servlets

Structure d’une servlet

S. Elkosantini 28

Servlets

Structure d’une 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 {

…. // Traitement pour les requêtes de type GET

}

public void doPost( HttpServletRequest request, HttpServletResponse response)

throws IOException, ServletException {

…. // requêtes de type POST

}

}

Objet requête Objet réponse

S. Elkosantini 29

Servlets

HttpServletRequest

S. Elkosantini 30

Servlets

HttpServletResponse

Page 3: Programmation orientée objet 2e année T.R.I

3

21/10/2019

S. Elkosantini 31

Servlets

Déploiement des servlets

Module Web (fichier WAR)

web.xml

Servlet

Descripteur de déploiement

<web-app >

<servlet>

<servlet-name>helloservlet</servlet-name>

<servlet-class>test.servlet.HelloWorldExample</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>helloservlet</servlet-name>

<url-pattern>/hello</url-pattern>

</servlet-mapping>

</web-app>

Balise principale

Balise de descrption d'une Servlet

Nom de la Servlet

Classe de la Servlet

Définition du chemin virtuel

Nom de la servlet considéré

Définition du chemin virtuel

Une application web peut contenir plusieurs servlets

S. Elkosantini 32

Servlets

Configuration des servlets à partir de Java 6 via les annotations

@WebServlet permet de marquer une classe comme servlet.

@WebServlet(name="simpleservlet", urlPatterns="/myservlet", "/simpleservlet"})

public class SimpleServlet extends HttpServlet { ... }

@WebServlet(name="simpleservlet", urlPatterns="/myservlet", "/simpleservlet"}, initParams={

@WebInitParam(name="param1", value="value1"),

@WebInitParam(name="param2", value="value2")

})

public class MyServlet extends HttpServlet { ... }

@WebInitParam cette annotation est utilisée pour préciser des paramètres

d’initialisation aux Servlets ou aux Filtres

S. Elkosantini 33

Servlets

Persistances d’instances

Est-ce que les servlets sont instanciées à chaque requêtes ?

Entre chaque requête du client, les Servlets persistent sous forme d’instances

d’objet.

L’unique instance traite toutes les requêtes.

Rapidité : pas de surcoût en temps lié à la création d’objet à chaque requête. L’espace mémoire réservé reste faible. La persistance, c’est-à-dire la possibilité de conserver l’état de la servlet, est facilitée.

S. Elkosantini 34

Servlets

Persistances d’instances

Exemple illustratif

public class SimpleCounterServlet extends HttpServlet {private int nbVisite= 0;protected void doGet(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {PrintWriter out = res.getWriter();

nbVisite ++;out.println("Depuis son chargement, c’est le" + nVisite + " eme visite à cette servlet " ) ; }

}

Page 4: Programmation orientée objet 2e année T.R.I

4

21/10/2019

S. Elkosantini 35

Servlets

Persistances d’instances

Possibilité d’utiliser des paramètres d’initialisation définis dans le fichier de déploiement web.xml

<web-app ><servlet>

<servlet-name>helloservlet</servlet-name>

<servlet-class>test.SimpleCounterServlet </servlet-class>

<init-param>

<param-name>nb_visite_initiale</param-name>

<param-value>10</param-value>

<description>Valeur initiale</description>

</init-param>

</servlet>

<servlet-mapping>

<servlet-name>helloservlet</servlet-name>

<url-pattern>/hello</url-pattern>

</servlet-mapping> </web-app>

web.xml

S. Elkosantini 36

Servlets

Persistances d’instances

public class SimpleCounterServlet extends HttpServlet {private int nb_visite;

public void init() throws ServletException {String initial = this.getInitParameter("nb_visite_initiale");try {

count = Integer.parseInt(initial);} catch(NumberFormatException e) { nb_visite = 0; }

}protected void doGet(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {PrintWriter out = res.getWriter();

nb_visite ++;out.println("Depuis son chargement, c’est votre " + nb_visite + " eme visite à cette servlet " ) ; }

}

Et de coté servlet…

S. Elkosantini 37

Servlets

Persistances d’instances

…Autre remarques ?

A chaque rechargement d’une Servlet : Création d’une nouvelle instance. destruction de l’ancienne servlet.

Pas de constructeurs. Toute initialisation se fait dans la méthode init().

init () ne possède pas de paramètres.

S. Elkosantini 38

Servlets

Servlet et les formulaires html

Conteneur Web

EntrepriseJava Beans

EntrepriseJava BeansServlet

Requete

Réponse

Poste clientFormulaire

NomPrenomAgeMot de passe

okrétablir

Recapitulatif des

informations

Nom : ElkosantiniPrenom: SabeurAge: 40

Page 5: Programmation orientée objet 2e année T.R.I

5

21/10/2019

S. Elkosantini 39

Servlets

Servlet et les formulaires html

Poste clientFormulaire

NomPrenomAgeMot de passe

okrétablir

<FORM Method=“POST" Action=“MaServlet">

Nom : <INPUT type=“text” size=20 name=“nom”><BR>

Prénom : <INPUT type=“text” size=20 name=“prenom”><BR>

Age : <INPUT type=“text” size=2 name=“age”><BR>

Age : <INPUT type=“password” size=20 name=“pwd”><BR>

<INPUT type=“reset” value=“rétablir”> </FORM>

<INPUT type=“submit” value=“Envoyer”> </FORM>

S. Elkosantini 40

Servlets

Servlet et les formulaires html

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class UserInfo extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html");

PrintWriter out = response.getWriter();

out.println("<HTML>\n<BODY>\n" +

"<H1>Recapitulatif des informations</H1>\n" +

"<UL>\n" +

" <LI>Nom: " +

request.getParameter("Nom") + "\n" +

" <LI>Prenom: " + request.getParameter("Prenom") +

"\n" +

" <LI>Age: " +

request.getParameter("Age") +

"\n" + "</UL>\n" + "</BODY></HTML>");

}}

Servlet

S. Elkosantini 41

Servlets

Servlet et les formulaires html

String getParameter(String Key) : renvoie la valeur du champ Key du formulaire

String[] getParameterValues(String Key) : Récupère les valeurs correspondant

champ Key d'un formulaire qui peut avoir plusieurs valeurs (cases à cocher,

listes à choix multiples).

Enumeration getParameterNames() : renvoie l'ensemble des noms des champs

du formulaire passé à la servlet.

Object getAttribute(String Key) : renvoie la valeur de l’attribut Key sous forme

d’un objet de type Object

S. Elkosantini 42

Servlets

Servlet et les formulaires html

getParameter(String Key) renvoie le contenu d’une variable à partir d’un

formulaire.

Object getAttribute(String Key) : renvoie la valeur de l’attribut Key sous forme

d’un objet de type Object

Quelle est la différence entre getAttribute et getParameter ?

Servlet

jsp jsp jsp

Servlet 1 Servlet 2

Serveur

Page 6: Programmation orientée objet 2e année T.R.I

6

21/10/2019

S. Elkosantini 43

Exercices

1. Ecrire une servlet qui permet de récupérer le login et le mot de passe à partir

d’un formulaire et les affiche dans une autre page.

2. Amélioration 1: ajouter le sex au formulaire et améliorer le message affiché :

“Bonjour Mr (ou Mme) ....”

3. Amélioration 2: ajouter la liste des compétences au formulaire et améliorer le

message affiché :

“Bonjour Mr (ou Mme) .... Vos compétences sont : … et …”

4. Remplacer la page html par une servlet.

5. A cette dernière version, ajouter un lien qui permet à un nouveau visiteur de

d’accéder en tant qu’invité. Un mot de passe lui sera affiché. Cette partie sera

traitée par une autre servlet.

Servlets

S. Elkosantini 44

Exercices

1. Reprendre l’exercice précédent en ajoutant les bases de données. Avant

d’afficher les messages, la servlet doit vérifier si le login existe dans la base de

données.

Servlets

S. Elkosantini 45

Servlets

Exercice

Écrire une application web comportant une première page HTML permettant dechoisir un affichage des pièces par catégorie.

1. Écrire une page HTML présentant la compagnie et ayant un lien vers un premierservlet.

2. La première servlet génère une page HTML permettant à l’usager de choisir unecatégorie à afficher. Il affiche la liste des noms de catégories de la table catégorieset permet de faire un lien vers la deuxième servlet en lui retournant le numéro decatégorie sélectionné par l’usager.

3. La troisième servlet reçoit un numéro de catégorie en paramètre HTTP unetroisième page HTML est générée. Celle-ci présente une entête contenant lacatégorie et un tableau contenant pour toutes les pièces de cette catégorie, lenuméro, la description, le nom du fabriquant et le prix de vente. Bonus : uneimage de la pièce en fonction de l’URL.

S. Elkosantini 46

Première servlet

Servlets

public class Categorie extends HttpServlet {Connection conn=null;

public void init(ServletConfig config) throws ServletException {try {

Class.forName ("org.postgresql.Driver");conn = DriverManager.getConnection ("jdbc:postgresql://127.0.0.1:5432/test", "postgres", "postgresql");}catch (Exception c) { System.out.println ("problème SQL"+c); }}

Page 7: Programmation orientée objet 2e année T.R.I

7

21/10/2019

S. Elkosantini 47

Première servlet

Servlets

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html"); PrintWriter out = response.getWriter(); try{Statement stmt = conn.createStatement(); String req= "SELECT * FROM categorie ";ResultSet rs = stmt.executeQuery(req);while(rs.next()) out.println("<a href=\"./produit?idc="+rs.getString("idcat")+"\">"+rs.getString("nom")+"</a>");}catch (Exception c) { System.out.println ("problème SQL"+c); }}}

S. Elkosantini 48

Première servlet

Servlets

Utiliser web.xml pour les paramètres de la base de données.

<context-param>

<init-param>

<param-name>db-driver</param-name>

<param-value>org.postgresql.Driver</param-value>

</init-param>

<init-param>

<param-name>db-url</param-name>

<param-value>jdbc:postgresql://127.0.0.1:5432/test</param-value>

</init-param>

<init-param>

<param-name>db-login</param-name>

<param-value>postgres</param-value>

</init-param>

<init-param>

<param-name>db-passwd</param-name>

<param-value>postgresql</param-value>

</init-param>

</context-param>

S. Elkosantini 49

Première servlet

Servlets

public class Categorie extends HttpServlet {Connection conn=null;

public void init(ServletConfig config) throws ServletException {try {String driver= config.getInitParameter("db-driver");String url= config.getInitParameter("db-url");String login= config.getInitParameter("db-login");String mdp= config.getInitParameter("db-passwd");

Class.forName (driver);}conn = DriverManager.getConnection (url, login, mdp);}catch (Exception c) { System.out.println ("problème SQL"+c); }}

La servlet devient alors …

S. Elkosantini 50

Première servlet

Servlets

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("text/html"); PrintWriter out = response.getWriter();

try{Statement stmt = conn.createStatement();

String req= "SELECT * FROM categorie ";ResultSet rs = stmt.executeQuery(req);while(rs.next()) out.println("<a href=\"./produit?idc="+rs.getString("idcat")+"\">"+rs.getString("nom")+"</a>");}catch (Exception c) { System.out.println ("problème SQL"+c); }}}

Page 8: Programmation orientée objet 2e année T.R.I

8

21/10/2019

S. Elkosantini 51

Deuxième servlet

Servlets

public class produit extends HttpServlet {Connection conn=null;

public void init(ServletConfig config) throws ServletException {try {String driver= config.getInitParameter("db-driver");String url= config.getInitParameter("db-url");String login= config.getInitParameter("db-login");String mdp= config.getInitParameter("db-passwd");

Class.forName (driver);}conn = DriverManager.getConnection (url, login, mdp);}catch (Exception c) { System.out.println ("problème SQL"+c); }}

S. Elkosantini 52

Deuxième servlet

Servlets

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html"); PrintWriter out = response.getWriter(); try{Statement stmt = conn.createStatement();

String req= "SELECT * FROM produit where idc="+request.getParameter("idc");ResultSet rs = stmt.executeQuery(req);while(rs.next()) out.println(rs.getString("nomp"));}

catch (SQLException c) { System.out.println ("problème SQL"+c); }}}

S. Elkosantini 53

Servlets

Redirection

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.sendRedirect("http://www.isima.rnu.tn"); }

public void doPost( HttpServletRequest request, HttpServletResponse response)

throws IOException, ServletException {

DoGet(request,response);}

}

Redirection vers un site

S. Elkosantini 54

protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

request.getRequestDispatcher("/index.html").forward(request,response);}

Servlets

Forward et Include

La redirection est cachée pour l’utilisateur. La réponse et la requete sont aussi redirigés

Page 9: Programmation orientée objet 2e année T.R.I

9

21/10/2019

S. Elkosantini 55

protected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {

response.setContentType("text/html");request.getRequestDispatcher("/entete.html").include(request,response);request.getRequestDispatcher("/index.html").include(request,response);

}

L’inclusion permet d’inclure plusieurs fois des ressources

Servlets

Forward et Include

S. Elkosantini 56

Les sessions

HTTP est un protocole sans état et ne permet pas mémoriser des variables

dans une requête.

Servlets

Comment faire alors ?

Les champs cachés.

Réecriture des URL (contenant les informations mémorisées)

Les sessions

S. Elkosantini 57

Les sessions

Une session est une suite d’interactions entre un client et un serveur Web

On peut utiliser les sessions pour mémoriser les actions d’un utilisateur

unique (achat en ligne)

Mécanisme très puissant permettant de stocker des objets et non de simples

chaînes de caractères.

L'API HttpSession fournit des fonctions pour gérer les sessions.

Servlets

S. Elkosantini 58

HttpSession

Méthode de création (de HttpServletRequest) :

HttpSession getSession() : retourne la session associée à l’utilisateur.

Gestion d’association (de HttpSession) :

Enumeration getAttributNames() : retourne les noms de tous les attributs.

Object getAttribut(String name) : retourne l’objet associé au nom.

setAttribut(String na, Object va) : donne la valeur va à l’attribut na.

removeAttribut(String na) : supprime l’attribut de nom na.

Destruction (de HttpSession) :

logout() : termine la session.

Servlets

Page 10: Programmation orientée objet 2e année T.R.I

10

21/10/2019

S. Elkosantini 59

HttpSession

public class HttpSessionServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {res.setContentType("text/plain"); PrintWriter out = res.getWriter();HttpSession session = req.getSession();String nom = (String)session.getAttribute("nom");out.println(" Bonjour Mr. " + nom + ".");

}}

Servlets

S. Elkosantini 60

HttpSession

public class HttpSessionServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse res)

throws ServletException, IOException {res.setContentType("text/plain"); PrintWriter out = res.getWriter();HttpSession session = req.getSession();Integer count = (Integer)session.getAttribute("count");

if (count == null)count = new Integer(1);

elsecount = new Integer(count.intValue() + 1);

session.setAttribute("count", count);out.println("Vous avez visité cette page " + count + " fois.");

}}

Servlets

Problème : un espace nécessaire suffisant dans le serveur

S. Elkosantini 61

Les sessions

Il est possible de fixer la durée d'une session par application (en minutes)

Servlets

<web-app >

<servlet>

<servlet-name>helloservlet</servlet-name>

<servlet-class>test.SimpleCounterServlet </servlet-class>

<session-config>

<session-timeout>30</session-timeout>

</session-config>

</servlet>

<servlet-mapping>

<servlet-name>helloservlet</servlet-name>

<url-pattern>/hello</url-pattern>

</servlet-mapping> </web-app>

S. Elkosantini 62

Cookies

Les cookies représentent un moyen simple de stocker temporairement des

informations chez un client.

Concrètement : il s'agit de fichiers texte stockés sur le disque dur du client.

L'envoi du cookie vers le navigateur du client se fait grâce à la méthode de

HttpServletResponse:

void AddCookie(Cookie cookie)

Servlets

Cookie MonCookie = new Cookie("nom", "valeur");

response.addCookie(MonCookie);

Exemple :

Page 11: Programmation orientée objet 2e année T.R.I

11

21/10/2019

S. Elkosantini 63

Cookies

Récupération des cookies du client:

Cookie[] getCookies()

Récupération de la valeur d'un cookie :

String Valeur = Cookie.getValue()

Servlets

Inconvénients des cookies :

Les navigateurs ne les acceptent pas toujours.

L’utilisateur peut configurer son navigateur pour qu’il refuse ou pas les cookies.

Le nombre et la taille des cookies peuvent être limités par le navigateur.

S. Elkosantini 64

Servlets

S. Elkosantini 65

Le contexte des servlets

Un contexte constitue une vue sur le fonctionnement d’une même application

web.

Il est possible de partager des informations entre servlets du même contexte

grâce à l’interface ServletContext

Servlets

Conteneur Web

Servlet 1

Servlet 2

Servlet 3

Servlet 4

Contexte

S. Elkosantini 66

Objet permettant au servlet de communiquer avec le conteneur

Obtenu avec :

Servlet.getServletContext()

Les principales méthodes de ServletContext

Object getAttribute(String name)

Retourne un attribut du contexte

Void setAttribute(String name, Object value)

Ajoute ou remplace un objet dans le contexte

String getInitParameter(String name)

Retourne un paramètre d'initialisation de l'application

Servlets

Le ServletContext

Page 12: Programmation orientée objet 2e année T.R.I

12

21/10/2019

S. Elkosantini 67

Le ServletContext

Servlets

S. Elkosantini 68

Autres champs du fichier web.xml

Il est possible de définir les pages à afficher :

En fonction d'erreurs http

En fonction d'exceptions java

<error-page>

<exception-type>

cours.event.EventException

</exception-type>

<location>/erreur.html</location>

</error-page> <error-page>

<error-code>404</error-code>

<location>/404.html</location>

</error-page>

Pour une erreur Http

Pour une exception

java

Servlets