Доступ к дереву 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}" />