1

JSF-1.2 のパラメーターを使用したカスタム関数呼び出しのサポートが必要で、このドキュメントhttp://docs.oracle.com/javaee/5/tutorial/doc/bnahq.html#bnaioに出会いました。

しかし、その関数に可変引数を使用することは可能ですか?

配列を使用してみましTag Libraryたが、その場合、JSF が関数を認識しないようです。

4

2 に答える 2

4

いいえ、EL メソッド式は可変引数をサポートしていません。現在のEL 2.2 バージョンにはありません。将来のEL 3.0 バージョンにもありません。

別のアプローチを探す必要があります。具体的な機能要件が不明なため、どれもお勧めできません。


更新:したがって、機能要件は次のとおりです。

ページに含まれる JavaScript でメッセージ バンドルからパラメータ化されたメッセージを使用する必要があります。メッセージ バンドルでパラメータ化されたファイル名を持つファイルを削除しようとすると、エラー メッセージまたは警告メッセージのようなもの。

まあ、それを回避するための賢明な回避策はありません。次の 2 つのオプションがあります。

  1. さまざまな量の引数を取る一連の EL 関数を作成します。

    #{my:format1(...)}
    #{my:format2(...)}
    #{my:format3(...)}
    ...
    
  2. <h:outputFormat>結果を出力する代わりに、リクエスト スコープの変数に格納するように拡張します。

    <my:outputFormat ... var="foo">
        <f:param ... />
        <f:param ... />
        <f:param ... />
        ...
    </my:outputFormat>
    
    ...
    #{foo}
    

JSF2 用のOmniFaces JSF ユーティリティ ライブラリには、<o:outputFormat>コンポーネントのフレーバーといくつかのof:formatX()関数の両方のソリューションがあります。JSF 1.x では使用できませんが、オープン ソースであり、ある程度の洞察が得られるはずです。

于 2013-03-19T11:31:19.430 に答える
0

リストまたは配列をカスタム関数に渡すことができます。

警告: このコードはテストされていないため、汚いと感じるかもしれません。これは完全なハックです。

マネージド Bean として登録された 2 つのアーティファクトが必要です。

1) 破壊されたMapタイプ:

/** Important: must be none-scoped */
public class ArrayBuilder extends AbstractMap<Object, Object> {

  private List<Object> list = new ArrayList<Object>();

  @Override public Object get(Object entry) {
    if(entry instanceof MakeArray) {
      return list.toArray();
    } else {
      list.add(entry);
      return this;
    }
  }

  @Override public Set<Entry<Object, Object>> entrySet() {
    return Collections.emptySet();
  }
}

アレイの作成をトリガーするポイズン ピル:

/** should be application scoped bean */
public final class MakeArray {
}

EL式:

#{fn:foo(arrayBuilder['one']['two']['three'][makeArray])}

コードの目的は、Object3 つの文字列を含む配列を関数に渡すことfooです。

これが実際に機能するかどうかはわかりません。

于 2013-03-19T11:59:03.227 に答える