我有一个功能性的JSF标记文件<w:export>
,它基本上是Primefaces <p:dataExporter>
的包装。它已经可以正常工作了一段时间了。
最近,需要开发另一个标记文件<w:table>
,而该标记文件又将使用<w:export>
标记文件。但是,一旦包含<w:export>
并使用新的标记文件显示页面,则会出现以下消息错误:
javax.faces.view.facelets.TagException: /WEB-INF/lib/tags.jar/META-INF/resources/components/newcomponents/table.xhtml @29,65 <w:export> /D:/demo/target/demo-web.war/WEB-INF/lib/tags.jar/META-INF/components/export.xhtml
at com.sun.faces.facelets.tag.UserTagHandler.apply(UserTagHandler.java:145)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:161)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:203)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:135)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:96)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:161)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:203)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:135)
at com.sun.faces.facelets.tag.jsf.core.FacetHandler.apply(FacetHandler.java:105)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:96)
标签实际上是在我当前正在处理的应用程序之外的另一个可重用jar中定义的。该罐具有以下结构:
| META-INF
| + resources
| | + components
| | | + newcomponents
| | | | table.xhtml
| | | | export.xhtml
| |
| w_components.taglib.xml
| web-fragment.xml
|
<w:export>
的相关代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:composite="http://java.sun.com/jsf/composite"
xmlns:p="http://primefaces.org/ui"
xmlns:pe="http://primefaces.org/ui/extensions"
>
<composite:interface name="export" displayName="Wraps primefaces dataExport">
...
<composite:implementation>
<p:panelGrid ..>
<p:panel ...>
<f:facet name="header">
<h:outputLabel ..."/>
</f:facet>
<p:panelGrid ...>
<p:commandLink ...>
<p:dataExporter.../>
</p:commandLink>
...
<w:table>
定义的相关代码:
<!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:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
xmlns:w="http://org.custom/components">
...
<composite:interface name="dataTable" displayName="Wraps primefaces dataTable">
<composite:implementation>
<h:panelGrid ...>
<p:dataTable...>
<f:facet name="header">
...
<w:export .../>
</facet>
</p:dataTable>
...
w_components.taglib.xml
...
<facelet-taglib>
<namespace>http://org.custom/components</namespace>
<tag>
<tag-name>table</tag-name>
<source>components/newcomponents/table.xhtml</source>
</tag>
<tag>
<tag-name>export</tag-name>
<source>components/export.xhtml</source>
</tag>
...
这就是我对 web-fragment.xml
...
<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>/WEB-INF/w_components.taglib.xml</param-value>
</context-param>
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/w_components.taglib.xml</param-value>
</context-param>
...
我相信关于从一个组件到另一个组件的引用我缺少一些东西,但是找不到它。除了抛出的错误没有太大帮助。
更新 事实证明,我实际上是在混淆。从When to use <ui:include>, tag files, composite components and/or custom components?中,我理解(我认为)我实际上是复合组件定义,但毫无理由地包括ALSO那些相同定义的标签库定义(我想我认为应该将CC定义放在资源中文件夹还不够)。 我已经删除了标签定义,并且抄送正在工作。