【问题标题】:Struts 2 conditional div tagStruts 2条件div标签
【发布时间】:2013-07-26 18:07:40
【问题描述】:

我正在我的网站上工作并尝试从数据库中打印出投资组合对象。我打印出来的页面有分页。

当使用以下标签时,我使用脚本创建新页面:

<div class="pics">
...
</div>

上面的 div 中最多只能有 8 个锚标记。锚标签没有什么特别之处,它们确实使用&lt;s:property&gt; 标签,仅此而已。

为了实现这个功能,我尝试了以下方法:

<c:set var="counter" value="0"/>
<s:iterator value="allPortfolio">
    <c:if test="${(counter mod 8) == 0}">
        <div class="pics">
   </c:if>

   <a href="<s:property value="filename">">Download</a>

    <c:if test="${(counter mod 8) == 0}">
        </div>
    </c:if>

    <c:set var="counter" value="${counter+1}"/>

</s:iterator>

但是,此代码创建了 11 个页面(我的数据库中每个投资组合对象 1 个页面)。它应该只创建 2 个页面,第一个页面包含 8 个项目,第二个页面包含其余 3 个项目。

换句话说,应该只有 2 个

<div class="pics">
...
</div>

一个有 8 个锚标签,一个有 3 个锚标签。

相反,这是页面加载后创建的代码:

 <div class="pics">
     <a href="1ba918625bca57f6e059c2d05393010b04da5ed6.png">Download</a>
 </div>
 <a href="ec49d4ca243a481b7fa819dfea783e0dd8f5a431.jpg">Download</a>   
 <a href="1b4ab5a3bebdf88045ef3818e852185c86e33048.png">Download</a>
 <a href="e12eaed32a97bb78ddd863696ca510d943c4d978.png">Download</a>
 <a href="2b6ee029b3fcef21b0a220a6b14de16206ce588b.png">Download</a>
 <a href="e3e94e7ac6bfb09ca012d30912525848f2d361ed.png">Download</a>
 <a href="f07e24b31fb65e38aa3d4bbe97a24a71c281aae7.png">Download</a>
 <a href="dd41b536ca45642fa9827311498b9480d6df9be8.png">Download</a>
 <div class="pics">
     <a href="a2ad0d4b73daa3311e9f9b16dcd7d9476cd6e748.png">Download</a>
 </div>
 <a href="45fa47125a5dfe3608d6d80fb0a9ba1f5c444264.png">Download</a>
 <a href="ee9b1571aa22e935772792ac363cc95e2a77bdfd.png">Download</a>

【问题讨论】:

    标签: struts2 ognl struts-tags


    【解决方案1】:

    实际上你不需要那个计数器,因为 Struts2 &lt;s:iterator&gt; 标签有 status 属性正是为此。定义它,您可以在迭代器中使用它的各种属性。例如,index 将返回从 0 开始的当前迭代计数。first 属性是布尔值,表示它是迭代中的第一个可用项。

    顺便说一句,别忘了关闭你的标签。

    <s:iterator value="allPortfolio" status="stat">
      <s:if test="#stat.first">
        <div class="pics">
      </s:if>
      <s:if test="!#stat.first && #stat.index % 8 == 0">
        </div>
        <div class="pics">
      </s:if>
    
      <a href="<s:property value="filename"/>">Download</a>
    
      <s:if test="#stat.last">
        </div>
      </s:if>
    </s:iterator>
    

    【讨论】:

    • 这会以
      结束,这会破坏页面的 div 完整性
    • @ThraT:忘记了最后一个关闭的 div。 :)
    • 完美,谢谢。我唯一想要的就是对包含 0 个对象的 allPortfolio 进行安全防护。当我使用一个空列表时,它似乎再次扰乱了 div 的完整性。
    • @ThreaT:只要将你的迭代器放入 if 块检查列表是否为空。
    【解决方案2】:

    使用 8 的模数意味着每 8 个链接可以被 8 整除,余数为 0。这不是解决问题的方法。

    你想使用类似的东西:

    <c:set var="counter" value="0" />
    
    <s:iterator value="allPortfolio">
      <c:if test="${counter gt 7}">
        <c:set var="counter" value="0" />
      </c:if>
    
      <c:if test="${counter eq 0}">
          <div class="pics">
      </c:if>
    
      <a href="<s:property value="filename">">Download</a>
    
      <c:if test="${counter eq 7}">
          </div>
      </c:if>
    
      <c:set var="counter" value="${counter+1}" />
    </s:iterator>
    
    <c:if test="{counter ne 8}">
      </div>
    </c:if>
    

    最后一位用于关闭最后一个 div,以防它保持打开状态。

    【讨论】:

      【解决方案3】:

      试试这个代码

      <s:set var="countdown" value="0"/>
      <s:iterator value="allPortfolio" status="status">
      
        <s:if test="#status.index % 8 == 0">
          <div class="pics">
          <s:set var="countdown" value="7"/> 
        </s:if>
      
         <a href="<s:url value='%{filename}'/>">Download</a>
      
         <s:if test="#countdown == 0 || #status.last">
           </div>
         </s:if>
      
         <s:set var="countdown" value="%{#countdown-1}"/>
      </s:iterator>
      

      【讨论】:

      • 这会将它们全部放在一个页面上,因为它不会创建初始
        标记。
      • @ThreaT 现在怎么样?
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签