Building Rich Web Building Rich Web Applications Applications ...

54
1 Building Rich Web Building Rich Web Applications Applications using jMaki using jMaki Sang Shin Sang Shin Java Technology Evangelist Java Technology Evangelist Sun Microsystems, Inc. Sun Microsystems, Inc. www.javapassion.com www.javapassion.com 1

description

 

Transcript of Building Rich Web Building Rich Web Applications Applications ...

Page 1: Building Rich Web Building Rich Web Applications Applications ...

1

Building Rich WebBuilding Rich WebApplications Applications using jMakiusing jMaki

Sang ShinSang ShinJava Technology EvangelistJava Technology EvangelistSun Microsystems, Inc.Sun Microsystems, Inc.www.javapassion.comwww.javapassion.com

1

Page 2: Building Rich Web Building Rich Web Applications Applications ...

2

Topics

• What is and Why jMaki?• jMaki Architecture• Widget model• Layout and Themes• Multi-Language support• Accessing external resources• Event model• jMaki Library Structure

Page 3: Building Rich Web Building Rich Web Applications Applications ...

What is & Why jMaki?What is & Why jMaki?

Page 4: Building Rich Web Building Rich Web Applications Applications ...

4

Origins of jMaki?

• ‘j’ is for JavaScript™ technology • Maki == to wrap in Japanese• Started as a way of wrapping JavaScript technology

functionality• Project jMaki has evolved to provide more

Page 5: Building Rich Web Building Rich Web Applications Applications ...

5

jMaki Features

• Widgets from popular toolkits> Dojo, Yahoo, Script.aculo.us, Spry, Google

• Make JavaScript technology accessible to Java technology, Phobos, PHP and Ruby

• Standardize event and data models> Consistent programming model

• XmlHttpProxy> Access to RESTful web services not in the web app domain

• Integrated Tools support> NetBeans and Eclipse plug-in's

Page 6: Building Rich Web Building Rich Web Applications Applications ...

6

Benefits of using jMaki

Page 7: Building Rich Web Building Rich Web Applications Applications ...

jMaki ArchitecturejMaki Architecture

Page 8: Building Rich Web Building Rich Web Applications Applications ...

8

jMaki Architecture

Dojo

Yahoo

Scriptaculous

Google

Spry

Widget Model jMaki Client Services jMaki Layouts

jMaki Client Runtime

jMaki Server Side Runtime XmlHttpProxy

Enterprise Resources External Services

Html

CSS

widget. json Injector

XHR Publish/Subscribe

Glue/Timers

Script/CSS Links

UUID Generator

Shared Configuration

Template Renderer

Runtime to JavaScript Parameter Convertor

XSL Style Sheets

XSL Transformer

ServiceConfiguration

HTTP Client

RESTServices

YahooServices

FlickrServices

RSSFeeds

Service DataBase

ManagedObjects

WebServices

JavaScript

Page 9: Building Rich Web Building Rich Web Applications Applications ...

9

Client Services

• Glue wires widgets together > Based on publish and

subscribe mechanism> Event bus on client

• Injector loads the contents of external page in current page

• Filter RSS data from web services

Page 10: Building Rich Web Building Rich Web Applications Applications ...

10

Client Services API

• jmaki.publish/subscribe• jmaki.Timer• jmaki.doAjax• jmaki.loadScript/loadStyle• jmaki.namespace• jmaki.extend• jmaki.log

Page 11: Building Rich Web Building Rich Web Applications Applications ...

Widget ModelWidget Model

Page 12: Building Rich Web Building Rich Web Applications Applications ...

12

Widget Model

• Reusable JavaScript technology component

• Common API for all widgets

• Described by HTML, CSS, JavaScript technology and JSON files

• Widget dependency information in widget.json

Page 13: Building Rich Web Building Rich Web Applications Applications ...

13

Widget Model

https://ajax.dev.java.net/widget-model.html

component.htmHTML Template

component.cssCS Styles

component.jsBehavior

Bootstrap Code

jMaki Widget

Page 14: Building Rich Web Building Rich Web Applications Applications ...

14

Hello World Widgetcomponent.htm

<div id=”${uuid}”></div>

component.js id valuejmaki.namespace(“jmaki.widgets.hello”); servicejmaki.widgets.hello.Widget = function(wargs) { argsvar mydiv = document.getElementById(wargs.uuid); selected mydiv.innerHTML = “Hello “ + wargs.args.name;}

index.jsp

<%@ taglib prefix=”a” uri=”http://jmaki/v1.0/jsp” %><a:widget name=”hello” args=”{name: 'world'}” />

Page 15: Building Rich Web Building Rich Web Applications Applications ...

Layout and ThemesLayout and Themes

Page 16: Building Rich Web Building Rich Web Applications Applications ...

16

jMaki Layouts

Page 17: Building Rich Web Building Rich Web Applications Applications ...

17

jMaki Layouts and Themes• Provide templates written in CSS and HTML• Gives you a place to put your widgets• Web designer friendly• Easy to customize

Page 18: Building Rich Web Building Rich Web Applications Applications ...

18

demo

Page 19: Building Rich Web Building Rich Web Applications Applications ...

Multi-Language SupportMulti-Language Support

Page 20: Building Rich Web Building Rich Web Applications Applications ...

20

JSP Technology: index.jsp<%@ taglib prefix="a" uri="http://jmaki/v1.0/jsp" %><a:widget name="hello" args="{name: 'Greg'}" />

PHP: index.php<?php require_once 'Jmaki.php'; ?><?php addWidget("hello", null, "{name: 'Greg'}"); ?>

Phobos: index.ejs<% library.jmaki.insert({ component:"hello", args: {name: 'Greg'}}); %>

Ruby: index.rb<%= jmaki_widget 'hello', :args => { :name => name }, :value => { 'Greg' }%>

jMaki: Multi-Language support

Page 21: Building Rich Web Building Rich Web Applications Applications ...

21

jMaki on Java• Taglibs on Java Server Pages (JSP)• Components on Java Server Faces (JSF)• Comprehensive Tooling and Runtime support • Recipe

> Choose a Layout> Add Widgets> Configure Services> Add Glue

Page 22: Building Rich Web Building Rich Web Applications Applications ...

22

jMaki & Phobos: Made for each other• Phobos

> Lightweight scripting-friendly web application environment> Runs on Java platform> Primary supported language is JavaScript

> No impedance mismatch> NetBeans IDE plug-in

• Recipe> Choose a Layout> Add Widgets> Configure Services> Add Glue

Page 23: Building Rich Web Building Rich Web Applications Applications ...

23

jMaki & Rails• Rails

> Open source full-stack Ruby-based web framework> Database-backed web application> Model-View-Control pattern> Convention over Configuration

• Recipe> Add jMaki Rails plugin> Add widgets to Rails View> Connect ActiveRecord and jMaki data model

Page 24: Building Rich Web Building Rich Web Applications Applications ...

24

demo

Page 25: Building Rich Web Building Rich Web Applications Applications ...

Steps for Writing Steps for Writing jMaki ApplicationsjMaki Applications

Page 26: Building Rich Web Building Rich Web Applications Applications ...

26

Steps for Writing jMaki Application

1.Choose a layout2.Drop widgets into a layout3.Configure widgets (if necessary)4.Provide glue if widgets interact5.Choose a theme

Page 27: Building Rich Web Building Rich Web Applications Applications ...

27

jMaki Palette in NetBeans IDE

Page 28: Building Rich Web Building Rich Web Applications Applications ...

Accessing ExternalAccessing ExternalResourcesResources

Page 29: Building Rich Web Building Rich Web Applications Applications ...

29

Access External Services

Page 30: Building Rich Web Building Rich Web Applications Applications ...

30

XMLHttpProxy (XHP)

• Access to RESTful web services not in the web app domain> Yahoo GeoCoder

• Provides customizable XSL-to-JSON transformations

• Access to RSS feeds> Atom/RSS

• Widgets are tuned to use it

A Window to the Outside World

Page 31: Building Rich Web Building Rich Web Applications Applications ...

31

Accessing External Services<a:widget name="jmaki.blockList" service="/xhp?id=rss" />

"rss"configured in the configuration file"xhp.json"

xhp.json:

{ "id": "rss", "url":"http://weblogs.java.net/blog/ludo/index.rdf", "xslStyleSheet": "rss.xsl"}

Page 32: Building Rich Web Building Rich Web Applications Applications ...

32

Access Enterprise ResourcesjMaki work with JPA

<a:widget name="yahoo.dataTable" args="{ columns :[ {label : 'Company', id : 'company'}, {label : 'Price', id : 'price'}, {label : 'Change', id : 'change'}, {label : '% Change', id : 'pchange'}, {label : 'Last Updated', id : 'lupdate'} ]}" service="data.jsp" />

data.jsp provides dynamic data from persistence using JPA

Page 33: Building Rich Web Building Rich Web Applications Applications ...

33

Access Enterprise Resourcesdata.jsp dynamic data using JPA

<%@ page import="java.util.*" %><%@ page import="server.Company" %><%@ page import="javax.persistence.*" %><% EntityManagerFactory emf = Persistence.createEntityManagerFactory("jmaki-jpaPU"); EntityManager em = emf.createEntityManager(); List<Company> list = em.createQuery("select c from Company c").getResultList(); out.println("["); for (int i=0; i<list.size(); i++) { Company c = list.get(i); out.println("['" + c.getCompanyname() + "'," + c.getPrice() + "," + c.getChange() + "," + c.getPercentchange() + ",'" + c.getLastupdated() + "']"); if (i < list.size()-1) out.println(","); } out.println("]");%>

Page 34: Building Rich Web Building Rich Web Applications Applications ...

34

demo

Page 35: Building Rich Web Building Rich Web Applications Applications ...

Event ModelEvent Model

Page 36: Building Rich Web Building Rich Web Applications Applications ...

36

How the widgets talk to each other?jMaki Events

• Publish/Subscribe is much like a server-side messaging system by it runs in the scope of an HTML page

• A means for one or more Project jMaki widgets to communicate with each other in a page using topics

• Action – Simple events that are declarative• Glue – For processing dynamic events where you

provide the logic in JavaScript

Page 37: Building Rich Web Building Rich Web Applications Applications ...

37

<a:widget name="dojo.fisheye" value="[ { iconSrc:'https://ajax.dev.java.net/images/blog_murray.jpg', label : 'You are here!', action : { topic : '/foo/select', message : {targetId : 'bar'}} }, { iconSrc:'https://ajax.dev.java.net/images/chinnici.jpg', label : 'test3'}]"/>

<a:widget name="dojo.tabbedview" subscribe="/foo" value="{items:[ {label : 'My Tab', content : 'Some Content'}, {id : 'bar', label : 'My Tab 2', include : 'test.jsp ', lazyLoad : true }, {label : 'My Tab 3', content : 'More Content', selected : true} ] }" />

Action Example

Page 38: Building Rich Web Building Rich Web Applications Applications ...

38

jMaki Glue: Publish/Subscribe• jMaki widgets communicate within the page

in JavaScript programming language via jMaki glue• Glue:

> JavaScript technology-based and loaded application-wide or based on a page

> JavaScript technology handlers mappedto topic names

• Steps to using the glue mechasim> Declare the topic you want to subscribe or listen to> Declare the name of the function (listener) which will handle the

notification> Provide the code to handle the notification

• Widgets configured to work by default

Page 39: Building Rich Web Building Rich Web Applications Applications ...

39

Publish/Subscribe• A means for jMaki widgets to communicate with each

other in a page using topics> Much like server-side messaging system but runs in the

scope of HTML pagePublish Subscribeicon.onClick = function() { function fisheyeListener(item) { jmaki.publish(“/dojo/fisheye”, this); var targetDiv = document.getElementById(“new”);} var responseText = “”; var index = Number(item.index); switch (index) { case 1: // set response text break; ... } targetDiv.innerHTML = responseText; } jmaki.susbscribe(“/dojo/fisheye”, fisheyelistener);

Page 40: Building Rich Web Building Rich Web Applications Applications ...

40

icon.onClick = function (){jmaki.publish("/dojo/fisheye/onSelect", {type :

"onSelect", targetId : id}); }

Publish Example

/dojo/fisheye is the base topic of the widget (“/onSelect” which is the sub-type gets appended)

Page 41: Building Rich Web Building Rich Web Applications Applications ...

41

jmaki.subscribe("/dojo/fisheye/*", fisheyeListener); function fisheyeListener(item) { var targetDiv = document.getElementById("newpage"); var responseText = ""; var index = Number(item.index); switch(index){ case 1: // Set responseText equal to Greg's bio

break; case 2: // Set responseText equal to Roberto's bio

default: responseText += 'Click on one of the photos above';break;

} targetDiv.innerHTML = responseText; }

Subscribe Example

Page 42: Building Rich Web Building Rich Web Applications Applications ...

42

Sample in glue.js jmaki.namespace("jmaki.listeners");

jmaki.subscribe("/grizzly/message", "jmaki.listeners.sendMessage");

jmaki.listeners.sendMessage = function(message) { jmaki.doAjax({ method : "post", url : "words", content : { callback : "jmaki.CometClient.callback, action : "post", message: "{message : \"" + escape(message) + "\" }}

Page 43: Building Rich Web Building Rich Web Applications Applications ...

43

demo

Page 44: Building Rich Web Building Rich Web Applications Applications ...

jMaki Library StructurejMaki Library Structure

Page 45: Building Rich Web Building Rich Web Applications Applications ...

45

jMaki Library Structure• Collection of named components

> Name if directory path of the component> A component is component.html, component.js,

component.css and widget.json• The toolkit library content

> For example, dojo or yahoo libs• Snippets for JSP technology, EJS, PHP, Rails, etc.• Palette entry names in a bundle file• All this packaged as a zip file for installation

Page 46: Building Rich Web Building Rich Web Applications Applications ...

46

jMaki Library Structure

Page 47: Building Rich Web Building Rich Web Applications Applications ...

47

config.json or widget.json Files

• A central place for defining Project jMaki configuration information > JavaScript programming language library dependencies > API keys> CSS dependencies> Project jMaki Glue handler mappings

Page 48: Building Rich Web Building Rich Web Applications Applications ...

48

widget.json for Dojo Clock Widget{ "name" : "Clock", "type" : "dojo", 'version' : '.8', 'jmakiVersion' : '.8.2.3', "image" : "images/dojo-clock.jpg", "description" : "This widget is a clock.", "args": [ {"clockType" : { "type":"STRING", "description" : "The clock type.", "defaultValue" : 'plain', 'values': [ {'name' : 'Plain', 'value' : 'plain', 'description' : 'Clock with blue background.'}, {'name' : 'Black', 'value' : 'black', 'description' : 'Clock with black background.'},

Page 49: Building Rich Web Building Rich Web Applications Applications ...

49

widget.json for Dojo Clock... 'config' : { 'type' : { 'id' : 'dojo', 'libs' : [ '../resources/libs/dojo/v.4.2/dojo.js' ], 'preload' : 'if (typeof djConfig ==\'undefined\') djConfig = { parseWidgets: false, searchIds: [] };', 'resources' : [ '../resources/libs/dojo/v.4.2/src' ] }

}

Page 50: Building Rich Web Building Rich Web Applications Applications ...

50

• id: You can override the automatic numbering• value: In-line a value for simple cases• service: Requires a corresponding server-side

component• args: JavaScript programming language Object

Literal/Associative Array• publish – topic events are published to• subscribe – topic to listen to for change events

Configure Widgets

Page 51: Building Rich Web Building Rich Web Applications Applications ...

51

jMaki Component Customizer

Page 52: Building Rich Web Building Rich Web Applications Applications ...

52

• Download jMaki NetBeans and Eclipse plug-ins

• Watch Screencasts• Read tutorials• Join and contribute!• Participate on jMaki forums• Create something cool!

jMaki

What toDo

http://jmaki.com

Page 53: Building Rich Web Building Rich Web Applications Applications ...

53

jMaki Resources• jMaki Project Site: ajax.dev.java.net (jmaki.com)

> Download binaries, IDE Plugins, Tutorials• Getting Started: ajax.dev.java.net/getstarted.html• Samples: ajax.dev.java.net/samples.html• Wiki: wiki.java.net/bin/view/Projects/jMaki• Aliases: [email protected]• jMaki Forum: forums.java.net/jive/forum.jspa?forumID=96• Blogs:

> weblogs.java.net/blog/gmurray71> weblogs.java.net/blog/carlavmott> blogs.sun.com/arungupta> weblogs.java.net/blog/ludo> weblogs.java.net/blog/ntruchsess

Page 54: Building Rich Web Building Rich Web Applications Applications ...

54

Building Rich WebBuilding Rich WebApplications Applications using jMakiusing jMaki

Sang ShinSang ShinJava Technology EvangelistJava Technology EvangelistSun Microsystems, Inc.Sun Microsystems, Inc.www.javapassion.comwww.javapassion.com

54