使用TagHandler创建taglib.xml使得带注释的自定义组件无法工作

时间:2015-02-21 19:22:05

标签: jsf jsf-2.2 custom-component tag-handler

作为练习,我只使用注释在jsf 2.2中创建一些自定义组件。目前我对在tag中完成的taglib不感兴趣,因为这使我免于维护它,所以初始开发更快。这很完美。在这个例子中,我有一个组件,目前,它扩展了PrimeFaces InputText(改变了没有区别),一个干净的faces-config(正确的2.2命名空间)和一个简单的页面

组件:

package my.custom.xforms;

import javax.faces.application.ResourceDependencies;
import javax.faces.application.ResourceDependency;
import javax.faces.component.FacesComponent;

import org.primefaces.component.inputtext.InputText;

@FacesComponent(value = "xforms.input", createTag = true,
    namespace =  "http://www.w3.org/2002/xforms", tagName = "input")
@ResourceDependencies({
    @ResourceDependency(library="primefaces", name="primefaces.css"),
    @ResourceDependency(library="primefaces", name="jquery/jquery.js"),
    @ResourceDependency(library="primefaces", name="primefaces.js")}
)
public class Input extends InputText {

    public Input() {
        setRendererType("xforms.inputRenderer");
    }

    @Override
    public String getFamily() {     
        return "my.xforms.components";
    }
}

面-config.xml中

<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
        http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
    version="2.2">
</faces-config>

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:xf="http://www.w3.org/2002/xforms"
    xmlns:p="http://primefaces.org/ui">
    <h:head/>
    <h:body>
        <xf:input />
    </h:body>
</html>

这很好地展示了PrimeFaces&#39;文字输入。

作为一项练习,我添加了一个标签,用于定义一个没有ui交互的模型(我的&#39;引擎的内部)。所以我的想法是添加一个TagHandler(它不需要在它之前操纵标签,所以也许我应该扩展UIComponentBase,但这不是现在的问题)。无法通过我可以看到的注释创建TagHandlers,因此我创建了一个taglib.xml并将我的TagHandler放在那里。

taghandler

package my.custom.xforms;

import java.io.IOException;

import javax.el.ELException;
import javax.faces.FacesException;
import javax.faces.component.UIComponent;
import javax.faces.view.facelets.ComponentHandler;
import javax.faces.view.facelets.FaceletContext;
import javax.faces.view.facelets.FaceletException;
import javax.faces.view.facelets.TagConfig;
import javax.faces.view.facelets.TagHandler;

public class ModelTagHandler extends TagHandler {

    public ModelTagHandler(TagConfig tagConfig) {
        super(tagConfig);
    }

    public void apply(FaceletContext faceletContext, UIComponent parent) throws IOException, FacesException, FaceletException, ELException {
        if (ComponentHandler.isNew(parent)) {
            System.out.println("XForms Model encountered");
        }
    }
}

新页面

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:xf="http://www.w3.org/2002/xforms"
    xmlns:p="http://primefaces.org/ui">
    <h:head/>
    <h:body>
        <xf:model /> <!-- can be put in h:head to, does not make a difference -->
        <xf:input />
    </h:body>
</html>

标签库

<facelet-taglib version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee   http://xmlns.jcp.org/xml/ns/javaee/web-facelettaglibrary_2_2.xsd">
    <namespace>http://www.w3.org/2002/xforms</namespace>

    <tag>
        <tag-name>model</tag-name>
        <handler-class>my.custom.xforms.ModelTagHandler</handler-class>
    </tag>
</facelet-taglib>

令我惊讶的是(仅部分),我的自定义组件仅使用注释创建,停止使用以下错误。

/components/page.xhtml @12,33 <xf:input> Tag Library supports namespace: http://www.w3.org/2002/xforms, but no tag was defined for name: input

如果我将自定义组件放在我的taglib中,它才会重新开始工作。

<tag>
    <tag-name>input</tag-name>
    <component>
        <component-type>xforms.input</component-type>
        <renderer-type>xforms.inputRenderer</renderer-type>
    </component>
</tag>

这是预期的行为吗?或者应该以不同的方式声明taghandler?我在谷歌尝试了很多关键字组合,但无济于事。没有找到错误,也没有任何暗示以不同的方式做事,没有。

我目前正在

中运行所有这些
  • Wildfly 8.0.0-Final(Mojarra 2.2.5-jbossorg-3 20140128-1641)
  • java7
  • PrimeFaces 5.1
  • OmniFaces 2.0。

我明天会尝试在较新的WildFly上运行它,或者只是尝试更新到最新的Mojarra(可能是在一个干净的Tomcat或其他任何东西)。

0 个答案:

没有答案