5

<f:viewParam>駆動型検索画面があります。単一の に対して複数の値を取るように実装しようとしています<f:viewParam>

正しいURLは次のようになると思います

<url>?state=COMPLETE&state=PENDING

XHTML セクションは次のとおりです。

<f:metadata>
   <f:viewParam name="state"
      value="#{backingBean.state}"
      converter="#{stateNameConverter}" />
</f:metadata>

backingBean で次の 2 つのメソッド シグネチャを試しました。

public void setState(State... state)

JSF 実装が値の配列を作成し、バッキング Bean に設定することを期待していました。JSF 実装は、列挙型を列挙型の配列に変換できないというエラーで失敗しました。

public void setState(State state)

JSF 実装は、URL で見つかったとおりに変換された値を設定するのではないかと考えました。最初の値のみが設定されました。

はと値のstateNameConverter間で変換します。Stringenum

<f:viewParam>JSF 2で複数の値を持つことは可能ですか?

4

1 に答える 1

7

いいえ、残念ながら のようなタグはありません<f:viewParams>。Mojarra のUIViewParameter#decode()実装 (コード ビハインド<f:viewParam>タグ) には、次のことを確認するコメントもあります。

@Override
public void decode(FacesContext context) {
    if (context == null) {
        throw new NullPointerException();
    }

    // QUESTION can we move forward and support an array? no different than UISelectMany; perhaps need to know
    // if the value expression is single or multi-valued
    // ANSWER: I'd rather not right now.
    String paramValue = context.getExternalContext().getRequestParameterMap().get(getName());

    // submitted value will stay as previous value (null on initial request) if a parameter is absent
    if (paramValue != null) {
        setSubmittedValue(paramValue);
    }

    rawValue = (String) getSubmittedValue();
    setValid(true);

}

これを回避するための現時点での最善の策は、プロパティ内またはプロパティExternalContext#getRequestParameterValuesMap()内から自分で値を収集することです。@PostConstruct<f:viewAction>@ManagedProperty("#{paramValues.state}")String[]

それを実現するカスタム タグを作成することもできます<my:viewParams>が、これは簡単なことではありません。

于 2011-10-17T13:15:13.340 に答える