如何使用JSTL迭代可能无限的集合集合

时间:2010-10-21 17:02:12

标签: java spring jstl

前言:我是SO的长期粉丝,几乎每天都在这里阅读 - 但这是我的第一个问题 - 感谢所有制作了如此出色资源的人!

环境:Spring / JSTL / Java;这个项目的限制是我不能接受一个需要放弃Spring / Java的解决方案,尽管我可以用JSTL来实现任何标准视图。

注意:这个问题不是关于如何在JSTL中迭代一个简单的集合;我知道该怎么做。此外,我搜索了SO和Google以寻找这个问题的答案,但还没有找到答案。我愿意承认,也许这表明我正在接近这个问题 - 如果是这样,我会很感激解释一个更好的方法来解决它。


问题:我有一个数据服务,从中我获得了一系列集合。我不控制这项服务,我也无法定义它 - 其他人负责这项服务,它可以随时改变。集合中的每个项目都可以是另一个集合(我必须解析),因此整个集合在理论上是无限制的。该系列基本上是这样的:

  • 项目名称:字符串
    • 项目:对象(可以是字符串或其他集合)
      (这个序列可能是无限的)

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

当前解决方案:在我的Spring Controller中,我目前将此集合作为Map添​​加到我的模型中。在我的视图(JSTL)中,我(当前)迭代了2个级别的集合,我假设(我可以假设这一点)第一个级别都是子集合(即:'categories') ),并且我还假设(错误地)第二级将全部成为项目(即:'服务')。

<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>

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

如果我可以使用pure-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 + "]";
}

天哪,我希望这一切都是清晰的,而不是压倒性的。 我也希望我只是忽略(或忽略)一种更优雅的解决方案,这种解决方案很容易被能够帮助我的人所认可。

感谢您的时间! :d

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

另一个选择是创建一个递归调用自身的JSP简单标记(.tag文件)。