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èmes Proposé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