compte rendu additionnel - Page Perso de Vincent Gardeux

publicité
Maverick & CookXML
BELKHADRA Sofiane
BERNABE Thomas
RESSE Romain
Présentation
Etant donné que nous avons déjà fait une présentation succincte des deux frameworks utilisés, nous
n’allons pas nous étendre de nouveau sur le sujet ; nous parlerons surtout de l’utilisation de ces
frameworks et des problèmes que nous avons rencontrés. Ce rapport est un complément à la
présentation que nous avons faite vendredi 15 mai.
Maverick
Comme nous l’avions dit lors de la présentation, maverick était apparemment un framework simple
d’utilisation, étant donné qu’il suffisait d’ajouter le maverick.jar aux librairies web et qu’il fallait juste
configurer un maverick.xml afin que ce framework fonctionne.
Nous nous sommes basés sur l’exemple qui était disponible sur le site de maverick, à savoir le
friendbook-jsp, permettant de gérer une sorte d’annuaire, ou plutôt un réseau social.
Malheureusement, ceci n’a pas fonctionné pour nous, car nous avons eu un problème directement
au niveau de la servlet fournie dans le maverick : la servlet Dispatcher est indisponible.
Cette erreur est revenue sur plusieurs autres groupes.
Cependant, chez certains autres, maverick est fonctionnel. A savoir que ces groupes nous ont
gracieusement aidé notamment en nous donnant un fichier war de test maverick (test de liens avec
maverick, ce programme devait afficher un lien, qui lorsqu’il était sélectionné, renvoyait vers un .m
qui permettait d’obtenir la nouvelle page jsp…), mais cela n’a pas fonctionné et nous avons encore
une fois rencontré la même erreur…
De plus, il n’existe que très peu de documentation liée à maverick sur le net, vu que ce framework
n’est pas si utilisé que ça. Effectivement, nous avons activement recherché les erreurs possibles du
servlet Dispatcher mais il n’y a aucunes réponses viables à ce problème sur internet…
Suite à cela, nous avons donc décidé de coder nous même nos propres servlets et jsp afin de faire
fonctionner le deuxième framework que nous avons choisit : cookXML
Voici le code du maverick.xml :
<?xml version="1.0"?>
<maverick version="2.0" default-view-type="document" default-transform-type="document">
<views>
<view id="loginRequired" path="loginRequired.jsp">
<transform path="trimOutside.jsp"/>
</view>
</views>
<commands>
<command name="welcome">
<view path="welcome.jsp">
<transform path="trimOutside.jsp"/>
</view>
</command>
<command name="loginSubmit">
<controller class="controlleurs.LoginSubmit" />
<view name="success" type="redirect"/>
<view name="error" path="loginFailed.jsp">
<transform path="trimOutside.jsp"/>
</view>
</command>
<command name="signup">
<view path="signup.jsp">
<transform path="trimOutside.jsp"/>
</view>
</command>
<command name="signupSubmit">
<controller class="controlleurs.SignupSubmit"/>
<view name="success" type="redirect" path="edit.m"/>
<view name="error" path="signup.jsp">
<transform path="trimOutside.jsp"/>
</view>
</command>
<command name="edit">
<controller class="controlleurs.Edit"/>
<view ref="loginRequired"/>
<view name="success" path="edit.jsp">
<transform path="trimInside.jsp"/>
</view>
</command>
<command name="editSubmit">
<controller class="controlleurs.EditSubmit"/>
<view ref="loginRequired"/>
<view name="success" type="redirect" path="friends.m"/>
</command>
<command name="addFriend">
<controller class="controlleurs.EditFriend"/>
<view ref="loginRequired"/>
<view name="success" type="redirect" path="friends.m"/>
</command>
<command name="changePassword">
<controller class="controlleurs.ChangePassword"/>
<view ref="loginRequired"/>
<view name="success" path="changePassword.jsp">
<transform path="trimInside.jsp"/>
</view>
</command>
<command name="changePasswordSubmit">
<controller class="controlleurs.ChangePasswordSubmit"/>
<view ref="loginRequired"/>
<view name="success" type="redirect" path="friends.m"/>
<view name="error" path="changePassword.jsp">
<transform path="trimInside.jsp"/>
</view>
</command>
<command name="logout">
<controller class="controlleurs.Logout"/>
<view ref="loginRequired"/>
<view name="success" type="redirect" path="welcome.m"/>
</command>
<command name="friends">
<controller class="controlleurs.Friends"/>
<view ref="loginRequired"/>
<view name="success" path="friends.jsp">
<transform path="trimInside.jsp"/>
</view>
</command>
</commands>
</maverick>
CookXML
CookXML est un framework qui permet de créer des instances de classes java (objets) à partir de xml
suivant ses tags. Cependant CookXML ne fonctionne que dans un seul sens, à savoir créer du java
objet à partir du xml mais pas l’inverse, nous ne pouvions donc pas ajouter les fonctionnalités
d’ajout, de suppression et de modification d’un contact.
Voici l’arborescence du projet :
Nous avons donc importé le package cookxml.jar et nous avons créé un Creator, indispensable à son
fonctionnement. La mise en place de cookxml est très simple lorsque l’on a compris comment
fonctionnaient les creators, adders, setters et converters.
Voici le code de la classe Converter :
package cookXML;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import modele.Adresse;
import modele.Annuaire;
import modele.Contact;
import modele.Email;
import modele.Telephone;
import modele.User;
import modele.Utilisateur;
import cookxml.core.CookXml;
import cookxml.core.adder.DefaultAdder;
import cookxml.core.creator.DefaultCreator;
import cookxml.core.setter.DefaultSetter;
import cookxml.core.taglibrary.SingleNSTagLibrary;
public class Creator {
SingleNSTagLibrary libUser;
SingleNSTagLibrary libContact;
Annuaire annuaire;
User user;
public Creator() {
SingleNSTagLibrary tagContact = new SingleNSTagLibrary();
SingleNSTagLibrary tagUser = new SingleNSTagLibrary();
tagContact.setCreator("annuaire", DefaultCreator
.getCreator(Annuaire.class));
tagContact.setCreator("contact", DefaultCreator
.getCreator(Contact.class));
tagContact.setCreator("email", DefaultCreator.getCreator(Email.class));
tagContact
.setCreator("tel", DefaultCreator.getCreator(Telephone.class));
tagContact.setCreator("adresse", DefaultCreator
.getCreator(Adresse.class));
tagContact.setSetter(null, null, DefaultSetter.getInstance());
tagContact.setAdder(null, DefaultAdder.getInstance());
libContact = tagContact;
tagUser.setCreator("user", DefaultCreator.getCreator(User.class));
tagUser.setCreator("utilisateur", DefaultCreator.getCreator(Utilisateur.class));
tagUser.setSetter(null, null, DefaultSetter.getInstance());
tagUser.setAdder(null, DefaultAdder.getInstance());
libUser = tagUser;
}
public void createObject() throws IOException {
try {
DocumentBuilder builder = DocumentBuilderFactory.newInstance()
.newDocumentBuilder();
CookXml cookXmlContact = new CookXml(builder, libContact, (Object) null);
annuaire = (Annuaire) cookXmlContact.xmlDecode("C:\\teste.xml");
CookXml cookXmlUser = new CookXml(builder, libUser, (Object) null);
user = (User) cookXmlUser.xmlDecode("C:\\utilisateur.xml");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public Annuaire getAnnuaire() {
return annuaire;
}
public User getUser() {
return user;
}
public void afficherAnnuaire(Annuaire annuaire) {
System.out.println(annuaire);
System.out.println("Nom de l'annuaire : " + annuaire.getName());
for (int i = 0; i < annuaire.getContactList().size(); i++) {
System.out.println("Annuaire " + i);
for (int j = 0; j < annuaire.getContactList().get(i)
.getAdresseList().size(); j++) {
System.out.println("Valeur de adresse : "
+ annuaire.getContactList().get(i).getAdresseList()
.get(j).getValeur());
}
for (int j = 0; j < annuaire.getContactList().get(i).getMailList()
.size(); j++) {
System.out.println("Valeur de mail : "
+ annuaire.getContactList().get(i).getMailList().get(j)
.getValeur());
}
for (int j = 0; j < annuaire.getContactList().get(i).getPhoneList()
.size(); j++) {
System.out.println("Valeur de telephone : "
+ annuaire.getContactList().get(i).getPhoneList()
.get(0).getValeur());
}
System.out.println("Valeur de nom : "
+ annuaire.getContactList().get(i).getNom());
System.out.println("Valeur de prenom : "
+ annuaire.getContactList().get(i).getPrenom());
System.out.println("Valeur de sexe : "
+ annuaire.getContactList().get(i).getSexe());
}
}
public void afficherUser(User user){
System.out.println(user);
for(int i = 0; i < user.getUtiliList().size();i++){
System.out.println("Utilisateur " + i);
System.out.println("Valeur de log "+user.getUtiliList().get(i).getLog());
System.out.println("Valeur de pass "+user.getUtiliList().get(i).getPass());
System.out.println("Valeur de estAdmin "+user.getUtiliList().get(i).getEstAdmin());
}
}
}
On créé donc des objets à partir des xml grâce à ces caractéristiques de cookXML.
Creators : lie le tag du nœud à une classe java.
Adders : lie un objet à un autre objet (nœuds imbriqués). Utilise par défaut la méthode add(Object
objet).
Setters : récupère les paramètres des nœuds. Utilise par défaut la méthode setValeur().
Converters : Nous n’en avons pas utilisé, mais ceux-ci servent à convertir certaines informations dont
on a besoin, juste en ajoutant un objet de type converter.
Il faut tout de même savoir qu’il faut une classe java par nœud contenus dans le xml. Il faut de plus
que ces classes aient un constructeur vide et une fonction add qui permet d’ajouter des objets java.
Comme vous l’avez vu lors de la présentation, cela fonctionne bien. Le seul problème est celui de la
redirection lorsque l’on entre un faux couple login/pass…
Conclusion
Nous avons donc réalisé ce projet en partie, mais ceci ne dépendait pas forcément de notre bon
vouloir ; les deux frameworks que nous avons choisit ne sont pas encore finalisés et ne sont pas près
de l’être vu qu’ils sont très peu utilisés et que d’autres font bien mieux qu’eux tout en étant
beaucoup plus simple d’utilisation (plus besoin de coder une classe entière par exemple si l’on
remplace cookXML… mais ceci est une autre histoire.).
Info importante
Placer les test.xml et utilisateur.xml à la racine du disque C:/.
Téléchargement