5

Is it possible to create a custom JSF core Facelet component. Something like <custom:composition> of <ui:composition>, or <custom:include> for <ui:include> It would be helpful if someone can tell me the steps involved.

Thanks in advance,

Kaushal

1 Answer 1

17

It are in essence taghandlers. I.e. classes extending from TagHandler.

Here's a Hello World taghandler.

com.example.HelloTagHandler

public class HelloTagHandler extends TagHandler { public HelloTagHandler(TagConfig config) { super(config); } @Override public void apply(FaceletContext context, UIComponent parent) throws IOException { // Do your job here. This example dynamically adds another component to the parent. if (ComponentHandler.isNew(parent)) { UIOutput child = new HtmlOutputText(); child.setValue("Hello World"); parent.getChildren().add(child); } nextHandler.apply(context, parent); // Delegate job further to first next tag in tree hierarchy. } } 

/WEB-INF/my.taglib.xml

<?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/my</namespace> <tag> <tag-name>hello</tag-name> <handler-class>com.example.HelloTagHandler</handler-class> </tag> </facelet-taglib> 

/WEB-INF/web.xml (note: this part is not mandatory when my.taglib.xml is in /META-INF folder of a JAR file inside /WEB-INF/lib like as with JSF component libraries):

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

Usage in /some.xhtml

<html ... xmlns:my="http://example.com/my"> ... <my:hello /> 

To see the source code of Mojarra implementation of <ui:composition> and <ui:include>, click the links.

See also:

Sign up to request clarification or add additional context in comments.

2 Comments

Thanks for the example. It was indeed helpful. I must say that your answers for JSF are very valuable.
I'm using this strategy, and I noticed that on a postback, the created component is moved, becoming the first child of the parent. Frustrating...

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.