作为练习,我只使用注释在 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 中或其他)。