Developing enterprise applications today using JavaFX is a challenge. The industry has not matured enough to identify patterns and practices. Consequently practioners (architects and developers alike) commit the same mistakes again and again. There is a complete lack of non-UI frameworks that make JavaFX application development easy and fast. FxObjects attempts to address that gap. The 0.1 version released provides powerful features.
2. Introduction
Who am I?
A hands-on architect
Experienced and very knowledgeable in Java and
Java EE
Authored a book on Struts
Several articles on Java EE for leading journals
Director of Enterprise Java Practice at
ObjectSource
Creator of FxObjects framework
3. Introduction
What is FxObjects? (Currently 0.1)
An open source JavaFX application development
framework (Apache License)
Why FxObjects?
Enterprise JavaFX architect/developer starts from
scratch, reinventing the wheel, wasting time and
repeating mistakes
Enterprise JavaFX applications need a strategic
and functional framework (not a point solution).
FxObjects is that strategic functional framework !
Learn FxObjects in 25 slides !
5. Introduction
FxObjects is the end to end application
development framework in the UI tier.
Designed to simplify large JavaFX application
development
Makes your application elegant by using
proven patterns, principles and practices
If you use FxObjects as defined in the user
guide, your application becomes inherently
test friendly
6. Introduction
FxObjects is Dependency Injection (DI)
friendly from the grounds-up.
Tested with Spring 2.5
Dependency Injection + FxObjects makes a
very powerful and agile programming model
FxObjects makes TDD possible with JavaFX
by using Model-View-Presenter (MVP)
FxObjects is NOT a UI component library
(and never intends to be).
7. Model-View-Presenter
(Passive View)
Note the sequence of events in MVP passive
View
Actual UI is lean, mean and clean
Presenter does the heavy lifting on the UI
side. But Presenter is not really a UI !!
Hence Presenter can be easily tested and
asserted
8. MVP with FxObjects
NodePresenter is the FxObjects class.
MyNodePresenter and MyNode are app
classes & hold reference to each other
When a event occurs, the MyNode simply
calls doOnSearchButtonClick()
9. Presenter Code
doSearchButtonClick method
Validates UI (for mandatory fields)
Calls the service asynchronously using FxObjects
Command classes
That’s it!
You will see FxObjects Commands next
For aiding the async service calls
Update the UI when async calls return data
Show error message when service call fails
10. Challenges in Service
Invocation
Async calls are fire and forget
They should execute off the Event Dispatch
Thread (EDT)
All UI updates should then again occur ON
the EDT.
Can be confusing and errror-prone
Swing provided SwingWorker
JavaFX provides a async framework
Slightly complex, but FXObjects simplifies this
12. Challenges in Service
Invocation (contd.)
HttpRequest (core JavaFX class) has some
solution (async call is off-EDT & callbacks are
on-EDT), but it is the foundation for a full
solution
FxObjects HttpCommands provide the
missing pieces to make this simple
How to easily go to another page v/s stay on
same page after service invocation?
FxObjects solves this, as we shall see soon
(controller chain)
13. Command objects
Command objects are configured first and
then executed [with execute(..) method]
var cmd = DefaultAsyncCommand {
runInBackground: function(modelObj:Object):Object {
//call service here
}
onSuccess: function(resultObj:Object):Void {
//update ui widgets here OR navigate to another UI
}
onError: function(e:Exception):Void {
//show the error
}
}
14. Automating XML to JavaFX
No Xml tag handling code necessary
Use XmlResponseBuilder
Called ResponseBuilder since it was initially
built to construct JavaFX objects from XML
content (returned by REST services)
Can handle XML of any type and of any
depth
Scales well for all kinds of xml
Best suited for small JavaFX apps though
Larger apps can use JAXBResponseBuilder
15. Automating JavaFX to XML
No code necessary
Use XmlRequestBuilder
Called RequestBuilder since it was initially
built to construct XML from JavaFX objects to
be sent as request body to REST services
Can handle JavaFX objects of any type and
of any depth
Scales well for JavaFX objects of any kind
Best suited for small JavaFX apps
Larger apps can use JAXBRequestBuilder
16. HttpCommands and Builders
Just like DefaultAsyncCommand
No runInBackground necessary. [Http
GET/POST themselves run in background !!]
Url & query parameters are configurable with
{ } syntax
e.g. http://server/app/search?zipCode={zipCode}
The params in {} can be passed in a Map
Otherwise reflection is used to query the object
Need RequestBuilder and ResponseBuilder
XML***Builder or JAXB***Builder
17. GetHttpCommand
var respBuilder = new MyJAXBResponseBuilder();
respBuilder.setSchema(…);
var cmd = GetHttpCommand {
urlTemplate: “http://.../Search?output=xml&zip={zipCode}&..
responseBuilder: respBuilder
onSuccess: function(resultData:Object) {
var result = resultData as ResultSet;
//update UI components here OR navigate to another UI
}
onError: function(e:Exception) {
..
}
}
..
function doSearchButtonClick() {
var paramMap = new HashMap();
paramMap.put(“zipCode”, node.zipCodeTxtBox.text);
cmd.execute(paramMap);
}
18. Custom JAXB Response
Builder
public class CafeSearchResponseBuilder extends
JAXBResponseBuilder<ResultSet> {
@Override
public ResultSet buildResponse(String serverResponse) {
ResultSet rs =
buildResponseObjectFromXml(serverResponse);
return rs;
}
@Override
public ResultSet buildResponse(InputStream inputStream) {
ResultSet rs = buildResponseObjectFromXml(inputStream);
return rs;
}
}
19. BodyHttpCommand
Use for PUT and POST
Almost same as GetHttpCommand
Additionally needs RequestBuilder
To convert the presentation model object into
format expected by server (Generaly XML)
Optionally a content pre-processor
To massage the output from the requestbuilder
and before sending to server
20. Navigation challenges
How to go to another page v/s stay on same
page after service invocation succeeds?
Default JavaFX model involves binding to a
new scenegraph
Couples the lower level UI to top level stage.
No idioms for organizing the application into
modules
Who decides what is the default node to
display?
Solution: FxObjects ControllerChain
22. Navigation with FxObjects
Controller Chain
Each Application can hold many Presenters
Each Application can have many Modules
Each Module can hold many Presenters
Application has a Application Controller
Each Module has a Module Controller.
Module Controller has a Id
Each NodePresenter owns the Node
Node Presenter has a Id
23. Navigation with FxObjects
Controller Chain (contd.)
public MyNodePresenter extends NodePresenter
var cmd = DefaultAsyncCommand {
runInBackground:function(modelObj:Object):Object {
//call service here
}
onSuccess: function(resultObj:Object):Void {
//update ui here OR go to another page
this.changeNodePresenter(“someNodePresenterId”);
}
onError: function(e:Exception):Void {
//show the error
}
}
changeNodePresenter(..) is defined in NodePresenter class (the parent)
24. FxObjects and Dependency
Injection
FxObjects is built with Dependency Injection
in mind.
DI is optional, but recommended
What can be wired
ApplicationController, ModuleController
NodePresenter (but not Nodes)
Commands, Services (Service Proxies)
Nodes should be maintained by Presenters.
This lets presenters choose appropriate node
handling strategy (cache, dispose after use etc.)
25. Bootstrapping FxObjects
var ctx = new ClassPathXmlApplicationContext(“/your-spring.xml");
var appController =
ctx.getBean("appController") as ApplicationController;
Stage {
title: "FxObjects Example“
scene: Scene {
width: 600
height: 400
content: bind [
appController.currentNodePresenter.getNode()
]
}
}
Node presenter configured as default is shown at the beginning
Every navigation call sets another NodePresenter as the “Current”
NodePresenter and that gets bound to the scenegraph
26. What’s coming in 0.2?
Lifecycle
Event
Event Bus
Security
JSON to JavaFX round-tripping
Suggestions welcome (Please post in the
discussion forums)
Timeframe: September 2010
27. FxObjects Summary
Enterprise JavaFX applications are inherently
complex.
Architecting such apps is art and science
FxObjects can help
The more complex the application, the more
value you get from FxObjects
End to end programming model for the UI
Does not force any programming model for
the server
28. Links
Project site – https://fxobjects/dev.java.net
Not a single person open source project
FxObjects is developed and supported by
ObjectSource (http://www.objectsource.com)
Download, use, extend, redistribute, OEM
Discussion Forums on project site
We will answer your questions
Participation welcome
Post ideas, questions, concerns, comments
Contribute code