[英]Validate f:viewParam value to be one of a select set of allowable values
[英]f:viewParam with multiple values
我有一个<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>
设置多个值?
不,不幸的是,没有<f:viewParams>
这样的标签。 Mojarra的UIViewParameter#decode()
实现(这是<f:viewParam>
标签背后的代码UIViewParameter#decode()
还有一条注释,它确认:
@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
ExternalContext#getRequestParameterValuesMap()
或<f:viewAction>
收集值,或者在String[]
上<f:viewAction>
@ManagedProperty("#{paramValues.state}")
属性。
您还可以创建一个自定义<my:viewParams>
标签来实现这一目标,但这并非完全无关紧要。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.