After the recent thread around taglibs future, I wanted to explore the possibility of using Java8’s functional interfaces to implement tags. http://svn.apache.org/r1663366 is a straw man I used.
To explain the approach here, I started with the thought that the SimpleTag model in JSP2.0 was a kind of functional implementation. Rather than having to define a class for each tag and a XML description of it, could we represent it as a single method and gain all the needed information through annotation and introspection. Basically I wanted to be able write a tag as something like void tagName(String attribute1, int attribute2, JspFragment body) TagLibrary describes the semantics I came up with, and BasicTagLibrary attempts to demonstrate how the various patterns used by today’s tags could be implemented with the new model. I think this can be supported on JSP2.x engines by using an annotation processor to generate SimpleTag implementations and the XML descriptor for the library. We could also use a ServletContainerInitializer to locate TagLibrary classes during webapp startup and pass the information to Jasper. However, I started to wonder if there was a more efficient model that could also be used for the JSPPage itself, one that might avoid generation for all cases not involving scriptlets. The thought was that a page can be represented by a series of fragments that are either: * text * text produced by EL ValueExpressions * tag invocations * scriptlets (but current best practices tend discourage that) The servlet samples contain various alternatives for representing such a page. I tried to make these work with the existing JSP APIs as much as possible but ran into a couple of impedance mismatches: * the JSP interfaces ofter have additional methods which prevent them being FunctionalInterfaces for example, JSPFragment is a abstract class and exposes two operations * JSP generally uses checked exceptions (JspException) whereas the j.u.function APIs do not. I introduced AbortException as a way to tunnel the checked exceptions to the higher levels * JSP historically has relied on life-cycle methods e.g. JspFactory’s get/releasePageContext. I explored using try-with-resources to control life-cycle instead The interfaces in o.a.jsp.functional try to address these issues. The code builds but I’ve not verified that it actually works as intended - that’s the next step :) Cheers Jeremy
signature.asc
Description: Message signed with OpenPGP using GPGMail