More Related Content
Similar to What's new in DWR version 3 (20)
What's new in DWR version 3
- 2. Recap
Since we last talked ...
Named Parameters
Binary Files
JavaScript Extending Java
Better Reverse Ajax
Data Sync: Dojo Data Store
JSON / JSONP / JSON-RPC
Varargs and Overloaded Methods
What’s Next
© SitePen, Inc. 2008. All Rights Reserved
- 5. Marshalling Types
Primitive types, and their Object counterparts
int, boolean, long, float, double, etc
Obvious classes
String, Date, BigDecimal, BigInteger, Enum, etc
Arrays and Collections
Map, List, Set, Iterator, ...
JavaBeans and Objects
XML objects
DOM, XOM, JDom, Dom4J
© SitePen, Inc. 2008. All Rights Reserved
- 7. Since we last talked ...
TIBCO General Interface
SitePen
http://svn.directwebremoting.org
© SitePen, Inc. 2008. All Rights Reserved
- 9. Named Parameters
DWR will create client-side classes to look like
server-side classes to make passing parameters
easy
© SitePen, Inc. 2008. All Rights Reserved
- 10. Named Parameters
Java:
public interface Person { ... }
public class Employee implements Person { ... }
public class Manager extends Employee { ... }
public HumanResources {
public void addPerson(Person p) { ... }
}
JavaScript:
Manager m = new Manager();
HumanResources.addPerson(m);
© SitePen, Inc. 2008. All Rights Reserved
- 11. Named Parameters
Why?
• Inheritance is useful in places
• It saves creating addEmployee() and addManager()
methods
© SitePen, Inc. 2008. All Rights Reserved
- 14. Lightweight Named Parameters
Java:
public interface Person { ... }
public class Employee implements Person { ... }
public class Manager extends Employee { ... }
public HumanResources {
public void addPerson(Person p) { ... }
}
JavaScript:
var m = { $dwrClassName:'Manager', firstname:'Joe', ...};
HumanResources.addPerson(m);
© SitePen, Inc. 2008. All Rights Reserved
- 15. Lightweight Named Parameters
Why?
• Everything as for Named Parameters
• But sometimes you get an object from somewhere
else
© SitePen, Inc. 2008. All Rights Reserved
- 17. Binary Files: File Upload
DWR has always had a long list of things that it will
marshall including Dates, DOM trees, etc
In addition, DWR will now marshall binary files just
as if they were the text resources it handles now
© SitePen, Inc. 2008. All Rights Reserved
- 18. Binary Files: File Upload
Java:
public Remoted {
public void receiveBinaryFile(byte[] uploaded) { ... }
}
HTML:
<input id='fileId' type='file'/>
JavaScript:
var binary = dwr.util.getValue('fileId');
Remoted.receiveBinaryFile(binary);
© SitePen, Inc. 2008. All Rights Reserved
- 19. Binary Files: File Upload
Will marshall to:
• byte[]
• java.awt.BufferedImage
• java.io.InputStream
• org.directwebremoting.io.FileTransfer
(gives access to filename and mime-type in
addition to the contents)
© SitePen, Inc. 2008. All Rights Reserved
- 20. Binary Files: File Upload
Why?
• This is a lot easier than using commons-fileupload
or similar
• We can provide integration with progress bar
widgets
© SitePen, Inc. 2008. All Rights Reserved
- 22. Binary Files: Download
Binary file handling is 2 way. It’s good for:
• Images
• PDF files
• Word, Excel documents
• etc.
© SitePen, Inc. 2008. All Rights Reserved
- 23. Binary Files: Download
Java:
public Remoted {
public void getPDF(String contents) {
ByteArrayOutputStream buf = new ByteArrayOutputStream();
Document doc = new Document();
PdfWriter.getInstance(doc, buf);
doc.open();
doc.add(new Paragraph(contents));
doc.close();
return new FileTransfer(quot;ex.pdfquot;, quot;application/pdfquot;, buf.toByteArray());
}
JavaScript:
Remoted.getPDF('Joe', function(data) {
dwr.engine.openInDownload(data);
});
© SitePen, Inc. 2008. All Rights Reserved
- 24. Binary Files: Download
Why?
• This is a lot easier than creating a special PDF/
image/etc serving servlet
© SitePen, Inc. 2008. All Rights Reserved
- 26. Javascript extending Java
DWR will allow you to implement Java interfaces
using JavaScript
© SitePen, Inc. 2008. All Rights Reserved
- 27. Javascript extending Java
Java:
public interface BazListener {
void somethingChanged(String msg);
}
public class Remote {
public void addBazListener(BazListener bl) { ... }
public void calledLater() {
for (BazListener bl : listeners)
bl.somethingChanged(quot;JS objects can implement Java interfacesquot;);
}
...
}
JavaScript:
function BazListener() {this.$dwrByRef;}
BazListener.prototype.somethingChanged = function(msg){alert(msg);};
var bl = new BazListener();
Remote.addBazListener(bl);
© SitePen, Inc. 2008. All Rights Reserved
- 28. Javascript extending Java
Why?
• Intuitive way to interact
• Easy Pub-sub
• Allows interaction with existing APIs
© SitePen, Inc. 2008. All Rights Reserved
- 30. Scalable Reverse Ajax
Previously there were some scalability limitations
with the 2.0 reverse ajax API.
3.0 deprecates the problem areas.
© SitePen, Inc. 2008. All Rights Reserved
- 31. Scalable Reverse Ajax
Reverse Ajax proxies no longer take a list of
ScriptSessions in the constructor, they just write to
the current ‘destination’
The Browser API allows you to change the current
‘destination’
© SitePen, Inc. 2008. All Rights Reserved
- 32. Scalable Reverse Ajax
// The default destination is the browser
// that caused the current action to happen.
Window.alert(quot;Helloquot;);
// Non DWR thread have no default destination
Thread t = new Thread(new Runnable()) {
public void run() {
// Error
Window.alert(quot;Helloquot;);
}
});
© SitePen, Inc. 2008. All Rights Reserved
- 33. Scalable Reverse Ajax
// Set the destination to be all browsers that
// are looking at the current page
Browser.withCurrentPage(new Runnable()) {
public void run() {
Window.alert(quot;Helloquot;);
}
});
// Set the destination to be all browsers that
// are looking at the current page
Browser.withCurrentPage(quot;index.htmlquot;, new Runnable()) {
public void run() {
Window.alert(quot;Helloquot;);
}
});
© SitePen, Inc. 2008. All Rights Reserved
- 34. Scalable Reverse Ajax
// Broadcast to everyone
Browser.withAllSessions(...);
// Broadcast to subsets
Browser.with*Filtered(scriptSesssionFilter, ...);
// To a known individual
Browser.withSession(sessionId, ...);
© SitePen, Inc. 2008. All Rights Reserved
- 35. Scalable Reverse Ajax
Why?
• It’s generally easier to use
• It decouples generation from routing
• It scales
© SitePen, Inc. 2008. All Rights Reserved
- 37. Reverse Ajax APIs
Reverse Ajax != Comet
Reverse Ajax == Comet + Polling + Piggyback
© SitePen, Inc. 2008. All Rights Reserved
- 38. Reverse Ajax APIs: JS Level
// Low level: Use server-side W3C DOM methods
Element ele = doc.createElement(quot;pquot;);
ScriptSessions.addFunctionCall(
quot;document.body.appendChildquot;,
ele);
© SitePen, Inc. 2008. All Rights Reserved
- 39. Reverse Ajax APIs: JS Level
// Low level: Any arbitrary JavaScript
String s = quot;if (document.all) window.alert('IE');quot;;
ScriptSessions.addScript(s);
© SitePen, Inc. 2008. All Rights Reserved
- 40. Reverse Ajax APIs: DOM Level
// Some methods from Window and Document
import javax.servlet.http.Cookie;
import org.directwebremoting.ui.browser.Document;
Cookie c = new Cookie(quot;namequot;, quot;valuequot;);
Document.setCookie(c);
© SitePen, Inc. 2008. All Rights Reserved
- 41. Reverse Ajax APIs: dwr.util
// dwr.util in Java
import org.directwebremoting.ui.dwr.Util;
String[] opts = new String[] {quot;onequot;,quot;twoquot;,...};
Util.addOptions(quot;liquot;, opts);
© SitePen, Inc. 2008. All Rights Reserved
- 42. Reverse Ajax APIs: Scriptaculous
// Scriptaculous Effects in Java
import org.directwebremoting.ui.scriptaculous.Effect;
Effect.fade(quot;someIdquot;);
© SitePen, Inc. 2008. All Rights Reserved
- 43. Reverse Ajax APIs: TIBCO GI
// TIBCO General Interface in Java
import jsx3.GI;
import jsx3.app.*;
import jsx3.gui.*;
Server server = GI.getServer(quot;servernamequot;);
TextBox phoneNum = server.getJSXByName(quot;phoneNumquot;,
TextBox.class);
phoneNum.setValue(quot;servernamequot;);
© SitePen, Inc. 2008. All Rights Reserved
- 44. Reverse Ajax APIs: Dojo
// Dojo in Java
import org.dojotoolkit.dijit.Dijit;
import org.dojotoolkit.dijit.Editor;
Editor e = Dijit.byId(quot;pricequot;, Editor.class);
e.setValue(42);
© SitePen, Inc. 2008. All Rights Reserved
- 45. Scalable Reverse Ajax
Why?
• A full range of APIs for dynamically updating client
data
• DWR doesn’t do widgets, but it does talk to the
people that do
Drapgen can be used to create and maintain large
APIs
© SitePen, Inc. 2008. All Rights Reserved
- 47. Dojo Data Store
DWR now implements all 4 interfaces to allow Dojo
to sync data with Java code on the server
© SitePen, Inc. 2008. All Rights Reserved
- 48. Dojo Data Store
Java:
// Load the data somehow
Map<String, Person> ppl = ...;
// Create an implementation of StoreProvider to hold the data
MapStoreProvider provider = new MapStoreProvider(ppl, Person.class);
// Tell DWR to expose the data to the internet
Directory.register(quot;testServerDataquot;, provider);
© SitePen, Inc. 2008. All Rights Reserved
- 49. Dojo Data Store
HTML:
<table id=quot;gridquot; dojoType=quot;dojox.grid.DataGridquot; ><tr>
<th field=quot;namequot; width=quot;120pxquot; editable=quot;truequot;>Name</th>
...
</tr></table>
JavaScript:
dojo.registerModulePath(quot;dwrquot;, quot;path/from/dojo/to/dwrquot;);
dojo.require(quot;dwr.data.Storequot;);
dwrStore = new dwr.data.Store(quot;testServerDataquot;, { subscribe:true });
dijit.byId(quot;gridquot;).setStore(dwrStore);
© SitePen, Inc. 2008. All Rights Reserved
- 50. Dojo Data Store
Java:
// The StoreProvider from earlier
MapStoreProvider provider = ...
// Get a representation of the internal data
Map<String, Person> data = provider.asMap();
// Mutate it
data.addPerson(new Person(...));
// The browsers viewing the data automagically update
© SitePen, Inc. 2008. All Rights Reserved
- 51. Dojo Data Store
Why?
• Data-Sync APIs are hard to get right, but are really
simple to use
• There is lots of potential for network level
optimization
© SitePen, Inc. 2008. All Rights Reserved
- 52. JSON / JSONP / JSON-RPC
© SitePen, Inc. 2008. All Rights Reserved
- 53. Dojo Data Store
DWR now supports:
• plain JSON
• JSONP
• JSON-RPC
© SitePen, Inc. 2008. All Rights Reserved
- 54. JSONP
Java:
public class Demo {
public sayHello(String name) {
return quot;Hello, quot; + name;
}
}
Shell:
$ wget http://example.com/app/dwr/jsonp/Demo/sayHello? ↩
callback=callback¶m0=quot;Joequot;
-> callback(quot;Hello, Joequot;);
© SitePen, Inc. 2008. All Rights Reserved
- 55. JSONP
Dojo:
dojo.io.script.get({
url:'http://example.com/app/dwr/jsonp/Demo/sayHello',
content:{param:'Joe'}
}).addCallback(function() { ... });
JQuery:
$.ajax({
dataType:'jsonp',
data:'param=Joe',
url:'http://example.com/app/dwr/jsonp/Demo/sayHello',
success:function () { ... },
});
© SitePen, Inc. 2008. All Rights Reserved
- 56. JSON / JSONP / JSON-RPC
Why?
• To allow DWR to remote functions to things other
than a DWR client
• ‘DWRP’ is designed to be something we can change
without a long deprecation process
© SitePen, Inc. 2008. All Rights Reserved
- 58. Varargs
You can now call methods with a vararg parameter
© SitePen, Inc. 2008. All Rights Reserved
- 59. Varargs
Java:
public Remoted {
public void method(String... arg) { ... }
}
JavaScript:
Remoted.method(quot;Onequot;, quot;Twoquot;, quot;Threequot;);
© SitePen, Inc. 2008. All Rights Reserved
- 60. Varargs
Why?
• It saves the hassle of wrapping options in an array
or collection before a method is called
Alert:
• It could break some corner cases when mixing
servlet parameters with normal parameters
© SitePen, Inc. 2008. All Rights Reserved
- 62. Overloaded Methods
Previously DWR prevented you from reliably calling
overloaded methods
© SitePen, Inc. 2008. All Rights Reserved
- 63. Overloaded Methods
Java:
public Remoted {
public void method(int num) {
log.debug(quot;int method called with quot; + num);
}
public void method(String str) {
log.debug(quot;String method called with quot; + str);
}
}
JavaScript:
Remoted.method(quot;String Paramquot;);
Remoted.method(42);
© SitePen, Inc. 2008. All Rights Reserved
- 64. Overloaded Methods
Why?
• It saves you from creating multiple proxy methods
to existing APIs
© SitePen, Inc. 2008. All Rights Reserved
- 66. Top Directions for DWR 3.1
Shorter release cycle
Gears
SMD
Dojo:
• Reverse Ajax API support
• Auto-build
Rest
© SitePen, Inc. 2008. All Rights Reserved
- 67. Any Questions?
• http://directwebremoting.org
• http://sitepen.com
© SitePen, Inc. 2008. All Rights Reserved