JSF式言語でリストの長さをどのように取得しますか?


117

ArrayListJSF EL式を使用して長さを取得するにはどうすればよいですか?

#{MyBean.somelist.length}

動作しません。



@GBaあなたはリストのサイズを表示するために#{MyBean.somelist.size()}を使うことができます。
Umair 2014

また、c:forEachを使用してリストをループし、ループ本体でカウント値を変数に割り当てることもできます(例:<c:set var = "nr_of_items" value = "$ {varStatus.count}" />)。とにかくリストをループしているときに特に役立ちます。
DavidBalažic、2015年

回答:


166

はい、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)}

2
fnはおそらく進むべき道ですが、残念ながら1.1以降のJSTLバージョンでのみ使用できます。
James McMahon

27
fn:lengthの使用は、JSPのみで機能しました(JSF、Faceletsなし、超レガシープロジェクトは段階的に廃止される前にわずかに更新されます)。使用する適切なtaglib:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
Christopher Parker

57
:私のようなここに着陸の人々のために、まだ2年、後者は、あなたにfaceletに次の名前空間を追加することがconsidere xmlns:fn="http://java.sun.com/jsp/jstl/functions"
ダミアンMIRAS

59

あなたはsize()を意味しますね?

#{MyBean.somelist.size()}

私のために動作します(Jboss EL拡張機能を持つJBoss Seamを使用)


ELの新しい仕様はサイズ方式をサポートしているのでしょうか?誰でもこれを確認または拒否できますか?
ジェームズマクマホン

2
@nemo -これは、JSR245のメンテナンスリリースで対処されている:blogs.sun.com/kchung/entry/jsr_245_mr_part_i(JEE6だろうJEEのスペック面では、)
マクダウェル

@McDowell、情報をありがとう、問題を修正するために移動するのにこれほど長い時間がかかることに本当に驚いています。
ジェームズマクマホン

ありがとうございました。それも私のために働いた。+1。しかし、JEE 6が広くサポートされるまでは、おそらく「より標準的な」JSTL関数を使い続けるでしょう。
Hosam Aly

ところで、それはおそらくJBossで機能します#{MyBean.somelist.size}(最後に括弧なしで)。
Hosam Aly

14

注:このソリューションは、古いバージョンの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」があります。それがこの問題を解決する最も簡単な方法かもしれません。



6
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>

<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>

画面上にテーブルサイズを表示します

例: Table Size = 5


はい、これが最も簡単な方法です。JSP(レガシーシステム)でwebsphere6を使用しています。同じtablibを使用し、ハッシュが機能しなかったため、「ハッシュ」ではなく「ドル記号」を使用しました。ie:{fn:length(SystemBean.list)}
JackDev 2013

0

EL Functorを使用することにより、最終的にEL言語を拡張できます。これにより、パラメーターを使用してもJava Beanメソッドを呼び出すことができます...


-1

7年後...私のjsfユーザーとして、faceletsソリューションはまだうまく機能しています

名前空間を xmlns:fn="http://java.sun.com/jsp/jstl/functions"

そして#{fn:length(myBean.someList)}例としてjsf ui:fragmentで使用する場合のようにELを使用して うまくいきます

<ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
    <!-- Do something here-->
</ui:fragment>

-5

次のELを使用して長さを取得できます。

#{Bean.list.size()}


1
これは基本的にDamoの答えと同じです。
Artjom B. 14

6
@ArtjomBとして。提案者は、他の誰かがすでに投稿したのと同じ答えに相当するものを投稿することは、ここでは一般的によくありません。この場合、ほぼ6年前です。
Andrew Barber 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.