【问题标题】:JSTL - Exists the remove-attribute for put-list-attribute?JSTL - 是否存在 put-list-attribute 的 remove-attribute?
【发布时间】:2015-05-05 08:37:34
【问题描述】:

我的主要磁贴定义有以下代码:

<definition name="main" template="/WEB-INF/jsp/templates/main/template.jsp">
    ...
    <put-list-attribute name="jsBase">
        <add-attribute value="basics" />
        <add-attribute value="jquery" />
    </put-list-attribute>
    <put-list-attribute name="jsExtra">
        <add-attribute value="boostrap" />
        <add-attribute value="d3" />
        <add-attribute value="gridster" />
        <add-attribute value="custom" />
    </put-list-attribute>
</definition>

此定义将用于所有页面。 template.jsp 看起来像这样:

<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles-extras" prefix="tilesx" %>
...

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml" id="html">
    <head>
    ...

    <tilesx:useAttribute id="jsBase" name="jsBase" classname="java.util.List" />
    <c:forEach var="file" items="${jsBase}">
        <script type="text/javascript" src="<c:url value="/js/${file}.js"/>" />
    </c:forEach>

    <tilesx:useAttribute id="jsExtra" name="jsExtra" classname="java.util.List" />
    <c:forEach var="file" items="${jsExtra}">
        <script type="text/javascript" src="<c:url value="/js/${file}.js"/>" />
    </c:forEach>
    ...

这个想法是加载在jsBasejsExtra 中定义的所有文件,考虑到我将保持jsBase 对所有页面保持不变,但jsExtra 可能因页面而异。我知道存在可以向列表添加额外值或用新值覆盖它的继承属性,但我想要的是继承原始列表中的所有值并仅删除一个值,因此我不必再次定义我想从原始列表中保留的值。有可能做这样的事情吗?:

    <put-list-attribute name="jsExtra" inherit="true">
        <remove-attribute value="custom" />
    </put-list-attribute>

如果无法使用类似的解决方法来防止重复代码?

【问题讨论】:

    标签: java jstl tiles apache-tiles


    【解决方案1】:

    根据需要“从原始列表中继承所有值并仅删除一个值”,如果脚本文件是您要排除的内容,则不要在页面中显示。

    <c:forEach var="file" items="${jsExtra}">
        <c:if test="${file != 'custom'}">
            <script type="text/javascript" src="<c:url value="/js/${file}.js"/>" />
        </c:if>
    </c:forEach>
    

    【讨论】:

    • 虽然代码很受欢迎,但它应该始终有一个附带的解释。这不必很长,但在意料之中。
    • @Korcholis 我在这种情况下使用这个复制粘贴的评论。喜欢就拿去吧。
    • 感谢@peterh,但它是修订后的自动评论粘贴。好点,确实
    • 请解释一下你的答案
    • 对不起,我的英语很差,我正在努力。
    【解决方案2】:

    感谢约翰·李的回答。但是有一点问题:为每个页面加载template.jsp,我想排除特定页面的custom.js,而不是所有页面(如果是这种情况,那么我不会在jsExtra 中包含custom.js第一名)。 但是以您的想法为灵感,我遇到了这个解决方案:

    <tilesx:useAttribute id="jsExclude" name="jsExclude" classname="java.util.List" />
    <tilesx:useAttribute id="jsExtra" name="jsExtra" classname="java.util.List"/>
    <c:forEach var="file" items="${jsExtra}">
        <c:if test="${!jsExclude.contains(file)}">
            <script type="text/javascript" src="<c:url value="/js/${file}.js"/>"></script>
        </c:if>
    </c:forEach>
    

    快速解释:我定义了一个排除列表,其中包含我不想为我在图块文件中定义的每个页面加载的文件名。这样我就可以从我的主定义中继承jsExtra 中包含的所有值,并选择我想要排除的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2020-06-17
      • 1970-01-01
      相关资源
      最近更新 更多