Ch 8 java sur le serveur Les JSP

Transcription

Ch 8 java sur le serveur Les JSP
Serveurs web, servlets et JSP
Les JSP
serveur web/JSP v8 .doc_____H.ZINSOU___________________________________________________________________
Ch 8 java sur le serveur
Les JSP
1.
PRÉSENTATION
2
1.1.
Définition, place, principe de fonctionnement
2
1.2.
1ers scripts JSP
3
2.
LES ÉLÉMENTS DES JSP
3
2.1.
Les balises
3
2.2.
Les objets implicites
6
2.3.
Les tags
6
2.4.
Les pages d'erreur
7
2.5.
Utiliser les objets Java
7
2.6.
La servlet générée
8
3.
3.1.
UTILISER UN JAVA BEAN DANS UN JSP
Qu'est-ce qu'un java bean
9
9
3.2. Un script JSP avec un bean d'accès aux données
3.2.1.
Un exemple de script d'accès aux données sans java bean
3.2.2.
Le même script, en utilisant un bean
9
9
10
3.3.
11
Extension du modèle
H.ZINSOU_____________________________________________________________________
__
JSP page 1
Serveurs web, servlets et JSP
Les JSP
serveur web/JSP v8 .doc_____H.ZINSOU___________________________________________________________________
1.
Présentation
1.1. Définition, place, principe de fonctionnement
Définition
- un langage simplifié pour créer des pages HTML à contenu
dynamique
- permet de placer des séquences de code java dans le code HTML
Place
par rapport aux servlets
- dans la servlet, on insère du code HTML dans un programme java (par
des commandes telles que out.println("<body>") )
- dans la page JSP, on insère du code java dans une page HTML (par
des balises telles que
<%= new Date( ) %>
o les servlets sont efficaces quand il y a de la logique à exécuter
o les JSP sont efficaces quand il y a un peu de logique dans
beaucoup de HTML
o on peut enchaîner servlet et JSP pour séparer les tâches
Principe de fonctionnement
-
le script JSP (maPage.jsp) est appelé comme une page HTML statique (par
http://localhost:8080/MonAppli/maPage.jsp)
-
une servlet est automatiquement générée et compilée à la 1ère exécution (placée dans le
répertoire jakarta-tomcat/work sur le serveur Tomcat)
H.ZINSOU_____________________________________________________________________
__
JSP page 2
Serveurs web, servlets et JSP
Les JSP
serveur web/JSP v8 .doc_____H.ZINSOU___________________________________________________________________
1.2.
1ers scripts JSP
Un JSP qui insère une donnée reçue en paramètre
<!-- BonjourParam.jsp -->
<HTML>
<HEAD>
<%!
String accueil = "Bienvenue à";
accueil += request.getParameter("nom");
%>
<TITLE>Page avec un paramètre reçu dans la requête</TITLE>
</HEAD>
<BODY>
<P ALIGN="CENTER"><FONT SIZE="5">
Bonjour<BR>
<%= accueil %><BR>
Bonne journée!!!
</FONT></P>
</BODY>
</HTML>
2.
Les éléments des JSP
2.1.
Les balises
Il y a 4 types de balises, plus les commentaires
les commentaires
<!— un commentaire qui sera inséré dans la
page HTML générée -->
<%— un commentaire qui ne sera pas inséré
dans la page HTML générée --%>
attention à ne pas oublier le % final dans le second cas
Les 4 balises correspondent à 4 fonctions et à 4 syntaxes
H.ZINSOU_____________________________________________________________________
__
JSP page 3
Serveurs web, servlets et JSP
Les JSP
serveur web/JSP v8 .doc_____H.ZINSOU___________________________________________________________________
- directives
elles donnent des instructions au générateur de code qui crée
la servlet
elles commencent par <%@
<%@ page … > définit la page:
utilisé par exemple dans <%@ language="java"
import="java.sql.*, java.util.* %>
<%@ include… >
pour inclure une autre séquence JSP
avant compilation de la page
<%@ taglib … > pour la définition de bibliothèques de tags propriétaires (voir plus loin la
définition des tags)
-
expressions
elles servent à insérer une séquence de texte variable dans le code HTML
par exemple, en utilisant l'attribut message défini au § précédent:
<%= message %>
ou en utilisant une méthode qui retourne un String:
<%= compte() %>
(ok aussi avec une méthode qui retourne un type primitif, ou un objet – dans de cas
objet.toString() sera implicitement appelé)
ou en fabriquant un String:
<%= « le résultat est «
+
compte() %>
attention : pas de ; à la fin d’une expression
-
scriptlets
pour insérer une séquence de code dans le corps de la servlet générée
par exemple
<% compteur++; %>
si la scriptlet doit afficher des informations, il faut le demander explicitement par
out.print(unTexte);
H.ZINSOU_____________________________________________________________________
__
JSP page 4
Serveurs web, servlets et JSP
Les JSP
serveur web/JSP v8 .doc_____H.ZINSOU___________________________________________________________________
les scriptlets accèdent aux objets implicites:
<%
String nomVisiteur = request.getParameter("nom");
if (nomVisteur != null) {
out.print("bienvenue " + nomVisiteur + "<br>");
}
%>
-
déclarations
avec <% ! … %>
elles définissent des données et des méthodes accessibles partout dans le script
elles commencent par <%!
elles peuvent etre placées n'importe où dans la page (mais on peut conseiller de les regrouper
au début ou à la fin)
une donnée définie dans une déclaration définit un attribut (de la servlet générée)
une méthode définie dans une déclaration est accessible par les autres méthodes et par les
scriptlets
par exemple
<%!
String message = "bonjour ";
int compteur;
String compte() {
return("le compte est: " + compteur);
}
%>
-
les variables message et compteur seront visibles par toutes les méthodes de la servlet
(c’est en fait un attribut de la servlet, partagé par tous les utilisateurs de celle-ci)
-
la méthode compte() pourra être appelée par n’importe quelle autre méthode de la
servlet, ainsi que dans les expressions et dans les scriptlets
les méthodes déclarées ne voient pas les objets implicites; pour qu'ils soient visibles, ils
devront etre passés en paramètre (par un scriptlet):
<%!
void methode1(java.io.Writer out) throws java.io.IOException {
out.write("essai");
}
%>
<% methode1(out); %>
ou en utilisant les objets implicites
<%
String nomVisiteur = request.getParameter("nom");
If (nomVisteur != null) out.println("bienvenue " + nomVisiteur);
%>
H.ZINSOU_____________________________________________________________________
__
JSP page 5
Serveurs web, servlets et JSP
Les JSP
serveur web/JSP v8 .doc_____H.ZINSOU___________________________________________________________________
-
si la scriptlet doit afficher des informations, il faut le demander explicitement par
out.print(unTexte);
ou encore
( utilisé dans l'exemple de servlet qui accède à la base de données )
<!-- point 2 : création d'une requête JDBC-->
<%
String requete = "select libelle from MotCle";
try {
2.2.
Les objets implicites
La JSP permet d'accéder directement aux principaux objets;
les autres objets seront accessibles à partir des objets implicites
Objet implicite
request
response
out
session
config
context
pageContext
objet représenté
la HttpServletRequest
la HttpServletResponse
le flot de sortie de la réponse (un JspWriter)
la HttpSession
la ServletConfig (accède aux paramètres de la servlet)
le ServletContext (accède aux paramètres de la web-app, aux autres
servlets par le RequestDispatcher)
donne accès aux méthodes attachées à la page
on a déjà vu dans les exemples précédents:
accueil += request.getParameter("nom");
et
out.println("<LI> " + rs.getString(1));
2.3.
Les tags
définissent des séquences de traitement à effectuer
<jsp:include … />
pour inclure une séquence HTML "en dur" ou le résultat d'une autre JSP
<jsp:forward … /> pour passer la HttpServletRequest à une autre JSP ou servlet
<jsp:useBean … />
)
<jsp:getProperty … />
) pour l'usage des java beans, décrits plus loin
<jsp:setProperty … />
)
utilisé dans l'exemple:
<!-- point 5 : inclusion d'un autre JSP-->
<jsp:include page="pied de page.html" flush="true" />
H.ZINSOU_____________________________________________________________________
__
JSP page 6
Serveurs web, servlets et JSP
Les JSP
serveur web/JSP v8 .doc_____H.ZINSOU___________________________________________________________________
2.4.
Les pages d'erreur
permet de définir et d'utiliser des pages contenant des messages d'erreur:
définition d'une page d'erreur:
on définit une page qui sera appelée en cas d’erreur survenue dans un script JSP et non
interceptée dans celle-ci
<!—page d'erreur -->
<%@ page isErrorPage="true" %>
... votre demande ne peut pas être traitée parce que ...
utilisation de la page d'erreur:
on définit dans un script JSP quelle page d’erreur devra être utilisée
<!—page utilisatrice -->
<% page errorPage="pagesErreur/erreur.jsp %>
-
l’affichage de la page d’erreur sera déclenchée par exemple par une erreur d'exécution
telle que
<% int x = Integer.parseInt(pasUnEntier) %>
-
l'utilisation de la page d'erreur évitera l'usage des try / catch dans le code JSP
=> la survenance d'une exception appellera automatiquement la page d'erreur
l'exception est accessible dans la errorPage par l'objet implicite exception:
<html>… la cause est <%=
2.5.
exception.getMessage() %>
Utiliser les objets Java
Un JSP qui insère la date du jour dans une page HTML:
<!-- Bonjour.jsp -->
<HTML>
<HEAD>
<TITLE>Page avec la date
</TITLE>
</HEAD>
<BODY>
<P ALIGN="CENTER">
<FONT SIZE="5">
Bonjour<BR>
La date du jour est <%= new java.util.Date() %><BR>
H.ZINSOU_____________________________________________________________________
__
JSP page 7
Serveurs web, servlets et JSP
Les JSP
serveur web/JSP v8 .doc_____H.ZINSOU___________________________________________________________________
Bonne journée!!!
</FONT></P>
</BODY>
</HTML>
2.6.
La servlet générée
- pour comprendre le code généré
- et en particulier pour comprendre les erreurs de compilation ou d'exécution
il sera probablement utile de se reporter au code généré
(situé dans jakarta-tomcat / work, dans le cas de Tomcat)
H.ZINSOU_____________________________________________________________________
__
JSP page 8
Serveurs web, servlets et JSP
Les JSP
serveur web/JSP v8 .doc_____H.ZINSOU___________________________________________________________________
3.
Utiliser un java bean dans un JSP
3.1.
Qu'est-ce qu'un java bean
La définition précise de ce qui fait un java bean dépend du contexte dans lequel on va utiliser
celui-ci: un java bean utilisé dans la palette d'un AGL comporte beaucoup plus de fonctionnalités
qu'un bean utilisé dans un JSP.
Pour qu'une classe soit utilisable en tant que bean dans un JSP
- elle doit comporter un constructeur sans paramètre
- elle doit être placée dans un package
- les attributs (en principe privés ou protégés) doivent être accessibles par des accesseurs
get() / set()
3.2.
Un script JSP avec un bean d'accès aux données
3.2.1. Un exemple de script d'accès aux données sans java bean
C'est un JSP qui insère dans la page une information venue de la base de données
<!—AbonneV2/liste des themes.jsp --><HTML>
<HEAD>
<TITLE>Thèmes Proposés</TITLE>
</HEAD>
<BODY>
<!-- point 1 : les classes importées -->
<%@ page language="java" import="java.lang.*, java.sql.*, accesBase.*" %>
<P>
<P ALIGN="CENTER"><FONT SIZE="5">Thèmes traités v2</FONT></P>
<!-- point 2 : création d'une requête JDBC-->
<%
String requete = "select libelle from MotCle order by libelle";
try {
Connection cnx = JdbcThinCnx.connecter(
"gestabonne", "gestabonne", "black", 1521, "orcl");
Statement stmt = cnx.createStatement();
ResultSet rs = stmt.executeQuery(requete);
%>
<UL>
<!-- point 3 : insertion de données "dynamiques" dans le code HTML-->
<% while (rs.next()) {
out.println("<LI> " + rs.getString(1));
}
%>
</UL>
<!-- point 4 : clôture de la requête JDBC-->
<%
rs.close();
H.ZINSOU_____________________________________________________________________
__
JSP page 9
Serveurs web, servlets et JSP
Les JSP
serveur web/JSP v8 .doc_____H.ZINSOU___________________________________________________________________
} catch (java.lang.Exception ex) {
out.println("erreur dans la requête " + requete);
throw new ServletException("erreur dans " + requete, ex);
}
%>
Dans le script
- un "scriptlet" insère une séquence qui crée et exécute une requête JDBC
- le JSP utilise une classe JdbcThinCnx pour accéder à la base
- une partie du code HTML est générée par
-
la
out.println("<LI> " + rs.getString(1));
balise <jsp:include page= insère un pied de page
c'est "simple": on ne crée pas d'objets Java Beans
mais en contrepartie il y a beaucoup de code java dans la page
et du code qu'il faudra répéter dans chaque page qui fera la meme requete
3.2.2. Le même script, en utilisant un bean
<HTML>
<HEAD>
<TITLE>Th&egrave;mes Propos&eacute;s presents dans la base</TITLE>
<%-- le bean d'accès aux données --%>
<jsp:useBean id="accesMotCle" scope="page" class="accesBase.AccesMotCle" />
<%-- un bean qui représente une donnée --%>
<jsp:useBean id="motCle" scope="page" class="beans.MotCle" />
</HEAD>
<BODY>
<%@ page language="java" import="java.lang.*, accesBase.*, beans.*" %>
<UL>
<p>
<%-- la boucle qui parcourt les lignes de la table --%>
<% while((motCle = accesMotCle.suivant()) != null) {%>
<%-- affichage d'une ligne avec <%= --%>
<li> <%= motCle.getLibelle() %>
<%-- fin de la boucle --%>
<% } %>
</p>
</UL>
<P>
Le bean d'accès aux données utilisé
public class AccesMotCle {
protected
protected
protected
protected
Connection cnx;
Statement liste;
String requeteListe = "select id_mc, libelle from motcle";
ResultSet result;
public AccesMotCle() throws Exception {
H.ZINSOU_____________________________________________________________________
__
JSP page 10
Serveurs web, servlets et JSP
Les JSP
serveur web/JSP v8 .doc_____H.ZINSOU___________________________________________________________________
cnx = JdbcMySqlCnx.connecter("GestAb", "GestAb", "localhost", "test");
}
public void demarrerListe(String condition, String tri) throws Exception {
StringBuffer select = new StringBuffer(requeteListe);
select.append(" " + condition);
liste = cnx.createStatement();
result = liste.executeQuery(select.toString());
}
public MotCle suivant() {
if (result.next()) {
MotCle mot = new MotCle();
mot.setId(result.getLong(1)); // et les autres attributs
return mot;
} else {
result.close();
liste.close();
return null;
}
3.3.
Extension du modèle
Un JSP peut utiliser plusieurs beans, par exemple pour accéder à plusieurs ressources.
Pour accéder à une ressource, on peut laisser le bean faire une plus ou moins grande partie du
travail
Dans l'exemple, suivant() dans le bean AccesMotCle renvoie un objet MotCle
=> pour placer le résultat dans un tableau HTML, on est encore obligé de mélanger quelque peu
langage HTML et code java:
<% while((motCle = accesMotCle.suivant()) != null) {%>
<%-- affichage d'une ligne avec <%= --%>
<li> <%= motCle.getLibelle() %>
<%-- fin de la boucle --%>
<% } %>
=> on pourrait définir un bean AfficheurDeMotsCles avec des méthodes
dessinerTableau(Vector motsCles) : retourne la chaine de caractères représentant un tableau
de mots clés en HTML
dessinerListe(Vector motsCles)
: retourne la chaine de caractères représentant une liste à
puces de mots clés en HTML
etc.
H.ZINSOU_____________________________________________________________________
__
JSP page 11