Applications Web : Utilisation d’Objets Entreprise sur Mesure
“Développer une Application Enterprise Objects” vous a montré combien il était facile de manipuler des enregistrements de base de données en les représentant par des EOGenericRecords. Maintenant, au lieu d’utiliser des objets entreprise génériques, vous allez créer une classe enterprise-object et personnaliser son comportement.
Dans ce chapitre, vous allez :
- générer une classe enterprise-object personnalisée,
- ajouter votre propre logique à une classe enterprise-object,
- apprendre comment donner des valeurs par défaut à des propriétés d’objets entreprise.
Génération de la Classe Enterprise-Object Personnalisée
La première étape de la personnalisation du comportement des objets entreprise consiste en la génération de classes personnalisées à partir des définitions d’entités du modèle de données. Vous continuerez à travailler ici sur le projet Authors que nous avons créé dans Développer une Application Enterprise Objects, y compris le modèle de données Authors.
EOModeler génére un fichier source Java basé sur les propriétés des entités telles qu’elles sont définies dans le modèle.
Génération du Fichier Source Java à partir d’une Entité Modèle
Pour générer un fichier source Java représentant l’entité Author, effectuez les taches suivantes :
- Double-cliquez sur Authors.eomodeld du groupe Resources de Project Builder pour l’ouvrir dans EOModeler.
- Dans EOModeler, sélectionnez l’entité Author.
- Choisissez Property > Generate Java Files.
- Naviguez jusqu’à votre répertoire projet et cliquez sur Save.
![[image: webobjects_images/modgeneratejava.gif]](/globals/images/webobjects_images/modgeneratejava.gif)
- Fermez Authors.eomodeld.
Ajout d’un Fichier Source Java au Projet
Pour ajouter Author.java au projet, suivez les étapes suivantes :
- Dans Project Builder, sélectionnez Classes dans la liste Files.
- Choisissez Project > Add Files.
- Sélectionnez Author.java dans votre répertoire projet et cliquez sur Open.
![[image: webobjects_images/pbauthorjavaadd.gif]](/globals/images/webobjects_images/pbauthorjavaadd.gif)
- Sélectionnez la cible Application Server et cliquez sur Add.
![[image: webobjects_images/pbauthorjavaadd2.gif]](/globals/images/webobjects_images/pbauthorjavaadd2.gif)
EOModeler génére le fichier illustré dans le Listing 12-1.
Listing 12-1 La classe Author générée par EOModeler
import com.webobjects.foundation.*; import com.webobjects.eocontrol.*; import java.math.BigDecimal; import java.util.*; public class Author extends EOGenericRecord { public Author() { super(); } public String firstName() { return (String)storedValueForKey("firstName"); } public void setFirstName(String value) { takeStoredValueForKey(value, "firstName"); } public String lastName() { return (String)storedValueForKey("lastName"); } public void setLastName(String value) { takeStoredValueForKey(value, "lastName"); } }
Le fichier source Java généré par EOModeler contient les méthodes accesseurs de l’attribut, méthodes déclarées comme étant les propriétés de la classe.
Il y a quelques trucs particuliers à noter ici :
- La classe Author est une extension de la classe EOGenericRecord. De cette manière, tous les comportements par défaut de EOGenericRecord sont présents dans votre classe.
- Il n’y a pas de variables d’instance dans la classe Author. A la place, les valeurs d’attribut sont accédées via les méthodes accesseurs, qui utilisent un codage cle-valeur pour obtenir et positionner les valeurs d’attribut.Si vous ajoutez du code qui modifie les données d’une classe personnalisée enterprise-object et que vous souhaitez que ces changements soient stockés dans la base de données, vous devrez utiliser ces méthodes accesseurs pour positionner les valeurs des attributs appropriés.
Modification du Projet Author
Le code du projet Author est écrit pour fonctionner avec des EOGenericRecords. Pour tirer profit de la classe Author, vous devez altérer les définitions des variables et des méthodes qui interagissent avec les objets Author dans votre programme, transformant ainsi les EOGenericRecords en objets Author.
Apportez les changements suivants au fichier Main.java :
- Changez la ligne @TypeInfo au dessus de la définition de authorList ainsi :
/** @TypeInfo Author */ - Changez la classe des variables d’instance author et authorItem de EOGenericRecord en Author.
- Effacez la définition de la variable d’instance authorClassDescription et son assignation dans le constructeur.Vous aviez besoin de la description de classe seulement pour créer des instances de EOGenericRecord avec le type correct récupéré à partir du fichier modèle. Maintenant que vous utilisez la classe Author, la description de classe n’est plus requise.
- Changez le constructeur et les méthodes addAuthor et updateAuthor de façon à créer un nouvel objet Author au lieu d’un objet EOGenericRecord.
author = new Author(); - Sauvegardez Main.java.
Après avoir effectué ces changements, Main.java devrait ressembler au Listing 12-2.
Listing 12-2 La classe Main modifiée de façon à utiliser Authors à la place des EOGenericRecords
import com.webobjects.foundation.*; import com.webobjects.appserver.*; import com.webobjects.eocontrol.*; import com.webobjects.eoaccess.*; public class Main extends WOComponent { protected Author author; protected Author authorItem; /** @TypeInfo Author */ protected NSMutableArray authorList; /** * Fait référence au contexte d'édition par défaut. */ private EOEditingContext editingContext; /** * Stocke les spécifications de recherche utilisées pour récupérer * les Authors à partir du stock de données. */ private EOFetchSpecification fetchSpec; public Main(WOContext context) { super(context); // Construit les spécifications de recherche. fetchSpec = new EOFetchSpecification("Author", null, null); // Récupère le contexte d'édition. editingContext = session().defaultEditingContext(); // Rapporte les auteurs. authorList = new NSMutableArray(editingContext.objectsWithFetchSpecification(fetchSpec)); // Crée un objet Author (où les données formulaire sont stockées). author = new Author(); } public WOComponent addAuthor() { // Ajoute l'Author seulement s'il n'est pas dans la liste. if (!authorList.containsObject(author)) { // Ajoute l'auteur à la liste. authorList.addObject(author); // Insère l'auteur dans le conexte d'édition. editingContext.insertObject(author); // Crée un nouvel auteur. author = new Author(); } return null; } public WOComponent deleteAuthor() { // Retire dans auteurList l'objet Author de authorItem. authorList.removeObject(authorItem); // Récupère le contexte d'édition de authorItem. EOEditingContext ec = authorItem.editingContext(); // Retire l'auteur du contexte d'édition. ec.deleteObject(authorItem); return null; } public WOComponent editAuthor() { // Positionne l'auteur à éditer sur celui sélectionné par l'utilisateur. author = authorItem; return null; } public WOComponent revertChanges() { // Annule les changements apportés au contexte d'édition. editingContext.revert(); // Rapporte de nouveau. authorList = new NSMutableArray(editingContext.objectsWithFetchSpecification(fetchSpec)); return null; } public WOComponent saveChanges() { // Sauvegarde dans le stocl d'objets les changements apportés // au contexte d'édition. editingContext.saveChanges(); return null; } public WOComponent updateAuthor() { // Crée un objet Author. author = new Author(); return null; } }
Du fait qu’Author est une sous-classe de EOGenericRecord, elle répond toujours aux chemins d’accès de clés du fichier WOD du composant Main. Construisez et lancez l’application pour le confirmer.
Ajout de Logique Propre
Maintenant que l’entité Author est représentée par la classe enterprise-object Author, vous pouvez y ajouter vos propres méthodes.
Vous aurez peut-être besoin d’afficher les données sous une forme différente de celle utilisée pour les enregistrer dans la base. Par exemple, il serait bien d’avoir une méthode dans la classe Author qui renvoie le nom complet d’un auteur, le nom d’abord avec une virgule séparant le nom du prénom. Une technique similaire est utilisée dans l’application Authors application (deux WOStrings séparés par une virgule), mais le fait de placer cette logique dans une méthode vous permet de supprimer la virgule si le prénom n’est pas présent.
Ajoutez à Author.java la méthode fullName illustrée dans le Listing 12-3.
Listing 12-3 La méthode fullName de la classe enterprise-object Author
/** * Crée le nom complet de cet auteur à partir de <code>lastName</code> * et de <code>firstName</code>. * * @retourne le nom complet de cet auteur. */ public String fullName() { String firstName = firstName(); String lastName = lastName(); String fullName; if ((firstName != null) && (!firstName.equals(""))) { fullName = lastName + ", " + firstName; } else { fullName = lastName; } return fullName; }
Sauveagrdez Author.java.
Utilisation d’une Logique Propre
Dans ce paragraphe, vous allez modifier le composant Main pour qu’il utilise l’attribut dérivé fullName de la classe enterprise-object Author (Author.java) de manière à afficher le nom complet d’un auteur.
- Ouvrez le composant Main dans WebObjects Builder.La Figure 12-1 montre que WebObjects Builder reconnaît que le type de authorItem est Author. De plus, un navigateur apparaît pour la classe Author à côté du navigateur de la classe Main. Remarquez que la nouvelle méthode, fullName, est représentée comme étant un attribut de la variable authorItem .
Figure 12-1 Le composant Main après avoir ajouté l’attribut dérivé fullName à la classe enterprise-object Author
![[image: webobjects_images/wobmainfullname.gif]](/globals/images/webobjects_images/wobmainfullname.gif)
- Retirer la virgule et le WOString qui affiche authorItem.firstName.
- Reliez l’attribut value du WOString restant à authorItem.fullName. Vous pouvez maintenant faire un glisser-déposer pour effectuer la liaison parce que WebObjects Builder a plus d’informations sur authorItem que quand il était un EOGenericRecord. Votre composant devrait maintenant ressembler à la Figure 12-2.
Figure 12-2 Le composant Main utilisant l’attribut dérivé fullName
![[image: webobjects_images/wobmainfullname2.gif]](/globals/images/webobjects_images/wobmainfullname2.gif)
- Sauvegardez Main.wo, construisez et lancez l’application.La Figure 12-3 montre que lorsque le prenom d’un auteur manque, la virgule n’est pas affichée comme c’était le cas avant.
Figure 12-3 L’application Authors utilisant la méthode fullName pour afficher les données d’un auteur
![[image: webobjects_images/webauthors2.gif]](/globals/images/webobjects_images/webauthors2.gif)
Appliquer des Valeurs par Défaut
Vous aurez peut-être besoin de fournir des valeurs par défaut aux attributs des objets entreprises pour faciliter ou rationaliser la saisie par exemple. Dans l’application Authors, quand un object entreprise Author est instancié, ses attributs firstName et lastName n’ont pas de valeur. Une manière d’informer les utilisateurs que le nom d’un auteur est obligatoire au moment de sa création, serait d’initialiser la propriété lastName des objets entreprise Author avec “*obligatoire*”. Il y a plusieurs façons de faire ceci.
Vous pourriez assigner des valeurs initiales dans la méthode qui crée l’instance. Faites le en invoquant la méthode set de la propriété avec l’argument approprié. Le Listing 12-4 montre la méthode addAuthor de la classe Main avec du code qui initialise la propriété lastName d’un objet Author nouvellement créé avec “*obligatoire*”.
Listing 12-4 Exemple de méthode addAuthor—appliquant des valeurs par défaut
public WOComponent addAuthor() { // Ajoute l'Author seulement s'il n'est pas dans la liste. if (!authorList.containsObject(author)) { // Ajoute l'auteur à la liste. authorList.addObject(author); // Insère l'auteur dans le contexte d'édition. editingContext.insertObject(author); // Crée un nouvel auteur. author = new Author(); // Applique une valeur initiale. author.setlastName("*obligatoire*"); } return null; }
Un des avantages de cette approche est qu’elle vous permet d’assigner de manière sélective des valeurs aux propriétés des nouvelles instances.
Un autre option consiste à appliquer des valeurs initiales dans la classe Author elle-même, ainsi aucune valeur n’a à être appliquée lorsque l’instance est créée. Vous pouvez aussi combiner ces méthodes—appliquer une valeur par défaut dans la classe et l’écraser par une autre lorsque c’est nécessaire.
Dans cet exemple, vous appliquez des valeurs initiales dans la classe Author. Modifiez le constructeur dans Author.java de façon à ce qu’il ressemble au Listing 12-5.
Listing 12-5 Le constructeur dans la classe Author—appliquant une valeur par défaut pour le lastName
public Author() { super(); // Applique une valeur initiale au nom. setlastName("*obligatoire*"); }
Lorsque vous construisez et lancez l’application, *obligatoire* apparaît
dans le champ Nom au moment où un auteur est créé.

Textes originaux en anglais sur developer.apple.com : WebObjects Web Application - Using Custom Enterprise Objects
Chargement
Commentaires récents