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 中找到它们。只设置了第一个值。
stateNameConverter
在 String
和 enum
值之间转换。
在 JSF 2 中<f:viewParam>
是否可以有多个值?
【问题讨论】:
【参考方案1】:不,很遗憾,没有<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()
或@ManagedProperty("#paramValues.state")
中的String[]
属性中收集值。
您还可以创建一个自定义的<my:viewParams>
标记来实现这一点,但这并不是微不足道的。
【讨论】:
感谢您的回复。我去搜集资料。以上是关于f:viewParam 具有多个值的主要内容,如果未能解决你的问题,请参考以下文章
根据 f:viewParam 有条件地调用 f:viewAction
何时调用 <f:metadata><f:viewParam> 的设置器
如何在不调用 <f:viewparam> 转换器的情况下调用 setter?