dojo carol mcdonald, java architect, updated and adapted by michel buffa

54
Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

Upload: ginette-berard

Post on 03-Apr-2015

107 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

Dojo

Carol McDonald, Java Architect,Updated and adapted by Michel Buffa

Page 2: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

2

Problèmes avec Ajax

• JavaScript > Support inconsistant entre

browsers> Nécessite des tests cross browsers> Le code peut devenir difficile à

developper, debugger, et maintenir

Page 3: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

3

Dojo Client SideDojo Client SideJavaScript LibraryJavaScript Library

Page 4: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

4

Qu'est-ce que le Dojo Toolkit?

• Ensemble Open Source de librairies JavaScript • Simplifie le code javascript • Appartient à Google aujourd'hui (qui a racheté Jot)• Supporté par

> IBM, Sun, JotSpot, SitePen, Renkoo, AOL TurboAjax, OpenLaszlo, Nexaweb, Bea Systems

• http://dojotoolkit.com/• Indépendant de la techologie serveur et des

langages utilisés (java, c#, python, ruby...)

source: dojotoolkit.org

Page 5: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

5

Les librairies du Toolkit Dojo

Page 6: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

6

Dojo 3 parties : Dojo

> Support cross-browser, chargement des packages , accès et manipulation du DOM, debugger Firebug Lite, évènements, composants MVC, Drag and drop, appels Ajax asynchrones, encodage, décodage JSON

dijit > Widgets, Contrôles avancés d'interface

utilisateur,système de template

dojoX> innovations: graphiquess, support du mode offline,

widgets évolués comme les tableaux (grid), etc

Page 7: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

7

IntégrerIntégrer dojo à une dojo à une applicationapplication

Page 8: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

8

1) L'application télécharge des morceaux de Dojo depuis le net :

Google:

<SCRIPT TYPE="text/javascript" SRC= ”http://ajax.googleapis.com/ajax/libs/dojo/1.3/dojo/dojo.xd.js"></SCRIPT>

La balise script est utilisée pour charger le script dojo.js, toujours obligatoire.

Page 9: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

9

2) Ajouter Dojo dans son application (il sera déployé avec l'application)

• Downloader depuis http://dojotoolkit.org/downloads

• Unzipper le fichier à côté des pages web ou jsp du projet.

• Inclure dojo comme ceci dans les pages qui l'utilisent

<script type="text/javascript" djConfig="parseOnLoad: true" src="dojo-release-1.3.2/dojo/dojo.js"> </script>

Pas de “/” ici ! Le système de chargement des packages chargera toutes les dépendances s'il y en a !

Page 10: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

10

Dojo dans son application

Ici dojo a été mis sous le répertoire js (classique lorsque on utilise plusieurs frameworks), dans le répertoire qui contient les pages web ou jsp (le repertoire “web” du projet netbeans par exemple)

Page 11: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

11

3) Installer une fois pour toute Dojo sur le serveur (recommandé)• Que ce soit Tomcat ou Glassfish, dézipper Dojo

dans le docroot du serveur, par exemple> C:\Sun\AppServer\domains\domain1\docroot\

dojo-release-1.3.2> C:\Program Files\Apache Software Foundation\

Apache Tomcat 6.0.18\webapps\ROOT\dojo-release-1.3.2

• Et l'inclure dans l'application :

<script type="text/javascript" djConfig="parseOnLoad: true" src=“/dojo-release-1.3.2/dojo/dojo.js"> </script>

“/” obligatoire ici, l’inverse de ce qu’on a vu précédemment !

Page 12: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

12

Dojo contient plusieursDémonstrationsPar exemple : themeTester.html

Page 13: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

13

Exemples de widgets issus de dijit

Page 14: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

14

Choses à faire dans une page pour utiliser Dojo

<head> <style type="text/css"> @import "js/dojo/resources/dojo.css";"; </style> <script type="text/javascript" src="js/dojo/dojo.js" djConfig="parseOnLoad: true" isDebug: true > </script></head> Cette ligne indique qu'on va

activer le mode debug : celava générer des messages encouleur pour firebug

Mais si on est pas sous Firefoxavec Firebug, Dijo inclut unmini debugger pour les autresbrowsers : firebug lite !

Charger la CSS Dojo

Page 15: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

15

Exemple de traces dans le debugger : console.log("log button clicked");console.debug("debug button clicked");console.info("info button clicked");console.warn("warn button clicked");console.error("error button clicked");

Page 16: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

16

Logging avec firebug lite dans IE console.log("log button clicked");console.debug("debug button clicked");console.info("info button clicked");console.warn("warn button clicked");console.error("error button clicked");

Page 17: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

17

Dijit = Dijit = dojo Widgetdojo Widget

Page 18: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

18

dijit est une couche au-dessus de Dojo

Les widgets Doko

Page 19: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

19

Qu'est-ce qu'un widget Dojo ?

• Un élément de GUI comme un button, text box, scroll bar, calendar, tree etc> Facile à utiliser, déclaratif (comme xhtml)> On peut associer des événements (écouteurs) à des

widgets> On ne se préoccupe plus de problèmes de

compatibilité entre navigateurs

• HTML+CSS sont pris en compte par JavaScript via Dojo

Page 20: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

20

Exemple déclaratif de button<head> <style type="text/css"> @import "js/dijit/themes/tundra/tundra.css"; @import "js/dojo/resources/dojo.css"; </style> <script type="text/javascript" djConfig="parseOnLoad: true" src="js/dojo/dojo.js" ></script> <script type="text/javascript"> dojo.require("dijit.form.Button"); </script></head><body class="tundra">

<button dojoType="dijit.form.Button" onclick="call_function"> Log Button</button>

Charger la CSS de Dijit

Style/thème pour les widgetsCharger le module

Pour les widgets déclaratifs

Page 21: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

21

Même exemple mais par programmation<head> ... <script type="text/javascript"> dojo.require("dijit.form.Button");

var myButton = new dijit.form.Button( {title:"Log Button"}, dojo.byId("someDiv")); </script>...</head><body class="tundra">

<div id="someDiv"></div>

</body>

Page 22: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

22

Widgets pour formulaires• CheckBox, RadioButton,ComboBox,

CurrencyTextBox, DateTextBox, NumberTextBox, Slider, ValidationTextBox, Textarea

• Attributs: disabled: Boolean• Methodes:

> focus donne le focus focus à ce widget > getValue donne la valeur du widget. > setValue modifie la valeur du widget. > reset reset de la valeur du widget > Undo remet la dernière valeur

• Points d'extension: onChange: ce sont des écouteurs (callbacks)

Page 23: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

23

Exemple dijit.form.DateTextBox

<script>dojo.require("dijit.form.DateTextBox");</script><body><input type="text" name="date1" value="2005-12-30"dojoType="dijit.form.DateTextBox"required="true" />

Page 24: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

24

Dijit, widgets de Layout• Accordion Container,Content Pane, Layout

Container, Split Container, Stack Container, Tab Container

Page 25: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

25

Exemple dijit.layout.AccordionContainer<script>dojo.require("dojo.parser");dojo.require("dijit.layout.AccordionContainer");</script><body><div dojoType="dijit.layout.AccordionContainer" duration="200" style="margin-right: 30px; width: 400px; height: 300px; overflow:

hidden"> <div dojoType="dijit.layout.AccordionPane" selected="true"

title="Pane1"> <p > some text ...</p > <!-- contenu html --> </div> <div dojoType="dijit.layout.AccordionPane"

title="Pane2" href="tab1.html" > <!-- c'est un URL !

Chargé en Ajax ! --> </div></div>

Page 26: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

26

Dijit menus et boutons• Button, ComboButton, DropDownButton, Menu,

Toolbar

Page 27: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

27

Exemple dijit.Menu<script>dojo.require("dojo.parser");dojo.require("dijit.Menu");</script><body><div dojoType="dijit.Menu" id="submenu1" contextMenuForWindow="true" style="display:

none;"> <div dojoType="dijit.MenuItem" iconClass="myIcon" onClick="alert('Hello world');"> Enabled Item

</div> <div dojoType="dijit.PopupMenuItem" id="submenu2"> Enabled Submenu <div dojoType="dijit.Menu"> <div dojoType="dijit.MenuItem" onClick="alert('Submenu 1!')"> Submenu Item One</div> . . .</div>

Page 28: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

28

Fonctions dojo Fonctions dojo indispensablesindispensables

Page 29: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

29

Fonctions Dojo

• dojo.byId("id");> Equivalent à : document.getElementById("someid");

• dijit.byId("id");> renvoie une instance de Dijit widget;

• dojo.addOnLoad("functionname"); > Appelle la fonction une fois que toute la page

et tous ses scripts ont été chargés.

Page 30: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

30

Dojo Query

// Query par tag xhtml. Equivalent à // document.getElementsByTagName("IMG");

dojo.query("img"); // Query par classe. dojo.query(".progressIndicator"); // Query par id. Equivalent à // document.getElementById("widget123");// ou dojo.byId("widget123")

dojo.query("widget123");

Page 31: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

31

Dojo For Each

• dojo.forEach(collection, function(item) { console.debug(item); } );

> Execute une fonction dans une boucle for• dojo.query("select", document).forEach("item.disabled = true;");> désactive tous les tags SELECT de la page

Page 32: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

32

Dojo et les événementsDojo et les événements

Page 33: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

33

dojo et la gestion des événements

Dojo• Simplifie le système de gestion des événements

de JavaScript • Permet de connecter une fonction que vous

avez écrite à : > Un événement DOM, par exemple un click sur un lien

<a href>.> un événement généré par un objet, par exemple une

animation qui démarre> Un autre appel de function : permet de déclencher

des réactions en chaine.> Un topic, dans lequel d'autres objets peuvent publier.

Page 34: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

34

dojo.event.connect(srcObj,"srcFunc", targetFunc);

function myFunction() { alert("dojo.connect handler");

}

var link = dojo.byId("mylink");

dojo.event.connect(link, "onclick", myFunction);

<a href="#" id="mylink">Click Me</a>

Page 35: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

35

Connecter des Objects et des Fonctions var someObject = {

bar: function() { console.debug("Bar fired!");

return 14; }

}

var anotherObject = {

anotherBar: function () { console.debug("anotherBar fired!"); }

}

dojo.connect(someObject, "bar", anotherObject, "anotherBar");

sourceObj, "sourceFunc", targetObj, “targetFunc”

Page 36: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

36

Déconnecter des Fonctions

objectConnections[1]= dojo.connect(someObject, "baz", anotherObject, "afterBaz");

dojo.disconnect(objectConnections[1]);

Page 37: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

37

S'abonner et publier dans un Topic (équivalent de messages qui déclenchent des actions, cf JMS)var unObjet = {

method1: (param1, param2) {

console.debug("f1 appelée avec: "+ param1+" et : " + param2); return; },

}

topics[1] = dojo.subscribe("MesMessages", "unObjet", method1);

dojo.publish("MesMessages", ["Alex", "Russell"]);

dojo.unsubscribe(topics[1]);

Page 38: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

38

Appels Ajax : Appels Ajax : XMLHttpRequest (XHR):XMLHttpRequest (XHR):dojo.xhrDelete(), dojo.xhrDelete(), dojo.xhrGet(), dojo.xhrGet(), dojo.xhrPost(), dojo.xhrPost(), dojo.xhrPut()dojo.xhrPut()

Page 39: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

39

Web traditionnel AJAX

within a browser, there is AJAX engine

Page 40: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

40

Envoie de requête, récupérer la réponse d'un serveur <script type="text/javascript"> dojo.xhrGet({ url: 'sayHello', load: helloCallback, error: helloError, content: {name: dojo.byId('name').value } });

</script>

Appeler un url

Fonction de callback

Contenu à envoyer

En cas d'erreur, on appellecette fonction.

Page 41: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

41

Dojo Hello WorldDojo Hello World

Page 42: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

42

Connecter un événement à un Widget (bouton ici)

<head>... <script type="text/javascript"> dojo.require("dijit.form.Button"); </script>...</head><body class="tundra">

Name: <input name="Name" id="name" type="text" />

<button dojoType="dijit.form.Button" id="helloButton"> Hello World! <script type="dojo/method" event="onClick"> makeAjaxCall(); </script></button>

</body> On déclare un écouteur avec le type dojo/method

Page 43: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

43

Suite...<head> <script type="text/javascript"> function makeAjaxCall(){ dojo.xhrGet({ url: 'sayHello.jsp', load: helloCallback, error: helloError, content: {name: dojo.byId('name').value } }); } function helloCallback(data,ioArgs) { dojo.byId("returnMsg").innerHTML = data; } </script></head><body> Name: <input name="Name" id="name" type="text" /> <button dojoType="dijit.form.Button" <script type="dojo/method" event="onClick"> makeAjaxCall(); ... <p id=returnMsg></p>

call url

Callback function

Content to send

On error function

Page 44: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

44

La page sayHello.jsp (attention, jdk 1.6 !)

<% String returnString = request.getParameter("name");

if (returnString == null || returnString.isEmpty()) { // Return error message returnString = "Name is required."; out.print("Error: " + returnString); } else { // Return the name out.print("Hello: " + returnString); }%>

Page 45: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

45

dojo.xhrPost pour envoyer un formulaire <head> <script type="text/javascript"> function makeAjaxCall(){ dojo.xhrPost({ url: 'sayHello', load: helloCallback, error: helloError, form: 'myForm' }); } function helloCallback(data,ioArgs) { dojo.byId("returnMsg").innerHTML = data; } </script></head><body> <form id="myForm" method="POST"> Name: <input type="text" name="name"> </form> <button dojoType="dijit.form.Button" <script type="dojo/method" event="onClick"> makeAjaxCall();

<p id=returnMsg></p></body>

xhrPost

Formulaire

Page 46: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

46

Dojo MVCDojo MVC

Page 47: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

47

Echange de données JSON

var cobblers = [

{"filling": "peach", "timeToBake": 30 },

{"filling": "cherry", "timeToBake": 35 },

{"filling": "blueberry", "timeToBake": 30}

];

{ "cobblers": [

{"filling": "peach", "timeToBake": 30 },

{"filling": "cherry", "timeToBake": 35 },

{"filling": "blueberry", "timeToBake": 30}

]

}

Objets javascript Dans le code

Ce qui est envoyé sur le réseau, Presque pareil !

Page 48: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

48

Envoi de paramètre en JSONdojo.xhrGet( {

// ici l'URL de ma servlet par exemple.

url: "validateServlet",

handleAs: "json", load: function(responseObject, ioArgs) {

// Prints "peach"

console.dir(responseObject.cobblers[0].filling);

return responseObject;

}

// More properties for xhrGet...

});

Page 49: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

49

Exemple dijit.form.FilteringSelect

Le fichier states.json contient :

{identifier:"abbreviation", items: [ {name:"Alabama", label:"Alabama",abbreviation:"AL"}, {name:"Alaska", label:"Alaska",abbreviation:"AK"}, . . . {name:"Wisconsin", label:"Wisconsin",abbreviation:"WI"}, {name:"Wyoming", label:"Wyoming",abbreviation:"WY"}]}

Page 50: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

50

Exemple dijit.form.FilteringSelect

<script> dojo.require("dojo.parser"); dojo.require("dijit.form.FilteringSelect"); dojo.require("dojo.data.ItemFileReadStore");</script></head><body> <div dojoType="dojo.data.ItemFileReadStore" jsId="stateStore" url="states.json"></div> <form method="post"> <input dojoType="dijit.form.FilteringSelect" store="stateStore" searchAttr="name" name="state1" autocomplete="true" /> <input type="submit" value="Go!" /> </form>

Le menu select est la vue

Lecture des donnés, c'est le modèle

Page 51: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

Drag and DropDrag and Drop

Page 52: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

54

Drag and Drop<script> dojo.require("dojo.dnd.source"); dojo.require("dojo.parser"); </script>

<h3>Source 1</h3><div dojoType="dojo.dnd.Source" jsId="c1" class="container"> <div class="dojoDndItem">Item Alpha</div> <div class="dojoDndItem">Item Beta</div> <div class="dojoDndItem">Item Gamma</div> <div class="dojoDndItem">Item Delta</div></div>

<h3>Pure Target 2</h3><div dojoType="dojo.dnd.Target" jsId="c2" class="container"> <div class="dojoDndItem">One item</div></div>

source

target

Page 53: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

55

Conclusion

• Dojo = gros support, très puissant,• Modulaire (on ne charge pas toute la librairie à

chaque fois)• Bon choix si besoin en GUI importants• Nombreux modèles disponibles (stores pour

flickr, google, youtube, etc.)

Page 54: Dojo Carol McDonald, Java Architect, Updated and adapted by Michel Buffa

56

Ressources web intéressantes

• Le livre “The Book of dojo” sur le site officiel:> http://dojotoolkit.org/

• Cours et Tps sur :• http://www.javapassion.com/ajaxcodecamp

• Très nombreux exemples à copier/coller sur • http://www.dojocampus.org• En particulier suivre le lien “dojo explorer”