Просто добавьте следующий пакет nuget в ваш проект - Microsoft.CodeDom.Providers.DotNetCompilerPlatform
.
Имел ту же проблему.
Вычисленный несколько грязный способ сделать это:
<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>
неоднократно, ссылаясь на свое собственное значение, для добавления/связывания строк.
"Чистый" способ сделать это должно было бы использовать функцию. Поскольку функция 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, который тривиален; инструмент мог легко генерировать его.
Вы могли использовать это? Кажется, что это хочет массив вместо списка..
${fn:join(array, ";")}
http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/fn/join.fn.html
Если Вашим подсписком является ArrayList, и Вы делаете это:
<div class='scheduled' title="${conf.subject}: ${conf.invitees}" id="scheduled${conf.id}">
Вы получаете почти, в чем Вы нуждаетесь.
единственная разница - то, что заголовок будет: "Тема: [blah@blah.com, blah2@blah2.com, и т.д.]".
, Возможно, может быть достаточно хорошим для Вас.
Какова разница между = = и = = = и почему вы вообще хотите использовать = = =?
-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) плюс выражение ключ/значение.