Eine erste Version steht. Was mir bislang bei Facelets in einem ersten produktiven Projekt gefehlt hat, geht nun:
Wie integriere ich Third-Party-JSP Taglibs, wenn meine Views gar keine JSPs verwenden?
Die Idee beruht auf einer Lösung wie sie die Template-Engine Freemarker verwendet. Eine Container unabhängige JSP-Umgebung, die eine Taglib laden und aufrufen kann. Auf diese Weise werden in Freemarker JSP-Fragmente eingebettet und genauso lassen sich in Facelet-Views auch Third-Party-Taglibs integrieren.
Die Java-Sourcen sind weitgehend von Freemarker übernommen und noch nicht vollständig angepasst, aber das Prinzip wird deutlich und es funktioniert mit SimpleTags bereits.
Das Beispiel geht davon aus, dass man das Starterkit aus Facelets als WebApplikation installiert alles weitere ist in der Zip-Datei im Anhang zu finden.
Eine Taglib wird integriert über ein CustomTag, welches im einer Facelet-Taglib beschrieben wird:
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
"http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://www.rinke-solutions.de/facelets/ext</namespace>
<tag>
<tag-name>taglib</tag-name>
<handler-class>rinke.solutions.faclets.tag.jsp.JspTaglibTag</handler-class>
</tag>
</facelet-taglib>
Im View selbst wird die Taglib dann mit diesem Tag "taglib" aufgerufen:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:x="http://www.rinke-solutions.de/facelets/ext"
>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>My First Facelet</title>
</head>
<body>
<x:taglib uri="http://www.rinke-solutions.de/taglibs/jsftest" tagname="simpleInsert" value="Test"/>
</body>
</html>
Was jetzt noch fehlt, ist die Integration komplexerer Tags mit Body oder Iteration.