質問
文字列のリストを受け取るカスタムタグがあるとします:
<%@ attribute name="thelist" type="java.util.List<java.lang.String>"
required="true" %>
タグを呼び出すjspでこの属性を作成するにはどうすればよいですか?スクリプトレットを使用できます
<tags:list thelist='<%= java.util.Arrays.asList("blah","blah2") %>' />
ただし、Expression Languageを使用してこれを行う方法はありますか?
解決
リストを作成するだけであれば、[<jsp:useBean>][1]
を使用して目的のスコープでオブジェクトを作成できます。
<jsp:useBean id="thelist" scope="request" class="java.util.ArrayList" />
ArrayListには引数なしのコンストラクタがあるため、これは機能します。ただし、リストには何も含まれません。そして、私が知る限り、ELもJSTLもコレクションにアイテムを追加するための組み込みメカニズムを提供していません。どちらも読み取り専用アクセスに焦点を当てています。 EL関数マッピング add()
メソッドを有効にします。
ただし、JSPにしたくないことを強制するのはやめたほうがいいと思います。この場合、JSPタグファイルを使用するのではなく、実際のタグハンドラをJavaで記述する必要があることを意味します。
他のヒント
kdgregoryが言っているように、 href = "http://java.sun.com/javaee/5/docs/tutorial/doc/bnahq.html#bnaio" rel = "nofollow noreferrer">カスタムタグライブラリ関数、ただし、可愛くてたとえば、次のようなものです:
#{foo:add(foo:add(foo:add(foo:newList(), 'One'), 'Two'), 'Three')}
Beanのような他のメカニズムを介してこれを行う方が簡単です。
スクリプトレットや見苦しいEL関数を避けたい場合は、独自のビルダーを使用してELインタープリターをだますことができます:
...
<jsp:useBean id="listBuilder" class="com.example.ELListBuilder"/>
<ul>
<c:forEach var="item" items="${listBuilder['red']['yellow']['green'].build}">
<li>${item}</li>
</c:forEach>
</ul>
...
例を確認してください: https://gist.github.com/4581179