Web 2.0 and Java

Preview:

DESCRIPTION

Web 2.0 and Java. The Zen of jMaki. Greg Murray Ajax Architect Sun Microsystems. December 12, 2006. Agenda. Web 2.0 and Java What is jMaki jMaki Widget Model jMaki Templates jMaki Injector jMaki Glue XmlHttpProxy for Mashups Building Applications with jMaki. Web 2.0. - PowerPoint PPT Presentation

Citation preview

Web 2.0 and Java

Greg MurrayGreg Murray

Ajax ArchitectSun Microsystems

The Zen of jMaki

December 12, 2006

2

Agenda

Web 2.0 and Java What is jMaki jMaki Widget Model jMaki Templates jMaki Injector jMaki Glue XmlHttpProxy for Mashups Building Applications with jMaki

3

Web 2.0

4

What problem are we trying to solve?

5

What our managers want...

6

What developers want...

http://www.isoma.net/games/goggles.html

7

Realities

We don't always have the skill setsWe don't have an infinite budgetWe don't have infinite time

8

End Result

We copy something a web application out there or go with a technology we know. Or we go over the top and over-reach our skill set.

9

Ajax options in Java

Frameworks– Direct Web Remoting (DWR)– Java Server Faces– Use all Java Google Web Toolkit

Use JavaScript toolkit on client with:– Servlets

– JSP

10

Dojo Toolkit

Why Dojo?– Package/build system - Load what you need– dojo.event - Cross browser event handling – dojo.ally - Accessibility– dojo.18n - Internationalization– dojo.lfx Effects– dojo.gfx - SVG/VML abstraction– dojo.io - Common abstraction to Ajax IO– dojo.storage - Storage

11

There are other Options

Dynamic Faces – Ajax with existing and future JSF *

Phobos – Scripting on the server*jMaki – Framework for creating JavaScript

centric web applications

* jMaki is supported in both Project Dyanmic Faces and Phobos

12

jMaki

jMaki - Not jMonkey ‘j’ is for JavaScript Maki is to Wrap (Japanese) jMaki == JavaScript Wrappers

13

jMaki Birthplace

Kumamoto, Japan

14

What is jMaki?

On the Client–Styles and templates

–Widget Model

–Client Runtime

–Client Services On the Server

–Server Runtime

–XMLHttpProxy

https://ajax.dev.java.net/about.html

jMaki is a Client/Server Framework that provides:

15

jMaki

jMaki - Not jMonkey jMaki is not an all or nothing framework ‘j’ is for JavaScript BSD License Supports

– JavaServer Pages– JavaServer Faces– Embedded JavaScript (Phobos)– PHP 5.x

16

jMaki target Audience Java, PHP, and Phobos developers want to use JavaScript but

may want one level of indirection between the script and themselves.

JavaScript developers who want a simple re-usable framework to tie applications together.

Designers who want access to CSS

17

jMaki Architecture

18

jMaki Demo

19

jMaki Styles and Templates

20

jMaki Styles and Templates● We are a cut and paste generation● Give you a place to put your widgets● Uses standard approach● Web Designer friendly● Easy to customizing

https://ajax.dev.java.net/source/browse/*checkout*/ajax/ws/lib/css/index.html

21

WYSIRWYG

What You See Is REALY What You Get

22

Template HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><link rel="stylesheet" href="jmaki-standard-footer.css" type="text/css"></link>

<html> ... <div class="header"> <div class="banner">Application Name</div>

</div> <!-- header --> ... </body>

</html>

23

Template CSS.header { height:100px; border: 1px solid #000000;}

.main { position: relative; width: 100%; height:auto; margin-top: 5px;}

.content { margin: 0 0 0 200px; height: auto; border: 1px solid #000000;}...

24

jMaki Widgets

25

Hello World Widgetcomponent.htm

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

component.jsjmaki.hello = {};jmaki.hello.Widget = function(wargs) { var mydiv = document.getElementById(wargs.uuid); mydiv.innerHTML = "Hello " + wargs.args.name;}

index.jsp<%@ taglib prefix="a"

uri="http://java.sun.com/jmaki" %><a:ajax name="hello" args="{name: 'world'}" />

26

jMaki in Dynamic Faces<%@ taglib prefix="a" uri="http://java.sun.com/jmaki-jsf" %><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %><%@ taglib prefix="jsfExt"

uri="http://java.sun.com/jsf/extensions/dynafaces"%> <f:view>

<jsfExt:scripts/><h:form prependId="false"> <a:ajax name="hello" args="{name: 'Greg'}" /> </h:form></f:view>

27

Multi-Server supportJSP - index.jsp<%@ taglib prefix="a"

uri="http://java.sun.com/jmaki" %><a:ajax 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'} }); %>

28

jMaki Widget Model// define the namespaces for foo and bar

if (typeof jmaki.foo == 'undefined') {

jmaki.foo = {};

}

jmaki.foo.bar = {};

jmaki.foo.bar.Widget = function(wargs) {

// widget code here

}

29

Wrapping other Widgetsdojo.require("dojo.widget.Editor");

// define namespace jmaki.dojo.editor

jmaki.dojo.editor.Widget = function(wargs) {

var container = document.getElementById(wargs.uuid);

this.editor = dojo.widget.createWidget("Editor2",

{ shareToolbar: false, toolbarAlwaysVisible: true,

focusOnLoad: false }, container);

this.getValue = function() {

return this.editor.getEditorContent();

}

}

30

jMaki config.json

A central place for defining jMaki configurationinformation which includes JavaScript librarydependencies including API keys, CSSdependencies, and jMaki Glue handler mappings.

31

Adding Dojo in the config.json

{"config": { "version": "1.2", "types": [ {"id": "dojo", "version": ".4.1", "libs": ["/resources/libs/dojo/version.4.1/dojo.js" ], "preload" : "if (typeof djConfig == 'undefined')

djConfig = { parseWidgets: false, searchIds: [] };" } ]}

32

Google Maps in config.json{"config": {"version": "1.2", "types": [ {"id": "google.map", "libs": ["http://maps.google.com/maps?

file=api&amp;v=2&amp;key="], "apikey" : "google" ], "apikeys" : [ {"id": "google", "keys": [ {"url": "http://localhost:8080/jmaki/", "key": "xoxoxoxo"

}]

}]

}}

33

jMaki Publish/Subscribe

A means for one or more jMaki widgets tocommunicate with each other in a page using topics.Publish/Subscribe is much like a server sidemessaging system by it runs in the scopeof an HTML page.

https://ajax.dev.java.net/publishsubscribe.html

34

Publish/Subscribe Usecases

● You don't want to put application specific code in a specific widget

● You have an application controller that drives application behavior

● More than one widget needs be acted upon

35

Publishing Events

icon.onClick = function (){jmaki.publish("/dojo/fisheye", this);

}

36

Subscribing to Events<script> function fisheyeListener(item) { var targetDiv = document.getElementById("newpage"); var responseText = ""; var index = Number(item.index); switch(index){ case 1: // Set responseText equal to Jayashri'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; } jmaki.subscribe("/dojo/fisheye", fisheyeListener);</script>

37

jMaki Injector

A JavaScript Utility for loading content froma URL (same domain) and properly loading scriptsand CSS styles into the document and the contentsa into a target element.

38

jMaki Injector Use Cases

● Build Composite Widgets– Tabbed Views– Accordions

● Do partial page refresh– Support page as an application pattern

39

Injector : Page Developer View

<%@ taglib prefix="a" uri="http://java.sun.com/jmaki" %> <a:ajax name="dojo.tabbedview" value="{tabs:[{label:'My Tab', content: 'Some static content'}, {label:'My Tab 2', url: 'tab2.jsp'} ]}" />

<%@ taglib prefix="a" uri="http://java.sun.com/jmaki" %>

<a:ajax name="yahoo.calendar" /><a:ajax name="flickr.favorites" args="{tags:'thekt', size:50, columns:2, count:4}"/>

index.jsp

tab2.jsp

40

Injector : Yahoo Tabbed View

41

Injector : Tabbed View Dojo

42

jMaki API Injector Useage

var divId = widget.uuid + "_tab" + i;

var _c = dojo.widget.createWidget("ContentPane",

{label: _row.label, selected: i==1});

_c.setContent("<div style='widget:100%;height:323px' id='" +

divId +"'>Loading " + divId + "</div>");

tabbedview.addChild(_c);

var _i = new jmaki.Injector();

_i.inject({url:_row.url, injectionPoint: divId});

https://ajax.dev.java.net/injector.html

43

jMaki Glue

jMaki Glue lets you wire together jMaki widgets together using JavaScript action handlers which is called on a publish subscribe events.

44

Glue Mapping - config.json{"config": { "version": "1.2", "glue" : { "includes": ["glue.js"], "listeners": [ {"topic" : "/debug", "action": "call", "target": { "object": "jmaki.listeners", "functionName": "debug" } } ] }}

45

Glue JavaScript Action handler

jmaki.listeners = function() { this.debug = function(args) { alert("debug: " + args); }}

glue.js

46

jMaki XMLHttpProxy

A generic proxy that allows you to access external content including RESTful web services. The proxy provides both session and token based security to prevent miss-use and un-authorized access.

https://ajax.dev.java.net/xmlhttpproxy.html

47

XMLHttpProxy

I want to cache common coordinates locally I want to format the data in a JavaScript Object

Notation (JSON) I want only my clients to access the service

Requirements:

I want to use Yahoo’s Geocoder APIIt’s provided as a RESTful web serviceI can’t access a domain from the browser

Use Case

48

jMaki XMLHttpProxy

http://weblogs.java.net/blog/gmurray71/archive/2006/08/restricting_acc.html

49

JavaScript Viewvar location =dojo.io.bind({ url: "xhp, mimetype: "text/json", content: { key: “yahoogeocoder”, urlparams: “location=milpitas ca” }, load : function(type, data) { alert("latitude=" + data.coordinates[0].latitude); }});

50

XMLHttpProxy xhp.json

http://weblogs.java.net/blog/gmurray71/archive/2006/08/restricting_acc.html

{ "id": "yahoogeocoder", "url": "http://api.local.yahoo.com/MapsService/V1/geocode", "apikey" : "appid=jmaki-key", "xslStyleSheet": "yahoo-geocoder.xsl", "defaultURLParams": "location=milpitas,+ca"}

51

What Yahoo Returns

<?xml version="1.0"?> <ResultSet xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:maps" xsi:schemaLocation="urn:yahoo:maps http://api.local.yahoo.com/MapsService/V1/GeocodeResponse.xsd"><Result precision="city"><Latitude>37.426357</Latitude><Longitude>-121.905617</Longitude><Address></Address><City>MILPITAS</City><State>CA</State><Zip></Zip><Country>US</Country></Result></ResultSet><!-- ws02.search.scd.yahoo.com uncompressed/chunked Wed Oct 18 10:50:46 PDT 2006 -->

52

XML to JSON Conversion using XSLT

<xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'

xmlns:yn="urn:yahoo:maps" >

<xsl:output method="text" encoding="UTF-8"/> <xsl:template match="text()"/> <xsl:template match="@*"/>

<xsl:template match="yn:ResultSet"> {"coordinates": [ <xsl:apply-templates/> ]} </xsl:template> <xsl:template match="yn:Result"> { "address" : "<xsl:value-of select="yn:Address"/>", "city" : "<xsl:value-of select="yn:City"/>", "state" : "<xsl:value-of select="yn:State"/>", "zip" : "<xsl:value-of select="yn:Zip"/>", "latitude" : "<xsl:value-of select="yn:Latitude"/>", "longitude" : "<xsl:value-of select="yn:Longitude" />"

} <xsl:if test="position() &lt; last()">,</xsl:if> </xsl:template></xsl:stylesheet>

53

XMLHttpProxy Returns JSON

{"coordinates": [ { "address" : "", "city" : "MILPITAS", "state" : "CA", "zip" : "", "latitude" : "37.426357", "longitude" : "-121.905617" } ]}

54

End Result

55

Session Based Restriction

http://weblogs.java.net/blog/gmurray71/archive/2006/08/restricting_acc.html

HttpSession session = req.getSession(false);if (session == null){res.setStatus(HttpServletResponse.SC_FORBIDDEN); return; }

56

Tool Support

● Full jMaki Support in Sync with releases● jMaki Web Application has all the pieces● Drag and Drop Support● Stylized jMaki Pages

57

Netbeans Plugin

58

Putting all the pieces together

● Choose a jMaki Template● Drop in a few jMaki Widgets or create some● Configure the Widgets

– publish/subscribe● Add jMaki Glue to wire everything together● Done!

59

jMaki Futures

● Considering jMaki 1.0 in spring – We're in beta now

● Support more libraries● Support more widgets● More layouts● Even better tooling

60

Review

● Java technologies can be used to create Web 2.0 Applications

● jMaki enabled Web 2.0 style applications easily

● jMaki promotes a standards based approach using HTML + CSS + JavaScript

● jMaki is not an all or nothing framework.● Use what you need● There is great tool support for jMaki

61

https://ajax.dev.java.net

or

www.jmaki.com

Recommended