Java EE – Les pages JSP

 

1.     Structure d'une page JSP

1.1.                    Définition et exemples

Une page JSP – Java Server Page – est une page HTML qui intègre du code Java.

D'un point de vue de la structure, une page JSP est très proche d'une page PHP ou ASP. Une page JSP est un fichier qui porte l'extension .jsp.

 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"    pageEncoding="ISO-8859-1"%>

<%@ page import="java.io.*, java.util.*" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0   Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>

      <head>

            <title>Clock page JSP</title>

      </head>

      <body>     

<%         

            Date today = new Date();

%>

            <p>Date et heure :

<% out.println(today.toString()); %>

            </p>

      </body>

</html>

 

ou bien

 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"    pageEncoding="ISO-8859-1"%>

<%@ page import="java.io.*, java.util.*" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0   Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>

      <head>

            <title>Clock page JSP</title>

      </head>

      <body>     

<%         

            Date today = new Date();

%>

            <p>Date et heure :

<%=today.toString() %>

            </p>

      </body>

</html>

 

Nous avons besoin, comme pour d'autres langages de scripts (ex : PHP), d'indiquer au serveur où commence et s'arrête le code HTML et le code Java. Pour cela, la spécification JSP définit des balises qui peuvent être employées pour délimiter le code.  Ces balises permettent de définir trois catégories d'éléments :

1.2.                    Les directives

Les directives sont des éléments qui permettent de préciser des informations relatives à la page. Elles commencent par <%@ et se terminent par %>. Il existe les trois directives suivantes : page, include et taglib (non étudiée ici). Une directive n'affecte que la page jsp qui la contient. Chaque directive inclut le nom de la directive, suivi des noms et valeurs des attributs.

 

La directive de page permet de définir les attributs de la page JSP, comme les importations de classes ou de paquetages, le type de contenu, l'encodage,  la page invoquée en cas d'erreur …

La directive de page peut être définie plusieurs fois dans un même document. Il est recommandé de toujours placer cette directive en tout début de document pour une question de logique et de lisibilité.

Si aucune directive n'est utilisée dans une page JSP, le moteur JSP utilisera ses propres paramètres par défaut, par exemple le type de contenu par défaut est text/html.

 

La directive d'inclusion permet d'inclure le texte d'un fichier dont le nom est donné dans la directive.

Ex. : <%@ include file="entete.html" %>

1.3.                    Les scripts

Les scripts sont des éléments qui permettent de placer le code Java dans les pages JSP. Il existe trois types de scripts :

·        les déclarations : pour déclarer et/ou initialiser une variable d'instance, ou déclarer une méthode d'instance

<%!

private string miseEnFormeMessage(String message)

{

      return "<strong class=\"erreur\">" + message + "</strong>" ;

}

%>

 

Les déclarations peuvent être placées à n'importe quel endroit dans une page JSP, mais il est préférable comme pour les directives, de les placer en début de fichier.

 

·        les scriptlets : pour contenir les instructions Java

Les scriptlets sont des blocs de code Java incorporés dans une page. L'objet out peut être utilisé avec la méthode print (ou println) pour générer du contenu texte à destination du client. Les visiteurs qui invoquent la page JSP ne pourront pas voir le code Java contenu dans cette page même s'ils affichent le code source de leur page avec le navigateur web, ce dernier ne contenant que la sortie générée après traitement.

 

<ul>

<%

      Enumeration<String> lesNomsParametres = request.getParameterNames();

      while ( lesNomsParametres.hasMoreElements() )

      {

            String leNom = lesNomsParametres.nextElement() ;

            out.println("<li>" + leNom + "</li>");

      }

%>

</ul>

 

Quelques différences entre scriptlet et déclaration :

·         une scriptlet ne peut être employée pour définir une méthode. Seule une déclaration le permet.

·         les variables déclarées dans une déclaration sont des variables d'instance, donc accessibles dans toutes les méthodes et tous les scriptlets de la page.

 

 

·        les expressions : pour renvoyer des informations aux utilisateurs.

Les expressions sont utilisées pour renvoyer au client les valeurs d'expressions Java. Elles sont souvent utilisées comme raccourcis pour simplifier le code.

Ainsi,

            <%       out.println(maChaine) ; %>

est équivalent à :

            <%= maChaine %>

Attention, une expression ne peut se terminer par un point-virgule.

 

Dans les parties HTML, les commentaires sont écrits comme ceci :

<!-- un commentaire HTML renvoyé au client -->

ou

<%-- un commentaire JSP qui ne sera pas renvoyé au client --%>

Par contre, il faut utiliser les commentaires Java // et /* */ dans  les scriptlets.

1.4.                    Les actions (non étudiées ici)

Les actions sont écrites sous forme d'éléments XML et permettent de condenser en une seule ligne un traitement qui serait plus long à écrire à l'aide d'un script Java.

 

 

2.    Coopération entre servlet et page JSP

Servlet

Page Jsp

Primeur à la logique de traitement

Primeur à la logique de présentation

 

Il est possible de respecter les responsabilités de chacun, logique de traitement aux servlets et logique de présentation aux pages JSP, car une servlet, une fois son traitement réalisé et les résultats mémorisés, peut passer le flux d'exécution à une page JSP.

 

Extrait de la classe servlet calculerMontantServlet.java

// appelée sur soumission des données du formulaire avec prix unitaire HT et quantité

public void doGet (HttpservletRequest requete, HttpServletResponse reponse) throws IOException

{

      ArrayList<String> erreursAppel = newArrayList<String>();

 

      // lecture et contrôle des données entrées par l'utilisateur

      String strPuHT = requete.getParameterName("txtPuHT");

      Double puHT;

 

      if ( strPuHT != null && ! strPuHT.trim().equals("") ) {

      try {

            puHT = Double.parseDouble(strPuHT);

      }

      catch ( Exception ex ) {

            erreursAppel.add("Prix unitaire doit être numérique");

      }

      else {

            erreursAppel.add("Prix unitaire obligatoire");

      }

 

 

 

 

      // idem pour le paramètre txtQte

      int qte = 0;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

      // réalise le calcul du montant HT à payer

      double totalHT = qte * puHT ;

 

      // prépare le modèle, càd informations à restituer à l'utilisateur

      // ces informations sont ajoutées en tant qu'attributs supplémentaires

      // à la requête

      requete.setAttribute("puHT", puHT) ;

      requete.setAttribute("qte", qte) ;

      requete.setAttribute("totalHT", totalHT) ;

 

      // transmet le flux d'exécution à la page vueAPayer.jsp

      requete.getDispatcher("/WEB-INF/vues/vueAPayer.jsp").forward(requete, reponse);

      }

}

 

 

 

Page vueAPayer.jsp

Appelée par la servlet calculerTotalHTServlet.java

 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

    pageEncoding="ISO-8859-1"%>

<%@ page import="java.io.*, javax.servlet.http.*, java.util.*" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0   Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>

      <head>

            <title>Clock page JSP</title>

      </head>

      <body>     

<p>

Prix unitaire HT : <%= request.getAttribute("puHT") %><br />

Quantité : <%= request.getAttribute("qte") %><br />

Total HT à payer : <%= request.getAttribute("totalHT") %>

</p>

      </body>

</html>