15

Bean のリストがあり、それぞれに電子メール アドレスのリストであるプロパティがあります。

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

<div>これにより、リスト内の Bean ごとに1 つレンダリングされます。

<div>サブリストの場合、リスト内の各エントリを連結して単一の文字列を形成し、のtitle属性の一部として表示できるようにしたいと考えています。なんで?これは、javascript ライブラリ (mootools) を使用してこれ<div>をフローティング ツール ヒントに変換し、ライブラリがtitleをツールヒントのテキストに変換するためです。

したがって、「件名」の場合、最終的には、サブリストのすべての電子メール アドレスを含む「件名: blah@blah.com、blah2@blah2.com など」にしたい${conf.subject}と思います。title<div>

JSP ELを使用してこれを行うにはどうすればよいですか? 私はスクリプトレットブロックをjspファイルに入れないようにしています。

4

8 に答える 8

16

これを行う「クリーンな」方法は、関数を使用することです。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 つの領域のタスクは、多くの場合、異なる人によって異なる時間に実行されます。これらのレイヤー間の疎結合を維持することで、複雑さとメンテナンス コストを最小限に抑えることができます。プレゼンテーションで別の区切り文字を使用するなどの些細な変更でさえ、プログラマーがライブラリーを変更する必要がある場合、システムは非常に高価で扱いにくいものになります。

クラスは、StringUtilEL関数として公開されているかどうかに関係なく同じです。必要な唯一の「余分な」ものは TLD です。これは些細なことです。ツールで簡単に生成できます。

于 2008-11-17T20:17:13.220 に答える
9

これを行うためのやや汚い方法を考え出しました:

<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>文字列を追加/連結するために、独自の値を参照して繰り返し使用します。

于 2008-11-17T18:34:30.493 に答える
4

これを使っていただけますか?リストではなく配列が必要なようです..

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

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

于 2008-11-17T18:35:19.913 に答える
1

サブリストがArrayListであり、これを行う場合:

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

必要なものをほぼ手に入れることができます。

唯一の違いは、タイトルが「件名:[blah @ blah.com、blah2@blah2.comなど]」になることです。

たぶんあなたには十分かもしれません。

于 2008-11-17T18:50:50.663 に答える
0

これがあなたが望むものだと思います:

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

この場合、タブ ID (キー) と URL (値) を含むハッシュマップがありました。これより前に、tabAttrs 変数が設定されていません。したがって、値を tabAttrs の現在の値 ('' で開始) にキー/値の式を加えたものに設定するだけです。

于 2010-01-23T00:20:23.060 に答える
0

次のように、サーバーからの変数の横に文字列を配置するだけです。

<c:forEach items="${upcomingSchedule}" var="conf">
    <div class='scheduled' title="${conf.subject}" 

         id="scheduled${conf.id}">

    ...
    </div>
</c:forEach>

遅すぎる!!!

于 2013-01-27T18:01:57.017 に答える