代码之家  ›  专栏  ›  技术社区  ›  Bane

如何使用JSTL迭代潜在的无限集合

  •  2
  • Bane  · 技术社区  · 15 年前

    前言:我是SO的忠实粉丝,几乎每天都在这里读东西——但这是我的第一个问题——感谢每一个创造了如此奇妙资源的人!

    环境:Spring/JSTL/Java;这个项目的约束使我无法接受需要放弃Spring/Java的解决方案,尽管我可能可以实现任何标准视图来代替JSTL。

    怎样


    问题:我有一个数据服务,从中获取一组集合。我不能控制这个服务,也不能定义它——这是由其他人负责的,它可以随时更改。集合中的每个项都可以是另一个集合(我必须对其进行分析),因此理论上整个集合是无限的。收藏基本上是这样的:

      • Item:对象(可以是字符串或其他集合)

    基本上每个 项目 是我的客户向他们的客户提供的“服务”,例如:“配置您的机构电子邮件”,以及 收集 是相关服务的“类别”,例如:“提供电子邮件服务”。但“提供的电子邮件服务”的类别实际上可能是更一般的更大项目/对象/集合的项目/对象/集合,例如:“提供的通信服务”。

    <ul>    
      <c:forEach items="${serviceCategories} var="category">  // iterate through each collection
    
        <li>${category.key}  //the user-displayable title of the 'category' ('collection')
    
          <ul>
            <c:forEach items="${category.value}" var="service">  // iterate through each item
              <li>${service.key}</li>  //the user-displayable title of the 'service' ('item')
            </c:if>
          </ul>
    
        </li>
    
      </c:if>
    </ul>
    

    所以我想我的问题是,给定这样一个数据结构,我如何在一个可以管理它的视图中表示它???我受客户希望将此结构表示为树状结构的约束。

    如果我可以使用纯java操作视图,那么我希望实现这一点的一种方法是使用递归。。。我想是这样的:

    /** NOTE:  I am not suggesting this is a great example of recursion, nor that it even
     *  would result in correct output; it was one-off'd just to provide something of an 
     *  example of how I imagine this could be done in Java if I had to do it this way.
     */
    private StringBuilder buildString( Map<String, Object> dataStruct ) {
    
      StringBuilder view = new StringBuilder();
    
      Set<String> keys = dataStruct.getKeys();
      for( String key : keys ) {
    
        Object value = dataStruct.get( key );
        if( value instanceof String ) {
    
          view = key + "[" + value + "]";
          return;
        }
    
        String subView = buildString( value );
        view = key + "[" + subView + "]";
    }
    

    我也希望我只是忽略(或不知道)一个更优雅的解决方案,很容易被人承认谁可以帮助我。

    谢谢你抽出时间! :天

    2 回复  |  直到 15 年前
        1
  •  0
  •   Jacob Mattison    15 年前

    任何时候,如果您有深度未知的分层数据,并且希望显示它,我认为一个好的选择是将其转换为XML并将XML绑定到某种类型的树显示。例如,在我的一个应用程序(也是Java/Spring)中的类似情况下,我使用 XStream 将集合转换为XML(您只需将XStream指向根对象,它遵循所有路径),然后我使用jQuery插件显示结果 jsTree

    如果您不想使用javascript,另一种方法是使用类似Jakob Jenkov的 Tree Tag .

        2
  •  0
  •   Steven Benitez    15 年前

    .tag 递归调用自身的。