前言:我是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