2012-01-07 9 views
5

可能性の重複:
Access the size of a collection in JSP/JSTL/ELArrayListにsize()の代わりにgetSize()がないのはなぜですか?

私はいくつかのJSPページ内のArrayListを多用し作ってるんです。

${myArrayList.size} 

しかし、オブジェクトがmyArrayList.getMyPropertyName()myArrayList.size()機能にアクセスできない、JSP/JSTLで${myArrayList.myPropertyName}でのJavaBean標準に準拠するようにしなければならないので:私はそうのようなArrayListにアクセスしたいと思います。

私は別のクラスを使用する必要がありますか?

更新:

このようなJSPであなたのArrayListのサイズの取得などの機能がちょうどクリーナー1つのライナーのために残されていることを受け入れるように少し難しいですが、設計者が代わりに.size()を選んだ他の理由があることができそうです.getSize()

${fn:length(myArrayList)}または${myArrayList.getSize()}の構文をサポートしている場合、これは実際問題ではないと思います。

+2

それは彼らがそれを書いた方法です。 [here](http://stackoverflow.com/questions/3579548/access-the-size-of-a-collection-in-jsp-jstl-el)(および多くの他のもの)に従ってfn:lengthを使用してください。 –

答えて

11

タイトルはそれをすべて言う:なぜ(のgetSizeを持っていないのArrayList )の代わりにsize()?

としては、 "Java Collections API Design FAQ" で説明:

は、なぜあなたは一貫性のために、 "豆スタイル名" を使用しませんでしたか?

新しいコレクション・メソッドの名前は 「命名規則ビーンズ」に準拠していませんが、我々は、彼らが 、合理的な一貫性とその目的に対して適切であると考えています。 Beansの命名規則は、 JDK全体には当てはまりませんので、 を覚えておく必要があります。 AWTはこれらの規則を採用しましたが、 の決定は多少議論の余地がありました。 コレクションAPIはかなり普及していると思われます。多くの場合、1行のコードで 複数のメソッド呼び出しがあるため、名前が短くなることが重要です( )。たとえば、イテレータ のメソッドを考えてみましょう。現在、コレクションのループは次のようになります。

 for (Iterator i = c.iterator(); i.hasNext();) 
     System.out.println(i.next()); 
コレクション名が 長い表現であっても、すべてが1行にきれいに収まります。メソッド "getIterator"の名前を "hasNextElement"と "getNextElement"とした場合、これはもはや のケースにはなりません。したがって、 Beansスタイルではなく、従来のJDKスタイルを採用しました。

+1

したがって、getSize()のためにsize()が削除されることは期待していません。 – Matthew

+3

@Matthew getSize()で置き換えられることはありませんが、いずれにせよ、あなたのプロジェクトのタイムラインがJDKの変更に必要な時間に耐えられないと思われます。 –

+1

@Matthew:誰もが「getSize()」が先祖優位の名前であることに突然同意したとしても、それは決して「APIは永遠に」という言葉に取って代わることはありません。 'java.util.List'インタフェースに' getSize() 'を追加することは価値がありません。(それは既存の実装クラスをすべて破ります)、その変更がなければ' getSize() ) 'を' java.util.ArrayList'に変換します(これは 'ArrayList'型の式で表される配列リスト上でのみ使用可能です)。 – ruakh

5

fn:length JSTL機能を使用します(docsを参照)。

まず、JSPの先頭にfn名前空間を宣言します。その後、

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

と:

${fn:length(myArrayList)} 
+0

私はこれを使用したいと思う。互換性のない古いバージョンのTomcatで作業しています。 – Matthew

+1

@Matthew:どうしてですか?あなたはJSP ELを使っていると言っています(例えば '$ {myArrayList.size}')、なぜJSTLは機能しませんか? – skaffman

+0

@Matthewその後、カスタムタグでラップしたり、バックエンドから長さを公開します。 –

1

ELの最新バージョンは、メソッド呼び出しに${collection.size()}

をサポートし、他の2つの答えは、コレクションAPIは、目的のJavaBeansの仕様に準拠していないあなたに詳細

  • を与えます。サイズは必ずしもプロパティではないことに注意してください。実装によっては、動的に計算されます。同じことが他のメソッドにもあります - 単純なプロパティではなく、ゲッターが不適切であるように見えるようにします。あなたはそれを繰り返す - EL 2.2から
  • 前に、あなたは、通常のコレクションのsize()を必要はありませんJSPで、ちなみに${fn:length(collection)}

を使用することができます。いくつかの計算を実行する必要がある場合は、サーブレット/コントローラでそれを行うと考えてください。もちろん、私は同意する、それは時々JSP自体でそれを使用することは有効です。

関連する問題