Exercice 5
Ajouter la technologie JavaBeansTM au mélange

[<<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.

A propos de l'exemple

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 Calculation
Quand 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.

 

Bonus Calculation
Après que l'utilisateur ait saisi des données et cliqué sur Submit

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.

 

Bonus Calculation
Erreur clé mutliple

Créer bonus.jsp

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>

</BODY>
</HTML>

Spécifier le JavaBean

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"/>

Récupérer les données

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");
%>

Transmission des données au JavaBean

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 du 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"/>

Créer la classe JavaBeans

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;
  }
}

Propriétés du Bean

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;

Constructeur

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();
}
}

Méthodes Set

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;
}

Méthodes Get

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;
}

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 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.

Local Applications:

Créer un nouveau fichier WAR

File menu:

Introduction :

War File General Properties :

Note: Assurez vous d'avoir ajouté bonus.jsp avant d'ajouter JBonusBean.class .

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.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.

Plus d'information

Consulter la page sur les JavaBeans à http://java.sun.com/beans/index.html pour plus d'information sur cette technologie.

[RETOUR]