Избегайте пробелов в выражении JSTL c: set - PullRequest
4 голосов
/ 18 января 2011

У меня есть файл JSP, который генерирует список LI, где первый и последний элемент в списке получают специальный класс, назначенный для них.В настоящее время я использую для этого следующий бит:

<c:set var="liclass">
    <c:if test="${rowStatus.first}">first</c:if>
    <c:if test="${rowStatus.last}"> last</c:if>
</c:set>

<%-- not very pretty --%>
<li<c:if test="${not empty liclass}"> class="${liclass}"</c:if>>

Проблема в этом случае заключается в том, что в случае, когда есть только один результат, класс должен стать 'первым последним' (который работает), ностановится first [...] last, где [...] представляет группу пробелов, которые SO отфильтровывает.

Кажется, что <c:set> также отбирает пробелы, вызванные используемым отступом.Я мог бы просто решить это, набрав его без пробелов:

<c:set var="liclass"><c:if test="${rowStatus.first}">first</c:if><c:if test="${rowStatus.last}"> last</c:if></c:set>

Но я бы предпочел читаемый вариант.Другой альтернативой является получение результата через функцию, которая удаляет лишние пробелы.

Вопрос: Существует ли подход или методика, позволяющая избежать установки пробелов, подобных этому, в теге <c:set>?

1 Ответ

7 голосов
/ 18 января 2011

Я бы сделал это прямо в атрибуте value с помощью условного оператора ?:.

<c:set var="liclass" value="${rowStatus.first ? 'first' : ''}" />
<c:set var="liclass" value="${liclass}${rowStatus.last ? ' last' : ''}" />

Для не очень красивой части <li> я бы просто добавил

<c:set var="liclass" value="${empty liclass ? 'none' : liclass}" />

и do

<li class="${liclass}">

Правда, это добавляет, казалось бы, ничего не стоящее class="none" для не первых / последних элементов, но кого это волнует?


Что касаетсяконкретный вопрос, вы можете обрезать пробелы, оставленные тегами, установив атрибут trimDirectiveWhitespaces для @page в true.

<%@page trimDirectiveWhitespaces="true" %>

(работает только в контейнерах Servlet 2.5 / JSP 2.1)

Вы также можете настроить его на уровне servletcontainer.Поскольку неясно, какой из них вы используете, вот только пример Apache Tomcat: в записи сервлета JSP в Tomcat/conf/web.xml добавьте / измените следующий параметр инициализации:

<init-param>
    <param-name>trimSpaces</param-name>
    <param-value>true</param-value>
</init-param>

В любом случае, я не могуне говорите с головы до головы и не гарантируйте, что это приведет к желаемому эффекту в конечном итоге с first last.Вы должны попробовать сами.

...