我正在使用JSF和Primefaces,我的问题是:
我有一个页面(page1.jsf),它返回一个带有字符串列表的视图参数(空格分隔):
<f:metadata>
<f:viewParam name="list" value="#{bean1.list}" converter="listConverter"/>
</f:metadata>
listConverter将字符串转换为单个单词列表。 如果我通过url访问页面(例如:page1.jsf?list = word1 word2 word3“),一切正常!
但是现在我正在尝试使用另一个页面(page2.jsf)来创建术语列表。 我正在使用Primeface DataTable,请遵循以下示例: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 [],其中包含所选对象。
毋庸置疑......它没有用。
有任何帮助吗? 提前谢谢。
答案 0 :(得分:8)
命令按钮不使用属性或参数来构造重定向发生的URL。
为此,您通常使用h:commandLink
或可选h:outputLink
,但您需要注意这些参数将呈现请求页面时的参数。如果用户在此之后对选择进行了更改,那么这些更改将不会反映在链接中。
为您提供最新选择的替代方法是使用操作方法并在那里构建重定向网址。
E.g。
<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();
}