使用OGNl表达式进行条件显示

时间:2012-02-07 05:40:58

标签: java struts2 ognl

在我的struts项目中,我在数组列表中有一组记录,这些记录有其名称和categoryid。在第二个arraylist中我有类别(category_id,categoryname)的记录。

现在我想列出第一个列表,其中类别名称为子标题,如

ArrayList1:(nameDetailList)
NAME:               CATEGORYID
name1                    1
name2                    2
name3                    1
name4                    5

ArrayList2:(categoryList)
CategoryID          CategoryName
1                     Category-1
2                     Category-2 
3                     Category-3 
4                     Category-4 
5                     Category-5

我需要将它们显示为

Category-1 
    --name1
    --name3
Category-2 
    --name2 
Category-5 
    --name3 

注意:这里我不想显示没有相关记录的类别名称。为此我编码如下。

<s:iterator id="catIter"  value="categoryList">
       <s:property value="categoryName"/>
  <s:iterator value="nameDetailList.{ ?this.categoryId==#catIter.categoryId}">
 <s:property value="Name"/>
</s:iterator>
 </s:iterator>

它显示那些没有与那些相关的记录的类别。任何人都可以告诉如何控制类别名称的显示。 还是有其他更好的选择。

2 个答案:

答案 0 :(得分:0)

您可以通过计算与类别相关的nameDetail数量来实现。如果某个类别没有任何与nameDetail相关的内容,则不会打印其名称。

如果你有一个按categoryId返回nameDetails的方法,你可以不加任何计数。我不知道你的案子是否有更好的解决方案。

<s:iterator value="categoryList" var="category">
   <s:set name="counter" value="0"/>

   <s:iterator value="nameDetailList" var="nameDetail">
      <s:if test="#category.categoryId == #nameDetail.categoryId">
          <s:set name="counter" value ="%{#counter + 1}"/>
      </s:if>
   </s:iterator>

   <s:if test="#counter > 0">
     <s:property value="#category.categoryName"/>

     <s:iterator value="nameDetailList" var="nameDetail">
        <s:if test="#category.categoryId == #nameDetail.categoryId">
             <s:property value="#nameDetail.name"/>
        </s:if>       
     </s:iterator>

   </s:if>


</s:iterator>

答案 1 :(得分:0)

我已将我的代码更新为

<s:iterator id="catIter"  value="categoryList" status="catstatu">      
  <s:iterator value="nameDetailList.{ ?this.categoryId==#catIter.categoryId}">
     <s:if test="#catstatus.first==true">
          <s:property value="categoryName"/>
     </s:if>
    <s:property value="Name"/>
  </s:iterator>
</s:iterator>

现在我得到了理想的输出。但解决方案是最好的吗?