Over a million developers have joined DZone.

Play's Anomalous Lack

DZone's Guide to

Play's Anomalous Lack

· Java Zone ·
Free Resource

Java-based (JDBC) data connectivity to SaaS, NoSQL, and Big Data. Download Now.

Having completed a first Play project, overall I like it and will probably use it again. That said, the popularity of Play raises some pretty interesting issues about the Java community and who does or does not get to be considered in, or hip.

Play does not support AJAX out of the box. It‘s mechanisms for routing requests is excellent, but it does not include partial DOM updates. Now, as we all know, JSF does support AJAX, and yet, to say JSF has a PR problem is like saying Michael Jackson‘s not the optimal choice to run a day care. What‘s even more surprising is Play comes with a sample that is completely AJAXified: zentasks. It‘s an impressive example, but ultimately it‘s pretty off-putting: its sloppy, incomplete, has polish in some trivial areas while leaving gaping holes in other more fundamental ones. The impression it leaves you with after a while is that it‘s just a door jamb: there to let the makers feel that they have demonstrated a needed level of power. In a move that‘s kind of Googlesque: zentasks is implemented with Backbone and the implementation is not even really documented in the guide. The other day, I noticed that it‘s referred to in the docs as a WIP. Uh, yeah….

Meanwhile, I was doing AJAX in JSF 5 years ago at least maybe longer. Now it is built into the framework. But beyond that, JSF has components that are available, e.g. RichFaces, that have AJAX baked into them. I probably would have stuck with AJAX if RichFaces Bootstrap were not in the runny eggs state.

Been reading a philosophy book about Convention. Not sure this is the first and last word on it, but it would be hard to overstate the importance of convention in the tech world, especially in software: it‘s everywhere. Java spearheaded the notion of deriving conventions through the community and JSF was the result of that process and the irony of that particular outcome is while I think its pace has been maddeningly glacial, I do think that where it ended up is pretty laudable. While I think most of the also-rans leave me feeling like the final review before jumping out at 20K feet was done by a legally blind acolyte with an eye patch.

Think about how we do logging. We are all used to: log.info(“blah”), etc. What is info? Why is the level the method name? That makes a mockery of the whole organization of syntactical logic. Probably because people didn‘t want to be doing this: log.message(level, message). Sure, that‘s not ideal either because message is represented 2x and you have to keep supplying the level over and over (though you are by invoking the level method too). This is advanced as an example of how powerful convention is: when we decide its warranted, we are willing to set aside language, logic, reason simply because we prefer another approach.

Meanwhile, I was reading around in the iOS SDK docs last night. Even with its clunky interface (I think still a webobjects vintage), the samples experience Apple offers makes all others look like clowns. You find the samples, generally several in your area of interest, you click once, after a short download, open and click run and it‘s up in the simulator. Play has better documentation than most frameworks by a mile, but it‘s still not good enough. There was a post this week I found on Twitter by a guy who used AngularJS with Play and Akka. Maybe that‘s a better way to get to a real 2013 web interface. Time for the Play team to decide. In the meantime, the best things about Typesafe, the fact that it‘s a comprehensive stack that includes everything you need down to the build tool, are just not really there on the webdev side.

Connect any Java based application to your SaaS data.  Over 100+ Java-based data source connectors.


Published at DZone with permission of

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}