Sé que no podemos repetir la IDENTIFICACIÓN de alguno de los componentes que tenemos en el mismo punto de vista de árbol.

Tengo una página en la que se incluye otra de las páginas de ciertas condiciones Como esta…

<h:panelGroup rendered="#{bean.insertMode == 'SINGLE'}">
   <ui:include src="_single.xhtml" />
</h:panelGroup> 
<h:panelGroup rendered="#{bean.insertMode == 'DOUBLE'}">
   <ui:include src="_double.xhtml" />
</h:panelGroup>

Ahora En estas páginas que tengo «Casi» los mismos componentes de la jerarquía (Complejos), con diferentes acciones de comportamiento (No sólo las llamadas de método, también de la vista), por ejemplo:

_single.xhtml

<p:inputText id="fieldID" value="#{bean.value}" />
<p:commandLink actionListener="#{bean.singleAction()}" />

_double.xhtml

<p:inputText id="fieldID" value="#{bean.value}" />
<p:commandLink actionListener="#{bean.doubleAction()}" />

Mi pequeño ejemplo funciona bien, y se representa como se suponía, pero me da

java.lang.IllegalStateException: Component ID fieldID has already been found in the view.

Sé que JSF proceso el total de páginas, incluso si no están incluidos y por eso me estoy poniendo esta excepción.

Cualquier forma inteligente de resolver esto sin cambiar los Identificadores de los componentes en el interior incluyen páginas (Aunque funciona, pero la excepción es molesto y parece que algo está mal).

No quiero también para envolver cada una de las páginas con algún componente contenedor con un ID diferente, por lo que tendrían un COMPLETO diferente de IDENTIFICACIÓN como formId:id de campo debido a que la página principal se refiere también a estos componentes dentro de estas se incluyen!

  • Si ambos solteros.xhtml y doble.archivos xhtml contiene casi la estructura exacta, ¿por qué no tener una sola página en su lugar?
  • No es la estructura exacta.. es totalmente diferente, con algunos campos compartidos entre ellos.. Y no quiero cambiar los Identificadores de estos campos compartidos 🙂 @LuiggiMendoza
  • Puedes envolverte en un invisible NamingContainer en su página principal o en las páginas secundarias. Es fácil hacer un invisible contenedor de nombres con un componente compuesto.
  • Por favor, lea la última sección de mi post 🙂
  • Sí, de ahí que me comentó en lugar de responder, sabía que había una mejor manera y veo BalusC ha señalado que ya 🙂
InformationsquelleAutor Hatem Alimam | 2013-09-12

1 Comentario

  1. 33

    El duplicado IDENTIFICADOR de componente de error se produce porque el tanto incluye físicamente terminan en el árbol de componentes JSF. El <h:panelGroup rendered="false"> no les impide terminar en JSF árbol de componentes, sino que les impide la generación de su código HTML de salida.

    Lugar de condicionalmente representación de su salida de HTML, usted necesita para condicionalmente a construir en el árbol de componentes JSF. JSTL es muy útil en este ya que se ejecuta durante la vista del tiempo de construcción:

    <c:if test="#{bean.insertMode eq 'SINGLE'}">
        <ui:include src="_single.xhtml" />
    </c:if> 
    <c:if test="#{bean.insertMode eq 'DOUBLE'}">
        <ui:include src="_double.xhtml" />
    </c:if>

    En caso de que usted está usando Mojarra, usted sólo necesita para asegurarse de que el uso de al menos la versión 2.1.18 o más reciente, de lo contrario vista ámbito de los frijoles se comportan como un ámbito de petición frijoles.

    Una alternativa es hacer uso de EL operador condicional en src atributo (el <ui:include> sí funciona como un taghandler también durante la vista de tiempo de compilación):

    <ui:include src="_#{bean.insertMode eq 'SINGLE' ? 'single' : 'double'}.xhtml" />

    O incluso el uso de la insertMode directamente como nombre de archivo:

    <ui:include src="_#{fn:toLowerCase(bean.insertMode)}.xhtml" />

    De cualquier manera, usted necesita para asegurarse absolutamente de que el #{bean.insertMode} está disponible durante la vista en tiempo de compilación, y también de que exactamente el mismo valor está disponible durante la restauración de la vista de la fase de devoluciones de datos como lo fue durante la fase de procesamiento, de lo contrario el punto de vista posiblemente podría ser restaurado con el mal incluir y JSF no puede decodificar el derecho entradas de comandos y más. También, cuando se quiere cambiar el include durante la devolución, que realmente necesita para reconstruir la vista (retorno nonull/void), o para enviar una redirección.

    Véase también:

    • Actualizar desde 2.1.2 2.1.18 guardado para mí.
    • Eres bienvenido. Tenga en cuenta que la 2.1.x está ya en 2.1.29.

Dejar respuesta

Please enter your comment!
Please enter your name here