f:具有多个值的viewParam

时间:2011-10-17 13:03:37

标签: jsf viewparams

我有一个<f:viewParam>驱动的搜索屏幕。我正在尝试实现它,为单个<f:viewParam>获取多个值。

我相信正确的网址看起来像

<url>?state=COMPLETE&state=PENDING

XHTML部分如下:

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

我在backingBean上尝试了以下两种方法签名:

public void setState(State... state)

希望JSF实现为值构建数组并在辅助bean上设置。 JSF实现失败,并显示错误,指出它无法将枚举转换为枚举数组。

public void setState(State state)

认为可能JSF实现会设置转换后的值,因为它在URL中找到它们。只设置了第一个值。

stateNameConverterStringenum值之间转换。

JSF 2中是否可以为<f:viewParam>设置多个值?

1 个答案:

答案 0 :(得分: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[]自己收集价值观。 } property。

你也可以创建一个自定义的<my:viewParams>标签来实现这一点,但这并不是一件容易的事。