避免在JSP中使用JSTL中的多个forEach循环

时间:2017-05-23 11:41:45

标签: java html jsp for-loop jstl

我想避免JSTL中的多循环,如下面的代码所示。我从api响应中获取了属性WRTSCDTADTA_PRZEDST_TR_OSW,并且它们随机传递,这就是代码看起来像这样的原因。

<c:forEach items="${ctx.model.customerAttributes}" var="customerAttribute">
<tr>
    <td class="code">${customerAttribute.subGroupName}</td>
    <td class="value">
        <c:forEach items="${customerAttribute.attributes}" var="attribute">
            ${attribute.attrName == 'WRTSC' ? attribute.attrValue : ''}
        </c:forEach>
    </td>
    <td class="value">
        <c:forEach items="${customerAttribute.attributes}" var="attribute">
            ${attribute.attrName == 'DTA' ? attribute.attrValue : ''}
        </c:forEach>
    </td>
    <td class="value">
        <c:forEach items="${customerAttribute.attributes}" var="attribute">
            ${attribute.attrName == 'DTA_PRZEDST_TR_OSW' ? attribute.attrValue : ''}
        </c:forEach>
    </td>
</tr>
</c:forEach>

我需要读取每个属性(如果没有发送属性,我需要创建空<td></td>块。

可以在一个循环而不是三个循环中完成(在这种情况下,此数字代表不同属性的数量)。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

我现在有这样的事情。伙计们,你认为这更好吗?

<c:forEach items="${ctx.model.customerAttributes}" var="customerAttribute">
<tr>
    <c:set var="WRTSC" value="" />
    <c:set var="DTA" value="" />
    <c:set var="DTA_PRZEDST_TR_OSW" value="" />

    <c:forEach items="${customerAttribute.attributes}" var="attribute">
        <c:if test="${WRTSC eq ''}">
            <c:set var="WRTSC" value="${attribute.attrName == 'WRTSC' ? attribute.attrValue : ''}" />
        </c:if>
        <c:if test="${DTA eq ''}">
            <c:set var="DTA" value="${attribute.attrName == 'DTA' ? attribute.attrValue : ''}" />
        </c:if>
        <c:if test="${DTA_PRZEDST_TR_OSW eq ''}">
            <c:set var="DTA_PRZEDST_TR_OSW" value="${attribute.attrName == 'DTA_PRZEDST_TR_OSW' ? attribute.attrValue : ''}" />
        </c:if>
    </c:forEach>

    <td class="code">${customerAttribute.subGroupName}</td>
    <td class="value">${WRTSC}</td>
    <td class="value">${DTA}</td>
    <td class="value">${DTA_PRZEDST_TR_OSW}</td>
</tr>
</c:forEach>

答案 1 :(得分:0)

你可以使用这样的东西

<c:forEach items="${ctx.model.customerAttributes}" var="customerAttribute">
    <tr>
        <td class="code">${customerAttribute.subGroupName}</td>
        <td class="value">
            <c:forEach items="${customerAttribute.attributes}" var="attribute">
             ${(attribute.attrName == 'WRTSC') || (attribute.attrName == 'DTA') || (attribute.attrName == 'DTA_PRZEDST_TR_OSW')? attribute.attrValue : ''}
            </c:forEach>
        </td>

    </tr>
</c:forEach>

<c:forEach items="${ctx.model.customerAttributes}" var="customerAttribute">
    <tr>
        <td class="code">${customerAttribute.subGroupName}</td>
        <td class="value">
            <c:forEach items="${customerAttribute.attributes}" var="attribute">
                <c:if test="${(attribute.attrName == 'WRTSC') || (attribute.attrName == 'DTA') || (attribute.attrName == 'DTA_PRZEDST_TR_OSW')}">
                 ${attribute.attrValue}
                </c:if>
            </c:forEach>
        </td>
    </tr>
</c:forEach>

答案 2 :(得分:0)

而不是运行3个内部循环,取3个内部变量

var WRTSC='';
var DTA ='';
var DTA_PRZEDST_TR_OSW ='';

并且只运行一个内部循环,其中使用变量检查条件,如果条件匹配则设置变量值,否则默认值为&#39;&#39;&#39;