Exercice 4
Technologie JavaServer PagesTM

[<<RETOUR] [SOMMAIRE] [SUIVANT>>]

La technologie JavaServer Pages™ (JSP) permet d'insérer des fragments de code servlet directement dans une page HTML statique. Quand la page JSP est chargée par le navigateur, le code servlet est exécuté et le serveur d'application crée, compile, charge et exécute une servlet en tâche de fond pour exécuter le code et retourner une page HTMl ou un rapport XML.

Cette leçon modifie le fichier WAR de l'exercice 3 Des Enterprise Beans coopératifs pour utiliser une page JSP à la place de BonusServlet .

Créer la page JSP

Une page JSP ressemble à une page HTML avec des fragments de code servlet encadrées dans des balises JSP ouvrantes (<%) et fermantes (%>). Il n'y a pas de méthodes de HttpServlet comme init , doGet , ou doPost . A la place le code qui est utilisé dans ces méthodes est inclus directement dans la page JSP en utilisant des balises JSP de script (scriptlet).

La page JSP suivante ( Bonus.jsp ) est l'équivalent de la servlet BonusServlet de l'exercice 3 Des beans d'entreprise coopèratifs. Une description plus détaillée des balises JSP suit le programme. Notez que les balises JSP ne peuvent être imbriquées. Par exemple on ne peut pas mettre un commentaire JSP dans un scriptlet JSP.

<HTML>
<HEAD>
<TITLE>Bonus Calculation</TITLE>
</HEAD>
  <%--  Comment
    Scriptlet for import statements
    <%@ indicates a jsp directive --%>
  <%@ page import="javax.naming.*" %>
  <%@ page import="javax.rmi.PortableRemoteObject" %>
  <%@ page import="Beans.*" %>
  <%-- Comment
    Scriptlet to get the parameters, 
    convert string to Integer to int for bonus
    calculation, and declare/initialize bonus
    variable. <% indicates a jsp scriptlet  --%>
  <%! String strMult, socsec; %>
  <%! Integer integerMult; %>
  <%! int multiplier; %>
  <%! double bonus; %>
<%
  strMult = request.getParameter("MULTIPLIER");
  socsec = request.getParameter("SOCSEC");
  integerMult = new Integer(strMult);
  multiplier = integerMult.intValue();
  bonus = 100.00;
%>
  <%-- Comment
    Scriptlet to look up session Bean --%>
<%
  InitialContext ctx = new InitialContext();
  Object objref = ctx.lookup("calcs");
  CalcHome homecalc = (CalcHome)
                    PortableRemoteObject.narrow(
                    objref, CalcHome.class);
%>
  <%-- Comment
    Scriptlet to create session Bean, 
    call calcBonus method, and retrieve a database
    record by the social security number 
   (primary key) --%>
<%
  try {
    Calc theCalculation = homecalc.create();
    Bonus theBonus = theCalculation.calcBonus(
                                  multiplier, 
                                  bonus, 
                                  socsec);
    Bonus record = theCalculation.getRecord(socsec);
%>
  <%-- Comment
    HTML code to display retrieved data
    on returned HTML page.  --%>
    <H1>Bonus Calculation</H1>
    Social security number retrieved: 
                    <%= record.getSocSec() %>
    <P>
    Bonus Amount retrieved: <%= record.getBonus() %>
    <P>
  <%-- Comment
    Scriptlet to catch DuplicateKeyException --%>
<%
  } catch (javax.ejb.DuplicateKeyException e) {
    String message = e.getMessage();
%>
  <%-- Comment
    HTML code to display original data passed to JSP
    on returned HTML page --%>
    Social security number passed in: <%= socsec %>
    <P>
    Multiplier passed in: <%= strMult %>
    <P>
    Error: <%= message %>
  <%-- Comment
    Scriptlet to close try and catch block --%>
<%
  }
%>
  <%--  Comment
    HTML code to close HTML body and page --%>
</BODY>
</HTML>

Commentaires

Les 7 premières lignes de Bonus.jsp présentent du HTML normal suivi par un commentaire JSP. Les commentaires JSPs sont similaires aux commentaires hormis le fait qu'ils commencent par <%-- au lieu de <!-- , qui ce à quoi ils ressemblent en HTML. Vous pouvez utilisez des commentaires JSP ou HTML dans une page JSP. Les commentaires HTML sont envoyés au client dans la page HTML tandis que les commentaires JSP sont retirés et n'apparaissent pas dans le HTML généré.

<HTML>
<HEAD>
<TITLE>Bonus Calculation</TITLE>
</HEAD>
<%-- Comment
Scriptlet for import statements
<%@ indicates a jsp directive --%>

Directives

Les directives JSP sont des instructions traitées par le moteur de JSP quand la page JSP est transformée en servlet. Les directives utilisées dans l'exemple incluent des packages et des classes. Les directives sont encadrées par des balises de directive <%@ et %>.

<%@ page import="javax.naming.*" %>
<%@ page import="javax.rmi.PortableRemoteObject" %>
<%@ page import="Beans.*" %>

Déclarations

Les déclarations JSP vous permettent de positionner des variables pour un usage ultérieur dans des expressions ou des scriptlets. vous pouvez aussi déclarer des variables à l'intérieur d'expressions ou de scriptlets losrque vous vous apprétez à les utiliser. La portée de ces variables couvre toute la page JSP, il n'y a pas de concept de variables d'instance. Si vous devez utiliser des variables dans plusieurs scriptlets ou expression il n'y a pas besoin de les déclarer comme variables d'instance. Les déclarations sont encadrées dans balises de déclaration <%! et %>. Vous pouvez utiliser des déclarations multiples. Par exemple, <%! double bonus; String text; %> .

  <%! String strMult, socsec; %>
  <%! Integer integerMult; %>
  <%! int multiplier; %>
  <%! double bonus; %>

Scriptlets

Les scriptlets JSP vous permettent d'intégrer des fragments de code java dans la page JSP. Le code intégré est inséré directement dans la servlet exécutée lorsque la page est demandée. Ce scriptlet utilise des variables déclarées dans les directives précédentes. Les scriptlets sont encadrées par des balises de scriptlet <% et %>.

<%
strMult = request.getParameter("MULTIPLIER");
socsec = request.getParameter("SOCSEC");
integerMult = new Integer(strMult);
multiplier = integerMult.intValue();
bonus = 100.00;
%>

Variables prédéfinies

Une scriptlet peut utiliser les vqrqibles prédéfinies session , request , response , out et in . Cet exemple utilise la variable prédéfinies request , qui est un objet de la classe HttpServletRequest . De même, response est un objet HttpServletResponse , out est un objet PrintWriter et in un objet BufferedReader.

Les variables prédéfinies sont utilisées dans les scriptlets de la même manièere qu'elles sont utilisées dans les servlets, si ce n'est que vous ne devez pas les déclarer.

<%
strMult = request.getParameter("MULTIPLIER");
socsec = request.getParameter("SOCSEC");
integerMult = new Integer(strMult);
multiplier = integerMult.intValue();
bonus = 100.00;
%>

Expressions

Les expressions JSP vous permettent d'extraire ou de calculer des valeurs dynamiquement pour les insérer dans la page JSP. Dans cet exemple une expression extrait le numéro de sécurité social du bean d'entité Bonus et l'insèere dans la page JSP.

<H1>Bonus Calculation</H1>
Social security number retrieved:
<%= record.getSocSec() %>
<P>
Bonus Amount retrieved: <%= record.getBonus() %>
<P>

Balises JSP prédéfinies

Les spécifications JavaServer Pages 1.1 définissent des balises JSP prédéfinies et vous permettent d'étendre l'implèmentation des JSP avec de nouvelles fonctionnalités et masqué une grande part de complexité aux concepteurs web qui auront besoin de regarder et modifier la page JSP. L'exemple de JSP de cet exercice n'utilise pas de balises JSP prédéfinies mais vous verrez un exemple de ces balises dans le prochain exercice. Les balises JSP prédéfinies dans les spécifications JSP 1.1 sont les suivantes :

jsp:forward et jsp:include indiquent au moteur de JSP de passer de la page courante à une autre page JSP.

jsp:useBean , jsp:setProperty , et jsp:getProperty vous permettent d'intégrer et d'utiliser la technologie JavaBeans dans une page JSP.

jsp:plugin télécharge automatiquement le Java Plug-In approprié sur le client pour exécuter une applet avec la plateforme Java appropriée.

Modifier bonus.html

Le seul changement à apporter à bonus.html est de modifier le paramètre ACTION du formulaire HTML pour pointer sur Bonus.jsp plutôt que BonusServlet .

<HTML>
<BODY BGCOLOR = "WHITE">
<BLOCKQUOTE>
<H3>Bonus Calculation</H3>
<FORM METHOD="GET" ACTION="Bonus.jsp">
<P>
Enter social security Number:
<P>
<INPUT TYPE="TEXT" NAME="SOCSEC"></INPUT>
<P>
Enter Multiplier:
<P>
<INPUT TYPE="TEXT" NAME="MULTIPLIER"></INPUT>
<P>
<INPUT TYPE="SUBMIT" VALUE="Submit">
<INPUT TYPE="RESET">
</FORM>
</FORM>
</BLOCKQUOTE>
</BODY>
</HTML>

Démarrer les serveurs et les outils

Pour exécuter cet exemple vous avez besoin de démarrer le serveur J2EE, l'outil de déploiement et la base de donnée Cloudscape. Dans des fenêtres différentes, tapez les commandes suivantes :

j2ee -verbose
deploytool
cloudscape -start

Si cela ne marche pas, tapez ceci à partir du répertoire J2EE :

Unix

j2eesdk1.3/bin/j2ee -verbose
j2eesdk1.3/bin/deploytool
j2eesdk1.3/bin/cloudscape -start

Windows

j2eesdk1.3\bin\j2ee -verbose
j2eesdk1.3\bin\deploytool
j2eesdk1.3\bin\cloudscape -start

Supprimer le fichier WAR

Comme une page JSP est ajoutée au composant web, vous devez supprimer le fichier WAR de l'exercice précédent et en créer un nouveau avec la page JSP.

Local Applications:

Créer un nouveau fichier WAR

File menu:

Introduction :

War File General Properties :

Note : Il semble qu'il y ait un bug dans l'outil de déploiement. Assurez cous d'jouter d'abord Bonus.jsp puis bonus.html . Si vous ajoutez bonus.html en premier, l'outil de déploirement met bonus.html là où doit aller Bonus.jsp , et Bonus.jsp là où doit aller bonus.html. si cela arrive, vous pouvez corriger manuellement le problème en les copiant dans les endroits appropriés après le déploiement.:
~/j2sdkee1.2/public_html/JSPRoot/bonus.html
~/j2sdkee1.2/public_html/JSPRoot/WEB-INF/classes/Bonus.jsp

War File General Properties :

Choose Component Type: .

Component General Properties:

Inspecting window:

Vérifier et déployer l'application J2EE

Avant de pouvoir déployer l'application, c'est une bonne idée de la vérifier. Le vérificateur peut indiquer des erreurs dans les composants de l'application, telles que de méthodes manquantes que le conteneur ne peut localiser.

Note : Si vous obtenez une erreur de sauvegarde (Save error) quand vous vérifiez ou déployer, arrêtez tout et redémarrez les serveurs et utilitaires de déploiement.

Verify:

Deploy:

Note: Ne cochez pas la case Return Client Jar. La seule fois où vous aurez besoin de cocher cette case est lorsque vous utiliserez la persistance gérée par les beans ou que vous déployerez une application autonome comme programme client. Cet exemple utilise une page HTML et une servlet donc cette case ne doit pas être cochée. Sélectionner cette option crée un fichier JAR avec les informations de déploiement nécessaire pour une application autonome.

Exécuter l'application J2EE

Le serveur web fonctionne sur le port 8000 par défaut. Pour ouvrir la page bonus.html diriger votre navigateur sur http://localhost:8000/BonusRoot/bonus.html , qui est l'endroit où l'outil de déploiement à mis la page HTML.

Note : L'outil de déploiement place Bonus.jsp sous public_html/JSPRoot , et bonus.html sous public_html/JSPRoot/WEB-INF/classes , ce qui n'est pas correct. Copiez manuellement les fichiers dans les emplacemetns corrects : public_html/JSPRoot/bonus.html et public_html/JSPRoot/WEB-INF/classes/Bonus.jsp.
Bonus Calculation

Social Security number retrieved: 777777777
Bonus Amount Retrieved: 200.0

Si vous donnez deux fois le même numéro de sécurité sociale, vous obtiendrez un résultat similaire à :

Bonus Calculation

Soc Sec passed in: 777777777
Multiplier passed in: 2
Error: Duplicate primary key

Plus d'informations

Une autre façon d'utiliser les JSPs est en combinaison avec la technologie JavaBeans™ où la page JSP présente un formulaire à l'utilisateur et appelle un JavaBean pour traiter les données entrées dans le formulaire. Un exemple de ce type est consultatble en ligne : J2EE Developer's Guide

Pour plus d'information sur JSP et les JavaBeans lire l'article : Buiding Your Own JSP Components

Exercice

A l'aide du support de cours, des exemples et de la documentation de l'API J2EE, réaliser une application dérivé de l'exemple de l'exercice avec :

L'application doit respecter le cas d'utilisation de cet exercice : l'utilisateur saisi un bonus et un multiplicateur, le serveur renvoit le bonus et préviens si le numéro de sécurité sociale à déjà) été saisis.

[RETOUR]