直接从JSF / richfaces访问基于java的DOM树

时间:2010-01-27 14:17:15

标签: java jsp jsf richfaces jstl

基于this question我还有其他一些问题:

1)这个问题中可用于jsf的地图实际上是一个数字,所以我现在不确定支持bean方法的返回类型现在应该是什么。如果我将它的当前Array<String>返回类型修改为Array<Map Integer, Map<String, String[]>>>(或ArrayList<Map Integer, Map<String, String[]>>>?),那么它只是在jsf端进一步嵌套迭代器的情况吗?麻烦是一个Array / ArrayList不是Map,我不确定它在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)我真正存储在这个地图中的是从java端解析的XML DOM树中的xpath rips。我现在想我可以直接从JSF访问这个基于java的DOM树,而不必使用XPath - &gt; 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>

再次感谢 标记

2 个答案:

答案 0 :(得分:1)

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

这是错误的。正如您所想的那样,ArrayList上的每次迭代都不会返回Map.Entry个对象。它只返回List的单个元素(在您的情况下为Map)。这是它应该是这样的:

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


简而言之,对c:forEachList进行Object[]次迭代,如下所示

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

最好在原始Java代码中解释为

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

虽然previous topic中演示的c:forEach次迭代最好在原始Java代码中解释为:

Map

答案 1 :(得分:0)

This article显示了一种使用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}" />