我正在使用 JSF 和 Primefaces,我的问题是:
我有一个页面(page1.jsf),它接收一个带有字符串列表(空格分隔)的 View 参数:
<f:metadata>
<f:viewParam name="list" value="#{bean1.list}" converter="listConverter"/>
</f:metadata>
listConverter 将字符串转换为单个单词的列表。
如果我通过 url 访问页面(例如:page1.jsf?list=word1 word2 word3")一切正常!
但现在我正在尝试使用另一个页面 (page2.jsf) 来创建该术语列表。
我正在使用 Primeface 数据表,如下所示: http://www.primefaces.org/showcase/ui/datatableRowSelectionRadioCheckbox.jsf
我想让用户选择多行(复选框 Primeface 示例),然后按下一个按钮,该按钮将重定向到 page1.jsf 并将所选项目的列表作为参数传递(例如,使用 Primeface 展示示例,传递一个列表所选车型)。
我正在尝试这样做:
<p:commandButton action="page1?faces-redirect=true&includeViewParams=true" >
<f:attribute name="list" value="#{bean2.convertSelectedItemsToString()}" />
</p:commandButton>
或这个:
<p:commandButton action="page1?faces-redirect=true&includeViewParams=true" >
<f:param name="list" value="#{bean2.convertSelectedItemsToString()}" />
</p:commandButton>
其中 bean2 有一个 selectedItems[] 与选定的对象。
不用说......它不起作用。
有什么帮助吗?
提前致谢。
请您参考如下方法:
命令按钮不使用属性或参数来构造重定向发生的 URL。
为此,您通常使用 h:commandLink
或可选 h:outputLink
,但您需要注意,这些将呈现请求页面时的参数。如果用户在此之后对选择进行了更改,则这些更改将不会反射(reflect)在链接中。
另一种可以为您提供最新选择的替代方法是使用操作方法并在那里构建重定向 URL。
例如。
<p:commandButton action="#{bean2.navigateWithSelection}" />
然后在你的 bean 中:
public String navigateWithSelection() {
return "page1?faces-redirect=true&" + convertSelectedItemsToString();
}
根据评论,如果
bean2
是一个对页面一无所知的通用bean,可以将目标页面作为参数传入:
<p:commandButton action="#{bean2.navigateWithSelection('page1')}" />
然后再次在你的 bean 中:
public String navigateWithSelection(String target) {
return target + "?faces-redirect=true&" + convertSelectedItemsToString();
}