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 .
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>
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 --%>
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.*" %>
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; %>
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;
%>
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;
%>
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>
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.
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>
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 :
j2eesdk1.3/bin/j2ee -verbose j2eesdk1.3/bin/deploytool j2eesdk1.3/bin/cloudscape -start
j2eesdk1.3\bin\j2ee -verbose j2eesdk1.3\bin\deploytool j2eesdk1.3\bin\cloudscape -start
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.
2BeansApp
afin de voir les composants de l'application. BonusWar
pour qu'il apparaissent encadré et en surbrillance. Delete
à partir du menu Edit.
Note : Il semble qu'il y ait un bug dans l'outil de déploiement. Assurez cous d'jouter d'abordBonus.jsppuisbonus.html. Si vous ajoutezbonus.htmlen premier, l'outil de déploirement metbonus.htmllà où doit allerBonus.jsp, etBonus.jsplà où doit allerbonus.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
BonusWar comme
nom.
ClientCode et ajouter Bonus.jsp ,
Next
ClientCode
et ajouter bonus.html
Finish
.
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.
2BeansApp sélectionée, choisir
Verifier dans le menu Tools. OK . La fenêtre
ne devrait pas indiquer de tests en échec. Deploy Application . Une boite
de dialogue Deploy BonusApp apparaît. 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.
Next . calcs pour CalcBean et bonus pour
BonusBean . Si ce n'est pas le cas, tapez les noms JNDI vous même
et validez en appuyant sur la touche Entrée.
Next . Assurez vous que le nom du Context Root est JSPRoot . Si ce n'est pas le cas, tapez les noms
JNDI vous mêmes et valider en appuyant sur la touche Entrée.
Next . Finish pour démarrer le déploiement. Une
boîte de dialogue avec l'état d'avancement du déploiement
apparaît.OK .
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 placeBonus.jspsouspublic_html/JSPRoot, etbonus.htmlsouspublic_html/JSPRoot/WEB-INF/classes, ce qui n'est pas correct. Copiez manuellement les fichiers dans les emplacemetns corrects :public_html/JSPRoot/bonus.htmletpublic_html/JSPRoot/WEB-INF/classes/Bonus.jsp.
Submit.
Bonus.jsp traite les données et renvoit
une page HTML avec le calcul du bonus.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
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
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]