Отображение динамических редакторов в JSF с помощью ui:include

Я хочу отобразить группу редакторов во вкладке. У каждого редактора есть свойство с именем component, в котором хранится визуализированный редактор. Простые редакторы используют теги HTML для отображения редактора, тогда как сложные используют редакторы, определенные на других страницах. Я обнаружил, что не могу использовать editor.component с ui: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/".

ИЗМЕНИТЬ2

Наконец мне удалось заставить его работать. Отсутствовала запись для класса-обработчика (com.corejsf.tag.DynamicIncludeHandler). Я также удалил строки, которые проверяли src на null в методе getSrc DynamicInclude.


person Seitaridis    schedule 10.04.2012    source источник


Ответы (1)


Насколько мне известно, такой альтернативы компоненту ui:include нет. Мы сами реализовали такую ​​штуку с помощью API FaceletContext.includeFacelet.

Довольно простой альтернативой может быть рендеринг таблицы с использованием цикла c: forEach — нет необходимости самостоятельно кодировать дополнительный компонент. Недостатком является то, что вы получите компонент для каждой строки, что в некоторых случаях может быть ресурсоемким.

person mrembisz    schedule 10.04.2012
comment
Можете ли вы привести небольшой пример реализации с API FaceletContext.includeFacelet? - person Seitaridis; 11.04.2012
comment
Раньше я не создавал пользовательский компонент, это мой первый раз. Я добавил два класса, создал файл дескриптора библиотеки тегов с именем динамического тега и прикрепленным типом компонента (DynamicInclude) и добавил библиотеку тегов в javax.faces.FACELETS_LIBRARIES в web.xml. В файле .xhtml я использую ‹custom:dynamic src=#{editor.component} /›, но ничего не отображается. Я что-то упускаю? - person Seitaridis; 11.04.2012
comment
Попробуйте сделать так, чтобы путь как src начинался с корня приложения, например, /WEB-INF/path/to/facelet. Если не поможет, попробуйте отладчик. - person mrembisz; 11.04.2012
comment
Я жестко закодировал #{editor.component} в /WEB-INF/editors/editor.xhtml. - person Seitaridis; 11.04.2012
comment
Я просмотрел исходный код страницы с помощью firebug и увидел, что тег ‹custom:dynamic src=/WEB-INF/editors/editor.xhtml›‹/custom:dynamic› существует. - person Seitaridis; 11.04.2012
comment
Если вы видите его в браузере, это означает, что тег не был обработан должным образом. - person mrembisz; 11.04.2012
comment
‹custom:dynamic src=/WEB-INF/editors/editor.xhtml›‹/custom:dynamic› не отображается, но я вижу его с помощью firebug. - person Seitaridis; 11.04.2012
comment
давайте продолжим это обсуждение в чате - person Seitaridis; 11.04.2012
comment
Я добавил свою текущую конфигурацию для пользовательского компонента (EDIT1) - person Seitaridis; 11.04.2012
comment
Приложение выдает исключение java.lang.NullPointerException в com.corejsf.component.DynamicInclude.buildView(DynamicInclude.java:97), так как faceletContext имеет значение null. - person Seitaridis; 11.04.2012
comment
faceletContext установлен в DynamicIncludeHandler, убедитесь, что он правильно зарегистрирован. - person mrembisz; 11.04.2012
comment
Я исправил проблему с изменениями, описанными в EDIT2. - person Seitaridis; 12.04.2012