SlideShare a Scribd company logo
Rich internet application development using the dojo toolkit
Rich Internet Application
         development using
             the Dojo Toolkit


FrOSCon, Sankt Augustin, 20. August 2011
                     Dr. Alexander Kläser
             klaeser at univention dot de
Goal of this presentation

                              Brief overview of existing JavaScript frameworks
                              General overview of Dojo (structure, features, resources)
                                   Know what you can do with it and whether it could help you
                              Some details w.r.t. Rich Internat Application (RIA)
                              development using Dojo




RIA development using the Dojo Toolkit                                                          3
Presentation outline

Overview over JavaScript
Frameworks
Overview over the Dojo Toolkit
Dojo core features
Dojo and Widgets
Presentation outline

Overview over JavaScript
Frameworks
Overview over the Dojo Toolkit
Dojo core features
Dojo and Widgets
Our situtation @Univention
                              Redesign of our administrative web frontend… what it can do:
                                   Domain wide configuration: users, groups, computers, ACLs, DNS,
                                   DHCP, mail, shared folders, printers, Nagios, policies, ...
                                   Computer wide configuration: system statistics, software
                                   management, process overview, ...
                                   Virtual machine management
                                   Thin client services
                                   Management system for school environments (class rooms, …)
                                   ...
                              Solution: rewrite the client side part as RIA (w/AJAX technologies)
                                   Communication with existing server part (written in Python)
                                   A JavaScript library simplifies cross-browser compatibility



RIA development using the Dojo Toolkit                                                               6
JavaScript libraries overview
                              There are many (OpenSource) JavaScript libraries:
                                   Prototype, JQuery, Yahoo UI, Dojo, Mootools, ExtJS, ...




                              Note: "JavaScript Prototype" is not necessarily the library
                              Is the winner JQuery?

RIA development using the Dojo Toolkit                                                       7
Our conclusions
                             JQuery is a very popular library
                                 Great for manipulating the DOM
                                 But, no ready-to-use infrastructure for RIA (see below)
                             ExtJS and Dojo seem to be the only libraries that offer a rich feature set:
                                 Many widgets, consistent API, module management, i18n, l10n, layout management, DOM
                                 manipulation, data abstraction, OOP, theming, data grids, build system etc.
                             ExtJS
                                 Many features and widgets, a very good documentation with tutorials
                                 Development is closed (product of the company Sencha)
                                 Dual licensing model (commercial + LGPL)
                             Dojo
                                 Open development
                                 License: Academic Free License v2.1 and modified BSD license
                                 Non-profit Dojo Foundation holds intellectual property rights
                             ... so the winner is Dojo... (at least in our case)
                             See also: http://dojotoolkit.org/reference-guide/quickstart/introduction/whydojo.html


RIA development using the Dojo Toolkit                                                                                 8
Presentation outline

Overview over JavaScript
Frameworks
Overview over the Dojo Toolkit
Dojo core features
Dojo and Widgets
Statistics about Dojo
                                             (lines of code)




RIA development using the Dojo Toolkit                           10
Statistics about Dojo
                                          (commits per month)




RIA development using the Dojo Toolkit                           11
Statistics about Dojo
                                          (commiters per month)




RIA development using the Dojo Toolkit                            12
Dojo overview
                              Dojo consists of 3 main parts...
                              dojo: the core
                                   Browser normalization, module loading, DOM manipulation, events,
                                   string functions, data access, drag 'n' drop, XHR calls, JSON
                                   encoding/decoding, effects/animations, OOP etc.
                              dijit: interface widgets, advanced UI controls, template driven
                                   Form elements (calendar, dynamic combo boxes, slider etc.),
                                   dialogs, tree, layout, menus, tooltips, WYSIWYG editor etc.
                              dojox: various extra projects, partly experimental
                                   More widgets, charts, data grid, file uploads, dynamic CSS rules,
                                   collections, syntax highlighting, sprintf, more editor plugins, more
                                   animation effects, JSON schema validation, JSON query syntax etc




RIA development using the Dojo Toolkit                                                                    13
Dojo philosophy
                              Non-intrusive
                                   Native objects (e.g., Array, String) are not extended with additional
                                   functionality
                                   Instead extensions are provided in a clean separate namespace
                                   When possible, these extensions (functions) refer to existing, native
                                   implementations of the browser
                              Ease of use and performance
                              Code that is as simple as possible
                              High-quality "full-stack" library
                              Dojo is modular, modules are loaded when need




RIA development using the Dojo Toolkit                                                                     14
How to use Dojo
                          <!DOCTYPE html>
                          <html>
                          <head>
                            <meta charset="utf-8">
                            <title>Tutorial: Hello Dojo!</title>
                            <!-- load Dojo and style sheets for widgets -->
                            <script src="...dojo/dojo.js"></script>
                            <link rel="stylesheet" type="text/css"
                          href="...dojo/resources/dojo.css" />
                            <link rel="stylesheet" type="text/css"
                          href="...dijit/themes/claro/claro.css" />
                            <!-- ... eventually other widget specific CSS files ... -->
                          </head>
                          <body class="claro">
                              <h1 id="greeting">Hello</h1>
                          </body>
                          </html>




RIA development using the Dojo Toolkit                                                    15
Presentation outline

Overview over JavaScript
Frameworks
Overview over the Dojo Toolkit
Dojo core features
Dojo and Widgets
Dojo Base
                              Base: no additional module needs to be loaded
                              Execute JS functions when then DOM is ready: dojo.addOnLoad() /
                              dojo.ready()
                              Packaging mechanism: dojo.require(), dojo.provide()
                                   Separation of code, usage of namespaces improves reusability :)
                                   Namespaces: dojo.foo.bar → dojo/foo/bar.js
                                   Browser can load modules on demand → one module, one file
                                   No need to track dependencies (a module can load another module)
                                   A module is just a file, otherwise there is no restriction (may declare
                                   any kind of class)
                                   Modules in dojo/dijit are already compatible with the AMD API
                                   (Asynchronous Module Definition), see:
                                   http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition


RIA development using the Dojo Toolkit                                                                       17
Dojo Base
                                         (packaging mechanism)

                          // some code...
                          dojo.require("my.Module"); // → my/Module.js
                          dojo.addOnLoad(function(){
                              var m = new my.Module();
                              // ...
                          });

                          // in the package my/Module.js
                          dojo.provide("my.Module");
                          dojo.require("my._ClassBase"); // → my/_ClassBase.js

                          dojo.declare("my.Module", my._ClassBase, {
                              // ... the code ...
                          });



RIA development using the Dojo Toolkit                                           18
Dojo Base
                                           (object oriented programming)
                              Dojo provides tools to make object oriented programming in JS
                              easier (encapsulating the prototype)
                                   Declaring classes w/inheritance: dojo.declare()
                                   Call to parent method: this.inherited(arguments)
                                   Extend existing classes: dojo.extend()
                                   Mixins: dojo.mixin(), dojo.delegate()
                              Use of mixins
                                   A mixin provides certain functionality (methods, variables) via
                                   inheritance
                                   Mixin cannot be instantiated alone
                              For multiple inheritance
                                   Dojo uses C3 linearization (as Python, Perl) to resolve the order in
                                   which methods are inherited


RIA development using the Dojo Toolkit                                                                    19
Dojo Base
                                         (object oriented programming 2)
                          dojo.declare("some.Child", [ some.Parent, some.OtherParent ],
                          {
                              myVal: "default value",

                                constructor: function(args){
                                    // parent constructor is automatically called
                                    dojo.mixin(this, args);
                                }

                                myMethod: function() {
                                    // call overloaded parent method via this.inherited()
                                    this.inherited(arguments);
                                    // mycode...
                                }
                          });

                          var a = new some.Child();
                          var b = new some.Child({ myVal:"x" });
                          // a.myVal == "default value"
                          // b.myVal == "x"


RIA development using the Dojo Toolkit                                                      20
Dojo Base
                                           (signals/events, language tools)
                              Events, signal handling
                                   Normalization of events
                                   Signal mechanism for events/function calls: dojo.[dis]connect()
                                   Publish/subscribe mechanism: dojo.publish(), dojo.subscribe()
                              Language tools
                                   Scoping & function parameters: dojo.hitch(), dojo.partial()
                                   Type checking: dojo.is[String,Array,Function,Object,Alien]()




RIA development using the Dojo Toolkit                                                               21
Dojo Base
                                         (signals/events, language tools 2)
                          obj = {
                              foo: function() { console.log('obj.foo()'); },
                              bar: function() { console.log('obj.bar()'); },
                              val: 42
                          };
                          dojo.connect(obj, 'foo', obj, 'bar');
                          dojo.connect(obj, 'foo', dojo.hitch(obj, function() {
                              // we are in the scope of 'obj'
                              console.log('signal for obj.foo()');
                              console.log('this.val=' + this.val); // this.val == 42
                          }));
                          obj.foo();

                          /* output:
                          obj.foo()
                          obj.bar()
                          signal for obj.foo()
                          this.val=42 */
                          /* full code: http://jsfiddle.net/rTUfr/1/ */

                          // ... it is also possible to connect to DOM-events
                          dojo.connect(domNode, "onclick", dojo.hitch(this, "handleClick"));


RIA development using the Dojo Toolkit                                                         22
Dojo Base
                                         (utilities for arrays, strings, and others)
                              Array utility functions:
                                   Iteration: dojo.forEach(), dojo.map()
                                   Filtering: dojo.filter()
                                   Condition check: dojo.every(), dojo.some()
                                   Index of a given element: dojo.indexOf()
                              String processing:
                                   dojo.trim()
                                   A template mechanism: dojo.replace()
                              JSON conversion: dojo.toJson(), dojo.fromJson()
                              Browser Sniffing: dojo.isIE < 7, isFF, isWebKit ...




RIA development using the Dojo Toolkit                                                 23
Dojo Base
                                               (Ajax calls, dojo.Deferred)
                              Ajax wrapper functions: dojo.xhr[Get,Post,Delete,Put]()
                              Handling of asynchronous events: dojo.Deferred
                                   Asynchronous operation abstraction
                                   Return a dojo.Deferred if the function is asynchronous
                                   Multiple dojo.Deferred can be nested and chained




RIA development using the Dojo Toolkit                                                      24
Dojo Base
                                          (Ajax calls, dojo.Deferred 2)
                          // xhrPost() returns an object of type dojo.Deferred
                          var deferred = dojo.xhrPost({
                              url: '/echo/json/',
                              handleAs: 'json',
                              content: { /* ... a dict of name/string pairs ... */ }
                          });

                          // register callback... then() returns a new deferred
                          deferred = deferred.then(function(data) {
                              var str = '';
                              dojo.forEach(data.messages, function(i) {
                                  str += '<div>' + i + '</div>';
                              });
                              dojo.body().innerHTML = str;
                              return data.value; // return value is fed to next deferred
                          });

                          // deferreds can be chained
                          deferred.then(function(value) {
                              dojo.body().innerHTML += '<div>Value: ' + value + '</div>';
                          });

                          /* full code: http://jsfiddle.net/hMREq/5/ */


RIA development using the Dojo Toolkit                                                      25
Dojo Base
                                         (DOM/CSS manipulation, animation)
                              Querying DOM nodes
                                   With standard CSS3 selectors: dojo.query()
                                   By their ID: dojo.byId()
                                   Chaining of DOM manipulation: dojo.NodeList
                              Placement in the DOM: dojo.place()
                              Manipulation of DOM attributes: dojo.attr()
                              Manipulation of CSS style: dojo.style()
                              Manipulation of CSS classes: dojo.[add,remove,has]Class()
                              Manipulation/querying of DOM node size/position: dojo.coords(),
                              dojo.position(), dojo.[margin,content]Box()
                              Animation: dojo.fadeIn/Out(), dojo.animateProperty()



RIA development using the Dojo Toolkit                                                          26
Dojo Base
                                         (DOM/CSS manipulation, animation 2)
                          // dojo.query uses standard CSS3 selectors
                          // it returns a dojo.NodeList, a subclass of Array
                          dojo.query("ul > li").forEach(function(n){ ... });
                          dojo.query("#mycontainer").addClass("mylist");
                          dojo.query("a").onclick(function(){ ... });
                          dojo.query(".styleA.styleB").map(function(n){ ... });

                          // calls can be chained
                          dojo.query(".container")
                              .addClass('newClass')
                              .fadeIn().play();

                          // other kinds of manipulation
                          dojo.style(domNode, "height", "50px");
                          dojo.place("<p>Hi</p>", dojo.body());
                          dojo.addClass(domNode, "myCssClass");
                          var width = dojo.marginBox(domNode).w;
                          dojo.marginBox(domNode, {w: 300, h: 400});
                          dojo.fadeIn({ node: node }).play();


RIA development using the Dojo Toolkit                                            27
Dojo core
                              Core: everything else below dojo.* that needs to be loaded via
                              dojo.require()
                              Dojo's Dom/Widget parsing package: dojo.parser (→ see dijit)
                              Effects library on top of base animations: dojo.fx.[sizeTo(),
                              slideBy(), crossFade(), wipeTo(), smoothScroll()]
                              Utility classes for internationalization: dojo.i18n
                              More string functions: dojo.string
                              Caching of inline text: dojo.cache()
                              HTTP cookie manipulation: dojo.cookie()
                              Data access/manipulation layer: dojo.store (obsolete API is
                              dojo.data)
                              …


RIA development using the Dojo Toolkit                                                         28
Build system
                              Works transparently with Package System
                              Collects all referenced JS module files of an Dojo application and
                              builds a single minified JS file
                                   Minification: Comments, whitespace, newlines are removed, local
                                   variables names replaced by short ones
                              …




RIA development using the Dojo Toolkit                                                               29
Presentation outline

Overview over JavaScript
Frameworks
Overview over the Dojo Toolkit
Dojo core features
Dojo and Widgets
Dijit
                              dijit = Dojo widgets
                              A widget encapsulates the DOM representation and offers a
                              convenient object-oriented interface
                                   Events, attribute settings, GUI logic, …
                              Widgets are created in a programmatic or a declarative manner
                              Types of widgets:
                                   Layout widgets (border, tabs, accordion, ...)
                                   Form widgets w/validation (drop down, date pickers, popup, ...)
                                   Dialogs, Menus, …
                              Support for i18n
                              Widgets are themeable



RIA development using the Dojo Toolkit                                                               31
Screenshot




                          See: http://download.dojotoolkit.org/release-1.6.1/dojo-release-1.6.1/dijit/themes/themeTester.html




RIA development using the Dojo Toolkit                                                                                          32
Widgets from markup (declarative)
                          <div dojoType="dijit.layout.TabContainer" style="width:
                          100%; height: 100%;">
                              <div dojoType="dijit.layout.ContentPane" title="Tab 1"
                          selected="true">
                                  Content tab 1
                              </div>
                              <div dojoType="dijit.layout.ContentPane" title="Tab 2">
                                  Content tab 2
                              </div>
                          </div>

                          /* specify 'djConfig="parseOnLoad:true' in script tag... */

                          /* ... after loading, Dojo will parse the DOM tree */

                          /* full code: http://jsfiddle.net/H4DXH/ */




RIA development using the Dojo Toolkit                                                  33
Widgets from code (programmatic)
                          dojo.require("dijit.layout.TabContainer");
                          dojo.require("dijit.layout.ContentPane");
                          dojo.addOnLoad(function() {
                              // Create outer tab container
                              var container = new dijit.layout.TabContainer({
                                  style: 'height: 100%; width: 100%;'
                              });
                              container.placeAt(dojo.body());

                                // Construct tab content panes
                                dojo.forEach([1, 2], function(i) {
                                    container.addChild(new dijit.layout.ContentPane({
                                         title: 'Tab ' + i,
                                         // 'content' can be HTML, DOM-node, or Dojo-widget
                                         content: 'Content tab ' + i
                                    }));
                                });
                                container.startup();
                          });

                          /* Extensive use in RIA: dynamic creation/manipulation of widgets   */

                          /* full code: http://jsfiddle.net/ghZxW/10/ */


RIA development using the Dojo Toolkit                                                             34
Special widget classes
                              Base class: dijit._Widget
                                   Base class for all widgets
                                   Provides many basic features for widgets (attributes, watch,
                                   connect, DOM handling, …)
                              Template: dijit._Templated
                                   Mixin dijit._Templated to support building dijit UI using templates
                                   Template: custom HTML code with variable/event hooks
                                   Use dojoAttachPoint and dojoAttachEvent in HTML-tags to reference
                                   DOM nodes and add event listeners
                              Container
                                   Mixin dijit._Container to support managing children dijits
                                   Container's startup() calls children's startup()
                                   Removing a child dijit from the container doesn't destroy it

RIA development using the Dojo Toolkit                                                                   35
Widget attributes
                              dijit._Widget.set() is the standard API to set and get attributes
                                   If necessary, custom setter/getter functions can be provided
                                   Setter functions : _setXXXAttr()
                                   Getter functions : _getXXXAttr()
                                   For the attribute email : _setEmailAttr() and _getEmailAttr()
                              dijit._Widget.watch() notifies observers upon attribute changes
                              Attributes are mapped to DOM nodes via attributeMap
                                   Attribute modification updates the DOM node automatically




RIA development using the Dojo Toolkit                                                             36
Dijit life cycle – creation
                              preamble() - originates from dojo.declare
                                 Advanced feature, return value is passed over to constructor
                              constructor() - originates from dojo.declare
                                 Initialize and add addtitional properties
                              postMixInProperties() - originates from dijit._Widget
                                 All member methods/variables have been mixed in from all ancestors
                              buildRendering() - originates from dijit._Widget
                                 DOM nodes are set up
                              postCreate() - originates from dijit._Widget
                                 Executed when widget is created and visibly placed in the DOM
                                 Children cannot be safely accessed here
                              startup() - originates from dijit._Widget
                                 Fires when widget and all children have been created
                                 For programmatic approach: call startup() manually after adding all children

RIA development using the Dojo Toolkit                                                                          37
Dijit life cycle – destruction
                              destroy() - originates from dijit._Widget
                                  Destroys widget itself
                              destroyRecursive() - originates from dijit._Widget
                                  Destroys children and widget itself
                              uninitialize() - originates from dijit._Widget
                                  Destructor method for custom clean-up
                              See also: http://dojotoolkit.org/reference-guide/dijit/_Widget.html

                                                            destroyRecursive()

                          recursive call
                                             destroyDescendants()              destroy()


                                                              uninitialize()           destroyRendering()
                               custom code goes here

RIA development using the Dojo Toolkit                                                                      38
Conclusion

                              There are many JavaScript libraries out there
                              Yet only a few provide a good feature set for Rich Internet
                              Application (RIA) development
                              The Dojo Toolkit
                                   OpenSource license & open development
                                   Many features & good quality code
                                   Many widgets that are themeable
                                   Great for RIA development & pure DOM manipulation




RIA development using the Dojo Toolkit                                                      39
The end…

  Thank you very much for your
  attention!
  Much more could be said…
  Do you have questions?




Resources
  http://dojotoolkit.org/
  http://dojotoolkit.org/api/
  http://dojotoolkit.org/reference-guide/
  http://dojotoolkit.org/documentation/
  http://www.sitepen.com/blog/

More Related Content

PDF
Building Real-World Dojo Web Applications
PPT
Dojo - from web page to web apps
PPTX
Dojo javascript toolkit
PPT
The Dojo Toolkit An Introduction
KEY
Dojo & HTML5
PPTX
How dojo works
PDF
Complete Dojo
PPTX
Dojo tutorial
Building Real-World Dojo Web Applications
Dojo - from web page to web apps
Dojo javascript toolkit
The Dojo Toolkit An Introduction
Dojo & HTML5
How dojo works
Complete Dojo
Dojo tutorial

What's hot (20)

PDF
Moving to Dojo 1.7 and the path to 2.0
PPTX
Angularjs vs Dojo toolkit | SuperSpeaker@CodeCamp Iasi 2014
KEY
Dojo, from scratch to result
PDF
JavaScript Libraries (Ajax Exp 2006)
PPTX
Starting with jQuery
PDF
Incremental DOM and Recent Trend of Frontend Development
PPT
HTML5: An Introduction To Next Generation Web Development
PDF
JavaScript Library Overview (Ajax Exp West 2007)
PDF
jQuery: The World's Most Popular JavaScript Library Comes to XPages
PDF
Understanding Webkit Rendering
PDF
Component-Oriented Web Development with Dart
PPTX
jQuery - the world's most popular java script library comes to XPages
PDF
Dojo and Zend Framework
PPTX
Building Rich Internet Applications with Ext JS
PDF
Java for XPages Development
PDF
Python - A Comprehensive Programming Language
PPT
Google Dev Day2007
PDF
Advanced jQuery (Ajax Exp 2007)
PDF
Web component driven development
PDF
Deview 2013 mobile browser internals and trends_20131022
Moving to Dojo 1.7 and the path to 2.0
Angularjs vs Dojo toolkit | SuperSpeaker@CodeCamp Iasi 2014
Dojo, from scratch to result
JavaScript Libraries (Ajax Exp 2006)
Starting with jQuery
Incremental DOM and Recent Trend of Frontend Development
HTML5: An Introduction To Next Generation Web Development
JavaScript Library Overview (Ajax Exp West 2007)
jQuery: The World's Most Popular JavaScript Library Comes to XPages
Understanding Webkit Rendering
Component-Oriented Web Development with Dart
jQuery - the world's most popular java script library comes to XPages
Dojo and Zend Framework
Building Rich Internet Applications with Ext JS
Java for XPages Development
Python - A Comprehensive Programming Language
Google Dev Day2007
Advanced jQuery (Ajax Exp 2007)
Web component driven development
Deview 2013 mobile browser internals and trends_20131022
Ad

Similar to Rich internet application development using the dojo toolkit (20)

PDF
JavaScript Library Overview
PDF
JavaScript Libraries (Kings of Code)
PDF
JavaScript Libraries (@Media)
PPT
Introduction To Dojo
PDF
JavaScript Library Overview
ODP
Dojo: Beautiful Web Apps, Fast
KEY
Your Library Sucks, and why you should use it.
PDF
Trimming The Cruft
KEY
10 Years of JavaScript
PDF
Getting Started with Dojo Toolkit
PPT
Dojo Toolkit from a Flex developer's perspective
KEY
Dojo for programmers (TXJS 2010)
ODP
Dojo: Getting Started Today
KEY
Dojo GFX workshop slides
PDF
Ria with dojo
PPTX
Js il.com
ODP
DOJO
PDF
How to make Ajax Libraries work for you
PDF
dojo.Patterns
PPTX
How to build a JavaScript toolkit
JavaScript Library Overview
JavaScript Libraries (Kings of Code)
JavaScript Libraries (@Media)
Introduction To Dojo
JavaScript Library Overview
Dojo: Beautiful Web Apps, Fast
Your Library Sucks, and why you should use it.
Trimming The Cruft
10 Years of JavaScript
Getting Started with Dojo Toolkit
Dojo Toolkit from a Flex developer's perspective
Dojo for programmers (TXJS 2010)
Dojo: Getting Started Today
Dojo GFX workshop slides
Ria with dojo
Js il.com
DOJO
How to make Ajax Libraries work for you
dojo.Patterns
How to build a JavaScript toolkit
Ad

Recently uploaded (20)

PPTX
sap open course for s4hana steps from ECC to s4
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Big Data Technologies - Introduction.pptx
PDF
Review of recent advances in non-invasive hemoglobin estimation
PPTX
A Presentation on Artificial Intelligence
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
Machine Learning_overview_presentation.pptx
PDF
Encapsulation_ Review paper, used for researhc scholars
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Empathic Computing: Creating Shared Understanding
PPTX
Cloud computing and distributed systems.
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
A comparative analysis of optical character recognition models for extracting...
PPT
Teaching material agriculture food technology
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Assigned Numbers - 2025 - Bluetooth® Document
sap open course for s4hana steps from ECC to s4
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Machine learning based COVID-19 study performance prediction
Big Data Technologies - Introduction.pptx
Review of recent advances in non-invasive hemoglobin estimation
A Presentation on Artificial Intelligence
Per capita expenditure prediction using model stacking based on satellite ima...
Machine Learning_overview_presentation.pptx
Encapsulation_ Review paper, used for researhc scholars
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Empathic Computing: Creating Shared Understanding
Cloud computing and distributed systems.
Chapter 3 Spatial Domain Image Processing.pdf
A comparative analysis of optical character recognition models for extracting...
Teaching material agriculture food technology
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Reach Out and Touch Someone: Haptics and Empathic Computing
Building Integrated photovoltaic BIPV_UPV.pdf
MYSQL Presentation for SQL database connectivity
Assigned Numbers - 2025 - Bluetooth® Document

Rich internet application development using the dojo toolkit

  • 2. Rich Internet Application development using the Dojo Toolkit FrOSCon, Sankt Augustin, 20. August 2011 Dr. Alexander Kläser klaeser at univention dot de
  • 3. Goal of this presentation Brief overview of existing JavaScript frameworks General overview of Dojo (structure, features, resources) Know what you can do with it and whether it could help you Some details w.r.t. Rich Internat Application (RIA) development using Dojo RIA development using the Dojo Toolkit 3
  • 4. Presentation outline Overview over JavaScript Frameworks Overview over the Dojo Toolkit Dojo core features Dojo and Widgets
  • 5. Presentation outline Overview over JavaScript Frameworks Overview over the Dojo Toolkit Dojo core features Dojo and Widgets
  • 6. Our situtation @Univention Redesign of our administrative web frontend… what it can do: Domain wide configuration: users, groups, computers, ACLs, DNS, DHCP, mail, shared folders, printers, Nagios, policies, ... Computer wide configuration: system statistics, software management, process overview, ... Virtual machine management Thin client services Management system for school environments (class rooms, …) ... Solution: rewrite the client side part as RIA (w/AJAX technologies) Communication with existing server part (written in Python) A JavaScript library simplifies cross-browser compatibility RIA development using the Dojo Toolkit 6
  • 7. JavaScript libraries overview There are many (OpenSource) JavaScript libraries: Prototype, JQuery, Yahoo UI, Dojo, Mootools, ExtJS, ... Note: "JavaScript Prototype" is not necessarily the library Is the winner JQuery? RIA development using the Dojo Toolkit 7
  • 8. Our conclusions JQuery is a very popular library Great for manipulating the DOM But, no ready-to-use infrastructure for RIA (see below) ExtJS and Dojo seem to be the only libraries that offer a rich feature set: Many widgets, consistent API, module management, i18n, l10n, layout management, DOM manipulation, data abstraction, OOP, theming, data grids, build system etc. ExtJS Many features and widgets, a very good documentation with tutorials Development is closed (product of the company Sencha) Dual licensing model (commercial + LGPL) Dojo Open development License: Academic Free License v2.1 and modified BSD license Non-profit Dojo Foundation holds intellectual property rights ... so the winner is Dojo... (at least in our case) See also: http://dojotoolkit.org/reference-guide/quickstart/introduction/whydojo.html RIA development using the Dojo Toolkit 8
  • 9. Presentation outline Overview over JavaScript Frameworks Overview over the Dojo Toolkit Dojo core features Dojo and Widgets
  • 10. Statistics about Dojo (lines of code) RIA development using the Dojo Toolkit 10
  • 11. Statistics about Dojo (commits per month) RIA development using the Dojo Toolkit 11
  • 12. Statistics about Dojo (commiters per month) RIA development using the Dojo Toolkit 12
  • 13. Dojo overview Dojo consists of 3 main parts... dojo: the core Browser normalization, module loading, DOM manipulation, events, string functions, data access, drag 'n' drop, XHR calls, JSON encoding/decoding, effects/animations, OOP etc. dijit: interface widgets, advanced UI controls, template driven Form elements (calendar, dynamic combo boxes, slider etc.), dialogs, tree, layout, menus, tooltips, WYSIWYG editor etc. dojox: various extra projects, partly experimental More widgets, charts, data grid, file uploads, dynamic CSS rules, collections, syntax highlighting, sprintf, more editor plugins, more animation effects, JSON schema validation, JSON query syntax etc RIA development using the Dojo Toolkit 13
  • 14. Dojo philosophy Non-intrusive Native objects (e.g., Array, String) are not extended with additional functionality Instead extensions are provided in a clean separate namespace When possible, these extensions (functions) refer to existing, native implementations of the browser Ease of use and performance Code that is as simple as possible High-quality "full-stack" library Dojo is modular, modules are loaded when need RIA development using the Dojo Toolkit 14
  • 15. How to use Dojo <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Tutorial: Hello Dojo!</title> <!-- load Dojo and style sheets for widgets --> <script src="...dojo/dojo.js"></script> <link rel="stylesheet" type="text/css" href="...dojo/resources/dojo.css" /> <link rel="stylesheet" type="text/css" href="...dijit/themes/claro/claro.css" /> <!-- ... eventually other widget specific CSS files ... --> </head> <body class="claro"> <h1 id="greeting">Hello</h1> </body> </html> RIA development using the Dojo Toolkit 15
  • 16. Presentation outline Overview over JavaScript Frameworks Overview over the Dojo Toolkit Dojo core features Dojo and Widgets
  • 17. Dojo Base Base: no additional module needs to be loaded Execute JS functions when then DOM is ready: dojo.addOnLoad() / dojo.ready() Packaging mechanism: dojo.require(), dojo.provide() Separation of code, usage of namespaces improves reusability :) Namespaces: dojo.foo.bar → dojo/foo/bar.js Browser can load modules on demand → one module, one file No need to track dependencies (a module can load another module) A module is just a file, otherwise there is no restriction (may declare any kind of class) Modules in dojo/dijit are already compatible with the AMD API (Asynchronous Module Definition), see: http://wiki.commonjs.org/wiki/Modules/AsynchronousDefinition RIA development using the Dojo Toolkit 17
  • 18. Dojo Base (packaging mechanism) // some code... dojo.require("my.Module"); // → my/Module.js dojo.addOnLoad(function(){ var m = new my.Module(); // ... }); // in the package my/Module.js dojo.provide("my.Module"); dojo.require("my._ClassBase"); // → my/_ClassBase.js dojo.declare("my.Module", my._ClassBase, { // ... the code ... }); RIA development using the Dojo Toolkit 18
  • 19. Dojo Base (object oriented programming) Dojo provides tools to make object oriented programming in JS easier (encapsulating the prototype) Declaring classes w/inheritance: dojo.declare() Call to parent method: this.inherited(arguments) Extend existing classes: dojo.extend() Mixins: dojo.mixin(), dojo.delegate() Use of mixins A mixin provides certain functionality (methods, variables) via inheritance Mixin cannot be instantiated alone For multiple inheritance Dojo uses C3 linearization (as Python, Perl) to resolve the order in which methods are inherited RIA development using the Dojo Toolkit 19
  • 20. Dojo Base (object oriented programming 2) dojo.declare("some.Child", [ some.Parent, some.OtherParent ], { myVal: "default value", constructor: function(args){ // parent constructor is automatically called dojo.mixin(this, args); } myMethod: function() { // call overloaded parent method via this.inherited() this.inherited(arguments); // mycode... } }); var a = new some.Child(); var b = new some.Child({ myVal:"x" }); // a.myVal == "default value" // b.myVal == "x" RIA development using the Dojo Toolkit 20
  • 21. Dojo Base (signals/events, language tools) Events, signal handling Normalization of events Signal mechanism for events/function calls: dojo.[dis]connect() Publish/subscribe mechanism: dojo.publish(), dojo.subscribe() Language tools Scoping & function parameters: dojo.hitch(), dojo.partial() Type checking: dojo.is[String,Array,Function,Object,Alien]() RIA development using the Dojo Toolkit 21
  • 22. Dojo Base (signals/events, language tools 2) obj = { foo: function() { console.log('obj.foo()'); }, bar: function() { console.log('obj.bar()'); }, val: 42 }; dojo.connect(obj, 'foo', obj, 'bar'); dojo.connect(obj, 'foo', dojo.hitch(obj, function() { // we are in the scope of 'obj' console.log('signal for obj.foo()'); console.log('this.val=' + this.val); // this.val == 42 })); obj.foo(); /* output: obj.foo() obj.bar() signal for obj.foo() this.val=42 */ /* full code: http://jsfiddle.net/rTUfr/1/ */ // ... it is also possible to connect to DOM-events dojo.connect(domNode, "onclick", dojo.hitch(this, "handleClick")); RIA development using the Dojo Toolkit 22
  • 23. Dojo Base (utilities for arrays, strings, and others) Array utility functions: Iteration: dojo.forEach(), dojo.map() Filtering: dojo.filter() Condition check: dojo.every(), dojo.some() Index of a given element: dojo.indexOf() String processing: dojo.trim() A template mechanism: dojo.replace() JSON conversion: dojo.toJson(), dojo.fromJson() Browser Sniffing: dojo.isIE < 7, isFF, isWebKit ... RIA development using the Dojo Toolkit 23
  • 24. Dojo Base (Ajax calls, dojo.Deferred) Ajax wrapper functions: dojo.xhr[Get,Post,Delete,Put]() Handling of asynchronous events: dojo.Deferred Asynchronous operation abstraction Return a dojo.Deferred if the function is asynchronous Multiple dojo.Deferred can be nested and chained RIA development using the Dojo Toolkit 24
  • 25. Dojo Base (Ajax calls, dojo.Deferred 2) // xhrPost() returns an object of type dojo.Deferred var deferred = dojo.xhrPost({ url: '/echo/json/', handleAs: 'json', content: { /* ... a dict of name/string pairs ... */ } }); // register callback... then() returns a new deferred deferred = deferred.then(function(data) { var str = ''; dojo.forEach(data.messages, function(i) { str += '<div>' + i + '</div>'; }); dojo.body().innerHTML = str; return data.value; // return value is fed to next deferred }); // deferreds can be chained deferred.then(function(value) { dojo.body().innerHTML += '<div>Value: ' + value + '</div>'; }); /* full code: http://jsfiddle.net/hMREq/5/ */ RIA development using the Dojo Toolkit 25
  • 26. Dojo Base (DOM/CSS manipulation, animation) Querying DOM nodes With standard CSS3 selectors: dojo.query() By their ID: dojo.byId() Chaining of DOM manipulation: dojo.NodeList Placement in the DOM: dojo.place() Manipulation of DOM attributes: dojo.attr() Manipulation of CSS style: dojo.style() Manipulation of CSS classes: dojo.[add,remove,has]Class() Manipulation/querying of DOM node size/position: dojo.coords(), dojo.position(), dojo.[margin,content]Box() Animation: dojo.fadeIn/Out(), dojo.animateProperty() RIA development using the Dojo Toolkit 26
  • 27. Dojo Base (DOM/CSS manipulation, animation 2) // dojo.query uses standard CSS3 selectors // it returns a dojo.NodeList, a subclass of Array dojo.query("ul > li").forEach(function(n){ ... }); dojo.query("#mycontainer").addClass("mylist"); dojo.query("a").onclick(function(){ ... }); dojo.query(".styleA.styleB").map(function(n){ ... }); // calls can be chained dojo.query(".container") .addClass('newClass') .fadeIn().play(); // other kinds of manipulation dojo.style(domNode, "height", "50px"); dojo.place("<p>Hi</p>", dojo.body()); dojo.addClass(domNode, "myCssClass"); var width = dojo.marginBox(domNode).w; dojo.marginBox(domNode, {w: 300, h: 400}); dojo.fadeIn({ node: node }).play(); RIA development using the Dojo Toolkit 27
  • 28. Dojo core Core: everything else below dojo.* that needs to be loaded via dojo.require() Dojo's Dom/Widget parsing package: dojo.parser (→ see dijit) Effects library on top of base animations: dojo.fx.[sizeTo(), slideBy(), crossFade(), wipeTo(), smoothScroll()] Utility classes for internationalization: dojo.i18n More string functions: dojo.string Caching of inline text: dojo.cache() HTTP cookie manipulation: dojo.cookie() Data access/manipulation layer: dojo.store (obsolete API is dojo.data) … RIA development using the Dojo Toolkit 28
  • 29. Build system Works transparently with Package System Collects all referenced JS module files of an Dojo application and builds a single minified JS file Minification: Comments, whitespace, newlines are removed, local variables names replaced by short ones … RIA development using the Dojo Toolkit 29
  • 30. Presentation outline Overview over JavaScript Frameworks Overview over the Dojo Toolkit Dojo core features Dojo and Widgets
  • 31. Dijit dijit = Dojo widgets A widget encapsulates the DOM representation and offers a convenient object-oriented interface Events, attribute settings, GUI logic, … Widgets are created in a programmatic or a declarative manner Types of widgets: Layout widgets (border, tabs, accordion, ...) Form widgets w/validation (drop down, date pickers, popup, ...) Dialogs, Menus, … Support for i18n Widgets are themeable RIA development using the Dojo Toolkit 31
  • 32. Screenshot See: http://download.dojotoolkit.org/release-1.6.1/dojo-release-1.6.1/dijit/themes/themeTester.html RIA development using the Dojo Toolkit 32
  • 33. Widgets from markup (declarative) <div dojoType="dijit.layout.TabContainer" style="width: 100%; height: 100%;"> <div dojoType="dijit.layout.ContentPane" title="Tab 1" selected="true"> Content tab 1 </div> <div dojoType="dijit.layout.ContentPane" title="Tab 2"> Content tab 2 </div> </div> /* specify 'djConfig="parseOnLoad:true' in script tag... */ /* ... after loading, Dojo will parse the DOM tree */ /* full code: http://jsfiddle.net/H4DXH/ */ RIA development using the Dojo Toolkit 33
  • 34. Widgets from code (programmatic) dojo.require("dijit.layout.TabContainer"); dojo.require("dijit.layout.ContentPane"); dojo.addOnLoad(function() { // Create outer tab container var container = new dijit.layout.TabContainer({ style: 'height: 100%; width: 100%;' }); container.placeAt(dojo.body()); // Construct tab content panes dojo.forEach([1, 2], function(i) { container.addChild(new dijit.layout.ContentPane({ title: 'Tab ' + i, // 'content' can be HTML, DOM-node, or Dojo-widget content: 'Content tab ' + i })); }); container.startup(); }); /* Extensive use in RIA: dynamic creation/manipulation of widgets */ /* full code: http://jsfiddle.net/ghZxW/10/ */ RIA development using the Dojo Toolkit 34
  • 35. Special widget classes Base class: dijit._Widget Base class for all widgets Provides many basic features for widgets (attributes, watch, connect, DOM handling, …) Template: dijit._Templated Mixin dijit._Templated to support building dijit UI using templates Template: custom HTML code with variable/event hooks Use dojoAttachPoint and dojoAttachEvent in HTML-tags to reference DOM nodes and add event listeners Container Mixin dijit._Container to support managing children dijits Container's startup() calls children's startup() Removing a child dijit from the container doesn't destroy it RIA development using the Dojo Toolkit 35
  • 36. Widget attributes dijit._Widget.set() is the standard API to set and get attributes If necessary, custom setter/getter functions can be provided Setter functions : _setXXXAttr() Getter functions : _getXXXAttr() For the attribute email : _setEmailAttr() and _getEmailAttr() dijit._Widget.watch() notifies observers upon attribute changes Attributes are mapped to DOM nodes via attributeMap Attribute modification updates the DOM node automatically RIA development using the Dojo Toolkit 36
  • 37. Dijit life cycle – creation preamble() - originates from dojo.declare Advanced feature, return value is passed over to constructor constructor() - originates from dojo.declare Initialize and add addtitional properties postMixInProperties() - originates from dijit._Widget All member methods/variables have been mixed in from all ancestors buildRendering() - originates from dijit._Widget DOM nodes are set up postCreate() - originates from dijit._Widget Executed when widget is created and visibly placed in the DOM Children cannot be safely accessed here startup() - originates from dijit._Widget Fires when widget and all children have been created For programmatic approach: call startup() manually after adding all children RIA development using the Dojo Toolkit 37
  • 38. Dijit life cycle – destruction destroy() - originates from dijit._Widget Destroys widget itself destroyRecursive() - originates from dijit._Widget Destroys children and widget itself uninitialize() - originates from dijit._Widget Destructor method for custom clean-up See also: http://dojotoolkit.org/reference-guide/dijit/_Widget.html destroyRecursive() recursive call destroyDescendants() destroy() uninitialize() destroyRendering() custom code goes here RIA development using the Dojo Toolkit 38
  • 39. Conclusion There are many JavaScript libraries out there Yet only a few provide a good feature set for Rich Internet Application (RIA) development The Dojo Toolkit OpenSource license & open development Many features & good quality code Many widgets that are themeable Great for RIA development & pure DOM manipulation RIA development using the Dojo Toolkit 39
  • 40. The end… Thank you very much for your attention! Much more could be said… Do you have questions? Resources http://dojotoolkit.org/ http://dojotoolkit.org/api/ http://dojotoolkit.org/reference-guide/ http://dojotoolkit.org/documentation/ http://www.sitepen.com/blog/