4

I am trying to create a custom tag with Facelets but it isn't rendering (i.e. the tag appears unreplaced in the response).

The tag (/WEB-INF/facelets/tags/inputThumbnailSelector.xhtml):

<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:t="http://myfaces.apache.org/tomahawk">

<ui:composition>
 <div style="position: relative;">
  <img style="position: absolute; left: 0; top: 0;" src="#{image}"/>
  <div class="thumbnail-selector" style="position: absolute; left: #{backingBean.thumbnailLeft}; top: #{backingBean.thumbnailTop};"/>
 </div>
</ui:composition>

</html>

/WEB-INF/facelets/tags/panayk.taglib.xml:

<!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://panayk.endofinternet.org/jsf</namespace>
 <tag>
  <tag-name>inputThumbnailSelector</tag-name>
  <source>inputThumbnailSelector.xhtml</source>
 </tag>
</facelet-taglib>

My web.xml contains:

<context-param>
 <param-name>javax.faces.FACELETS_LIBRARIES</param-name>
 <param-value>/WEB-INF/facelets/tags/panayk.taglib.xml</param-value>
</context-param>

This is how the tag is called:

<!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:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:t="http://myfaces.apache.org/tomahawk"
   xmlns:my="http://panayk.endofinternet.org/jsf">

<ui:composition template="/layout/layout.xhtml">
...  
   <my:inputThumbnailSelector image="${facesContext.externalContext.requestContextPath}/image/get.servlet?id=1" 
            backingBean="#{entryHandler}"/>
...
</ui:composition>

</html>

Many thanks in advance!

Panayiotis Karabassis
  • 2,278
  • 3
  • 25
  • 40

3 Answers3

7

I found my answer here: https://community.oracle.com/thread/1719525

I think I found the problem and the solution (which is not 100% correct). The context param should be facelets.LIBRARIES not javax.faces.FACELETS_LIBRARIES.

The context param javax.faces.FACELETS_LIBRARIES is supposed to replace the deprecated (deprecated as per JSF specification) context param facelets.LIBRARIES. When the latter is used there is a warning in the logs during server startup saying facelets.LIBRARIES is deprecated and javax.faces.FACELETS_LIBRARIES should be used instead. But I think this is only used for logging a warning, i.e. still the name facelets.LIBRARIES is used to build custom taglib components. I'm saying this is not 100% correct because it should work with the new parameter name. There are other parameters which have got new names, but I didn't test them yet.

Community
  • 1
  • 1
Panayiotis Karabassis
  • 2,278
  • 3
  • 25
  • 40
  • 1
    @Panyiotis Karabassis: Thank you, this saved my day. My problem was using facelet instead of facelets – Bertie Jun 23 '11 at 07:29
  • You are welcome! Is this is still a problem, then? I haven't programmed JSF in a while, but I just purchased the "Core JavaServer Faces" book (very promising) which is about JSF2.0 with facelets as the default view layer. Shouldn't it work 'out of the box' now? – Panayiotis Karabassis Jun 23 '11 at 18:43
  • In the "Core Javaserver Faces" the author used both javax.faces.FACELETS_LIBRARIES and acelets.LIBRARIES which is really confusing – Tarik Jan 14 '15 at 14:22
0

I recommend doing your tags like this:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:t="http://myfaces.apache.org/tomahawk">

 <div style="position: relative;">
  <img style="position: absolute; left: 0; top: 0;" src="#{image}"/>
  <div class="thumbnail-selector" style="position: absolute; left: #{backingBean.thumbnailLeft}; top: #{backingBean.thumbnailTop};"/>
 </div>
</ui:composition>

but everything seems ok, since you use a layout, did you wrap the custom tag in a ui:define like this ?

<ui:define name="body">
<my:inputThumbnailSelector image="${facesContext.externalContext.requestContextPath}/image/get.servlet?id=1" 
            backingBean="#{entryHandler}"/>
</ui:define>
0

Make sure your *.taglib.xml is well configured. It happen I had the wrong namespace and it did not work. immediately as I've changed it it worked, I had auto complete (aka. code completion)

<facelet-taglib version="2.2"
            xmlns="http://xmlns.jcp.org/xml/ns/javaee"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
</facelet-taglib>

Related links:

JSF 2.2: New namespaces

Packaging Facelets files (templates, includes, composites) in a JAR

Dorin Brage
  • 158
  • 1
  • 5
  • 14