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

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to