Fortement imbriqué dans le code HTML, le langage JSP doit réaliser la partie dynamique d'un site web, c'est à dire :
Le code JSP est compris entre les balises <% et %>, il utilise la syntaxe du langage java (voir fiches correspondantes). Les fichiers auront l'extension .jsp et seront stockés sur le serveur. Ce dernier exécute le code correspondant lorsqu'il est sollicité par le serveur Web.
Une page JSP contient un certain nombre de balises qui seront détaillées plus loin. Notamment :
Comme les autres langages de script, JSP permet de manipuler un certain nombre d'objets prédéfinis :
Comme le langage Java, JSP est extrêmement sensible à la casse (Majuscule / minuscule)
En début d'un fichier JSP, il est intéressant de définir le comportement de la page ou d'incorporer des instructions récurrentes à partir d'un autre fichier (par exemple un entête, un script JavaScript…)
Cette directive fournit de nombreuses et précieuses informations. Les options (voir un extrait dans le tableau ci-dessous) seront toutes comprises à l'intérieur de balises <%@ page …%>.
OPTION | EXPLICATION | EXEMPLE |
---|---|---|
import | les paquetages java utilisés (certains le sont par défaut : java.lang.*, javax.servlet.*, javax.servlet.http.*, javax.servlet;jsp.*) | import=“java.applet.*,java.io.*” |
extends | la classe qu'étend ce JSP | extends HttpServlet |
errorPage | page d'erreur vers laquelle rediriger les exceptions non interceptées dans le code JSP errorpage=“CapteErreur.jsp | |
isErrorPage | Indique si la page JSP est une page d'erreur (alors on peut utiliser l'objet exception sans le redéclarer) ou non | IsErrorPage=false (la valeur par défaut est false) |
session | Indique que la page permet la gestion des objets session ou non (la valeur par défaut est true, on peut donc créer des session et les utiliser sans avoir à déclarer un objet de la classe HttpSession) | session = true |
buffer | Indique la taille de données mise en mémoire tampon avant de les envoyer vers l'objet ServletResponse. S'exprime en kilo octets (kb) | buffer = 32 kb (valeur par défaut 8kb) |
autoFlush | Indique si le buffer doit être automatiquement vidé lorsqu'il est plein ou si une exception doit être levée | autoFlush = true (valeur par défaut true) |
Lorsque des éléments de programmation doivent apparaître dans plusieurs pages JSP, il est possible d'écrire ce morceau de code dans un fichier JSP et de l'introduire dans un autre par l'usage de la balise
<%@ include file="nomfichier" %>
Ce fichier peut contenir toute forme de texte, aussi bien du javaScript que de l'HTML ou du JSP.
Le code ainsi inclus est analysé par le serveur d'application, contrairement à l'action <jsp:include … > qui ne fait que recopier le texte.
Elles consistent à faire réaliser à la page des actions de type inclusion de Bean, de fichiers, redirection de page…
//récupération de la valeur d'une information envoyée par la page appelante request.getParameter("txtnom")
//création d'une variable de session nom en fonction d'une donnée envoyée par la page appelante session.setAttribute("nom",request.getParameter("txtnom") ) //appel à une variable de session crée précédemment session.getAttribute("mot de passe").toString()
//récupération de l'ensemble des valeurs envoyées par la page appelante Enumeration e = request.getParameterNames( ); //parcours des informations while (e.hasMoreElements()) { //récupération du nom du prochain élément String name = (String)e.nextElement(); //récupération de la valeur du paramètre connu sous son nom String value = request.getParameter(name); …………… } // fin de la boucle
//renvoi vers une autre page response.setRedirect("Pageerreur.jsp") <jsp:forward page="Pageerreur.jsp" />
L'accès aux bases dans des pages JSP se réalise au travers d'une connexion JDBC/ODBC. Un pilote ODBC doit avoir été créé préalablement. Pour utiliser les fonctionnalités base de données de JSP, il est nécessaire d'importer le package java.sql.*. Toute manipulation sur une base de données peut lever une exception qu'il est nécessaire d'encadrer dans un try {… accès aux bases…} catch (… ) {…}.
//définit le pilote odbc à utiliser String url = "jdbc:odbc:cnx_etud"; //vérifie l'existence d'une connexion préalable (facultatif) Connection cnxion = (Connection)application.getAttribute("dbconn"); if (cnxion == null) { //charge les outils d'accès aux bases Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); /établit la connexion au pilote ODBC/ cnxion = DriverManager.getConnection(url, "", ""); //établit que la connexion a eu lieu (facultatif) application.setAttribute("dbconn", cnxion);
//création du texte de la requête à partir d'une donnée fournie par la page appelante String req = "Delete from employé where emp_nom='" req += request.getParameter("txtnom") +"'"; //création d'un objet Statement sur la connexion établie précédemment Statement stmt = cnxion.createStatement( ); // exécution de la requête stmt.executeQuery(req) ;
//création d'un objet Statement sur la connexion établie précédemment Statement stmt = cnxion.createStatement( ); //exécution de la requête et récupération du résultat dans un objet ResultSet ResultSet rs = stmt.executeQuery("Select * from employé") ; //parcours du résultat while (rs.next( ) ) { //accès à un champ par son nom rs.getString("emp_nom") ; //accès à un champ par son numéro (il faut commencer au numéro 1 rs.getString(1) ; } //fin de la boucle
//création d'un objet Statement sur la connexion établie précédemment Statement stmt = cnxion.createStatement( ); //exécution de la requête et récupération du résultat dans un objet ResultSet ResultSet rs = stmt.executeQuery("Select * from employé") ; //récupération de la structure correspondant à la requête ResultSetMetaData rsmd = rs.getMetaData( ) ; //calcul du nombre de colonnes int nbCols = rsmd.getColumnCount(); // parcours du ResultSetMetaData <% for (int i=1; i<=nbCols ;i++) { //accès au nom de la colonne i rsmd.getColumnName(i) }//fin de la boucle
Fonctionnement très pratique du langage, il offre deux possibilités pour réutiliser du code JSP ou JAVA écrit par ailleurs ou produit dans l'intention de s'en resservir.
//permet de réutiliser le code contenu dans une autre page <jsp:include page="PageFonctions.jsp" />
//déclaration d'une instance d'un Bean // id est le nom de l'instance, class donne le nom de la classe utilisée, scope décrit la portée du Bean… <jsp:useBean id="unCompte" class="packageGesCompte.Compte scope="session" />