f:viewParam 具有多个值

Posted

技术标签:

【中文标题】f:viewParam 具有多个值【英文标题】:f:viewParam with multiple values 【发布时间】:2011-12-09 07:09:28 【问题描述】:

我有一个<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 中找到它们。只设置了第一个值。

stateNameConverterStringenum 值之间转换。

在 JSF 2 中&lt;f:viewParam&gt; 是否可以有多个值?

【问题讨论】:

【参考方案1】:

不,很遗憾,没有&lt;f:viewParams&gt; 这样的标签。 Mojarra 的UIViewParameter#decode() 实现(这是&lt;f:viewParam&gt; 标记后面的代码)中还有一条评论证实了这一点:

@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&lt;f:viewAction&gt; 中的ExternalContext#getRequestParameterValuesMap()@ManagedProperty("#paramValues.state") 中的String[] 属性中收集值。

您还可以创建一个自定义的&lt;my:viewParams&gt; 标记来实现这一点,但这并不是微不足道的。

【讨论】:

感谢您的回复。我去搜集资料。

以上是关于f:viewParam 具有多个值的主要内容,如果未能解决你的问题,请参考以下文章

根据 f:viewParam 有条件地调用 f:viewAction

何时调用 <f:metadata><f:viewParam> 的设置器

将 f:viewParam 与必需的属性和命令一起使用

如何在不调用 <f:viewparam> 转换器的情况下调用 setter?

<f:viewParam> 的验证/转换错误不会本地化到 <f:view locale>,而是本地化到默认语言环境

如果位于 template.xhtml 中,JSF f:viewParam 不调用 setter