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 回答