3

作为练习,我只使用注释在 jsf 2.2 中创建了一些自定义组件。现在我对在 ui 中完成的 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”文本输入。

作为练习,我添加了一个标签,它定义了一个没有 ui 交互的模型(在“我的”引擎内部)。所以我的想法是添加一个 TagHandler (它也不需要操纵它之前的标签,所以也许我应该 extend UIComponentBase,但这不是现在的“问题”)。TagHandlers 不能通过我所看到的注释来创建,所以我创建了一个 taglib.xml 并将我的 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>

这是预期的行为吗?还是应该以不同的方式声明标签处理程序?我在谷歌中尝试了很多关键字组合,但无济于事。没有发现错误,也没有任何提示以不同的方式做事,什么都没有。

我目前正在运行所有这些

  • Wildfly 8.0.0-Final (Mojarra 2.2.5-jbossorg-3 20140128-1641)
  • java7
  • PrimeFaces 5.1
  • OmniFaces 2.0。

明天我将尝试在更新的 WildFly 上运行它,或者只是尝试更新到最新的 Mojarra(可能在干净的 Tomcat 中或其他)。

4

0 回答 0