Custom Facelet component in JSF

前端 未结 1 1813
谎友^
谎友^ 2020-12-01 15:22

Is it possible to create a custom JSF core Facelet component. Something like of , or

相关标签:
1条回答
  • 2020-12-01 16:11

    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:

    • When to use <ui:include>, tag files, composite components and/or custom components?
    0 讨论(0)
提交回复
热议问题