Web Tier : Servlet et JSP
Protocole HTTP
Client Serveur Description d’une requête http
GET /blogs. HTTP1.1 • Une version : HTTP 1.0 / HTTP 1.1
• Un protocole : http / https
200 HTTP 1.1
• Un domaine: [Link]
• Un chemin : /mes/bienvenue-a-mes/
•
POST /blogs/. HTTP1.1
Une méthode :
• GET : pour récupérer une information un document / une
302 HTTP 1.1
Location : /blogs/10 ressource
• POST : pour soumettre un formulaire / modification d’une
GET /blogs/10. HTTP1.1
ressource
• PUT : permet d’ajouter une ressource
200 HTTP 1.1
• DELETE : pour supprimer un document
• Et d’autres : PATCH, HEAD, CONNECT, TRACE
2
Servlet
• Une servlet est un composant Web de Java EE. Elle permet de traiter
une requête entrante sur un serveur et de générer une réponse
dynamique.
• La plupart du temps, les servlets sont utilisées pour traiter des
requêtes HTTP et générer dynamiquement une réponse.
3
Servlet
• Permet de créer dynamiquement du contenu
au sein d’un conteneur Java
• Contenu le plus souvent au format html mais
également xml, text, octets (transfert de
fichiers)
• Déclaration d’une servlet via l’utilisation de la
classe « HttpServlet »
4
Servlet – Cycle de vie
Request Response
Generic Initialisation Exécution Destruction
Servlet init service destroy
HttpServlet doGet doPost doDelete doOptions doHead doTrace
Il y a 5 étapes:
[Link] la classe Servlet dans la mémoire.
[Link]éer l'instance de la Servlet.
[Link] la méthode init() de Servlet.
[Link] la méthode service() de Servlet.
Le service() appellera une des deux méthodes, soit doGet() soit doPost()
[Link] la méthode destroy() de Servlet.
5
Servlet - doXXX
• Méthodes appelées en fonction de la « méthode http »
• 2 paramètres :
HttpServletRequest : récupération des données de la requête
HttpServletResponse : permet de fournir des données en réponse
6
Structure d’une servlet HTTP
• Une servlet HTTP est une classe Java qui hérite de la classe
[Link] :
7
Servlet - implémentation
public class HelloWorldServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
• Etendre la classe «HttpServlet » [Link]().write("Bonjour !");
• Déclarer dans le fichier « [Link] »
}
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app>
<servlet>
Servlet avec son nom <servlet-name>Hello</servlet-name>
<servlet-class>HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
Mapping associé à la <servlet-name>Hello</servlet-name>
<url-pattern>/hello</url-pattern>
servlet </servlet-mapping>
</web-app>
8
Servlet – Portée des objets
Portée Description
application Objets accessible par toutes les instances de servlet
session Objets accessibles pendant la durée de la session de l’utilisateur
request Objets accessibles pendant la requête de l’utilisateur
pageContext Objets accessibles par la page JSP
9
Servlet - implémentation
• Etendre la classe «HttpServlet »
• Ajouter l’annotation « @WebServlet »
@WebServlet( urlPatterns= {"/hello"})
public class HelloWorldServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
[Link]().write("Bonjour !");
}
}
10
Configuration du déploiement d’une servlet
• Pour la servlet ci-dessus, l’annotation @WebServlet précise le motif
de l’URL (URL pattern) pour lequel la servlet devra être sollicitée
(dans cet exemple « /hello »).
• Une fois l’application déployée dans un serveur de test en local, une
requête de la forme
[Link] de l'application]/hello
devrait répondre
Bonjour !
11
Motif d’URL d’une Servlet
• Une servlet pour être déployée a besoin d’un ou plusieurs motifs d’URL indiquant le chemin des requêtes qu’elle prend en
charge.
• Il existe plusieurs syntaxes qui sont toutes équivalentes :
@WebServlet("/hello")
@WebServlet({"/hello"})
@WebServlet(urlPatterns={"/hello"})
• Il est possible de donner plusieurs motifs d’URL indiquant que la même servlet peut être sollicitée à partir de chemins
différents.
@WebServlet({"/hello", "/bonjour"})
@WebServlet(urlPatterns={"/hello", "/bonjour"})
• Il est possible d’utiliser le caractère générique *. Son utilisation est limitée car il ne peut apparaître que comme premier ou
dernier élément d’un motif :
// Toutes les URL se terminant par .html
@WebServlet("*.html")
// Toutes les URL commençant par /hello/
@WebServlet("/hello/*")
12
Servlet - Limitation
• Difficulté de produire du code html « lisible »
• Code html lié au code Java :
Intégration de code html en provenance d’une agence web difficile.
Impossibilité de valider syntaxiquement le code html par les IDE type Eclipse
• La servlet est plus destinée à interagir avec les couches métier.
Java Server Page
13
JSP
• Page html ayant l’extension « .jsp » et permettant d’éxècuter des éléments
dynamiques à partir :
De scriptlets : code java directement intégré à la page.
De taglibs : nouvelles balises interprétées par le conteneur Web et permettant de
réaliser des traitements et de générer du code html
Des expressions languages
• Existence de nombreuses librairies de taglibs :
JSTL : Java Standard Taglibs
Struts
Spring (spring-security taglib)
• Possibilité de créer de nouvelles taglibs
14
De la JSP à la Servlet
transforme compile
« en servlet »
[Link] hello_jsp.java hello_jsp.class
Transformée en Servlet, une page jsp possède toutes les méthodes et
propriétés d’une servlet
15
Les exemples avec JSP
• Des variables prédéfinies dans JSP
<!-- Import déclaration -->
<%@ page import="[Link].*, [Link].*" %>
<%@ page import="[Link], [Link].*" %>
16
Des variables prédéfinies dans JSP
Quelques variables disponibles dans JSP à utiliser:
request : [Link]
response: [Link]
out: [Link]
<%
// Using out variable:
[Link]("<h1>Now is "+ new Date()+"</h1>");
// Using request variable:
String serverName= [Link]();
// Using response variable:
[Link]("[Link]
%>
17
Le code Java dans HTML (JSP)
<%@ page import="[Link],[Link].*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Java In HTML</title> </head>
<body>
<% Random random = new Random(); // Returns a random number (0, 1 or 2)
int randomInt = [Link](3);
if (randomInt == 0) { %> <h1>Random value =<%=randomInt%></h1> <% }
else if (randomInt == 1) { %> <h2>Random value =<%=randomInt%></h2> <% }
else { %> <h3>Random value =<%=randomInt%></h3> <% } %>
</body>
</html>
18
Définir des méthodes dans JSP en utilisant <%! %>
• À la base, JSP est compilé en Servlet (une classe). Donc, JSP vous permet de créer des méthodes à
l'intérieur de JSP. Ces méthodes sont déclarés dans <%! %>
<%!
public int sum(int a, int b) {
return a + b; }
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Method in JSP</title>
</head>
<body>
<h1>
1 + 2 = <%=sum(1, 2)%>
</h1>
</body>
</html>
19
JSP – Scriplets directives
• Permettent de préciser des informations globales sur la page
• 3 directives :
Page
Include
taglib
20
JSP – Scriplets directives « page »
• Définit des caractéristiques sur la page JSP.
• Chaque caractéristique est déclarée une seule fois sauf « import »
<%@ page pageEncoding="UTF-8"
info="Page JSP Todo"
contentType="text/html; charset=UTF-8"%>
<%@ page import="[Link]"%>
<%@ page import="[Link]"%>
21
JSP – Scriplets directives « include »
• Permet d’inclure un fichier dans une page JSP
• Fichier peut être un fragment d’une page JSP, html
• L’inclusion est réalisée avant la page JSP incluant ne soit interprétée
<html> <nav class="navbar navbar-expand-lg navbar-light bg-light">
<head> <a class="navbar-brand" href="#">ToDo</a>
<link rel="stylesheet" href="css/[Link]"> <button class="navbar-toggler" type="button" d
</head> ata-toggle="collapse" data-target="#navbarNav" aria-
<body> controls="navbarNav" aria-expanded="false" aria-
<%@ include file="[Link]"%> label="Toggle navigation">
<div class="container">Liste de todos</div> <span class="navbar-toggler-icon"></span>
</body> </button>
</html> </nav>
22
Gestion des exceptions dans JSP
La gestion des exceptions est le processus permettant de gérer les
erreurs d'exécution.
Dans JSP, il existe deux manières d'effectuer la gestion des exceptions :
Par les attributs errorPage et isErrorPage de la directive de page
Par élément <error-page> dans le fichier [Link]
23
Exemple de gestion des exceptions dans jsp
Il y a 3 fichiers :
[Link] pour les valeurs d'entrée
[Link] pour diviser les deux nombres et afficher le résultat
[Link] pour gérer l'exception
<form action= "[Link]" >
No1 :<input type= "text" name= "n1" /><br/><br/>
No2 :<input type= "text" name= "n2" /><br/><br/>
<input type= "submit" value= "diviser" />
</form>
24
Exemple de gestion des exceptions dans jsp
<%@ page errorPage= "[Link]" %>
<%
String num1=[Link]( "n1" );
String num2=[Link]( "n2" );
int a=[Link](num1) ;
int b=[Link](num2) ;
int c=a/b;
[Link]( "la division des nombres est : " +c);
%>
25
Exemple de gestion des exceptions dans jsp
<%@page isErrorPage= "true" %>
<h3>Désolé, une exception s'est produite !</h3>
L'exception est : <%= [Link]() %>
26
JSP – tag de commentaires
• Permet d’insérer des commentaires
• Contenu non interprété par le moteur de JSP
• Non restitués lors de la génération de la page html
<%-- Commentaires non restitués au client --%>
27
Les tags d’actions
• Permettent de réaliser des traitements courants
Inclusion de pages JSP
Forward vers une autre page
Utilisation ou déclaration d’un bean
• Introduites par le tag de la forme
<jsp:nomAction attribut="valeur" >
28
Les actions
• jsp:include : permet d’inclure une page JSP
• jsp:forward : permet de rediriger vers une autre page
• jsp:useBean : permet d’utiliser ou d’instancier un objet. Utiliser
fréquemment pour typer les objets
• jsp:setProperty : permet de modifier une propriété d’un objet
• jsp:getProperty : permet d’obtenir la valeur d’une propriété
d’un objet
29
Les Expressions Languages
• Permet d’éviter l’utilisation de « scriplets »
• Les EL permettent :
De manipuler facilement les objets
De réaliser des tests basiques et des opérations
• Syntaxe
${ expression }
30
Exemple de paramètre EL
Dans cet exemple, nous avons créé deux fichiers [Link] et [Link].
Le fichier [Link] reçoit l'entrée de l'utilisateur et envoie la demande au
[Link] qui à son tour affiche le nom de l'utilisateur à l'aide d'EL.
<form action= "[Link]" >
Saisissez le nom :<input type= "text" name= "nom" /><br/>
<input type= "submit" value= "go" />
</form>
Bienvenue, ${ [Link] }
31
Exemple EL sessionScope
• Dans cet exemple, nous imprimons les données stockées dans la
portée de la session à l'aide d'EL.
• Pour cela, nous avons utilisé l'objet sessionScope.
<h3>bienvenue sur la page d'index</h3>
<%
[Link]( "user" , "moi" );
%>
<a href= "[Link]" >visite</a>
La valeur est ${ [Link] }
32
Java Servlet et JSP Hello World
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Hello World Java EE</title>
</head>
<body>
<h1>Hello JSP and Servlet!</h1>
</body>
</html>
33
Java Servlet et JSP Hello World
• Mettre à jour la page JSP (formulaire d'ajout)
<h1>Hello JSP and Servlet!</h1>
<form action="helloServlet" method="post">
Enter your name: <input type="text" name="yourName" size="20">
<input type="submit" value="Call Servlet" />
</form>
34
Java Servlet et JSP Hello World
• Maintenant, mettez le code suivant dans la méthode doPost() :
String yourName = [Link]("yourName");
PrintWriter writer = [Link]();
[Link]("<h1>Hello " + yourName + "</h1>");
[Link]();
35
JSP et Java Beans
Un des objectifs des JSP / Servlets
Ne pas mélanger du code HTML au code Java des Servlets
D’un autre coté si c’est pour mettre du code Java dans le code JSP qu’est ce qu’on y gagne ?
Un point important dans la conception de pages JSP est de minimiser le code Java embarqué
dans les pages
Déporter la logique métier dans des composants objets qui seront accédés depuis les pages
JSP
Simplification des traitements inclus dans la JSP
Possibilité de réutilisation des composants depuis d’autres JSP ou d’autres composants
Les spécifications JSP définissent une manière standard d’intérargir avec des composants Java
Beans
36
Java Bean
Qu’est-ce qu’un composant Java Bean ?
Un composant java (objet) dont la classe respecte certaines règles d’écriture
Le respect de ces règles d’écriture permet ensuite d’utiliser ces composants de manière standard
Composants Java Beans depuis JSP
Composants graphiques pour la construction d’interface utilisateurs
…
Une classe Java Bean
Classe publique
Possède un constructeur public sans arguments
Regroupe un ensemble de propriétés
accessibles par des méthode de la forme getXXX() où XXX est le nom de la propriété
éventuellement modifiables par une méthode setXXX() où XXX est le nom de la propriété
Implémente en option l’interface [Link]
37
package test;
Un exemple de bean public class Personne {
private String nom;
Propriété privée private String prenom;
private int age = 0;
public Personne() {
[Link] = "Abdallah"; // nom par défaut
[Link] = "Med"; // prénom par défaut
Accesseur (« getter ») }
public String getNom() {
return ([Link]);
}
Modifieur (« setter »)
public void setNom(String nom) {
[Link] = nom;
}
...
public int getAge () {
return ([Link]);
}
public void setAge(int age) {
[Link] = age;
}
} 38
Utiliser un bean depuis une JSP
Le tag <jsp:useBean>
Permet de localiser une instance ou bien d’instancier un bean pour l’utiliser
dans la JSP
Syntaxe
Nom utilisé pour la variable qui
servira de référence sur le bean
<jsp:useBean
La classe du bean
id="beanInstanceName"
class="[Link]" Optionnel, le type de la référence
type="[Link]" beanInstanceName si ce n’est pas
scope="page|request|session|application" le type défini par l’attribut class
/>
Optionnel, détermine la portée durant laquelle le bean estdéfini
et utilisable
• le bean demandé est déjà instancié pour la portée précisée :
renvoi de sa référence
• le bean demandé n’est pas déjà présent pour la portée précisée:
instanciation du bean
ajout de celui-ci à la portée spécifiée
39
Utiliser un bean depuis une JSP
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 qui appartiennent à la même sessionque 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
40
Utiliser un bean depuis une JSP
exemple
<jsp:useBean
id="utilisateur"
Définition dans la session d’un java bean instance de la
class="[Link]"
classe Personne du package test et désigné par la
scope="session" référence utilisateur
/>
<html>
<body>
<ul>
<li>NOM : <%=[Link]()%></li>
<li>PRENOM : <%=[Link]()%></li>
<li>AGE : <%=[Link]()%></li>
</ul>
</body>
</html>
41
Fixer les propriétés d’un bean depuis une JSP
Le tag <jsp:setProperty>
Permet de mettre à jour la valeur de un ou plusieurs attributs d’un bean
Syntaxe
<jsp:setProperty name="beanInstanceName"
property="propertyName"
value="string|<%=expression%>"
/>
<jsp:useBean id="utilisateur" class="[Link]" scope="session"/>
...
<jsp:setProperty name="utilisateur" property="nom" value="Toto"/>
<jsp:setProperty name="utilisateur" property="age" value="34"/>
Quand le type de la propriété du Bean n'est pas String une conversionautomatique est effectuée en utilisant la
méthode valueOfde la classe enveloppe
<% [Link]([Link]("34"));%>
42
Fixer les propriétés d’un bean depuis une JSP
Possibilité de fixer les propriétés du bean à l’aide des paramètres de la requête
Syntaxe
<jsp:setProperty name="beanInstanceName" property="propertyName"/>
Le nom de la propriété est le même que le nom du paramètre de la requête
<jsp:setProperty name="beanInstanceName" property="propertyName"
param="paramétrage"/>
Le nom de la propriété est différent du nom du paramètre de la requête
MaPageJSP?name="Ali"&age="24"
<jsp:useBean id="utilisateur" class="[Link]" scope="session"/>
...
<jsp:setProperty name="utilisateur" property="nom" param="name"/>
<jsp:setProperty name="utilisateur" property="age" param="age"/>
<jsp:setProperty name="beanInstanceName" property="*"/>
Fixe toutes les propriétés correspondant à des paramètres de la requête
Accéder aux propriétés d’un bean depuis une JSP
Le tag <jsp:getProperty>
Permet d’obtenir la valeur d’un attribut d’un bean
Syntaxe
<jsp:getProperty name="beanInstanceName" property="propertyName" />
<jsp:useBean id="utilisateur" class="[Link]" scope="session"/>
...
<body>
<ul>
<li>Nom : <jsp:getProperty name="utilisateur" property="nom"/></li>
<li>Age : <jsp:getProperty name="utilisateur" property="age"/></li>
</ul>
...
44