le portails d’entreprise

59
STIME/DT - Alain Paoli - 2000 1 Le Portails d’Entreprise

Upload: imogene-montana

Post on 31-Dec-2015

38 views

Category:

Documents


1 download

DESCRIPTION

Le Portails d’Entreprise. Plan. Les Portails d’Entreprise Définition Les problèmes à résoudre Les technologies, leur apports, leurs limitations Servlet, JSP XML, DOM, DTD et Schema, XSLT, XForms Cocoon Récapitulatif Apports / Limitations des technologies présentées - PowerPoint PPT Presentation

TRANSCRIPT

STIME/DT - Alain Paoli - 2000 1

Le Portails d’Entreprise

STIME/DT - Alain Paoli - 2000 2

Plan

• Les Portails d’Entreprise– Définition

– Les problèmes à résoudre

• Les technologies, leur apports, leurs limitations – Servlet,

– JSP

– XML, DOM, DTD et Schema, XSLT, XForms

– Cocoon

• Récapitulatif– Apports / Limitations des technologies présentées

– Problèmes / Solutions

• Proposition

STIME/DT - Alain Paoli - 2000 3

Portails d’Entreprise (EIP)

• Objectif: Intégrer l’information pour améliorer la productivité et la réactivité de l’entreprise– Premières applications: rapports financiers, statistiques

ventes / achats

• Définition: Un point d’accès unique et personnalisé à des sources d’informations variées

• Forte croissante:– 80% des 500 premières entreprises mondiales sont en

train de déployer un portail (estimation Gartner Group)

STIME/DT - Alain Paoli - 2000 4

STIME/DT - Alain Paoli - 2000 5

Degrés de variabilités• Deux niveaux de personnalisation

– Page • Style

• Choix des portlets et leur mise en page (lignes, colonnes)

– Portlet• Contenu du Portlet (peut être dynamique)

• Deux types de contenus pour un Portlet– résumé

– complet

• Deux types de pages– Bureau : montre plusieurs portlets

– Zoom: montre un seul portlet + Bannière et barre de navigation

STIME/DT - Alain Paoli - 2000 6

Portails d’Entreprise

• Fonctionnalités– Bureau personnalisé

– Pages composées de modules indépendants (Portlets)

– Agrégation d’informations en provenance de sources très variées

• Bases de données, Bases documentaires, Messagerie, Sites Web

– Applications simples• Formulaires de saisie

• Requêtes (dans annuaire LDAP, base documentaire, …)

– Accessible via divers types de terminaux (Navigateur sur PC, Organiseur, Téléphone WAP, ….)

STIME/DT - Alain Paoli - 2000 7

Les Problèmes à résoudre• Maintenir une session

• Maintenir un profil utilisateur– Préférences du bureau personnalisé (liste des portlets composant la page

bureau)

– Droits aux diverses sources d’informations et applications (portlets)

– La structure du profil doit pouvoir évoluer

• Agréger des sources d’informations très diverses– La composition d’une page nécessite de multiples requêtes

• Gérer des formulaires

• Composer dynamiquement les pages par un assemblage de portlets– En fonction du profil utilisateur

– En fonction du type de terminal

STIME/DT - Alain Paoli - 2000 8

Les technologies classiques

Servlet, JSP

STIME/DT - Alain Paoli - 2000 9

Servlet

STIME/DT - Alain Paoli - 2000 10

Servlet - Principe• Une instance d’une classe qui implémente l’interface

javax.servlet.http.HttpServer reçoit les requêtes HTTP.

• Les requêtes HTTP transmises spécifient le nom (ou classe du Servlet) appelé.

• Quand l’objet javax.servlet.http.HttpServer reçoit une requête HTTP:– S'il n'existe pas encore d'instance du Servlet correspondant à la

requête HTTP, il en crée une.

– Il appelle une méthode de cette instance, pour traiter la requête, à l'intérieur d'un nouveau processus léger (ou "thread") qui est créé pour l'occasion:

• doGet (pour les requêtes HTTP GET)

• doPost (pour les requêtes HTTP POST)

STIME/DT - Alain Paoli - 2000 11

Servlet - Idiomeimport java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

public class MonServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

// Utiliser l’objet "request" pour lire les headers HTTP (e.x. cookies)

// et les paramètres transmis par un formulaire HTML

// Utiliser l’objet "response" pour écrire la ligne HTTP réponse avec ses headers

// (e.x. spécifier le MIME type, passer des cookies).

PrintWriter out = response.getWriter();

// Utiliser l’objet "out" pour écrire la page réponse envoyée au navigateur

out.println("<HTML>\n" + "<HEAD><TITLE>Hello WWW</TITLE></HEAD>\n" + "<BODY>\n" +

"<H1>Hello WWW</H1>\n" +

"</BODY></HTML>");

}

}

STIME/DT - Alain Paoli - 2000 12

Session

• Session: maintenue par cookie temporaire ou insertion d ’un paramètre dans la requête.

– Un contexte est maintenu pour un utilisateur• HttpSession session = request.getSession(true);

// récupère la session courante. En crée une si besoin est

• session.setAttribute("o1", objet1); // stocke un objet

• MaClasse o = session.getAttribute ("o1"); // retrouve l’objet

• Enumeration enumAttNames = session. getAttributeNames();

– Méthodes:• getCreationTime(): long Date de création de la session

• getId(): String Identifiant de la session

• getLastAccessedTime() : long Date dernière requête

• get/setMaxInactiveInterval(int): nb de millisecondes d’inactivité

• isNew(): boolean vrai si la session vient d’être crée

STIME/DT - Alain Paoli - 2000 13

JSP

• But:– Séparer les parties statiques des parties dynamiques

d’une page• Pouvoir utiliser les outils classiques pour la partie statiques des

pages HTML

– Inclusion de code Java dans les pages HTML• Le code Java est inclus entre des tags ‘<%’  et ‘%>’

• L’extension de la page doit être ‘.jsp’

• Le code HTML et le code Java sont compilés dans un servlet dont le source est généré automatiquement lors de la première requête sur la page

STIME/DT - Alain Paoli - 2000 14

Expression JSP

• Sert à inclure une valeur dans le flot de sortie (page réponse)

• Syntaxe:– <%= expresssion Java %>

• Exemple:– <p>Aujourd’hui: <%= new java.util.Date() %> </p>

• L’expression Java est évaluée, convertie en une string, et insérée dans la page. Cette évaluation est faite lors du traitement de la requête HTTP.

STIME/DT - Alain Paoli - 2000 15

Scriptlet JSP• Permet d’insérer n’importe quel code Java

– Syntaxe: <% code Java %>

<% if (Math.random() < 0.5) { %>

Vous avez <B>gagné</B>!

<% } else { %>

Vous avez <B>perdu</B>!

<% } %>

• Sera compilé en quelque chose comme:if (Math.random() < 0.5) {

out.println(”Vous avez <B>gagné</B>!");

} else {

out.println(" Vous avez <B>perdu</B>!");

}

STIME/DT - Alain Paoli - 2000 16

Actions• jsp:useBean:

– <jsp:useBean id="user" class="appli.User" scope="session"/>

– Cette action associe un Bean, instance de la classe spécifiée par ‘class’, avec une portée spécifiée par ‘scope’, avec la référence spécifiée par ‘id’.

– Si une instance associée avec la même référence n’est pas trouvée dans la portée, une nouvelle instance est crée.

– Portée: quatre valeurs possibles• application: bean visible de toutes les pages, pour toutes les sessions

• session: bean visible de toutes les pages pour une session considérée

• requête: bean visible de toutes les pages participant à une requête

• page: bean visible dans la page considérée

• jsp:setProperty– <jsp:setProperty name="user" property="*" />

– Positionne toutes les propriétés du Bean avec les valeurs passées en paramètres dans la requête, de telle façon qu’un paramètre de nom ‘prop’ positionnera la valeur d’une propriété de nom ‘property’ (i.e. ce Bean est muni d’un ‘setter’ setProp()), en faisant au préalable des conversions implicites.

STIME/DT - Alain Paoli - 2000 17

Exemple

• Gérer un formulaire d’identification– L’utilisateur doit saisir son logon et son mot de passe, puis cliquer

sur ’OK’• Si pas de logon ou de mot de passe saisi: message d’erreur affiché

dans la page réponse.

• Si utilisateur inconnu (logon ou mot de passe non enregistré): message d’erreur affiché dans la page réponse.

• Si erreur, on affiche à nouveau le formulaire avec valeurs saisies et message d’erreur

• Sinon, on affiche la page d’accueil.

– Architecture• Une page JSP affichant le formulaire + message d’erreur

• Un Bean User + un Bean Contrôleur du dialogue

STIME/DT - Alain Paoli - 2000 18

Page JSP<jsp:useBean id="user" class="User" scope="session"/>

<jsp:setProperty name="user" property="*"/>

<jsp:useBean id="controler" class="IdentificationControler" scope="page"/>

<% controler.process(request, response); %> <!-- appel du contrôleur - ->

<html> <body>

<form method="post" action="identification.jsp?state=control">

<p>Votre email

<input type="text" name="logon" size="40" value="<%= user.getLogon() %>">

<p>Mot de passe

<input type="password" name="pass" maxlength="10" size="10" value="<%= user.getPass() %>">

<p><input type="submit" name="submit" value="Entrée">

</form>

<p><%= controler.getErrorMessage() %>

</body>

</html>

STIME/DT - Alain Paoli - 2000 19

Bean Userpublic class User {

private String logon = "";

private String pass = "";

public User() { // constructeur

}

public String getLogon() {

return logon;

}

public String getPass() {

return pass;

}

public void setLogon(String logon) {

this.logon = logon;

}

public void setPass(String pass) {

this.pass = pass; }

}

STIME/DT - Alain Paoli - 2000 20

import javax.servlet.http.*;

public class IdentificationControler {

private String errorMessage = "";

public void process(HttpServletRequest request, HttpServletResponse response) {

try {

if (request.getParameter("state") == null) { // état: initialisation

return;

String logon = request.getParameter("logon"); String pass = request.getParameter("pass");

if (logon.equals("") || pass.equals("")) {

errorMessage = "<b>Erreur: vous n'avez pas saisi votre identifiant ou votre mot de passe</b>";

return; }

User user = (User) request.getSession().getAttribute("user");

if (!isRegistred(user)) {

errorMessage = "<b>Erreur: vous n'êtes pas enregistré comme utilisateur</b>";

return; }

response.sendRedirect("accueil.jsp"); //sendRedirect() doit être fait avant écriture du tag <html>

} // end try

catch(IOException e) { errorMessage = "<b>Erreur: Fichier " + nextJSP + " introuvable.</b>"; }

}

}

public boolean isRegistred(User user) { // retourne true si l’utilisateur est connu, et false sinon

}

}

STIME/DT - Alain Paoli - 2000 21

Exécution• (1) Affichage du formulaire pour la première fois / session:

– requête HTTP GET: http://localhost:8080/MyPortal/Identification.jsp

– Création du bean User (logon et pass initialisé à "")

– Création d’une instance du contrôleur (sa portée est  "page")• attribut errorMessage initialisé à "" 

• sa méthode process ne fait rien (pas de paramètre "state" dans la requête).

• (2) Saisie du logon et du pass et envoi– Récupération du bean User (logon et pass contiennent les valeurs saisies)

– Création d’une instance du contrôleur (sa portée est  "page")• attribut errorMessage initialisé à "" 

• il y a un paramètre  "state" avec la valeur "control" : la méthode process vérifie les valeurs saisie et vérifie que l ’utilisateur est enregistré

– Si OK: redirige la requête vers  "accueil.jsp"  

– Sinon positionne un message d’erreur dans errorMessage . Le message sera affiché par l’exécution du l’expression : <%= controler.getErrorMessage() %>

STIME/DT - Alain Paoli - 2000 22

JSP: Limitations• Insertion de code Java dans du code HTML

– Pas de séparation entre contenu et présentation

– Le flot de contrôle du code Java doit suivre l’ordre d’écriture dans le flot de sortie

– Comment gérer plusieurs types de terminaux ?

Portlet 1

Code HTML de Mise en Page

Portlet 2

Portlet 3 Portlet 4

<html><table> <tr> <td>… Portlet 1 </td> <td>… Portlet 2 </td> </tr> <tr> <td>… Portlet 3 </td> <td>… Portlet 4 </td> </tr></table></html>

Page

Flot decontrôle

Flot desortie

STIME/DT - Alain Paoli - 2000 23

Solution• Deux étapes:

– (1) Générer le contenu sous la forme d’une arborescence Page / Portlets, chaque Portlet ayant sa structure propre.

• Pouvoir construire le contenu des portlet dans n’importe quel ordre.

– (2) Générer la présentation pour l’ensemble en fonction du type de terminal

Page

Portlet 1 Portlet 2 Portlet 3 Portlet 4

STIME/DT - Alain Paoli - 2000 24

XML

STIME/DT - Alain Paoli - 2000 25

Définition• XML est une norme (recommandation) du W3C (World Wide

Web Consortium): http://www.w3.org– En charge de la définition de standards du Web (HTML)

– Rassemble des entreprises et des chercheurs• Labos: Massachusetts Institute of Technology (MIT), Institut

National de Recherche en Informatique et Automatique (INRIA), Keio University of Japan.

• Nombreux standards connexes à XML:– Définis par le W3C (XSL, DOM, Schema, RDF)

– Définis par des entreprises ou consortiums indépendants du W3C : OASIS, Biztalk, WAP Forum

– Des standards de fait : SAX

STIME/DT - Alain Paoli - 2000 26

Définition

• XML: eXtensible Markup Language– Méta-langage permettant de définir des documents ou

messages (flots) structurés.

– Documents édités (sérialisés) sous forme de données encadrées par des balises (Tags).

• Les balises sont exprimées comme en HTML

<hello>Hello World !</hello>

• XML permet de définir des informations:– semi-structurées

– extensibles: on peut définir ses propres balises

– auto-documentées (par les balises)

STIME/DT - Alain Paoli - 2000 27

Définition• XML définit les règles syntaxiques que doivent

respecter les documents XML bien formés.– Le document a une structure d ’arbre

• une seule balise (racine) au sommet

• à chaque balise ouvrante correspond une balise fermante

• tout élément fils est entièrement contenu dans son père

Document bien formé Document mal formé

<?xml version="1.0"?><livre isbn="1-55860-622-x"> <titre>Data on the Web</titre> <auteur>Serge Abiteboul</auteur> <resume>Des relations aux données semi-structurées et XML </resume></livre>

<?xml version="1.0"?><livre isbn="1-55860-622-x"> <titre>Data on the Web</titre> <auteur>Serge Abiteboul</auteur> <resume>Des relations aux données semi-structurées et XML</livre> </resume><annexe>…</annexe>

attribut

STIME/DT - Alain Paoli - 2000 28

Compréhension des informationsMenu

Saumon Fumé

Canard Rôti Pommes de Terres

Profiteroles

Seule la présentationet le sens permettentd ’identifier la structure

<?xml version="1.0"?><menu date="12-02-00"> <entree>Saumon fumé</entree> <plat> <viande>Canard Rôti</viande> <garniture>Pommes de Terre</garniture> </plat> <dessert>Profiteroles</dessert> </menu>

Des marqueurs (balises)explicitent la structure

Seul le contenu est décrit(pas de présentation)

Menu;Saumon Fumé;Canard Rôti...

Informations non explicites

STIME/DT - Alain Paoli - 2000 29

Document Object Model• Le DOM est une recommandation du W3C fixant les

types d’objets utilisés pour représenter en mémoire les nœuds d’une arborescence XML

<?xml version="1.0"?>

<annuaire>

<!-- carte de visite -->

<carte id="56321">

<nom>Dupont</nom>

<prenom>Alfred</prenom>

</carte>

</annuaire>

Document

Element

Attribute

Text

annuaire

Element

Element carteComment

carte de visite

56321 nom prenom

Dupont Alfred

Element

Text

STIME/DT - Alain Paoli - 2000 30

Document Object Model

• Dans le modèle DOM, tout objet est un nœud de type Node. Le nœud racine du document est un objet Document.– L’objet Element représente les balises contenues dans le document

XML. Le nœud Document ne peut posséder qu’un seul fils de type Element.

– Le nœud Text traduit le contenu textuel d’un Element ou d’un Attribute (autre sous-classe de Node).

• Ces types sont définis en IDL et sous formes d’interfaces Java– Nombreuses méthodes réparties sur les différents types pour:

• Créer les différents types de nœuds

• Ajouter / Supprimer / Remplacer un fils ; obtenir la liste des fils

• Accéder / Positionner le père

• Accéder / Positionner un attribut ; obtenir la liste des attributs

• Cloner un nœud.

STIME/DT - Alain Paoli - 2000 31

Utilisation d’un DOM

<?xml version="1.0"?>

<annuaire>

<carte id="56321">

<nom>Dupont</nom>

<prenom>Alfred</prenom>

</carte>

</annuaire>

Parser XML

DOM

Sérialiseur XML

Application Java

Le Parser fournitune implémentationdu DOM

Le Sérialiseur utiliseune implémentationdu DOM

L’application Javalit, modifie, ajoute, supprime des nœudsou crée un DOM detoute pièce

STIME/DT - Alain Paoli - 2000 32

import java.io.*; import org.w3c.dom.*; import org.apache.xerces.parsers.*;

import org.apache.xml.serialize.*; import org.xml.sax.*;

public class UseDom {

public static void main(String[] args) {

try {

DOMParser parser = new DOMParser(); // crée le parser

parser.parse("annuaire.xml"); // parse

Document doc = parser.getDocument(); // récupère le DOM

Element annuaire = doc.getDocumentElement(); // récupère la racine annuaire

Element carte = doc.createElement("carte"); // crée un élément <carte>

carte.setAttribute("id", "12345"); // ajoute un attribut à <carte>

annuaire.appendChild(carte); // ajoute le fils <carte> à <annuaire>

Element nom = doc.createElement("nom"); // crée l’élément <nom>

nom.appendChild(doc.createTextNode("Durand")); // positionne valeur de <nom>

carte.appendChild(nom); // ajoute le fils <nom> à <carte>

XMLSerializer serializer = new XMLSerializer(); // crée le sérialiseur

FileWriter fw = new FileWriter("annuaire2.xml"); // crée le flot de sortie

serializer.setOutputCharStream(fw); // positionne le flot dans le sérialiseur

OutputFormat of = new OutputFormat(); // définit un format de sortie

serializer.setOutputFormat(of); // positionne format de sortie dans le sérialiseur

serializer.serialize(doc); // sérialise

fw.close(); // clos le flot de sortie

} catch(IOException e) { } catch(SAXException e) { } }

}

STIME/DT - Alain Paoli - 2000 33

Utilisation d’un DOM

• Le programme précédent produit le document XML suivant:

<?xml version="1.0" encoding="UTF-8"?><annuaire> <carte id="56321"> <nom>Dupont</nom> <prenom>Alfred</prenom> </carte> <carte id="12345"> <nom>Durand</nom> </carte></annuaire>

STIME/DT - Alain Paoli - 2000 34

Validation d’un Document XML• Via un DTD:

– Déclarer les éléments fils d’un élément, et leur cardinalité

– Déclarer les noms d’attributs d ’un élément, et leur caractère obligatoire ou facultatif ou valeur par défaut

• Définir un attribut de type clé unique (ID)

• Définir un attribut de type référence à une clé (IDREF)

• Via un Schema:– Déclarer des types élémentaires et complexe en utilisant des

constructeur de types (union, liste, séquence, agrégation)

– Définir des clés et leur référence

– Définir des types dérivés• par extension: ajout d’éléments ou d’attributs à la structure

• par restriction: en rajoutant des contraintes sur un type

– Utilisation des espaces de noms (namespaces)

STIME/DT - Alain Paoli - 2000 35

Données semi-structurées XML• Relationnel

– Structure de table• Le sens d’une cellule se définit par

rapport au tuple auquel elle appartient et au schéma.

– Algèbre fondée sur relation universelle + {dépendances}

– Contraintes:• Toutes les lignes d’une table possèdent la

même structure

• Toute cellule est d’un type pré-défini atomique

• XML– Structure d’arbre quelconque

• Le sens d’un nœud se définit par rapport à ses ancêtres (contextuellement auto-descriptif)

– Propositions d’algèbres (Datalog)– Contraintes:

• Un nœud a un nombre quelconque de fils

• Types pré-définis de nœuds (Document, Element, Text, …)

TableDocument

Ligne 2

C3 C4 C5

Ligne 1

C1 C2 C3

STIME/DT - Alain Paoli - 2000 36

XSLT

STIME/DT - Alain Paoli - 2000 37

Définition

• XSLT (XML Stylesheet Language Transformation) est un standard XML qui permet de générer un document cible à partir d’un document source– par des opérations de filtrage

– par des transformations

– par des calculs simples

– par des appels à des objets Java

• Il fait partie de XSL (XML Stylesheet Language) qui se décompose en:– XSLT pour la transformation des documents XML (recommandation du

W3C)

– XSL-Formating Object pour la description des informations de mise en page (Working Draft)

STIME/DT - Alain Paoli - 2000 38

Principe de Fonctionnement• La feuille de style décrit

comment le processeur XSLT doit transformer le document XML source.– Elle contient des règles

décrivant les transformations à appliquer sur un nœud (sous-arbre).

• Le résultat de la transformation peut:– être un document XML

– être un document HTML

– être un document texte

– respecter un format propriétaire

Processeur XSLT

Document XML

Source

Feuillede styleXSLT

Document

Cible

STIME/DT - Alain Paoli - 2000 39

Mécanisme de transformation• L’application d’une règle de transformation à un

nœud génère une partie du document cible• Pour transformer un nœud, le processeur

– Trouve la règle la plus prioritaire s’appliquant à ce nœud

– applique la règle de transformation

– lorsqu’une règle s’applique à un nœud, ce nœud est le contexte de référence pour les instructions XSL contenues dans le corps de la règle

<xsl:template match="expression XPath de sélection"> instructions XSLT ou texte littéral à produire ou éléments XML bien formés à insérer</xsl:template>

Partie condition

Partie production

STIME/DT - Alain Paoli - 2000 40

XPath• Normalise la façon de localiser des parties d’un document XML

• Expressions XPath:

<?xml version="1.0"?>

<portlet name="stat" title="Stats"> <stats> <item>

<semaine>43</semaine><value>64</value>

</item> <item>

<semaine>44</semaine><value>16</value>

</item> </stats></portlet>

– "/" sélectionne la racine <portlet>

– "item" sélectionne tous les nœuds <item>

– "item/@title" sélectionne l’attribut "title" pour tous les nœuds <item>

– "item[@title=‘Stats’]" sélectionne tous les nœuds <item> possédant un attribut "title" avec la valeur ‘Stats’

– "item/value" sélectionne les fils <value> pour tous les nœuds <item>

– "." identifie le nœud contexte courant

– ".." identifie le père du nœud contexte courant

STIME/DT - Alain Paoli - 2000 41

Instructions XSLT• <xsl:apply-template/>

– Cette instruction sélectionne les fils du nœud courant (contexte courant) et provoque le traitement sur chacun de ces nœuds.

– Elle peut comporter un attribut select contenant une expression XPath pour ne sélectionner que certains nœuds fils.

• <xsl:value-of select="requête XPath"/>– Traduit le résultat de la requête XPath (un nœud ou un attribut),

appliqué au contexte courant en une chaîne de caractères qui est insérée en lieu et place de cette balise.

• Insère le contenu du nœud ou la valeur de l’attribut sélectionné

• {requête XPath}– Idem <xsl:value-of select="requête XPath"/>, mais doit être utilisé

lorsque la chaîne de caractères résultat doit être insérée en tant que valeur d’attribut d’un élément XML.

STIME/DT - Alain Paoli - 2000 42

<?xml version="1.0"?><?xml-stylesheet href="p5.xsl" type="text/xsl"?><?cocoon-process type="xslt"?>

<portlet name="stat" title="Stats"> <stats> <item>

<semaine>43</semaine><value>64</value>

</item> <item>

<semaine>44</semaine><value>16</value>

</item> </stats></portlet>

<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/"> <html> <body>

<table bgcolor="#CCCCCC"> <tr><td colspan="3" align="center"> <xsl:value-of select="@title"/> </td></tr> <xsl:apply-templates/>

</table> </body> </html> </xsl:template>

<xsl:template match="item"> <tr> <td width="20"> <xsl:value-of select="./value"/>%</td> <td width="60">S <xsl:value-of select="./semaine"/></td> <td width="40"> <img src="o.gif" width="{./value}" height="10"/></td> </tr> </xsl:template></xsl:stylesheet>

STIME/DT - Alain Paoli - 2000 43

Code HTML Généré<html><body><table bgcolor="#CCCCCC"> <tr><td align="center" colspan="3">Stats</td></tr> <tr> <td width="20">64%</td> <td width="60">S43</td> <td width="40"><img height="10" src="o.gif" width="31"></td> </tr>

<tr> <td width="20">16%</td> <td width="60">S44</td> <td width="40"><img height="10" src="o.gif" width="9"></td> </tr>

</table></body></html>

STIME/DT - Alain Paoli - 2000 44

XForms

STIME/DT - Alain Paoli - 2000 45

XForms• XForms est la redéfinition des formulaires HTML en XML

– Recommandation du W3C en cours d’élaboration– Modèle en couches, définition des types et contraintes en Schema ?

Présentation

Logique

DonnéesDonnées stockées

en XML

Définition des types, Données calculées

et contraintes

Présentations alternatives / types de

média

<employe> <identite> <nom>Dubois</nom> <prenom>Pierre</prenom> <sexe> <value>Masculin</value> </sexe> </identite></employe>

<group name="employe"> <group name="identite"> <string name="nom"/> <string name="prenom"/> <string name="sexe"> <value>Masculin</value> <value>Féminin</value> </string> </group></group>

Feuilles de styleXSLT

STIME/DT - Alain Paoli - 2000 46

XForms• Au niveau logique, un modèle décrit la structure du

formulaire (Working Draft du 6 Avril 2000)– Les données sont regroupées en groupes et sous-groupes.

– Données typées (string, date, durée, nombre, booléen)• données mono et multi valuées

– Facettes exprimant :• des contraintes sur les données

– min, max, integer, decimals, format, caractère obligatoire de la donnée

• des règles de calcul simples– extension envisagées pour intégrer des langages de scripts (javascript)

• Problème:– Définition incomplète et déclarée obsolète. Attente nouvelle version

STIME/DT - Alain Paoli - 2000 47

Cocoon 1

http://xml.apache.org/cocoon/

STIME/DT - Alain Paoli - 2000 48

Architecture Cocoon

Requête HTTP DOMDOM Chaîne de n Processeurs

Producteur Formateur

DocumentHTML

PDFWML

….

Méthode service() du Servlet Cocoon

Sourced’information

• La chaîne de production de la page réponse se compose d’un Producteur, de 0 à n Processeur et d’un Formateur:– Le rôle du Producteur est de produire le DOM de la page réponse à la requête

HTTP (à partir d’une ou plusieurs sources d’informations)

– Le rôle d’un Processeur est de traiter le DOM fournit en entrée, et de retourner le DOM modifié ou enrichit. Les processeurs sont spécialisés (LDAP, SQL, …)

– Le rôle du Formateur est d’appliquer une transformation XSLT pour fabriquer la présentation au format ad hoc (HTML, PDF, WML, …)

Feuille destyle XSLT

Réponse à la requête HTTP

STIME/DT - Alain Paoli - 2000 49

Cocoon: Fonctionnalités• Producteurs, Processeurs et Formateur sont des objets Java

– Implémentent une interface donnée. On peut définir ses propres classes.

– Le nom du Producteur est spécifié dans le fichier paramètre ou bien est passé en paramètre dans la requête HTTP

– Les noms des Processeurs et Formateur sont spécifiés dans le document XML retourné par le producteur. Les processeurs sont exécutés dans l’ordre de leur déclaration dans ce DOM

• XSP: c’est le ‘JSP’ de Cocoon pour traiter les parties dynamiques– Syntaxe purement XML.

– Chaque page contenant des balises XSP est compilée sous la forme d’un objet Java qui est utilisé par le processeur XSP.

• Système de cache mémoire– Feuilles de style XSLT parsées une fois, leur DOM est stocké dans le cache.

– Une seule instance de Producteur, Processeur et Formateur par classe, mémorisée dans le cache. Idem pour le parseur XML (Xercès) et le processeur XSLT (Xalan).

– La page réponse produite est stockée dans le cache. Si la même requête est traitée, avec les mêmes paramètres, Cocoon retourne la page stockée dans le cache.

STIME/DT - Alain Paoli - 2000 50

Cocoon: Limitations• Peu adapté à la personnalisation:

– Cache de type tout ou rien (version 1.8): si les pages sont personnalisées, il y a peu de chances qu’on réutilise une même page. Et de plus toute nouvelle page produite est stockée dans le cache (risque de dépassement de capacité mémoire).

– L’unité de la chaîne de production est la page et non le portlet : • L’unité stockée dans le cache est la page

• Compilation de la page en classe Java si utilisation de balises XSP dans la page. Conséquence: si n pages dynamiques, alors il y a n compilations.

• Conséquences, si personnalisation:– On ne peut utiliser le cache (nuit aux performances)

– On ne peut utiliser le mécanisme XSP.

STIME/DT - Alain Paoli - 2000 51

Publication / Composition

• Définitions– La publication consiste à mettre à jour des sources d’informations.

– La composition consiste à fabriquer une page qui agrège des informations en provenance de sources diverses.

• Constat:– Les sources d’informations sont rafraîchies à des intervalles de

temps très divers (de la seconde à plusieurs jours).• La plupart des informations ont une fréquence basse de

rafraîchissement (plusieurs heures à plusieurs jours)

– Les processus de publication et de compositions ne sont donc pas synchrones.

• Ex: arrivée d’un e-mail publication de l’e-mail sous format XML ad hoc (1 fois), puis n composition de pages affichant le contenu de cet e-mail.

STIME/DT - Alain Paoli - 2000 52

Récapitulatif

Problèmes / Solution

STIME/DT - Alain Paoli - 2000 53

Apports / Limitations

Techno Apports Limitations

Servlet Gère la session utilisateur Pas de distinction entreparties statiques etdynamiques des pages

JSP Distinction entre partiesstatiques et dynamiques despages

Pas de distinction entrecontenu et présentation

Cocoon 1.xXMLXSLTXForms

Distinction entre contenu etprésentation.Chaîne de production dont lesmaillons (Producteur,Processeurs, Formateurs)sont ‘plugables’.

Mal adapté à lapersonnalisation : l’unité dela chaîne de production est lapage.Pas de distinction entrepublication et composition depages (sera pris en comptepar Cocoon 2)

STIME/DT - Alain Paoli - 2000 54

Problèmes / Solutions

Problèmes SolutionsMaintient d’une session Utiliser l’API Java Servlet

Maintenir profil utilisateur évolutif Définit le profil en XML

Gérer les droits Définir droits dans annuaire LDAP

Gérer des formulaires Implémenter XForms

Distinguer Contenu / Présentation Cocoon 1.x (XML + XSLT)

Adapter la présentation et filtrer le contenuen fonction du type de terminal

Cocoon 1.x (XSLT)

Personnalisation par assemblage deportlets

? ? ?

Distinguer publication / Composition ? ? ? ou Cocoon 2

STIME/DT - Alain Paoli - 2000 55

Proposition

Pour un Portail

d’Information

d’Entreprise

STIME/DT - Alain Paoli - 2000 56

Mécanisme<?xml version="1.0"?><?xml-stylesheet href="home_page.xsl" type="text/xsl"?><?cocoon-process type="xslt"?>

<page name="/portal/pages/home_page.xml"> <!-- code HTML de mise en page --> <insert-portlet name="stat" content="resume"/> <!-- code HTML de mise en page --></page>

<portlet name="stat" title="Stats"> <resume> <item>

<semaine>43</semaine><value>64</value>

</item> <item>

<semaine>44</semaine><value>16</value>

</item> </resume>

<complete> <item> <!-- détails --> </item> </complete></portlet>

<?xml version="1.0"?><?xml-stylesheet href="home_page.xsl" type="text/xsl"?><?cocoon-process type="xslt"?>

<page name="/portal/pages/home_page.xml"> <!-- code HTML de mise en page --> <insert-portlet name="banniere" content="complete"/> <!-- code HTML de mise en page --> <portlet name="stat" title="Stats"> <stats> <item>

<semaine>43</semaine><value>64</value>

</item> </stats></portlet> <!-- code HTML de mise en page --></page>

+

=

STIME/DT - Alain Paoli - 2000 57

Mécanisme• (0) A l’initialisation du serveur, tous les portlets sont parsés et les DOM

résultats sont chargés dans un cache mémoire commun à tous les utilisateurs.– Contrainte: les portlets ont le même état persistant pour tous les utilisateurs.

• (1) Suite à la réception d’une demande de page (requête HTTP), le Producteur:– Parse le fichier XML décrivant la page et charge le DOM dans la session utilisateur.

– Remplace les balises <insert-portlet> de la page par les balises <portlet> correspondantes (copie / coller).

• Suivant la valeur de l’attribut "content" de la balise <portlet> n’insère que la partie "résumé" ou la partie "complète".

• (2) Si besoin les processeurs traitent le DOM retourné par le Producteur– Un processeur peut être définit pour un portlet donné. Si l’on utilise XSP dans le

portlet, c’est le processeur du portlet qui appelle le processeur XSP.

• (3) Le formateur recherche dans le cache session le flot de caractères HTML.– Si non trouvé, crée la présentation et la stocke dans la session

– Si le contenu d’un des portlets à changé reconstruit la présentation que pour ce portlet

STIME/DT - Alain Paoli - 2000 58

Implémentation XForms<group name="employe"> <group name="identite"> <string name="nom"/> <string name="prenom"/> <string name="sexe"> <value>Masculin</value> <value>Féminin</value> </string> </group>

</group> Formulaire XForms

<form method="post" action="home_page.xml"> Formulaire HTML <input type="text" name="employe/identite/nom" value=""/> <input type="text" name="employe/identite/prenom" value=""/> <input type="radio" name="employe/identite/sexe" value="Masculin"/> <input type="radio" name="employe/identite/sexe" value="Féminin"/> <input type="submit" name="submit" value="OK"/></form>

• Une classe abstraite FormProcessor:– Récupérer la liste des paramètres/valeurs dans la

requête HTTP• Pour chaque paramètre, contrôler la valeur par

rapport aux contraintes définies dans le formulaire, et construire le nœud correspondant dans le DOM Data.

– Appeler la méthode abstraite process()• Un formulaire doit avoir une classe héritant de

FormProcessor et implémentant la méthode process() pour traiter le DOM Data.Correspondances

des noms

STIME/DT - Alain Paoli - 2000 59

Architecture

RequêteHTTP

PageHTML

Moteur de Portail

Producteur Processeur Formateur

Mécanisme de cache

PublicationSQL

PublicationLDAP

PublicationLotus

PublicationEmail

BDRAnnuaire

LDAP Lotus Email

Référentiel XMLA base de fichiers ou base de données XML

Système de publicationGère la fréquence de rafraîchissement suivant les sources d’informations