未调用JSF2中的自定义组件



我在我的应用程序中创建了一个自定义标签,但由于某种原因它不起作用,我遵循了本教程(这是我发现放在这里作为参考的最清晰的教程),但是,像我做的其他教程一样,我的自定义标签没有被调用。

web - inf/example.taglib.xml

<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
    xmlns="http://java.sun.com/xml/ns/javaee"
    version="2.0">
    <namespace>http://example.com/facelettags</namespace>
    <tag>
        <tag-name>hello</tag-name>
        <handler-class>example.MenuTagHandler</handler-class>
    </tag>
</facelet-taglib>

标签处理程序类

package example;
public class MenuTagHandler extends TagHandler {
    private String name = "Anonymous";
    public MenuTagHandler(TagConfig config) {
        //other constructor stuff
        Logger.getLogger(MenuTagHandler.class).info("aaaa");
        //other constructor stuff
    }
    @Override
    public void apply(FaceletContext context, UIComponent parent) throws IOException {
        Logger.getLogger(MenuTagHandler.class).info("aaaa");
        UIComponentBase c = new UIComponentBase() {
            @Override
            public void encodeEnd(FacesContext ctx) throws IOException {
                ResponseWriter w = ctx.getResponseWriter();
                w.write(String.format(
                        "<p>Hello %s! I am FaceletTag.</p>",
                        name));
            }
            // abstract method in base, must override
            @Override
            public String getFamily() {
                return "com.example.facelettag.test";
            }
        };
        parent.getChildren().add(c);
    }
}

我的。xhtml文件

<?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">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://java.sun.com/jsf/facelets"
                xmlns:exampler="http://example.com/facelettags" >
        <example:hello />
</ui:composition>

呈现结果

<example:hello></example:hello>

不幸的是,日志中没有打印任何东西,有人知道为什么它不调用标签处理程序吗?

如果*.taglib.xml文件不在/WEB-INF/lib中放置的JAR文件的/META-INF中,因此不会被自动检测和注册(就像在所有这些第三方JSF组件库的情况下,如PrimeFaces, RichFaces等),那么您需要手动注册它在webapp的web.xml中,如下所示:

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

与具体问题无关,请注意,到目前为止,您所使用的不是自定义组件。这是一个自定义标记处理程序,它反过来创建UIComponentBase的匿名实例。这并不一定是"最好的"。练习。如果在视图构建期间不需要执行任何与组件树相关的操作,那么根本不需要标记处理程序部分。只需创建一个完整的@FacesComponent类。

参见:

  • 何时使用,标签文件,复合组件和/或自定义组件?

最新更新