Vous êtes sur la page 1sur 52

JSP et Java beans

Licence pro cours n3

Java Server Pages


___________________________

Introduction
Concepts fondamentaux
Dlgation et inclusion
Partage de donnes
Exemple
Cycle de vie de la servlet gnre
Licence pro cours n3

Introduction aux JSP


Le langage JSP est un langage de scripts
Les scripts sont des instructions Java embarques dans du code
HTML,SVG,WML,XML entre les balises <% %>
Chaque script est interprt par un serveur JSP qui diffrencie le
code JSP du code HTML grce des balises spcifiques
Le serveur JSP cr, compile, excute une servlet. C'est la servlet
gnre qui produit le code HTML,... de la page envoye au
client
L'utilisation des JSP n'est pas limite la gnration de code
HTML. Le contenu gnr peut tre du code XML ou XHTML
Licence pro cours n3

Traduction puis compilation


moteur JSP
requte

client
(navigateur)
rponse

serveur
web

compilation du
script JSP

JVM

servlet

le script JSP est compil en une servlet


la servlet est compile puis excute
Licence pro cours n3

<HTML> <BODY>
<H1>Affichage des prix HT et TTC</H1>
<% String param = request.getParameter("PHT");
float prixHT = Float.parseFloat(param);
float prixTTC= prixHT*(1+0.196F);
out.print("prix HT =" + prixHT + "<BR>" );
out.print("prix TTC =" + prixTTC + "<BR>" );
%>
</BODY> </HTML>

fichier HTML
envoy cot client

rsultat = HTML
gnr via l'objet
prdfini out
du code Java

<HTML> <BODY>
<H1> Affichage des prix HT et TTC </H1>
prixHT = 42,50<BR>
prixTTC = 50,83<BR>
</BODY> </HTML>

Licence pro cours n3

Mcanismes mis en oeuvre


Plusieurs zones <% ... %> peuvent cohabiter dans une mme JSP
Au premier chargement d'une JSP (ou aprs modification), le
moteur JSP
- rassemble tous les fragments <% ... %> de la JSP dans une
classe
JSP = objet Java prsent
- la compile en une servlet
dans le moteur
- la servlet est compile et instancie
Puis, ou lors des chargements suivants, le moteur JSP
- excute le code de la servlet dans un thread
=> dlai d'attente lors de la 1re invocation d la compilation
Licence pro cours n3

JSP
compilation
requte
client

objet
request

SERVLET
mthode de
servlet

objet
response

Licence pro cours n3

rponse
au client

Balises de commentaires
2 manires de placer des commentaires dans une
page JSP
<!-- mon commentaire -->
dans ce cas les commentaires sont transmis la
rponse. Ils sont donc visibles lorsqu'on visualise le
code source de la page HTML.
ou
<%-- mon commentaire --%>
Le serveur JSP ne les prend pas en compte. Leur
intrt est uniquement de commenter le code JSP
Licence pro cours n3

4 types de balises
Les balises de directives spcifient les paramtres applicables la
page
<%@ ... %>
Les balises permettant de dfinir des variables globales la page
<%! ... %>
Les balises de scriptlets permettant d'inclure du code java
<% ... %>
Les balises permettant d'valuer une expression et l'affichage de sa
valeur dans la page
<%= ... %>
Licence pro cours n3

Balises de scriptlets
Une scriptlet une suite d'instructions Java contenues dans la balise
<%
%>
et excutes ds qu'un client invoque la page
Les variables dclares dans une scriptlet sont locales une
requte.
Contrairement aux variables dclares dans la balise <%!
qui persistent d'une requte l'autre
Exemple :
<% float[] pttc = {23.4,78.9,32.0};
for (int i=0;i<pttc.length;i++){
out.println("<h2>Prix TTC</h2>");
out.println(pttc[i]);
}
Licence pro cours n3
%>

%>

10

Balises de dclarations
Les variables et mthodes qui deviendront membres de
la servlet gnre par le compilateur JSP sont
dclares par la balise :
<%!
dclarations
%>
Exemples :
<%! private int nbLettres(String nom){
return nom.length();
}
int nb = 0;
%>

Mthode d'instance
- attache l'objet correspondant
la JSP

variable d'instance
- initialise l'instanciation de la JSP
- persiste entre 2 invocations tant que la JSP ne
Licence pro cours n3
change pas

11

Exemple

Attention !!
<%! int cpt = 0; %>

<% int cpt = 0; %>


variable locale la JSP
(rinitialise chaque
invocation de la JSP)

variable d'instance de la JSP


(persiste)
Licence pro cours n3

12

Balises d'expression
Une balise d'expression contient une expression Java
<%=
%>
Exemple 1 :
<input name="Nom" value= "<%= nom %>" type="text">
A l'excution, cette expression est value, sa valeur est envoye la
page HTML de rponse. Concrtement, l'utilisateur saisit un nom qui
sera un paramtre de la requte. La valeur sera null si aucune
valeur n'est fournie
Exemple 2 :
<%Date date = new java.util.Date();
out.println( "date du jour : " + date );
la valeur retourne est
%>
une String
est quivalent
date du jour : <%= new java.util.Date()%>
Licence pro cours n3

13

Balises de directives
3 sortes de balises qui spcifient des directives de gnration de page
au compilateur :

page permet de dfinir un certain nombre d'attributs qui


s'appliqueront la page

include permet d'inclure un fichier texte ou autre ressource


la cration de la servlet

taglib permet de dfinir une bibliothque de balises utiliser


Licence pro cours n3

14

La directive page
Attributs qui s'appliqueront la page

import dfinit les paquetages importer


l'attribut extends dfinit la classe parente de la servlet
<%@page import="java.util.Date"%>
date du jour : <%= new Date()%>
langage dfinit le langage de script utilis dans la page
<%@page langage="java"%>
contentType dfinit le type de contenu de la page gnre
<%@page contentType="text/plain" %>
<%@page contentType="text/html" %>
errorPage spcifie la page afficher en cas d'erreur
<%@page errorpage ="500.jsp" %>
isErrorPage vaut true si la page est une page d'erreur,
false sinon
<%@page isContentType ="false" %>
Licence pro cours n3

15

Directive page, attribut errorPage


Dans la JSP provoquant l'erreur :
on peut rcuprer une exception dclenche dans une scriptlet
JSP.
son traitement pourra tre assure par une page d'erreur
la page d'erreur est spcifie par la balise page et son attribut
errorPage
<%@ page errorPage="erreur.jsp" %>
ou
<%@ page errorPage="erreur.jsp?code=xxx" %>
NOTE

Une seule page


d'erreur par JSP

transmission
d'information la page
d'erreur
Licence pro cours n3

16

Directive page, attribut isErrorPage


Dans la page de traitement de l'erreur :

on dfinit la page JSP comme une page d'erreur par

false indique une


page normale

<%@ page isErrorPage=true %>

l'objet accompagnant l'exception est rfrenc par la variable implicite


exception
On peut donc recueillir des informations sur l'erreur par les mthodes
classiques de la classe Exception:
exception.getMessage()
exception.printStackTrace()

Licence pro cours n3

17

Directive page, attribut errorPage:


exemple (1/2)
<%@ page language="java" contentType="text/html" %>
<%@ page errorPage="/erreur.jsp" %>
<html><head><title>Page avec une erreur</title></head>
<body>
<% int var=90; var = var/0; %>
division.jsp
Division par 0 = <%= var %>
</body></html>
<%@ page language="java" contentType="text/html" %>
<%@ page isErrorPage="true" %>
<html><head><title>Page de gestion de l'erreur</title></head>
<body><h2><%=exception.getClass().getName()%><br>
l'exception dclenche est : <%= exception.getMessage()%>
</body></html>
objet implicite
Licence pro cours n3

erreur.jsp

18

Directive page, attribut errorPage:


exemple (2/2)

Licence pro cours n3

19

La directive include (1/3)


include permet d'inclure dans la page un fichier texte ou autre
ressource la cration de la servlet
recherche relativement
ServletContext

<%@include
file="/chemin/relatif/auContexte"%>
<%@include
file="dansLe/repertoire/deLaPage"%>

recherche dans le mme rpertoire que la


JSP courante

En gnral, le contenu du fichier est un fragment de page. Les


variables cres par le fichier inclus sont dans la porte de la page
Licence pro cours n3

20

La directive include (2/3)


Cette inclusion se fait au moment de la conversion, pendant la
cration de la servlet correspondante.
Le contenu du fichier externe est inclus comme sil tait saisi
directement dans la page JSP
Les ressources inclure doivent tre contenues dans le
contexte de l'application web

Licence pro cours n3

21

La directive include (3/3)


<HTML><HEAD>
<TITLE>Page de titre</TITLE>
</HEAD><BODY>

corps.jsp
<%! String nom; %>
<% nom="Meyer"; %>

<%@ include file="/entete.html" %>


<%@ include file="/corps.jsp" %>
Bonjour <%=nom %>
<%@ include file="/piedpage.html" %>

Ceci est le pied de page.


</BODY>
</HTML>

piedpage.html

entete.html

nom : variable dclare dans


le fichier inclus corps.jsp

Licence pro cours n3

22

La directive taglib
l'API 1.1 de Java Server Pages permet aux dveloppeurs de crer
une bibliothque de balises qui peuvent tre mlanges aux
balises jsp standards ainsi qu'aux balises html.
Le moteur jsp traite ces balises comme des balises standards pour
crer du code java compil ensuite en servlets.

<%@taglib uri="taglib/maBalise.tld"
prefix="unPrefixe"%>

fichier xml spcifiant


l'ensemble des attributs de
chaque balise

Licence pro cours n3

23

Pour dfinir une balise (" Tag ")


Dfinir un gestionnaire de balises (" Handler ")
Objet invoqu par le container web pour valuer le tag
pendant l'excution de la JSP qui le rfrence
Objet qui implante une interface Tag ou BodyTag ou drive
d'une classe de base TagSupport ou BodyTagSupport
Et dfinit les mthodes doStartTag() et doEndTag()

Le dclarer dans un TLD (" tag library descriptor "),


document XML qui dcrit une bibliothque de balises

Licence pro cours n3

24

Exemple
Le tag : <tt:simple />
Serait implanter par le gestionnaire :
public SimpleTag extends TagSupport {
public int doStartTag() throws JspException {
try {
pageContext.getOut().print("Hello.");
} catch (Exception ex) {
throw new JspTagException("SimpleTag: " +
ex.getMessage());
}
return SKIP_BODY; // ce tag n'a pas de corps
}
public int doEndTag() {
return EVAL_PAGE;// si le reste de la page
// doit tre valu
Licence pro cours n3
25
}
}

Les variables implicites (1/2)


Un certain nombre d'objets sont toujours accessibles et utilisables
l'intrieur des pages JSP.
package javax.servlet
ServletRequest.request reprsente la requte utilisateur
ServletRequest.response reprsente la rponse fournie
ServletContext.application espace de donnes partag
entre toutes les servlets et JSP de la mme application
ServletConfig config contient les paramtres d'initialisation de
la servlet
package javax.servlet.jsp
jsPWriter.out reprsente le flot de sortie pour la rponse
PageContext.pageContext contient les attributs de la page
package javax.servlet.http
HttpSession.session contient les attributs attachs la session

Licence pro cours n3

26

out et request:
variables implicites

Les variables implicites (2/2)


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@page language="java" %>
<html><head><title>Informations du client</title></head>
<body bgcolor="white">
Protocole
: <%= request.getProtocol() %><br>
Serveur
: <%= request.getServerName() %><br>
Port
: <% out.println(request.getServerPort()); %><br>
Hote distant : <% out.println(request.getRemoteHost()); %><br>
Methode
: <%= request.getMethod() %><br>
</body></html>

Licence pro cours n3

27

Cycle de vie de la servlet gnre


Exemple : question.jsp
<%
String nom = request.getParameter("Nom");
if(nom==null) nom=" ";
%>
<form action="" method="post">
<table>
<tr>
<td>Nom</td>
<td><input name="Nom" value="<%= nom %>" type="text"></td>
</tr>
</table>
<table><input type="submit" value="Envoyer"></table>
<table><B> <%= nom %> </B></table>
</form>
Licence pro cours n3

28

aprs chargement de la page

aprs saisie du nom

aprs excution de la servlet


Licence pro cours n3

29

Cycle de vie de la servlet gnre :


commentaires

La page JSP prcdente est traduite en une servlet qui se charge de


l'affichage en 1
L'utilisateur saisit un nom dans le champ de texte en 2
Il appuie sur le bouton envoyer qui transmet la requte avec
comme paramtre le nom saisi. C'est une requte de type POST qui
donne la mme servlet la responsabilit du traitement de la requte
<form action="" method="post">
La servlet question_jsp.class doit donc s'excuter avec
comme paramtre issu de la requte le nom Hubert
elle affiche de nouveau la page en remplaant l'expression
<%= nom %> par sa valeur

Licence pro cours n3

30

Cycle de vie de la servlet gnre


(1/2)

Traduction du script JSP en servlet Java, le fichier question.jsp devient


question_jsp.java
A ce niveau, les erreurs de syntaxe JSP sont dtectes

Compilation de la servlet
question_jsp.java devient question_jsp.class
A ce niveau, les erreurs de syntaxe Java sont dtectes

Cration et chargement d'un objet servlet


- construction d'une instance de servlet
- chargement en mmoire de cet objet

A chaque requte utilisateur, un thread est cr vers la servlet


Les variables d'instance sont accessibles et modifiables par tout utilisateur et
pour toute requte
Pour des raisons de scurit, il est important de crer des variables propres
chaque session pour viter les partage
des variables d'instance entre plusieurs
Licence pro cours n3
31
utilisateurs

Cycle de vie de la servlet gnre


(2/2)
Initialisation de la servlet

- la mthode _jspInit() est excute une seule fois


- elle a pour rle d'initialiser les variables et de charger les valeurs
d'environnement (ServletConfig)

Appel la mthode _jspService()

- chaque requte, un thread est cr qui fait appel


la mthode _jspService()
- cette mthode dtermine le type de requte (HTTP, ...) et le mode de
transmission (GET ou POST)
- les objets request et response sont crs

Destruction de la servlet
- la mthode jspDestroy() enregistre les donnes, libre les ressources
utilises par la servlet puis ferme les connexions aux BD
- le programmeur peut surcharger jspDestroy() et _jspInit()
Licence pro cours n3

32

Cycle de vie de la servlet gnre :


traduction JSP->servlet
les variables dclares dans des balises <%!...%> sont
traduites en variables d'instance
idem pour les mthodes
Les variables dclares l'intrieur d'une scriptlet sont traduites
en variables locales de la mthode _jspService()
Les expressions JSP <%=...%> sont places dans un flux de
sortie de type out.println(...)
Les balises HTML sont places dans un flux d'criture de type
out.write(...)
Le code Java interne une scriptlet est plac tel quel
l'intrieur de la mthode _jspService()

Licence pro cours n3

33

Java Beans

Dfinition
Persistance
Proprits
beans et JSP
Exemple

Licence pro cours n3

34

Le modle de composants Java


Le modle de composants Java (Java beans) permet de
construire une application en assemblant des entits logicielles
par programme (ou visuellement)
Ce modle de composants est dcrit par un ensemble d'APIs
Pour fonctionner, ce modle repose sur un ensemble d'outils
formant un environnement dans lequel les composants
interagissent
Ce modle utilise des conteneurs qui fixe un cadre pour la
coopration des composants
Dans l'architecture des applications web, les composants
mtiers sont implants par des Java beans
Modle composant alternatif : ActiveX de Microsoft
Licence pro cours n3

35

Persistance

Un bean est un objet Java


Comme tout objet, il possde un tat
Cet tat doit tre mmoris pour toute utilisation ultrieure du
bean
Tout bean doit donc utiliser un mcanisme de persistance
universel dfini par leur conteneur
A cette fin, ils se doivent d'implmenter l'interface
java.io.Serializable

Exemple :
- composant logiciel charg de surveiller la temprature d'une piscine
- la temprature min de dclenchement du chauffage est fixe 25
- si l'application s'arrte et reprend plus tard, il est souhaitable que ce
seuil soit mmoris
Licence pro cours n3

36

Dfinition
Un bean correspond une tche bien dfinie (logique
mtier) comme la gestion d'une piscine, l'inventaire
d'un magasin, le cot d'entretien d'une turbine, etc...
Un bean est une classe Java laquelle on associe
des proprits
Chaque proprit a une ou plusieurs mthodes
d'accs
Le codage des mthodes suit certaines conventions
de nommage
Licence pro cours n3

37

Construction d'un java bean


Les Java Beans sont des classes Java qui respectent les directives
suivantes :
un constructeur public sans argument
les proprits d'un Bean sont accessibles au travers de mthodes
getXXX (lecture) et setXXX (criture) portant le nom de la
proprit
Mthodes de lecture des proprits :
type getNomDeLaProprit()
pas de paramtre et son type est celui de la proprit
boolean isNomProprit()
Mthodes d'criture des proprits :
void setNomDeLaProprit(type) : un seul argument du type de
la proprit et son type de retour est void
Un Java Beans implmente l'interface java.io.Serializable
Licence pro cours n3
permettant la sauvegarde de
l'tat du Bean

38

Autres proprits
Proprits possdant des valeurs multiple :
public TypeProprit[] getNomProprit();
public TypeProprit getNomProprit(int index);
public void setNomProprit(TypeProprit[] valeur);
public void setNomProprit
(int index,TypeProprit[] valeur);

Licence pro cours n3

39

Java bean : exemple


public class Personne implements Serializable{
private String nom;
private String prenom;
variables d'instance
private int age;
prives
public Personne(){}
public Personne(String nom, String prenom, int age) {
this.nom = nom;this.prenom = prenom;this.age = age;}
public int getAge() {return age;}
public String getNom() {return nom;}
public void setAge(int age) {this.age = age;}
public void setNom(String nom) { this.nom = nom;}
public void setPrenom(String prenom){this.prenom = prenom;}
public String getPrenom() {return prenom;}
}
Licence pro cours n3

40

Beans et JSP
Un bean est inclus dans une page JSP par la balise :
<jsp:useBean>
Aprs excution, un bean rend son rsultat la page
JSP ou la servlet
L'utilisation de beans vite l'emploi de la mthode
getRequestParameter(...)
La valeur du paramtre d'une requte peut tre
utilise directement pour renseigner la proprit d'un
bean
Un serveur peut grer la porte d'un bean en le liant
soit une page, une requte, une session ou une
application
Licence pro cours n3

41

Porte d'un bean


<jsp:useBean id = "nomDuBean"
scope = "page|request|session|application"
class = "nomPackage.nomClasse"
type = "typeDuBean">
</jsp:useBean>
class = "nomClasse" on suppose ici que la classe
nomClasse se trouve dans le package nomPackage de
lapplication
class = "fr.cnam.eclipse.nomPackage.nomClasse"
On indique ici le nom absolu de la classe
type est utilis pour le transtypage. Il indique soit une classe
mre soit une interface de la classe

Licence pro cours n3

42

Proprits d'un bean


Les valeurs de tous les paramtres de la requte dont les noms
correspondent aux proprits du bean leur sont affects
<jsp:setproperty name="nomDuBean" property="*" />
Seul le paramtre uneProprit est utilis pour renseigner la
proprit unePropriete
<jsp:setproperty name="nomDuBean"
property="unePropriete"/>
On utilise ici un paramtre de requte dont le nom est diffrent de celui
de la proprit du bean
<jsp:setproperty name="nomDuBean"
property="unePropriete" param=nomduParametre/>
La proprit prend directement la valeur constante
<jsp:setproperty name="nomDuBean"
property="unePropriete"
value="constante" />
Licence pro cours n3

43

Exemple 1 (1/3)
La page JSP qui suit affiche le texte : Bonjour suivi de la
valeur du paramtre nom de la requte.
La classe HelloBean est stocke dans le rpertoire entites.
La proprit nom du bean HelloBean est alimente par le
paramtre de la requte pass dans son en-tte si celui-ci est
renseign
Sinon c'est sa valeur par dfaut qui est utilise
L'excution de la page JSP provoque l'affichage du texte
bonjour suivi du contenu de la proprit nom du bean
HelloBean
Intrt :
pas de code Java dans la page JSP
modularit dans la construction de l'application

Licence pro cours n3

44

Exemple 1 (2/3)
package entites;
import java.io.Serializable;
public class HelloBean implements Serializable{
private String nom = " tous";
private String prenom = " ";
public void setNom( String nom ){
this.nom=nom;
}
public String getNom(){
return nom;
}
public void setPrenom( String prenom ){
this.prenom=prenom;
}
public String getPrenom(){
return prenom;
}
Licence pro cours n3
}

45

Exemple 1 (3/3)
<%-- hello.jsp --%>
<jsp:useBean id="hello" class="entites.HelloBean">
<jsp:setProperty name="hello" property="prenom"
value="Albert" />
</jsp:useBean>
valeur donner
la proprit

<HTML>
<HEAD><TITLE>Bonjour</TITLE></HEAD>
<BODY>
rfrence du bean
<H2>
Bonjour <jsp:getProperty name="hello" property="nom" />
<br>
<jsp:getProperty name="hello" property="prenom" />
</H2>
</BODY>
nom de la
</HTML>
proprit
Licence pro cours n3

46

Licence pro cours n3

47

Exemple 2
un prnom est saisi
travers un formulaire

page affiche
en rponse

Licence pro cours n3

48

Le bean HelloBean
package entites;
import java.io.Serializable;
public class HelloBean implements Serializable{
private String nom;
private String prenom;
public void setNom( String nom ){
this.nom = nom;
}
public String getNom(){ return nom; }
public void setPrenom( String prenom ){
this.prenom = prenom;
}
public String getPrenom(){ return prenom; }
}
Licence pro cours n3

49

hello.jsp
initialisation
<jsp:useBean id="hello" class="entites.HelloBean">
<jsp:setProperty name="hello" property="prenom" value=" "/>
<jsp:setProperty name="hello" property="nom" value=" tous!"/>
</jsp:useBean>
<jsp:setProperty name="hello" property="prenom" />
<HTML>
<HEAD><TITLE>Bonjour</TITLE></HEAD>
<BODY>
<h2>Tapez votre prnom</h2>
<form action="hello.jsp" method="post"><hr>
<table><tr>
<td>Prnom</td>
<td><input name="prenom" value="" type="text" size="15">
<td><input type="submit" value="Envoyer"></td>
</tr></table></form><hr>
<b>Bonjour</b>
<jsp:getProperty name="hello" property="nom" /><br>
<jsp:getProperty name="hello" property="prenom" />
Licence pro cours n3
50
</BODY></HTML>

Fonctionnement (1/2)
Initialisation
aprs le premier appel
hello.jsp, nom et
prenom sont initialiss

L'objet hello est cr et initialis avec les valeurs par dfaut comprises entre

les balises
<jsp:useBean id="hello" ......... </jsp:useBean>
Licence pro cours n3

51

Fonctionnement (2/2)
Aprs validation du formulaire, la nouvelle valeur de la proprit prenom
est transmise l'objet hello par la balise jsp :
<jsp:setProperty name="hello" property="prenom" />

la page hello.jsp est de nouveau


invoque et la valeur des proprits nom
et prenom est affiche
<b>Bonjour</b>
<jsp:getProperty name="hello" property="nom" /><br>
<jsp:getProperty name="hello"
property="prenom" />
Licence pro cours n3

52

Vous aimerez peut-être aussi