Vous êtes sur la page 1sur 9

26/03/2023

Problématiques
 Les servlets sont des classes Java qui améliorent la fonctionnalité
d'un serveur web en fournissant un contenu web dynamique.
 Elles sont couramment utilisées pour générer dynamiquement des
pages HTML pour des sites web interactifs. Java Server Page JSP
Problèmes de maintenance peuvent survenir :
 parce que la logique de présentation et la logique de génération de contenu
dynamique sont mélangées; Karim AFDEL
 Chaque fois que la présentation est modifiée, le servlet doit être compilé et
déployé à nouveau; kafdel@ymail.com
 Les développeurs doivent généralement écrire du code HTML dans le flux
de sortie de la servlet, ce qui peut être fastidieux et peut coupler la servlet
au format de sortie spécifique du contenu.
Solution Une des meilleures pratiques pour les servlets et les JSP consiste à
séparer la logique de présentation et la logique de génération de contenu
dynamique en utilisant le modèle de conception Modèle-Vue-Contrôleur
2
(MVC) . 1

Servlet et JSP
 Exécutable avec tous les serveurs Web (Apache, IIS, ...) C'est quoi JSP?
auxquels on a ajouté un "moteur" de servlet/JSP (le plus  Code Java embarqué dans une page HTML entre les balises <%
connu :Tomcat) et %>
 JSP compilées automatiquement en servlet par le moteur  Extension .jsp pour les pages JSP

 Servlet = du code Java contenant de l'HTML  les fichiers .jsp sont stockés sur le serveur (comme des docs) ils
sont désignés par une URL http://www.fsa.ac.ma /exemple.jsp
 JSP = une page HTML contenant du code Java
 le chargement de l'URL provoque l'exécution de la JSP côté
 Concrètement avec les JSP :
serveur
 les parties statiques de la page HTML sont écrites en HTML
 Programme Java s'exécutant côté serveur Web
 les parties dynamiques de la page HTML sont écrites en Java
 Servlet : prog. "autonome" stockés dans un fichier .class sur le
serveur
 JSP : prog. source Java embarqué dans une page .html

4 3

1
26/03/2023

3 parties d'une JSP Exemple 1


 Scriptlets <% %>
<HTML> <BODY>
 Declarations <%! %> <H1>Table des factorielles</H1>
 Expressions <%= %> <% int i,fact;
Scriptlets <% %> for ( i=1,fact=1 ; i<4 ; i++, fact*=i ) { out.print( i + "! =" + fact + "<BR>" ); }
Contient du code Java %>
</BODY> </HTML>
Insérer dans jspservice() de la servlet, donc peut utiliser out, request,
Exemple 2: fichier date.jsp
response, etc.
<html><head><title>Obtenue par une JSP</title></head>
Exemple : <body>
<% String[] langages = {"Java", "C++", "Smalltalk", "Simula 67"}; <h3>Bonjour de ma part </h3> <hr>
out.println("<h3>Principaux langages orientés objets : </h3>"); La date courante est : <%= new java.util.Date() %>
</body>
for (int i=0; i < langages.length; i++) { out.println("<p>" +
</html>
langages[i] + "</p>"); } %>
 Traité quand le client demande l’URL de la JSP :
http://serveurWeb:<port>/.../date.jsp

6 5

Déclarations <%! %>


Sont des déclarations Java.
Expressions <%= %> Scriptlets <% %>
Permet de définir des méthodes ou des données
En fait expression Java qui renvoie un objet String ou <%@page contentType="text/html" pageEncoding="UTF-8"%>
membres un type primitif. <!DOCTYPE html> Welcome.jsp
<%!
%! field or method declaration %> Un raccourci pour <% out.println(…); %> <html>
<%@page contentType="text/html"
<head>
Exemples : <%= XXX %> ~ <% out.println
out.println(XXX);
(XXX); %> pageEncoding="UTF-8"%>
<title>JSP Page</title>
<%! int random4() {return !!!!!attention au ; </head> <!DOCTYPE html>
(int)(Math.random() * 4);} %> est donc converti en out.println(…) dans la <body>
<%! int nombreFetiche = 2; %> <% out.print("Hello World");%> <html>
méthode _jspService(…) de la servlet.
</body> <body>
Exemple: </html>
<%@page contentType="text/html" <pre>
La somme est: <%= (195 + 9 + 273) %>
pageEncoding="UTF-8"%> Index.jsp <% String name =
Je vous réponds à l'adresse :
<!DOCTYPE html> <%@page contentType="text/html" pageEncoding="UTF-8"%> request.getParameter("uname");
<%=request.getParameter("email") %>
<html> <!DOCTYPE html>
Directive <%= ... %> String Email =
<head> <html>
La directive <%= expr %> génère l'affichage d'une request.getParameter("Email");
<meta http-equiv="Content-Type" <body>
content="text/html; charset=UTF-8"> valeur de l'expression expr <form action="Welcome.jsp"> out.println("Welcome " + name+" Email : "
<title>JSP Page</title> <%= expr %> raccourci pour <% out.print(expr); <pre> +Email);
</head> %> UserName : <input type="text" name="uname
name="uname">
"> %>
<body> Exemple : Email : <input type="text" name="Email"> </pre>
<%! int i = 38;%> <HTML> <BODY> <input type="submit" value="Login"><br
value="Login"><br/>
/> </body>
<%= "Value of the variable is:" + i%> <% int aleat = (int) (Math.random() * 5); %> </pre>
</html>
</body> <H1> <%= aleat %> </H1> </form>
</html> </BODY> </HTML> </body>
8 7
</html>

2
26/03/2023

Méthodes et variables d'instance Mécanismes mis en œuvre


Des méthodes et des variables d'instance peuvent être associées à une JSP entre les
directives <%! et %>
Exemple:  plusieurs zones <% ... %> peuvent cohabiter
<HTML> <BODY>
dans une même JSP
<H1>Compteur</H1>  lors du premier chargement d'une JSP (ou après
<%! int cpt = 0; //Variable d'instance- initialisée à l'instanciation de la JSP modification), le moteur rassemble tous les
// - persiste entre 2 invocations tant que la JSP ne change pas fragments <% ... %> de la JSP dans une classe
// Méthode d'instance - attachée à l'objet correspondant à la JSP  la compile
int getCpt() {return cpt++; }  l'instancie
%> JSP = objet Java présent dans le moteur
<H1> <%= getCpt() %> </H1>
 puis, ou lors des chargements suivants, le
Remarque moteur exécute le code dans un thread
Variables d'instance  délai d'attente lors de la 1ère invocation dû à la
Attention !! compilation
<%! int cpt = 0; %> ≠ <% int cpt = 0; %>  en cas d'erreur de syntaxe dans le code Java de la
Variable d'instance de la JSP (persiste) JSP message récupéré dans le navigateur
Variable locale à la JSP (réinitialisée à chaque invocation de la JSP)

10 9

D'autres Directives
Les objets implicites
La directive <%@ page ... %>
Donne des informations sur la JSP (non obligatoire, valeurs par défaut)
Objets prédéclarés utilisables dans le code Java des JSPs
le flux de sortie pour générer le code HTML out Exemple :
<%@ page import="..."%>
la requête qui a provoqué le chargement de la JSP request <%@ page import="java.io.*"%>
la réponse à la requête de chargement de la JSP response
les "import" nécessaires au code Java de la JSP

l'instance de servlet associée à la JSP courante (≡ page <%@ page errorPage="..."%> (ex. <%@ page errorPage="err.jsp"%>)
this)
fournit l'URL de la JSP à charger en cas d'erreur
l'exception générée en cas d'erreur sur une page exception

suivi de session pour un même client session <%@ page contentType="..."%> (ex. <%@ page contentType="text/html"%>)
le type MIME du contenu retourné par la JSP
espace de données partagé entre toutes les JSP application

<%@ page isThreadSafe="..." %> true ou false


true la JSP peut être exécutée par +sieurs clients à la fois (valeur par défaut)

<%@ page isErrorPage="..." %> true ou false


true la JSP est une page invoquée en cas d'erreur

12 11

3
26/03/2023

Gestion des erreurs


 Erreur de syntaxe
Récupération des données d'un formulaire
 dans les directives JSP (ex. : oubli d'une directive %>) Méthode String getParameter(String) de l'objet prédéfini request
 dans le code Java
 retourne le texte saisi
 Erreur d'exécution du code Java (ex. : NullPointerException)
 ou null si le nom de paramètre n'existe pas
 dans tous les cas, erreur récupérée dans le navigateur client Exemple : Formulaire HTML
2 possibilités <HTML> <BODY>
 conserver la page par défaut construite par le moteur <FORM ACTION=http://www.fsa.ac.ma /form.jsp METHOD=POST>
 en concevoir une adaptée aux besoins particuliers de l'application Nom <INPUT NAME="nom"> <P>
 en utilisant des directives <%@ page errorPage="..." %> et Prénom <INPUT NAME="prenom"> <P>
 <%@ page isErrorPage="..." %> <INPUT TYPE=SUBMIT VALUE="Envoi">
Exemple de gestion d'erreur <INPUT TYPE=RESET VALUE="Remise à zéro">
<HTML> <BODY> </FORM>
</BODY> </HTML>
<H1>Pourvu ... !!</H1>
Récupération des données d'un formulaire: form.jsp
<% int hasard = (int) ( Math.random() * 5 );
<HTML> <BODY>
%> <H1>Exemple de résultat</H1>
<H1> <%= 12 / hasard %> </H1></BODY> </HTML> Bonjour
Résultat Si hasard = 0 page d'erreur par défaut <%= request.getParameter("prenom") %>
<%= request.getParameter("nom") %>

14 13 </BODY> </HTML>

Inclusion de JSP
Exemple :
 Agrégations des résultats fournis par plusieurs JSP <HTML> <BODY>
 Meilleure modularité <H1>Pourvu ... !!</H1>
<%@ page errorPage="err.jsp" %>
 Meilleure réutilisation <% int hasard = ... %>
<H1> <%= 12 / hasard %> </H1>
Directives <jsp:include> et </jsp:include>
</BODY> </HTML>
<HTML> <BODY>
<H1>JSP principale</H1> err.jsp
<jsp:include page="inc.jsp" > <HTML> <BODY>
</jsp:include> <%@ page isErrorPage="true" %>
<h1> Le 0 est sorti !! </h1>
</BODY> </HTML>
erreur :
inc.jsp <%= exception.getMessage() %>
<B>JSP incluse</B> </BODY> </HTML>

<P> <%= (int) (Math.random()*5) %> Si hasard = 0  page d'erreur err.jsp = 0


</P> Récupération de l'erreur via l'objet prédéfini exception

!!! Pas de <HTML> <BODY>


16 15

4
26/03/2023

Délégation de JSP
Résultat
 Une JSP peut déléguer le traitement d'une requête <HTML> <BODY>
à une autre JSP <H1>JSP principale</H1>
<B>JSP incluse</B>
 prise en compte complète de la requête par la <P> <%= (int) (Math.random()*5) %>
JSP déléguée </P> </BODY> </HTML>
 Directives <jsp:forward> et
Remarque
</jsp:forward> 1. directives <jsp:include> et </jsp:include> inclusion statique
<HTML> <BODY> 2. directive <%@ page include file="…"%> inclusion dynamique
L'élément <jsp:include> vous permet d'inclure soit un fichier statique ou dynamique
<H1>JSP principale</H1> dans un fichier JSP. Les résultats d'inclure des fichiers statiques et dynamiques sont
très différentes. Si le fichier est statique, son contenu est inclus dans le fichier
<jsp:forward page="forw.jsp" > appelant JSP. Si le fichier est dynamique, elle agit sur la demande et le renvoie du
</jsp:forward> résultat qui est inclus dans la page JSP. Lorsque l'action de "include" est terminée,
le conteneur JSP continue le traitement du reste du fichier JSP.
Ignoré !!
</BODY> </HTML>
18 17

Délégation et inclusion de JSP Fichier forw.jsp


Transmission de paramètres aux inclus et aux délégués par Utilisation de couples (name, value)
Directive <jsp:param name="..." value="..." />
<HTML> <BODY>
Exemple : <H1>JSP déléguée</H1>
<HTML> <BODY> <P>
<H1>JSP principale</H1>
<jsp:forward page="forw.jsp">
<%= (int) (Math.random()*5) %>
<jsp:param name="nom" value="Taha
value="Taha" " /> </P>
<jsp:param name="
name="prenom
prenom" " value="Mohamed" /> </BODY> </HTML>
</jsp:forward>
</BODY> </HTML>
!!! Avec <HTML> <BODY>

Récupération des paramètres ≡ à la récupération des paramètres transmis via un formulaire Résultat
<HTML> <BODY>
<HTML> <BODY>
<H1>JSP déléguée/incluse</H1> <H1>JSP déléguée</H1>
Nom : <%= request.getParameter("nom") %> <P>
Prénom : <%= request.getParameter("prenom") %>
</BODY> </HTML>
<%= (int) (Math.random()*5) %>
</P>
</BODY> </HTML>
20 19

5
26/03/2023

l'attribut scope JSP et Java beans


Il indique la portée du bean But : avoir le moins de code Java possible dans une page JSP
Description valeur (HTML)
Le bean est valide pour cette requête. Il est utilisable dans request
Sous-traiter le code à un Java bean
les pages de redirection de la requête (<jsp:forward>). Il
est détruit à la fin de la requête balise XML : <jsp:useBean>
Similaire à request, mais le bean n'est pas transmis aux page Syntaxe générale :
pages de redirection <jsp:forward>. C'est la portée par
défaut
<jsp:useBean id="nomInstanceJavaBean"
Le bean est valide pour la session courante. S’il n’existe pas session
encore dans la session courante, il est créé et placé dans la class="nomClasseDuBean"
session du client. Il est réutilisé jusqu’à ce que la session
soit invalidée scope="request|session|application|page“>
Le bean est valide pour l’application courante. Il est créé application
</jsp:useBean>
une fois et partagé par tous les clients des JSP.
• Le bean est alors utilisable par nomInstanceJavaBean
• balise sans corps donc utilisation de <jsp:useBean … />

22 21

Etape2 : Utilisation du bean dans une JSP Exemple:Etape 1: Bean


 Utilisation à l'aide de son nom public class SimpleBean implements java.io.Serializable
{
 Récupération des propriétés :
private int compter;
– Par appel de méthode getXXX() :
public SimpleBean() {
– Par la balise <jsp:getProperty …>
compter = 0;
<p> on repère le bean par le nom nomBean <br>
}
<jsp:useBean id="nomBean" class="SimpleBean" public void setCompter(int theValue) {
scope="session"> compter = theValue;
</jsp:useBean> }
<p> On accède a une propriété avec une expression: public int getCompter() {
<br> compteur = <%= nomBean.getCompter() %> return compter;
<hr> }
public void increment() {
On incrémente le compteur <% nomBean.increment(); %> compter++;
<p>On peut accéder à la propriété par une balise :<br> }
<jsp:getProperty name="nomBean" property="compter" /> }

24 23

6
26/03/2023

Exemple Positionner les propriétés du bean dans une JSP


//File: index.jsp
<%@ page import=“fsa.ac.ma.MessageBean" %>  Par appel de méthode setXXX(...) :
<HTML> <HEAD> <TITLE>Using a JavaBean</TITLE>  Par la balise <jsp:setProperty …>
</HEAD>
<p> on repere le bean par le nom nomBean<br>
<BODY>
<h1>Using a JavaBean</h1> <jsp:useBean id="nomBean" class="SimpleBean"
<% MessageBean m = new MessageBean(); %> scope="session">
The message is: <%= m.msg() %> </BODY>
</HTML> </jsp:useBean>
//////////////////////////////////////////////////
//File: MessageBean.java <p> On positionne une propriéte avec une expresion:
package beans; <br> compteur = <%= nomBean.setCompter(6) %>
public class MessageBean
{ public MessageBean() { } <p>ou par une balise :<br>
public String msg() { return "Hello from JSP! <jsp:setProperty
"; }} name=”nomBean"property="compter" value="6" />

26 25

 Bean Counter
package fsa.ac.ma;
import java.io.Serializable;
Un développement efficient est un public class Counter implements Serializable{
private int count = 0;
développement efficace, c’est-à-dire qui public Counter() { }
atteint les objectifs du projet mais en plus public int getCount() { count++; return count; }
public void setCount(int count) { this.count = count; }}
à moindre coût, avec moins de  //File: BeanCounter.jsp
<HTML> <HEAD> </HEAD>
ressources humaines et en moins de <BODY>
temps ! <%@ page language="java" %>
<jsp:useBean id="counter" scope="session" class=" fsa.ac.ma.Counter" />
<jsp:setProperty name="counter" property="count" value="6" />
<% out.println("Count from scriptlet code : ” + counter.getCount() + "<BR>");%>
Count from jsp:getProperty :
<jsp:getProperty name="counter" property="count" /><BR>
</BODY>
28 27
 </HTML>

7
26/03/2023

Couche Controller
//// servelet controleur if (result){
Exemple App MVC
package fsa.ac.ma; User user
user=loginService.getUserDetails(userId); Partie Vue (Input)
import java.io.IOException; //request.getSession
// request.getSession().
().setAttribute
setAttribute("user",
("user", user);
Login.jsp
import javax.servlet.RequestDispatcher; //utilisation de session scope pour tramettre l'objet user <%@ page language="java" contentType="text/html; charset=windows-1256"
import javax.servlet.ServletException; //response.sendRedirect("success.jsp"); pageEncoding="windows-1256"%>
import javax.servlet.http.HttpServletRequest; request.setAttribute("user
user", user
user); <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
import javax.servlet.http.HttpServletResponse; RequestDispatcher dispatcher=
<html>
import fsa.ac.ma.dto.User; request.getRequestDispatcher("success.jsp"
success.jsp");
<head>
public class LoginServlet extends javax.servlet.http.HttpServlet dispatcher.forward(request, response); <meta http-equiv="Content-Type" content="text/html; charset=windows-1256">
implements javax.servlet.Servlet { return; } <title>Login Page</title>
static final long serialVersionUID = 1L; else {response.sendRedirect("login.jsp"); </head>
public LoginServlet() {super();} return;}}} <body>
protected void doPost(HttpServletRequest request, <form action="login"
action="login" method=
method="post"
"post">
>
HttpServletResponse response) throws ServletException, <br
br>> User ID : <input type="text"
type="text" name=
name=""userId
userId""/>
IOException <br
br>> Password : <input type="password"
type="password" name=
name="password"
"password"/>
/>
{String userId,password; <br
br>> <input type="submit"
type="submit"/>
/>
</form>
userId= request.getParameter("userId");
</body>
password= request.getParameter("password");
</html>
LoginService loginService=new LoginService();
boolean result=
result=loginService.authenticate
loginService.authenticate((userId
userId,, password);

30 29

Fichier déploiement Web.Xml Exemple App MVC


// Couche Model ( couche métier) package fsa.ac.ma.dto;
Web.xml
<?xml version="1.0" encoding="UTF-8"?> <welcome-file-list> package fsa.ac.ma;
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <welcome-file>index.html</welcome-file> import java.util.*; public class User {
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> import fsa.ac.ma.dto.User; private String userName;
<display-name>
<welcome-file>index.htm</welcome-file>
public class LoginService { private String userId;
LoginApps</display-name>
<welcome-file>index.jsp</welcome-file> HashMap<String,
HashMap <String, String> users=new HashMap
HashMap<String,
<String, String>(); public String getUserName() {
<servlet>
<description> <welcome-file>default.html</welcome-file> LoginService() return userName;
</description> <welcome-file>default.htm</welcome-file> {users.put("AFDEL", "AFDEL Karim"); }
<display-name>LoginServlet
LoginServlet</display-name> users.put("TAHA", "TAHA Mohamd");
<welcome-file>login.jsp</welcome-file> public void setUserName(String userName)
<servlet-name>LoginServlet</servlet-name> users.put("MOUSSA", "MOUSSA SADR"); } {
<servlet--class>
<servlet class>fsa.ac.ma.LoginServlet
fsa.ac.ma.LoginServlet</servlet
</servlet--class> </welcome-file-list> public boolean authenticate (String userId, String password) this.userName = userName;
</servlet>
</web-app> { if(password == null || password.trim()== "") {return }
<servlet-mapping>
false; } public String getUserId() {
<servlet-name>LoginServlet
LoginServlet</servlet-name>
<url-pattern>/login
>/login</url-pattern> return true; } return userId;
</servlet-mapping> public String getUserName(String userId) }
{return users.get(userId);}
public void setUserId(String userId) {
public User getUserDetails
getUserDetails(String
(String userId
userId))
this.userId = userId;
{ User user
user=new
=new User();
}
user.setUserName((users.get
user.setUserName users.get((userId
userId));
));
user.setUserId((userId
user.setUserId userId);
);
}
32 31return user; }}

8
26/03/2023

Partie Vue : Ouput


Success.jsp
<%@ page language="java" contentType="text/html; charset=windows-1256"
pageEncoding="windows-1256" import="fsa.ac.ma.dto.User"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1256">
<title>Success</title>
</head>
<body>
<h3> Login Successful </h3>
<%User user
user=(User)
=(User)request.getAttribute
request.getAttribute("user");
("user"); %>
Hello <%=user.getUserName
<%=user.getUserName() () %>
</body>
</html>

33

Vous aimerez peut-être aussi