これを行う「クリーンな」方法は、関数を使用することです。JSTLjoin
関数は では機能しないためCollection
、ループ コードの大きなチャンクをカット アンド ペーストする代わりに、独自の関数を問題なく作成して、あらゆる場所で再利用できます。
関数の実装と、Web アプリケーションにその場所を知らせる 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/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 は少し冗長ですが、JSP を使用する開発者にとって、TLD を回避する方法を知っておくことは優れたスキルです。また、プレゼンテーション用に JSP などの標準を選択したので、役立つツールがある可能性が高くなります。
このアプローチには、基礎となるモデルにメソッドを追加するという代替方法よりも多くの利点があります。この関数は一度記述すれば、どのプロジェクトでも再利用できます。クローズドソースのサードパーティ ライブラリで動作します。それぞれの新しいメソッドでモデル API を汚染することなく、さまざまなコンテキストでさまざまな区切り記号をサポートできます。
最も重要なことは、ビューとモデル コントローラーの開発役割の分離をサポートすることです。これら 2 つの領域のタスクは、多くの場合、異なる人によって異なる時間に実行されます。これらのレイヤー間の疎結合を維持することで、複雑さとメンテナンス コストを最小限に抑えることができます。プレゼンテーションで別の区切り文字を使用するなどの些細な変更でさえ、プログラマーがライブラリーを変更する必要がある場合、システムは非常に高価で扱いにくいものになります。
クラスは、StringUtil
EL関数として公開されているかどうかに関係なく同じです。必要な唯一の「余分な」ものは TLD です。これは些細なことです。ツールで簡単に生成できます。