JSF EL式を使用してArrayList
の長さを取得するにはどうすればよいですか?
#{MyBean.somelist.length}
動作しません。
はい。Java API作成委員会の天才が、特定のクラスにsize()
メンバーまたはlength
属性がある場合でも、getSize()
またはgetLength()
JSFおよび他のほとんどの標準が必要とする、あなたが望むことをすることはできません。
これを行うにはいくつかの方法があります。
1つ:長さを返す関数をBeanに追加します。
クラスMyBean: public int getSomelistLength(){return this.somelist.length; } JSFページ: #{MyBean.somelistLength}
2:Faceletsを使用している場合(ああ、神様、なぜFaceletsを使用しないのですか!)、fn名前空間を追加し、length関数を使用できます
JSFページ: #{fn:length(MyBean.somelist)}
あなたはsize()を意味しませんか?
#{MyBean.somelist.size()}
私のために働く(Jboss EL拡張機能を持つJBoss Seamを使用)
注:このソリューションは、JSTLの古いバージョンに適しています。 1.1以降のバージョンでは、 Bill James で提案されているfn:length(MyBean.somelist)
を使用することをお勧めします。
この記事 には、別の可能な解決策を含む、より詳細な情報があります。
問題は、リストのサイズメソッド(有効なLinkedListメソッド)を呼び出そうとしているが、JavaBeans準拠のgetterメソッドではないため、式list.size-1を評価できないことです。
このジレンマに対処するには、2つの方法があります。まず、次のようにRT Coreライブラリを使用できます。
<c_rt:out value='<%= list[list.size()-1] %>'/>
次に、JSPページでJavaコードを回避する場合は、リストを含み、JavaBeans準拠のgetterメソッドを使用してリストのサイズプロパティへのアクセスを提供する単純なラッパークラスを実装できます。このBeanはリスト2.25にリストされています。
C_rtメソッドの問題は、リクエストから変数を手動で取得する必要があることです。そうしないと、変数が認識されないためです。この時点で、機能に組み込むべきものについて多くのコードを入れています。これは、ELのGIANTの欠陥です。
最終的に「ラッパー」メソッドを使用することになりました。これがそのクラスです。
public class CollectionWrapper {
Collection collection;
public CollectionWrapper(Collection collection) {
this.collection = collection;
}
public Collection getCollection() {
return collection;
}
public int getSize() {
return collection.size();
}
}
誰もまだ言及していない3番目のオプションは、リストのサイズを(MVCを使用していると仮定して)別の属性としてモデルに入れることです。したがって、モデルには「someList」と「someListSize」があります。それがこの問題を解決する最も簡単な方法かもしれません。
<%@ taglib uri="http://Java.Sun.com/jsp/jstl/functions" prefix="fn"%>
<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>
画面にテーブルサイズが表示されます
例:Table Size = 5
最終的に EL Functor を使用してEL言語を拡張できます。これにより、パラメータを使用してJava Beanメソッドを呼び出すことができます...