Связать строки в JSP EL?

Просто добавьте следующий пакет nuget в ваш проект - Microsoft.CodeDom.Providers.DotNetCompilerPlatform.

Имел ту же проблему.

15
задан matt b 18 November 2008 в 19:09
поделиться

5 ответов

Вычисленный несколько грязный способ сделать это:

<c:forEach items="${upcomingSchedule}" var="conf">
    <c:set var="title" value="${conf.subject}: "/>
    <c:forEach items="${conf.invitees}" var="invitee">
        <c:set var="title" value="${title} ${invitee}, "/>
    </c:forEach>
    <div class='scheduled' title="${title}" id="scheduled<c:out value="${conf.id}"/>">
    ...
    </div>
</c:forEach>

я просто использую <c:set> неоднократно, ссылаясь на свое собственное значение, для добавления/связывания строк.

8
ответ дан 1 December 2019 в 02:29
поделиться

"Чистый" способ сделать это должно было бы использовать функцию. Поскольку функция JSTL join не будет работать над Collection, можно записать собственное без слишком большой проблемы и снова использовать все это по месту вместо того, чтобы вырезать и вставить большой блок кода цикла.

Вам нужны реализация функции и TLD для уведомления веб-приложения, где найти его. Соедините их в JAR и бросьте его в Ваш каталог WEB-INF/lib.

Вот схема:

com/x/taglib/core/StringUtil.java

package com.x.taglib.core;

public class StringUtil {

  public static String join(Iterable<?> elements, CharSequence separator) {
    StringBuilder buf = new StringBuilder();
    if (elements != null) {
      if (separator == null)
        separator = " ";
      for (Object o : elements) {
        if (buf.length() > 0)
          buf.append(separator);
        buf.append(o);
      }
    }
    return buf.toString();
  }

}

META-INF/x-c.tld:

<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">
  <tlib-version>1.0</tlib-version>
  <short-name>x-c</short-name>
  <uri>http://dev.x.com/taglib/core/1.0</uri>
  <function>
    <description>Join elements of an Iterable into a string.</description>
    <display-name>Join</display-name>
    <name>join</name>
    <function-class>com.x.taglib.core.StringUtil</function-class>
    <function-signature>java.lang.String join(java.lang.Iterable, java.lang.CharSequence)</function-signature>
  </function>
</taglib>

, В то время как TLD является немного подробным, зная Ваш путь вокруг, каждый - хороший навык для любого разработчика, работающего с JSP. И, так как Вы выбрали стандарт как JSP для презентации, существует хороший шанс, у Вас есть инструменты, которые выручат Вас.

Этот подход имеет много преимуществ перед альтернативой для добавления большего количества методов к базовой модели. Эта функция может быть записана однажды и снова использована в любом проекте. Это работает с закрытым исходным кодом, сторонней библиотекой. Различные разделители могут поддерживаться в различных контекстах, не загрязняя модель API с новым методом для каждого.

Самое главное, это поддерживает разделение представления и ролей разработки образцового контроллера. Задачи в этих двух областях часто выполняются различными людьми в разное время. Поддержание слабой связи между этими слоями минимизирует сложность и затраты на обслуживание. Когда даже тривиальное изменение как использование другого разделителя в презентации требует, чтобы программист изменил библиотеку, у Вас есть очень дорогая и громоздкая система.

StringUtil класс является тем же, функционируют ли его выставленные как EL или нет. Единственным "дополнительным" необходимым является TLD, который тривиален; инструмент мог легко генерировать его.

16
ответ дан 1 December 2019 в 02:29
поделиться

Вы могли использовать это? Кажется, что это хочет массив вместо списка..

${fn:join(array, ";")}

http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/fn/join.fn.html

3
ответ дан 1 December 2019 в 02:29
поделиться

Если Вашим подсписком является ArrayList, и Вы делаете это:

<div class='scheduled' title="${conf.subject}: ${conf.invitees}" id="scheduled${conf.id}">

Вы получаете почти, в чем Вы нуждаетесь.

единственная разница - то, что заголовок будет: "Тема: [blah@blah.com, blah2@blah2.com, и т.д.]".

, Возможно, может быть достаточно хорошим для Вас.

1
ответ дан 1 December 2019 в 02:29
поделиться

Какова разница между = = и = = = и почему вы вообще хотите использовать = = =?

-121--847615-

Проблема заключается в субпиксельной визуализации, которая возникает, когда исходное значение (которое является плавающим значением) имеет ненулевую дробную составляющую. Округлите до ближайшего целого числа и вы должны быть в порядке.

-121--2122929-

Я думаю, что это то, что вы хотите:

<c:forEach var="tab" items="${tabs}">
 <c:set var="tabAttrs" value='${tabAttrs} ${tab.key}="${tab.value}"'/>
</c:forEach>

В этом случае у меня была хэшмэп с идентификатором вкладки (ключ) и URL (значение). Переменная tabAttres не задана до этого. Таким образом, он просто устанавливает значение текущего значения tabAttres ("to start) плюс выражение ключ/значение.

0
ответ дан 1 December 2019 в 02:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: