[<<RETOUR] [SOMMAIRE] [SUIVANT>>]
vous pouvez utiliser la technologie JavaBeans
pout placer un JavaBean entre la page JSP et bean de session
CalcBean pour obtenir une meilleur spéaration entre Modèle,
Vue et Contrôleur (Model, View, Controller (MVC)). MVC est un patron de
conception qui consiste en 3 types d'objets . Le Modèle fournit la logique
métier de l'application, la Vue sa présentation à l'écran
et le Contrôleur est un objet qui gère ce qui arrive lorsque l'utilisateur
interagit avec la vue. Un patron de conception décrit un problème
récurrent et ses solutions, bien que les solutions ne soient jamais exactement
les mêmes pour chqaue occurence du problème.
L'exercice 4 Technologie
JavaServer Pages est construit avec des pages HTML et JSP qui fournissent
la présentation à l'écran (Vue) et gèrent ce qui
arrive lorsque l'utilisateur interagit avec les données (Contrôleur).
Les beans d'entité et de session (BonusBean
et CalcBean ) sont les objets applicatifs ou Modèle.
Cette leçon utilise une page JSP pour la présentation à l'écran (Vue), un JavaBean pour gérer les interactions de l'utilisateur avec la vue (Contrôleur), et les beans d'entité et de session comme objets applicatifs (Modèle). Séparer le Contrôleur de la Vue de cette façon permet au JavaBean de s'interposer avant le bean de session et fournit un exemple de séparation M-V-C plus claire. Une application qui utilise des patrons de conception clairs est plus facile à mettre à jour, maintenir et gèrer.
Dans l'exercice
4 Technologie JavaServer Pages, l'interface utilisateurde l'application
consistait en une page HTMl avec un formulaire. Le formulaire HTML appelle une
page JSP quand lm'utilisateur clique sur le bouton Submit
de la page HTML.
Une autre façon de créer l'interface utilisateur est d'utiliser une page JSP qui inclut le formulaire HTML, les scriptlets JSP et les balises JSP prédéfinies pour interagir avec le JavaBean. quand la page JSP est chargée, le formulaire HTML est affiché et les scriptlets et balises prédéfinies JSP pour interagir avec le Javabeans sont exécutées. Comme aucune donnée n'a été fournie pour l'instant, l'affichage apparaît comme sur la Figure 17:
bonus.jsp est chargée
Après que l'utilisateur ai entré
quelques données et cliqué sur le bouton Submit
, le formulaire HTML est réaffiché et les scriptlets ainsi que
les balises JSP prédéfinies pour interagir avec le JavaBeans sont
éxécutées avec les données fournies par l'utilisateur.
L'affichage ressemble alors à celui de la Figure
18. Cela est dû au fait que le paramètre
ACTION du formulaire HTML de bonus.jsp s'appelle
lui-même récursivement.
Si l'utilisateur entre le même numéro de sécurité sociale, une erreur de clé multiple est retounrée et affiché par la page JSP comme présenté dans la Figure 19.
Le code de bonus.jsp
est plutôt simple car le code utilisé pour chercher le bean de
session et calculer le bonus est maintenant dans le JavaBean. La premièere
partie du fichier HTML contient le code pour créer le formulaire. Le
code qui transmet les données de formulaire au bean est dans la seconde
partie du fichier: Le fichier bonus.jsp complet est
présenté ci-dessous. regardez le un peu avant d'aller plus loin
dans notre discussion sur les scriptlets et balises prédéfinies
pour interagir avec le JavaBean.
<HTML>
<BODY BGCOLOR = "WHITE">
<HEAD>
<TITLE>Bonus Calculation</TITLE>
</HEAD>
<BLOCKQUOTE>
<H3>Bonus Calculation</H3>
<!--ACTION parameter calls this page-->
<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>
<!--Scriptlet and JavaBeans Tags start here -->
<jsp:useBean id = "jbonus" class = "JBonusBean"/>
<%! String sMult, ssec; %>
<%
sMult = request.getParameter("MULTIPLIER");
ssec = request.getParameter("SOCSEC");
%>
<jsp:setProperty name = "jbonus" property="strMult" value="<%=sMult%>"/>
<jsp:setProperty name = "jbonus" property="socsec" value="<%=ssec%>"/>
Social security number retrieved:
<jsp:getProperty name="jbonus" property="socsec"/>
<P>
Bonus Amount retrieved:
<jsp:getProperty name="jbonus" property="bonusAmt"/>
<P>
Error messages:
<jsp:getProperty name = "jbonus" property="message"/>
</BLOCKQUOTE>
Le code de la balise JSP suivante précide
le JavaBean utilisé dans cet exemple. Le paramètre
id définit un alias à utiliser pour éférencer
le JavaBean, et le paramètre class précise
quel classe de JavaBeans. Dans cet exemple,id est
jbonus et la class est
JBonusBean .
<jsp:useBean id = "jbonus" class = "JBonusBean"/>
Les scriptlets JSP suivqnts récupérent
les données saisies par l'utilisateur dans le formulaire HTML. Le multiplicateur
est stocké dans la chaîne sMult
, et le numéro de sécurité sociale est stocké
dans la chaîne ssec.
<%! String sMult, ssec; %>
<%
sMult = request.getParameter("MULTIPLIER");
ssec = request.getParameter("SOCSEC");
%>
Les balises JSP suivantes modifient 2 propriétés
du JavaBean. Une propriété est un champ privédans une classe
JavaBean. La première ligne utilise la balise nommée
jsp:setProperty pour définir le champ strMult
dans la classe JBonusBean (accédée
par l'alias jbonus id
) avec la valeur stockée dans la variable sMult.
La seconde ligne effectue une opération similaure sur le champ
socsec de la classe JBonusBean.
<jsp:setProperty name = "jbonus" property="strMult" value="<%=sMult%>"/>
<jsp:setProperty name = "jbonus" property="socsec" value="<%=ssec%>"/>
The
value="<%=ssec%>"
expression sends the data contained in the ssec variable to the socsec field in the JavaBean.
Récupérer les données d'un
JavaBean est similaire à lui envoyer. Il faut utiliser la balise nommée
jsp:getProperty et indiquer quelle propriété
(champ privé) contient les données que vous voulez récupérer.
La balise getProperty suivante récupére
les données stockées dans le champ privé
socsec de la classe JBonusBean (alias
jbonus id ).
Social security number retrieved:
<jsp:getProperty name="jbonus" property="socsec"/>
Les balises suivantes font des opérations
similaires sur les champs bonusAmt et
message de la classe JBonusBean.
<P>
Bonus Amount retrieved:
<jsp:getProperty name="jbonus" property="bonusAmt"/>
<P>
Error messages:
<jsp:getProperty name = "jbonus" property="message"/>
Une classe JavaBeans ressemble à une classe java ordinaire. Mais pour être un JavaBean, une classe doit respecter des conventions de nommage et de conception comme définit dans les spécifications JavaBeans. Comme tous les beans respectent les spécifications JavaBeans , ils peuvent être accédés et gérés par d'autres programmes et outils qui respectent les mêmes conventions.
Dans la section
Créer bonus.jsp, des balises HTML et des scriptlets JSP sint utilisées
pourf obtenir et définir les données des champs privés
de la classe JBonusBean. Cela est possible car la
classe JBonusBean suit les conventions de nommage
et conception des JavaBeans.
Cette section décrit le code de
JBonusBean et donne une brève introduction à la technologie
JavaBeans telle qu'elle est utilisée dans les JSP. Visitez la page d'accueil
sur les JavaBeans à l'adresse http://java.sun.com/beans/index.html
pour plus d'informations sur cette technologie.
Voici la classe JBonusBean
en entier. Une discusssion sur ses parties intéressantes suit.
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import Beans.*;
public class JBonusBean {
private String strMult, socsec, message;
private double bonusAmt;
CalcHome homecalc;
public JBonusBean() {
try{
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("calcs");
homecalc = (CalcHome)
PortableRemoteObject.narrow(
objref, CalcHome.class);
} catch (javax.naming.NamingException e) {
e.printStackTrace();
}
}
public double getBonusAmt() {
if(strMult != null){
Integer integerMult = new Integer(strMult);
int multiplier = integerMult.intValue();
try {
double bonus = 100.00;
Calc theCalculation = homecalc.create();
Bonus theBonus = theCalculation.calcBonus(
multiplier, bonus, socsec);
Bonus record = theCalculation.getRecord(
socsec);
bonusAmt = record.getBonus();
socsec = record.getSocSec();
} catch (javax.ejb.DuplicateKeyException e) {
message = e.getMessage();
} catch (javax.ejb.CreateException e) {
e.printStackTrace();
} catch (java.rmi.RemoteException e) {
e.printStackTrace();
}
return this.bonusAmt;
} else {
this.bonusAmt = 0;
this.message = "None.";
return this.bonusAmt;
}
}
public String getMessage(){
return this.message;
}
public String getSocsec(){
return this.socsec;
}
public String getStrMult(){
return this.strMult;
}
public void setSocsec(String socsec) {
this.socsec = socsec;
}
public void setStrMult(String strMult) {
this.strMult = strMult;
}
}
Les propriétés définissent les les données qu'un JavaBeans rend accessible aux autres programmes et outils à travers ses méthodes get et set. Les données peuvent faire serveir par exemple à définir l'apparence du JavaBeans ou son comportement, ou peuvent être utilisées ou être le résultat d'une série de calculs ou traitements. Les propriétés sont des champs de classe privé,qui doivent toujours et uniquement être accédé par les méthodes get et set.
Le code suivant montre les propréités
privées de la classes JBonusBean. La classe
JBonusBean class a une méthode get<property>
pourchaque chaque champ et une méthode set<property>
pour les champs strMult et socsec.
public class JBonusBean {
private String strMult, socsec, message;
private double bonusAmt;
Le constructeur de JBonusBean
contacte le bean de session.
public JBonusBean() {
try{
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("calcs");
homecalc = (CalcHome)
PortableRemoteObject.narrow(
objref, CalcHome.class);
} catch (javax.naming.NamingException e) {
e.printStackTrace();
}
}
JBonusBean a deux méthodes
d'affectations (méthodes préfixées par le mot
set ). Les méthodes d'affectation affectent à une propriété
(champ privé) les valeurs spécifiées. Les deux méthodes
d'affections sont setSocsec et
setStrMult pour définir les champs privés socsec et strMult
(propriétés du JavaBean) .
Dans cet exemple les valeurs utilisées pour
définir les propriétés socsec
et strMult viennent des balises
setProperty dans la page JSP. Le serveur J2EE
utilise les informations fournies par les balises setProperty
tpour utiliser les méthodes correspondantes
de JBonusBean (utilisé sous l'alias jbonus
id ):
<jsp:setProperty name = "jbonus" property="strMult" value="<%=sMult%>"/>
<jsp:setProperty name = "jbonus" property="socsec" value="<%=ssec%>"/>
Dans la classe JBonusBean
, les méthodes set<property> suivent
des conventions de nom que le serveur fait correspondre aux balises
setProperty du fichier JSP pour passer les données aux méthodes
appropriées du JavaBean.
Pour les méthodes d'affectation, le nom
de la méthode est composé avec le mot set
et le nom de la propriété. Le nom de la propriété
est le nom d'un des champs privés de JBonusBean.
Bien que les noms de champ commencent toujours par une minuscule par convention,
le second mot du nom de la méthode à toujours sa première
en majuscule. Ainsi pour définir le champ privé
socsec , le nom de la méthode est setSocsec
. Le serveur J2EE fait correspondre Socsec dans le
nom de la méthode en socsec le nom duchamp
privé. Les méthodes d'affection n'ont pas de valeur de retour
et ont un seul argument du type approprié..
public void setSocsec(String socsec) {
this.socsec = socsec;
}
public void setStrMult(String strMult) {
this.strMult = strMult;
}
JBonusBean a 4 méthodes
de lecture des propriétés (méthodes préfixées
par le mot get ). Les méthodes pour lire les
propriétés lisent et retournent les valeurs des propriétés
(valeur des champs privés). Les 4 méthodes de lecture des propriétés
sont getBonusAmt , getMessage
, getSocsec et getStrMult
qui retournent les données des champs privés
bonusAmt , message , socsec
, et strMult (propriétés du JavaBean).
Dans cet exemple les valeurs utilisées pour
définir les champs bonusAmt et
message viennent de la méthode getBonusAmt
. La page JSP obtient les valeurs des propriétés de
JBonusBean en utilisant les balises getProperty
name . La page JSP recherche uniquement les valeurs
qui la concerne, c'est la raison pour laquelle la propriété de
JBonusBean concernant le multiplicateur (le champ
strMult ), n'est pas recherchée par la page JSP.
Social security number retrieved:
<jsp:getProperty name="jbonus" property="socsec"/>
<P>
Bonus Amount retrieved:
<jsp:getProperty name="jbonus" property="bonusAmt"/>
<P>
Error messages:
<jsp:getProperty name = "jbonus" property="message"/>
Les méthodes de lecture des propriétés
suivent les mêmes conventions de nom que que lesm éthodes d'affection,
c'est de cette manière que la page JSP recherche les valeurs de
JBonusBean . Les méthodesde lecture des propriétés
ont toujours une valeur de retour et ne prennent pas d'argument. vous noterez
que bien que la méthode getBonusAmt définit
les valeurs de propriété et n'a pas réellement besoin de
retourner une valeur, elle retourne this.bonusAmt
pour éviter de provoquer une erreur d'exécution du serveur J2EE.
La méthode getBonusAmt
utilise un bloc if-else pour gérer les cas
où la valeur de strMult n'est pas fournie.
Quand la page JSP est chargée une première fois, l'utilisateur
n'a pas encore fourni de données mais toutes les balises et scriptlets
de la page sont exécutées. Dans ce cas, la valeur de la propriété
strMult passée au JBonusBean
est null , ce qui résulte en un multiplicateur
nul et une valeur null bonusAmt.
Une erreur d'exécution du serveur apparaît quand la page JSP essaie
d'afficher la valeur null bonusAmt.
Pour éviter cette erreur, bonusAmt est défini
à 0 dans le cas où la valeur de strMult
est null.
public double getBonusAmt() {
if(strMult != null){
Integer integerMult = new Integer(strMult);
int multiplier = integerMult.intValue();
try {
double bonus = 100.00;
Calc theCalculation = homecalc.create();
Bonus theBonus = theCalculation.calcBonus(
multiplier, bonus, socsec);
Bonus record = theCalculation.getRecord(
socsec);
bonusAmt = record.getBonus();
socsec = record.getSocSec();
} catch (javax.ejb.DuplicateKeyException e) {
message = e.getMessage();
} catch (javax.ejb.CreateException e) {
e.printStackTrace();
} catch (java.rmi.RemoteException e) {
e.printStackTrace();
}
return this.bonusAmt;
} else {
this.bonusAmt = 0;
this.message = "None.";
return this.bonusAmt;
}
}
public String getMessage(){
return this.message;
}
public String getSocsec(){
return this.socsec;
}
public String getStrMult(){
return this.strMult;
}
public void setSocsec(String socsec) {
this.socsec = socsec;
}
public void setStrMult(String strMult) {
this.strMult = strMult;
}
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 vous ajoutez une classe complétement nouvelle à l'application, vous devez supprimer le fichier WAR de l'exercie précédent et en créer un nouveau.
2BeansApp afin de voir ses composants. BonusWar
afin qu'il soit encadré et mis en surbrillance. Delete
à partir du menu Edit.
ClientCode , et ajouter
bonus.jsp . Next
,allez dans le répertoire ClientCode , ajouter
JBonusBean.class Finish
. Note: Assurez vous d'avoir ajoutébonus.jspavant d'ajouterJBonusBean.class.
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.jsp allez avec votre navigateur à l'adresse
http://localhost:8000/JSPRoot/bonus.jsp , qui est l'endroit où
l'outil de déploiement a installé la page JSP.
Submit
. Bonus.jsp traite les données et retourne
une page HTML avec le résultat du calcul du bonus.
Consulter la page sur les JavaBeans à
http://java.sun.com/beans/index.html pour plus d'information sur cette
technologie.
[RETOUR]