Доступ к дереву DOM на основе Java непосредственно из JSF/richfaces
На основе этот вопрос У меня есть еще несколько вопросов:
1) карта в этом вопросе, которая становится доступной для jsf, на самом деле является одним из числа, поэтому теперь я не уверен, что теперь должен использоваться тип возвращаемого метода bean. если я изменяю текущий Array<String>
возвращаемый тип на Array<Map Integer, Map<String, String[]>>>
(или ArrayList<Map Integer, Map<String, String[]>>>
?), это будет просто случай дальнейшего вложения итератора на стороне jsf? Проблема заключается в том, что Array/ArrayList не является картой, и я не уверен, как это выглядит в jsf. это было бы правильно:
<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) то, что я действительно храню на этой карте, - это xpath rips из дерева XML DOM, обработанного на стороне java. Я теперь думаю, что могу получить доступ к этому дереву DOM на основе Java из JSF напрямую, не используя XPath → ArrayOfMaps и возвращая это. В XML файле, который выглядит примерно так, есть ли лучший способ, чем использование вышеуказанного метода?:
<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>
Еще раз спасибо
Марк
Ответы
Ответ 1
<c:forEach items="#{bean.map}" var="entry"> <!-- array -->
<c:forEach items="#{entry.value}" var="nentry"> <!-- map -->
Это неправильно. Каждая итерация по ArrayList
не возвращает объект Map.Entry
вообще, как вы, кажется, думаете. Он просто возвращает отдельный элемент List
(который находится в вашем случае a Map
). Вот как это должно выглядеть:
<c:forEach items="#{bean.list}" var="map"> <!-- array -->
<c:forEach items="#{map}" var="entry"> <!-- map -->
В двух словах, атерация c:forEach
по List
или Object[]
, как следует
<c:forEach items="${array}" var="item">
...
</c:forEach>
лучше всего интерпретировать в необработанном Java-коде как
for (Object item : array) {
// ...
}
в то время как итерация c:forEach
по Map
, как показано в предыдущем разделе, лучше всего интерпретировать в необработанном Java-коде как:
for (Entry<K, V> entry : map.entrySet()) {
K key = entry.getKey(); // ${entry.key}
V value = entry.getValue(); // ${entry.value}
}
Ответ 2
В этой статье показан способ использования рекурсии с JSTL. Вы можете попробовать:
<c:forEach var="node" items="${node.children}">
<c:set var="node" value="${node}" scope="request"/>
<jsp:include page="node.jsp"/>
</c:forEach>
Просто, чтобы разместить ваше дело, вы можете поставить перед циклом следующее:
<c:set var="node" value="#{backingBean.rootNode}" />