Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 未调用JSF2中的自定义组件_Jsf 2_Facelets - Fatal编程技术网

Jsf 2 未调用JSF2中的自定义组件

Jsf 2 未调用JSF2中的自定义组件,jsf-2,facelets,Jsf 2,Facelets,我正在我的应用程序中创建一个自定义标记,但由于某些原因,它不起作用,我遵循了教程(这是我发现放在这里作为参考的最清晰的一个),但是,像我做的其他教程一样,我的自定义标记插件没有被调用 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">

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

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>

http://example.com/facelettags
你好
example.MenuTagHandler
我的标记处理程序类

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);
    }
}
包示例;
公共类MenuTagHandler扩展了TagHandler{
私有字符串name=“匿名”;
公共菜单生成器(TagConfig配置){
//其他构造函数的东西
getLogger(MenuTagHandler.class).info(“aaaa”);
//其他构造函数的东西
}
@凌驾
公共void apply(FaceletContext上下文,UIComponent父级)引发IOException{
getLogger(MenuTagHandler.class).info(“aaaa”);
UIComponentBase c=新的UIComponentBase(){
@凌驾
public void encodeEnd(FacesContext ctx)引发IOException{
ResponseWriter w=ctx.getResponseWriter();
w、 写入(String.format)(
“您好%s!我是FaceletTag。

”, 姓名);; } //基中的抽象方法,必须重写 @凌驾 公共字符串getFamily(){ 返回“com.example.facelettag.test”; } }; parent.getChildren().add(c); } }
My.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>

渲染结果为

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);
    }
}


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

如果
*.taglib.xml
文件不在JAR文件的
/META-INF
中,该JAR文件位于
/WEB-INF/lib
中,因此不会被自动检测和注册(就像所有第三方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>

javax.faces.FACELETS\u库
/WEB-INF/example.taglib.xml

与具体问题无关,请注意,到目前为止,您所拥有的不是一个自定义组件。这是一个自定义标记处理程序,它反过来创建了
UIComponentBase
的匿名实例。这不一定是“最好的”练习。如果在视图生成期间不需要执行任何与组件树相关的操作,则根本不需要taghandler部分。只需创建一个fullworthy
@FacesComponent
类即可

另见:

您是否遵循了以下步骤:“要使用taglib,只需将jar文件放入WAR中的WEB-INF/lib即可。”?这个问题表明您没有。请注意,这是Hello World自定义组件的一个非常糟糕的示例。taghandler部分是不必要的,匿名创建的组件实例显然是一种不好的做法,因此会误导初学者。我是在项目中创建的,所以我跳过了这一步,因为我认为应该这样做可见。关于注释:你有一个好的例子,我可以用它来创建我的taglib吗?像个符咒一样工作!谢谢!