JSTL — существует ли атрибут удаления для атрибута списка размещения?

У меня есть следующий код для моего основного определения плитки:

<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>
    ...

Идея состоит в том, чтобы загрузить все файлы, определенные в jsBase и jsExtra, принимая во внимание, что я оставлю jsBase нетронутым для всех страниц, но jsExtra может варьироваться от страницы к странице. Я знаю, что существует свойство inheratance, которое может добавлять дополнительные значения в список или переопределять его новыми значениями, но я хочу наследовать все значения из исходного списка И удалить только одно значение, поэтому мне не нужно определять снова значения, которые я хочу сохранить из исходного списка. Можно ли сделать что-то вроде этого?:

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

Если невозможно использовать что-то вроде обходного пути для предотвращения дублирования кода?


person MangaPowerZero    schedule 05.05.2015    source источник


Ответы (2)


В соответствии с потребностями «наследовать все значения из исходного списка И удалить только одно значение», если вы хотите исключить файл сценария, не показывайте его на странице.

<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>
person Leo Lee    schedule 07.05.2015
comment
Хотя код приветствуется, он всегда должен сопровождаться пояснением. Это не должно быть долго, но это ожидается. - person peterh; 07.05.2015
comment
@Korcholis Я использую этот скопированный комментарий для таких случаев. Возьми, если хочешь. - person peterh; 07.05.2015
comment
Спасибо @peterh, однако это автоматический вставщик комментариев после редактирования. Хорошая мысль, действительно - person Sergi Juanola; 07.05.2015
comment
Пожалуйста, объясните свой ответ - person Mohit Jain; 07.05.2015
comment
Извините, мой английский плохой, я пытаюсь. - person Leo Lee; 07.05.2015
comment
Спасибо за идею! Код в том виде, в каком он есть сейчас, работает, но не самым эффективным образом... тем не менее, он послужил мне источником вдохновения :D - person MangaPowerZero; 08.05.2015

Спасибо Джон Ли за ваш ответ. Но есть небольшая проблема: template.jsp загружается для каждой страницы, и я хочу исключить custom.js для определенных страниц, а не для всех страниц (если бы это было так, я бы не включал custom.js в jsExtra в первую очередь). Но, взяв вашу идею за вдохновение, я нашел это решение:

<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, из моего основного определения и выбирать значения, которые я хочу исключить.

person MangaPowerZero    schedule 08.05.2015