This post shows how to use Expression Language (EL) from JavaFX to communicate with a server using Exadel Flamingo. See my previous posts on Enterprise JavaFX: calling Seam component from JavaFX, invoking Hibernate Validator from JavaFX, and binding to server-side context variable from JavaFX.
Seam component:
@Name ("helloAndTime") @Scope(ScopeType.SESSION) public class HelloAndTime { private Date lastAccessTime; public Date getCurrentTime() { return new Date(); } public String sayHello(String name) { lastAccessTime = getCurrentTime(); return "Hello " + name; } public Date getLastAccessTime() { return lastAccessTime; } }
JavaFX script:
def expressionService: ExpressionService = { var returnValue: ExpressionService = null; try { CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); FXServiceFactory.URL = "http://localhost:8080/server-javafx/seam/resource/hessian/"; returnValue = FXServiceFactory.getService(ExpressionService.class, ExpressionService.NAME) as ExpressionService; } catch (exception: Exception) { Alert.inform(exception.getMessage()); } returnValue } var userName: String = "Enter name"; var serverAnswer: String; var serverTime: Date; var lastAccessTime: String; var poller = Timeline { repeatCount: Timeline.INDEFINITE; keyFrames: [ KeyFrame { time: 1s; action: function () { serverTime = expressionService.getValue("helloAndTime.currentTime") as Date; } } ] } poller.playFromStart(); var stage: Stage; stage = Stage { title: "EL-Expression Sample" width: 420 height: 400 scene: Scene { fill: LinearGradient { endX: 0.0 stops: [Stop { offset: 0.0 color: Color.LIGHTGRAY } Stop { offset: 1.0 color: Color.GRAY }] } stylesheets: [ "{__DIR__}style.css" ] content: VBox { translateX: 5 translateY: 5 spacing: 10 content: [ TextBox { text: bind userName with inverse }, Button { text: "Say Hello" style : "-fx-font-size: large" action: function() { var classes: Class[] = String.class; serverAnswer = expressionService. invokeMethod("helloAndTime.sayHello", String.class, classes, userName) as String; lastAccessTime = String.valueOf(expressionService. getValue("helloAndTime.lastAccessTime") as Date); } }, Text { content: bind "Server says: {serverAnswer}" styleClass: "text" }, Text { content: bind "Last access time: {lastAccessTime}" styleClass: "text" }, Text { content: bind "Current server time: {serverTime}" styleClass: "text" } ] } } onClose: function() { poller.stop(); FX.exit(); } }
Line 6: we get a reference to ExpressionService instance. This class gives us all the functionality to work with EL from JavaFX.
Line 24: we bind to currentTime property in helloAndTime component (bean). The syntax we use is helloAndTime.currentTime. If you are have are familiar with JSF then you would expect this format: #{helloAndTime.currentTime}. Due to JavaFX syntanx we can’t use {} brackets. I think helloAndTime.currentTime is just as simple.
Line 57: we invoked a method
Line 60: we bind to now another property: helloAndTime.lastAccessTime
When using EL, we don’t have to create an interface for the remote component as we did in calling Seam component from JavaFX. On the other hand, the compiler can’t check that such method actually exits. When using an interface, the compiler will complain if we try to invoke a method that’s not in the interface.
Result:
That’s it.
Leave a Reply