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