执行此操作的“干净”方法是使用函数。由于 JSTLjoin
函数在 a 上不起作用Collection
,您可以编写自己的函数而不用太麻烦,并在所有地方重用它,而不是剪切和粘贴大量循环代码。
您需要函数实现和 TLD 来让您的 Web 应用程序知道在哪里可以找到它。将它们放在一个 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();
}
}
元信息/xc.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 有点冗长,但了解如何使用 TLD 对于任何使用 JSP 的开发人员来说都是一项很好的技能。而且,由于您选择了 JSP 之类的标准来进行演示,因此您很有可能拥有可以帮助您的工具。
与向底层模型添加更多方法的替代方法相比,这种方法具有许多优点。此函数可以编写一次,并在任何项目中重复使用。它与封闭源代码的第三方库一起使用。可以在不同的上下文中支持不同的分隔符,而不会使用新方法污染模型 API。
最重要的是,它支持分离视图和模型控制器开发角色。这两个领域的任务通常由不同的人在不同的时间执行。保持这些层之间的松散耦合可以最大限度地降低复杂性和维护成本。当即使是像在演示文稿中使用不同的分隔符这样的微不足道的更改也需要程序员修改库时,您将拥有一个非常昂贵且繁琐的系统。
StringUtil
无论是否作为 EL 函数公开,该类都是相同的。唯一需要的“额外”是TLD,这是微不足道的;一个工具可以很容易地生成它。