«Чистый» способ сделать это - использовать функцию. Поскольку функция JSTL join
не будет работать на Collection
, вы можете написать свою собственную без особых проблем и использовать ее повсеместно вместо того, чтобы вырезать и вставить большой кусок кода цикла.
Вам нужна реализация функции и TLD, чтобы ваше веб-приложение узнало, где его найти. Сложите их вместе в JAR-файл и поместите в каталог WEB-INF / lib.
Вот схема:
ком / х / TagLib / ядро / 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 / х-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, который является тривиальным; инструмент может легко сгенерировать его.