我有一个<f:viewParam>驱动的搜索屏幕.我正在尝试实现它以获取单个的多个值<f:viewParam>.
我相信正确的URL看起来像
<url>?state=COMPLETE&state=PENDING
Run Code Online (Sandbox Code Playgroud)
XHTML部分如下:
<f:metadata>
<f:viewParam name="state"
value="#{backingBean.state}"
converter="#{stateNameConverter}" />
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
我在backingBean上尝试了以下2个方法签名:
public void setState(State... state)
Run Code Online (Sandbox Code Playgroud)
希望JSF实现为值构建一个数组并在依赖bean上设置.JSF实现失败,错误表明它无法将枚举转换为枚举数组.
public void setState(State state)
Run Code Online (Sandbox Code Playgroud)
认为可能JSF实现会设置转换后的值,因为它在URL中找到它们.仅设置了第一个值.
该stateNameConverter之间的转换String和enum价值.
<f:viewParam>在JSF 2中可以有多个值吗?
不,不幸的是,没有这样的标签<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);
}
Run Code Online (Sandbox Code Playgroud)
现在最好的办法来解决这个是从自己收集的值ExternalContext#getRequestParameterValuesMap()在@PostConstruct或<f:viewAction>或者一个@ManagedProperty("#{paramValues.state}")上一个String[]属性.
您还可以创建一个自定义<my:viewParams>标记来实现这一目标,但这并非完全无关紧要.
| 归档时间: |
|
| 查看次数: |
2436 次 |
| 最近记录: |