ArrayList
JSF EL 式を使用しての長さを取得するにはどうすればよいですか?
#{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 Jamesfn:length(MyBean.somelist)
の提案に従って使用することをお勧めします。
この記事には、別の可能な解決策を含む、より詳細な情報が含まれています。
問題は、リストの size メソッド (有効な 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の大きな欠陥です。
私は最終的に「ラッパー」メソッドを使用しました。これがそのクラスです。
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)}"/>
On screen it displays the Table size
Example: Table Size = 5
最終的にはEL Functorを使用して EL 言語を拡張できます。これにより、パラメーターを使用しても、任意の Java Bean メソッドを呼び出すことができます...
次の EL を使用して長さを取得できます。
#{Bean.list.size()}