tutorial framework etiquetas español ejemplo componentes java jsp jsf richfaces jstl

framework - Acceder al árbol DOM basado en Java directamente desde JSF/richfaces



jsf primefaces (2)

Basado en esta pregunta , tengo un par de preguntas más:

1) el mapa en esta pregunta que está disponible para jsf es en realidad uno de un número, por lo que ahora no estoy seguro de cuál será el tipo de devolución del método de bean de respaldo ahora. si modifico su Array<String> actual Array<String> return type a Array<Map Integer, Map<String, String[]>>> (o ArrayList<Map Integer, Map<String, String[]>>> ?) Sería solo un caso de anidación adicional del iterador en el lado jsf? El problema es un Array / ArrayList no es un Mapa y no estoy seguro de cómo se ve en jsf. sería esto correcto?

<c:forEach items="#{bean.map}" var="entry"> <!-- array --> <c:forEach items="#{entry.value}" var="nentry"> <!-- map --> <h:outputText value="Key: #{nentry.key}, Values:" /> <!-- integer --> <c:forEach items="#{nentry.value}" var="nnentry"> <!-- sub map --> <h:outputText value="Key: #{nnentry.key}, Values:" /> <!-- string --> <c:forEach items="#{nnentry.value}" var="nnnentry"> <!-- string[] --> <h:outputText value="#{nnnentry}" /> </c:forEach><br /> </c:forEach><br /> </c:forEach><br /> </c:forEach>

?

2) lo que realmente estoy almacenando en este mapa es rasgaduras xpath de un árbol XML DOM analizado en el lado java. Ahora estoy pensando que puedo acceder directamente a este árbol DOM basado en java desde JSF sin tener que usar XPath -> ArrayOfMaps y devolverlo. En un archivo XML que se parece a esto, ¿hay alguna forma mejor que utilizar el método anterior ?:

<test> <testid>1</testid> <testname>myName</testname> <inst> <id>1</id> <src>C:/my/path</src> <mask>.*/./w{3}</mask> <mask>.*/.x</mask> </inst> <inst> <id>2</id> <src>C:/my/otherpath</src> <mask>.*/./w{3}</mask> <mask>.*/.x</mask> </inst> </test>

Gracias de nuevo Mark


Este artículo muestra una forma de usar la recursión con JSTL. Puedes darle una oportunidad:

<c:forEach var="node" items="${node.children}"> <c:set var="node" value="${node}" scope="request"/> <jsp:include page="node.jsp"/> </c:forEach>

Simplemente, para acomodar su caso, puede poner lo siguiente antes del ciclo:

<c:set var="node" value="#{backingBean.rootNode}" />


<c:forEach items="#{bean.map}" var="entry"> <!-- array --> <c:forEach items="#{entry.value}" var="nentry"> <!-- map -->

Esto está mal. Cada iteración sobre una ArrayList no devuelve un objeto Map.Entry como parece pensar. Simplemente devuelve el elemento individual de la List (que en su caso es un Map ). Así es como debería verse:

<c:forEach items="#{bean.list}" var="map"> <!-- array --> <c:forEach items="#{map}" var="entry"> <!-- map -->


En pocas palabras, a c:forEach iteración sobre una List u Object[] siguiente manera

<c:forEach items="${array}" var="item"> ... </c:forEach>

es mejor interpretarlo en código Java sin procesar como

for (Object item : array) { // ... }

mientras que un c:forEach iteración sobre el Map como se demostró en su tema anterior, es mejor interpretarlo en código Java sin procesar como:

for (Entry<K, V> entry : map.entrySet()) { K key = entry.getKey(); // ${entry.key} V value = entry.getValue(); // ${entry.value} }