2012-04-10 1 views
1

Я хочу отобразить группу редакторов в виде табуляции. Каждый редактор имеет свойство, называемое компонентом, который хранит рендер-редактор. Простые редакторы используют HTML-теги для рендеринга редактора, тогда как сложные используют редакторы, определенные на других страницах. Я узнал, что не могу использовать editor.component с ui: include, потому что это значение недоступно при сборке дерева. Как я могу решить эту проблему? Существуют ли альтернативы ui: include, которые не имеют этого ограничения ?.Дисплей динамических редакторов в JSF с 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> 

EDIT 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). Я также удалил строки, которые протестировали src для null в методе getSrc для DynamicInclude.

ответ

1

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

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

+0

Можете ли вы дать мне небольшой пример реализации с FaceletContext.includeFacelet api? – Seitaridis

+0

Это здесь http://pastebin.com/5e2dgR15 – mrembisz

+0

Я еще не создал пользовательский компонент, это мой первый раз. Я добавил два класса, создал файл дескриптора библиотеки тегов с именем динамического тега и прикрепленным типом компонента (DynamicInclude) и добавил библиотеку тегов в javax.faces.FACELETS_LIBRARIES в web.xml. В файле .xhtml я использую , но ничего не отображается. Я что-то упускаю? – Seitaridis