使用 ui:include 在 JSF 中显示动态编辑器

Posted

技术标签:

【中文标题】使用 ui:include 在 JSF 中显示动态编辑器【英文标题】:Display dynamic editors in JSF with ui:include 【发布时间】:2012-04-22 18:09:40 【问题描述】:

我想在 tabview 中显示一组编辑器。每个编辑器都有一个名为 component 的属性,用于存储渲染的编辑器。简单的编辑器使用 html 标签来呈现编辑器,而复杂的编辑器使用在其他页面中定义的编辑器。我发现我不能将editor.componentui:include 一起使用,因为在构建树时该值不可用。我该如何解决这个问题?是否有任何替代 ui:include 没有此限制?

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.prime.com.tr/ui">

<h:panelGroup>
    <p:tabView value="#groupsBean.groups" var="group">  
        <p:tab title="#group.name">  
            <h:panelGroup>  
                <p:dataTable value="#group.editors" var="editor">  
                    <p:column headerText="Key">  
                        <h:outputText value="#editor.name" />  
                    </p:column>  
                    <p:column headerText="Value">
                        <h:panelGroup rendered="#not editor.href">
                            <h:outputText value="#editor.component" escape="false" />
                        </h:panelGroup>
                        <h:panelGroup rendered="#editor.href">
                            <ui:include src="#editor.component" />
                        </h:panelGroup>  
                    </p:column>  
                </p:dataTable>  
            </h:panelGroup>  
        </p:tab>  
    </p:tabView>  
</h:panelGroup>  

编辑 1

web.xml 包含以下条目:

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

custom.taglib.xml 位于 WEB-INF 文件夹中。

<facelet-taglib>  
    <namespace>http://www.custom.ro/</namespace>  
    <tag>  
        <tag-name>dynamic</tag-name>  
        <component>  
            <component-type>ro.custom.DynamicInclude</component-type>                 
        </component>  
    </tag>  
</facelet-taglib>

DynamicInclude 用@FacesComponent("ro.custom.DynamicInclude")注解

groups.xhtml 中,我添加了动态包含的命名空间 - xmlns:custom="http://www.custom.ro/"

EDIT2

我终于成功了。缺少的是处理程序类(com.corejsf.tag.DynamicIncludeHandler)的条目。我还删除了在 DynamicInclude 的 getSrc 方法中测试 src 是否为 null 的行。

【问题讨论】:

【参考方案1】:

据我所知,没有这样的组件可以替代 ui:include。我们已经使用 FaceletContext.includeFacelet api 自己实现了这样的事情。

一个相当简单的替代方法是使用 c:forEach 循环来呈现表格 - 无需自己编写额外的组件。缺点是每行都有一个组件,在某些情况下可能会占用大量资源。

【讨论】:

你能给我一个使用 FaceletContext.includeFacelet api 实现的小例子吗? 我之前没有创建过自定义组件,这是我第一次。我添加了这两个类,创建了带有“动态”标签名称和附加组件类型(DynamicInclude)的标签库描述符文件,并将标签库添加到 web.xml 中的 javax.faces.FACELETS_LIBRARIES。在 .xhtml 文件中,我使用 ,但没有显示任何内容。我错过了什么吗? 尝试将路径作为 src 以应用程序根目录开头,例如 /WEB-INF/path/to/facelet。如果没有帮助,请尝试调试器。 我已将 #editor.component 硬编码为 /WEB-INF/editors/editor.xhtml。 我正在用 firebug 查看页面源代码,发现 标签存在。跨度>

以上是关于使用 ui:include 在 JSF 中显示动态编辑器的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSF 2.2 动态加载表单

JSF:将页面动态包含到primefaces对话框中

JSF ui:include 和 getElementById

JSF 2:如何将包含要调用的参数的动作传递给 Facelets 子视图(使用 ui:include 和 ui:param)?

在 JSF 中动态显示和隐藏 <h1> [重复]

条件 ui:在 JSF 中包含并保留布局