I've used both Tapestry (nearly 5 years) and Grails (1 year before junking
Grails has some really nice features, such as url mapping and the built-in
I didn't like:
1) Lack of type-safety. Many errors would present themselves only at
runtime, which slowed productivity and in worst cases, resulted in errors
2) The incantations required to generate scaffolding - they are obscure and
require reading the manual in as much detail as just copy and pasting
3) Plugins and core system versions were often incompatible. This required
careful version management.
Versus Tapestry, the +/-s
a) Tapestry has been rock solid and stable - very few critical bugs in the
core framework. Similarly with the limited plugins we use.
b) It's fairly complex to learn - particularly the request lifecycle and IOC
c) Sometimes there's too much Java magic, which is hard to understand eg.
byte code enhancement of page classes
d) Does things its own way when a standard solution would have been easier
to understand and maintain eg. homegrown IOC. Wrt Tapestry IOC, I still
haven't got my head round the annotations on method parameters, together
with specially named parameters versus Guice's explicit Module constructor
w/ explicit bind calls. Tapestry methodology is too many steps of magic, as
opposed to simply leaving the one step of IOC object lookup and binding
magic - like the math prof who skips 2-3 steps of reasoning which are only
obvious if you know the technique well.
In short, I would definitely recommend Tapestry above Grails, but I feel
that there is better yet to come in the web frameworks arena.