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>

私のタグハンドラクラス

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>

残念ながら、ログには何も出力されません。タグ ハンドラを呼び出さない理由を誰か知っていますか?

4

1 に答える 1

0

ファイルが配置されたJARファイルの*.taglib.xml内部になく、したがって自動的に検出および登録されない場合(PrimeFaces、RichFacesなどのすべてのサードパーティJSFコンポーネントライブラリの場合のように)、次のようになります。次のように、手動でwebappに登録する必要があります。/META-INF/WEB-INF/libweb.xml

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

具体的な問題とは関係なく、これまでのところカスタムコンポーネントではないことに注意してください。これはカスタムタグハンドラーであり、の匿名インスタンスを作成しますUIComponentBase。これは必ずしも「ベスト」プラクティスではありません。ビューのビルド時にコンポーネントツリーに関連するアクションを実行する必要がない場合は、タグハンドラー部分はまったく必要ありません。@FacesComponent代わりに、十分な価値のあるクラスを作成してください。

参照:

于 2013-03-19T20:21:09.827 に答える