1

JSP内の任意のデータに簡単にアクセスできるようにMapインターフェースを実装するカスタムBeanをいくつか作成しました。

例:

${person["cellPhoneNumber"]}

この余分なデータはバックエンドに追加される場合と追加されない場合があるため、マップはこれを保存するための優れた柔軟な方法のようです。

Beanでゲッターを使用しようとすると、問題が発生します。MyPersonクラスにはgetName()メソッドがあります。JSPで以下を使用すると、Map.get()メソッドの代わりにメソッドが呼び出されます。

${person.name}

このMapの呼び出しを回避して、代わりにget("name")呼び出す方法はありますか?getName()

これが私の基本的な(削除された)Javaクラスです:

class Person implements Map
{
    private HashMap<String, Object> myMap;
    private String name;
    public Object get(Object key)
    {
        return myMap.get(key);
    }
    public String getName()
    {
        return this.name;
    }
}

JSTL1.1の使用

4

1 に答える 1

5

サーブレットコンテナは、Mapインターフェイスを実装するすべてのクラスをマップとして扱い、他のメソッドを完全に破棄して、キールックアップによってフォールバックするように見えます。私は2つの解決策を見ます:

1)get(Object key)通常のプロパティに注意する必要があります。

class Person implements Map
{
    private HashMap<String, Object> myMap;
    private String name;
    public Object get(Object key)
    {
        switch(key) {
            case "name": return getName();
            default: myMap.get(key)
        }
    }
    public String getName()
    {
        return this.name;
    }
}

これは少し不器用で、あまりスケーラブルではありません。また、リフレクションを使用してすべてのフィールドを自動的に検索するか、Beanをマップに変換する方がおそらく簡単です(Javaオブジェクト(Bean)をキーと値のペアに変換する方法(およびその逆)を参照)。さらに悪いことに。

2)マップを特別なBean属性として公開します。

class Person
{
    private HashMap<String, Object> optional;
    private String name;
    public Map<String, Object> getOptional()
    {
        return optional;
    }
    public String getName()
    {
        return this.name;
    }
}

次に、EL式は次のようになります。

${person.optional['cellPhoneNumber']}

これは、次の理由からはるかに優れたアプローチです。

  • より高速でスケーラブルです
  • あなたの意図をよりよく表す
  • それはより良いデザインです(コメントでduffymoによって強調されているように)-携帯電話番号のようなオプションの属性Person があります。オプションの属性の「マップ」でPerson はありません。
于 2012-09-29T15:15:39.377 に答える