Download - Présentation JAXB et STRUTS²
![Page 1: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/1.jpg)
Présentation JAXB et STRUTS²
Combe PierreCoin Cyrille
Jehanno Mathieu
![Page 2: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/2.jpg)
Cyrille Coin, Pierre Combe, Mathieu Jehanno
Présentation de JAXB
Présentation de STRUTS²
Présentation de l’étude de cas
Conclusion
Sommaire
![Page 3: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/3.jpg)
JAXBJava Architecture for XML Binding
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 4: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/4.jpg)
Présentation
API Java de Sun
Gestion de la persistance en XML
Framework utilisant le Data Binding
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 5: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/5.jpg)
Le Data Binding est une technologie permettant d'automatiser la transformation d'un modèle de données en un modèle de données objets dans un langage de programmation
JAXB permet de convertir les fichiers XML en instances de classes Java
Data Binding (association de données)
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 6: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/6.jpg)
Présentation (2) L'utilisation de JAXB implique trois étapes :
◦ La génération de classes à partir du schéma XML
◦ Le rassemblement des données
◦ La redistribution des données
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 7: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/7.jpg)
Principe
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 8: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/8.jpg)
Principe (2)
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 9: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/9.jpg)
Génération des classes Java (1)
Réalisée à l’aide d’un schéma XSD
Utilisation du Compilateur JAXB XJCxjc [-options …] <schema>
Liste des options sur le site de SUN : https://java.sun.com/webservices/docs/2.0/tutorial/doc/JAXBUsing2.html#wp150369
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 10: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/10.jpg)
Génération de classes Java – Exemple (1) contact.xml
contact.xsd
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Contacts> <Contact mail="[email protected]" prenom="Pierre" nom="Combe"/> <Contact mail= " [email protected]" numTel= " 068984356" prenom="Mathieu" nom="Jehanno"/></Contacts>
<xsd:element name="Contacts" type="ListeContacts"/><xsd:complexType name="ListeContacts">
<xsd:sequence> <xsd:element name="Contact" type="ContactType" maxOccurs="unbounded"/> </xsd:sequence>
</xsd:complexType><xsd:complexType name="ContactType">
<xsd:attribute name="nom" type="xsd:string"/> <xsd:attribute name="prenom" type="xsd:string"/> <xsd:attribute name="numTel" type="xsd:int"/> <xsd:attribute name="mail" type="xsd:string"/>
</xsd:complexType>
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 11: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/11.jpg)
Génération de classes Java - Exemple (2)
XML Schéma JAXB Binding(package schema.repertoire)
<xsd:complexType name="ListeContacts"> <xsd:sequence> <xsd:element name="Contact" type="ContactType" maxOccurs="unbounded"/> </xsd:sequence>
</xsd:complexType>
ListeContacts.javaprotected List<ContactType> contact;
public List<ContactType> getContact()
<xsd:complexType name="ContactType"> <xsd:attribute name="nom" type="xsd:string"/> <xsd:attribute name="prenom" type="xsd:string"/> <xsd:attribute name="numTel" type="xsd:int"/> <xsd:attribute name="mail" type="xsd:string"/>
</xsd:complexType>
ContactType.javaContient les 4 attributs + getters et
setters
- ObjectFactory.java
Pour cette étude de cas, le compilateur XJC génère 3 classes Java :
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 12: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/12.jpg)
La classe ObjectFactory Cet objet contient l’ensemble des méthodes
de construction des objets Java générés par XJC dans le package
ObjectFactory permet d’instancier les objets Java représentant « le contenu XML »◦ public ContactType createContactType()◦ public ListeContacts createListeContacts() ◦ public JAXBElement<ListeContacts>
createContacts(ListeContacts value)◦ JAXBElement est un objet du type complexe qui encapsule la
racine du document XML
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 13: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/13.jpg)
Le Plugin XJC Eclipse (1) Facilite l’utilisation du compilateur XJC
Installation◦ Site web :
https://jaxb-workshop.dev.java.net/plugins/eclipse/xjc-plugin.html
◦ Copier le répertoire dans le répertoire plugins d’Eclipse
◦ Redémarrer Eclipse
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 14: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/14.jpg)
Cyrille Coin, Pierre Combe, Mathieu Jehanno
Plugin XJC Eclipse (2)
![Page 15: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/15.jpg)
Le rassemblement des données (unmarshall en anglais) permet d'instancier les classes précédemment créées avec les données contenues dans les fichiers XML
XML => JAVA
Pour cela, il faut utiliser un rassembleur (unmarshaller). Ce dernier va vérifier que les données qu'il reçoit sont bien celles attendues (sinon exceptions levées)
Le rassemblement des données
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 16: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/16.jpg)
Package javax.xml.bind.*
La création des objets nécessite la création d'un objet de type JAXBContext en utilisant la méthode statique newInstance()
L’objet Unmarshaller va permettre de transformer un document XML en un ensemble d'objets. Une telle instance est obtenue en utilisant la méthode createUnmarshaller() de la classe JAXBContext
La méthode unmarshal() de la classe Unmarshaller se charge de traiter un document XML et retourne un objet du type complexe qui encapsule la racine du document XML
Le rassemblement des données (2)
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 17: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/17.jpg)
Le rassemblement des données (3)
public void load(String filename) {
try {// Création d'une instance des classes générées à partir du schémaJAXBContext jc = JAXBContext.newInstance(‘schema.repertoire’);
// Création d'un objet UnmarshallerUnmarshaller u = jc.createUnmarshaller();// Demander la validation du documentunmarshaller.setValidating(true);
// Chargement de l'arbre à partir du xml "filename"JAXBElement<ListeContacts> contacts = (JAXBElement<ListeContacts>)
u.unmarshal(new FileInputStream(filename));
ListeContacts repertoire = contacts.getValue();
} catch (JAXBException e) { e.printStackTrace(); } catch (FileNotFoundException e) { e.printStackTrace(); }}
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 18: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/18.jpg)
Elle consiste à récupérer le contenu de chaque instance de classe et de les insérer dans les fichiers XML
JAVA => XML
Comme pour le rassemblement, pour la redistribution, nous disposons d'un distributeur (marshaller). Ce dernier est chargé de vérifier l'intégrité des données qu'il transporte. Si une erreur intervient, il pourra lever des exceptions
La redistribution des données
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 19: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/19.jpg)
Package javax.xml.bind.*
La création du document nécessite la création d'un objet de type JAXBContext en utilisant la méthode statique newInstance()
Il faut ensuite créer un objet de type Marshaller à partir du contexte et d'appeler sa méthode marshall pour générer le document.
La redistribution des données (2)
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 20: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/20.jpg)
La redistribution des données (3)public void save(String filename) {
try {PrintStream out = new PrintStream(filename);
JAXBElement<ListeContacts> contacts_list = of.createContacts(repertoire);
JAXBContext jc = JAXBContext.newInstance(‘schema.repertoire’);Marshaller m = jc.createMarshaller();// Pour une indentation plus "lisible" du fichier XMLm.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);m.marshal(contacts_list, out);
} catch (JAXBException jbe) {System.err.println("Erreur lors de la redistribution des données");jbe.printStackTrace();
} catch (FileNotFoundException e) { e.printStackTrace(); }}
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 21: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/21.jpg)
JAXB Annotations
package javax.xml.bind.annotation
@XmlAttribut @XmlElement L'annotation @XmlRootElement peut être
utilisée sur une classe pour préciser que cette classe sera le tag racine du document XML
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 22: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/22.jpg)
Il est possible de configurer l'ordre des éléments
JAXB Annotations (2)
@XmlRootElement @XmlType(propOrder = {"nom", "prenom", "taille", "dateNaiss", "adresses"}) public class Personne {
private String nom; private String prenom;...
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 23: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/23.jpg)
STRUTS²
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 24: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/24.jpg)
Présentation STRUTS²
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 25: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/25.jpg)
Télécharger Struts2 à l’adresse suivante et dézipper le:◦ http://struts.apache.org/download.cgi◦ Un fichier nommé struts2-blank-2.x.x.war est présent dans le dossier
dézippé. Télécharger Tomcat à l’adresse suivante et installer le:
◦ http://tomcat.apache.org/download-55.cgi Démarrer Eclipse, puis File/import/WAR file
Comment utiliser STRUTS²
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 26: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/26.jpg)
Comment utiliser STRUTS² Voici ici un projet Struts2 nommé présentation. Vous pouvez démarrer HelloWorld.jsp et vous
apprécierez Struts2!!!
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 27: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/27.jpg)
Formulaire Struts²◦ En Entête de la jsp:
<%@ taglib prefix="s" uri="/struts-tags" %>◦ Formulaire de Login
◦ Mémoriser le nom de l’action ainsi que <s:actionerror />
Fonctionnement de Struts²Exemple avec un formulaire
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 28: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/28.jpg)
Un fichier struts.xml a été crée lors de l’import. Afin d’intercepter l’action de demande de login, nous rajoutons
une action dont le nom est doLogin, dont le contrôleur est dans le package net.roseindia.Login. Enfin, dans les balises « result », on traite les différents cas possibles.
Fonctionnement de Struts²
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 29: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/29.jpg)
On crée un contrôleur Login.java dans le package net.roseindia, classe qui « extends » ActionSupport.
On doit créer deux attributs, username et password, ainsi que les getters et setters. (Attention, les attributs doivent avoir le même nom que dans le formulaire de la jsp)
Fonctionnement de Struts²
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 30: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/30.jpg)
Cyrille Coin, Pierre Combe, Mathieu Jehanno
Lors de l’appel d’un getter, Struts2 fait le lien entre le nom des textfield et les méthodes getXXX().(le textfield nommé username sera récupéré par getUsername()
La fonction execute() est appelée automatiquement. Dans cette fonction et à l’aide des méthodes getUsername() et getPassword(), on contrôlera la bonne saisie des données.
Fonctionnement de Struts²
![Page 31: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/31.jpg)
Valeur de retour◦ Si le couple login/mot de passe est correct, alors on
retourne SUCCESS.◦ Sinon, on crée un addActionError("Invalid user
name or password! Please try again!"); et on retourne ERROR.
◦ Dans la jsp, nous avons parlé d’un <s:actionerror />, c’est à cet endroit qu’apparaitra le message d’erreur dans la jsp.
Fonctionnement de Struts²
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 32: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/32.jpg)
Via un XML◦ Créer un XML ayant comme nom :
NomDeLaClasse-validation.xml◦ Dans notre exemple, le XML sera Login-validation.xml◦ Voici le contenu:
◦ Username et password sont requis
Gestion des erreurs de saisie – méthode 1
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 33: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/33.jpg)
Via un validator dans la classe◦ Importer dans la classe Login: import
com.opensymphony.xwork2.validator.annotations.RequiredStringValidator;
◦ Puis rajouter @RequiredStringvalidator juste au dessus de getter dont la saisie est obligatoire puis le message à afficher si l’utilisateur ne saisit pas le champ.
◦ Le message apparaitra dans la jsp à l’endroit de la balise: <s:actionmessage/>
Gestion des erreurs de saisie – méthode 2
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 34: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/34.jpg)
Via le contrôleur, dans la fonction execute()◦ if(getUsername().equals("") ||
getPassword().equals("")){ addActionError("Données manquantes "); return ERROR;
◦ }
Gestion des erreurs de saisie – méthode 3
Cyrille Coin, Pierre Combe, Mathieu Jehanno
![Page 35: Présentation JAXB et STRUTS²](https://reader035.vdocument.in/reader035/viewer/2022062520/56816498550346895dd66fbd/html5/thumbnails/35.jpg)
Cyrille Coin, Pierre Combe, Mathieu Jehanno
Présentation de l’application