f:viewParam多值传递

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上尝试了以下两个方法签名:
public void setState(State... state)

希望JSF实现可以为这些值构建一个数组,并将其设置在后台bean上。但是,JSF实现失败,报错说它无法将枚举转换为枚举数组。
public void setState(State state)

我曾以为JSF的实现会按照在URL中找到它们的顺序设置转换后的值,但事实上只设置了第一个值。

stateNameConverter用于String和枚举值之间的转换。

在JSF 2中,<f:viewParam>是否支持多个值?

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);

}

目前,解决此问题的最佳方法是通过在@PostConstruct<f:viewAction>中使用ExternalContext#getRequestParameterValuesMap()从自己收集值,或者在String[]属性上使用@ManagedProperty("#{paramValues.state}")

您还可以创建自定义<my:viewParams>标签来实现这一点,但这并不是非常容易的。


谢谢您的回复。我会去收集信息。 - fransvn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接