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



我想在选项卡视图中显示一组编辑器。每个编辑器都有一个名为 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>

动态包含注释为@FacesComponent("ro.custom.DynamicInclude")

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

编辑2

最后,我设法让它工作。缺少的是handler-class(com.corejsf.tag.DynamicIncludeHandler)的条目。我还删除了在 DynamicInclude 的 getSrc 方法中测试 src 为 null 的行。

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

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

相关内容

  • 没有找到相关文章

最新更新