一尘不染

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

jsp

基于这个问题,我还有其他几个问题:

1)这个问题中可供jsf使用的映射实际上是一个数字,因此我现在不确定现在应支持的bean方法的返回类型是什么。如果我将其当前Array<String>返回类型修改为Array<MapInteger, 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片段。我现在想我可以直接从JSF访问此基于Java的DOM树,而不必使用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>

阅读 273

收藏
2020-06-08

共1个答案

一尘不染

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

array –>

错了
您似乎认为,每次上的迭代都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) {
    // ...
}

而上一主题中演示的c:forEach迭代最好在原始Java代码中解释为:Map

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