ArrayList
JSF EL式を使用して長さを取得するにはどうすればよいですか?
#{MyBean.somelist.length}
動作しません。
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)}
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
あなたはsize()を意味しますね?
#{MyBean.somelist.size()}
私のために動作します(Jboss EL拡張機能を持つJBoss Seamを使用)
#{MyBean.somelist.size}
(最後に括弧なしで)。
注:このソリューションは、古いバージョンのJSTLに適しています。1.1以降のバージョンでfn:length(MyBean.somelist)
は、Bill Jamesの提案に従って使用することをお勧めします。
この記事には、別の可能な解決策を含む、いくつかのより詳細な情報があります。
問題は、リストのサイズメソッド(有効なLinkedListメソッド)を呼び出そうとしていることですが、これはJavaBeans準拠のゲッターメソッドではないため、式list.size-1を評価できません。
このジレンマに対処するには2つの方法があります。まず、次のようにRT Coreライブラリを使用できます。
<c_rt:out value='<%= list[list.size()-1] %>'/>
次に、JSPページでJavaコードを使用したくない場合は、リストを含む単純なラッパークラスを実装し、JavaBeans準拠のgetterメソッドを使用してリストのsizeプロパティへのアクセスを提供できます。そのBeanはリスト2.25にリストされています。
c_rtメソッドの問題は、そうでないと認識できないため、リクエストから変数を手動で取得する必要があることです。この時点で、組み込み機能に必要な多くのコードを配置しています。これは、GIANT 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)}"/>
画面上にテーブルサイズを表示します
例: Table Size = 5
EL Functorを使用することにより、最終的にEL言語を拡張できます。これにより、パラメーターを使用してもJava Beanメソッドを呼び出すことができます...
次のELを使用して長さを取得できます。
#{Bean.list.size()}