Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to create a custom Facelets tag?

I am using JSF 2.0. I created custom JSTL tags with tagfiles and that were working fine in JSP. But I want to use custom JSTL tags in Facelets too. Is it possible to create tagfiles in Facelets or not?

like image 329
Nisar Avatar asked Feb 07 '13 12:02

Nisar


People also ask

What is custom tagging?

A custom tag is a user-defined JSP language element. When a JSP page containing a custom tag is translated into a servlet, the tag is converted to operations on a tag handler. The web container then invokes those operations when the JSP page's servlet is executed.


1 Answers

"Custom JSTL tags" makes honestly no sense. This term is utterly meaningless. JSTL is already a taglib at its own. Please carefully read the introductory paragraphs of our JSTL wiki page to learn what JSTL really is. You perhaps actually meant "Custom JSP tags". Of course they would not work in Facelets as that's a completely different view technology than JSP and actually the successor of the deprecated JSP.

Well, the analogy of a "Custom JSP tag" is a "Custom Facelets tag", or more commonly "Facelets tag file". It's rather simple, you can follow the same syntax as an include file.

/WEB-INF/tags/some.xhtml:

<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets">
    Hello World
    ...
    <ui:insert /> <!-- This inserts tag body, if necessary. -->
</ui:composition>

and register it in /WEB-INF/example.taglib.xml as follows:

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
    version="2.0">
    <namespace>http://example.com/jsf/facelets</namespace>
    <tag>
        <tag-name>some</tag-name>
        <source>tags/some.xhtml</source>
    </tag>
</facelet-taglib>

which is in turn registered in /WEB-INF/web.xml as follows:

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

(note that registration in web.xml is unnecessary when the *.taglib.xml file is in /META-INF folder of a JAR in /WEB-INF/lib)

and finally use it in your templates as follows:

<html ... xmlns:my="http://example.com/jsf/facelets">
...
<my:some />

See also:

  • When to use <ui:include>, tag files, composite components and/or custom components?
  • Structure for multiple JSF projects with shared code
like image 102
BalusC Avatar answered Sep 22 '22 18:09

BalusC