Rapid database prototyping, rich extensibility, support for SOA? Not for me (well I am partial to database prototyping, you have me there). I look primarily for a framework that makes it easy to quickly build ad-hoc screens and then easily refactor generally useful pieces of these into reusable widgets. To these ends my colleagues chose Apache's JSF (JavaServer Faces) implementation, MyFaces, prior to my joining the company. Based on my research they made an exceptional choice for building ad-hoc screens since MyFaces Tomahawk provides a good set of widgets (which JSF calls Components) which make it easier to write tidy JSPs.
However, since JSF Components are authored in Java (a procedural programming language) to generate primarily HTML (a declarative presentation language) you have two problems: template refactoring is non-trivial (JSP to Java is best and is still not cut-and-paste), and JSF components need to be recompiled to see changes (stalls quick tweaks by requiring context or server restart). This is before having to deal with further layers of "control" like the TLD which specifies which components actually exist and what attributes are legal (why is it that this cannot be specified in the Java source of the component). Bottom line, JSF promotes DRY (Don't Repeat Yourself) development, but makes it challenging to manage by distributing the authoritative sources of various rules across many Java and XML files.
project: page.html scripts: dojo: dojo.js [...] custom: manifest.js widget: BlogPost.js [...] templates: BlogPost.html BlogPost.css [...]
Any other common patterns in your site can be refactored and even improved in this way. New approaches to interaction and modularity can be discovered in the process, as demonstrated with the possibility of Textiling the tag body to provide even simpler markup and support for styling verbose content.
The presentation files are linked very explicitly to the widget JS through templatePath and templateCssPath. When a page is loaded the Dojo parser scans the DOM for elements with a dojoType attribute. Any of those found trigger a lookup of the appropriate Widget JS. If the Widget is not already loaded into the runtime it is fetched using Ajax. The Widget JS triggers a request for the HTML and CSS template files (which are likely cached if the user has encountered this widget before). In short, you load dojo.js in the head of your page and let it do the rest. No other work required if you are using the existing library of Dojo Widgets.
Oh, and by the way, Dojo effectively makes server-side templating unnecessary so you can static host the entire presentation tier of your application and gain some potentially large bandwidth benefits.