【问题标题】:Accessing java-based DOM tree directly from JSF/richfaces直接从 JSF/richfaces 访问基于 java 的 DOM 树
【发布时间】:2011-01-09 23:43:52
【问题描述】:

基于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。我现在想我可以直接从 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>

再次感谢 标记

【问题讨论】:

    标签: java jsp jsf richfaces jstl


    【解决方案1】:

    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}" />
    

    【讨论】:

    • 你是在暗示 node 是我的后备 bean 类引用吗?
    • 没有。在此之前你可以拥有&lt;c:set var="node" value="#{backingBean.rootNode}"
    【解决方案2】:
    <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:forEach 迭代 ListObject[] 如下

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

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

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

    虽然Map 上的c:forEach 迭代如您的previous topic 所示,最好在原始Java 代码中解释为:

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

    【讨论】:

    • 在上面的对象引用中#和$可以互换吗?
    • 是的。 #$ 可以同时执行get,但只有# 也可以执行set。因此,如果您使用例如${managedbeanname},如果它尚未创建,它将不会创建托管bean(因此它可能会返回null)。如果尚未完成,#{managedbeanname} 将创建 bean。
    • 还在向你学习BalusC,不知道#和$
    • @Triztian:不客气。另请参阅 stackoverflow.com/questions/4812755/… 了解一些历史。
    猜你喜欢
    • 2011-02-21
    • 2013-09-05
    • 1970-01-01
    • 2012-02-27
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-31
    相关资源
    最近更新 更多