7

我正在使用 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 数据表,遵循以下示例: http: //www.primefaces.org/showcase/ui/datatableRowSelectionRadioCheckbox.jsf

我想让用户选择多行(复选框 Primeface 示例),然后按下一个按钮,该按钮将重定向到 page1.jsf 并将所选项目列表作为参数传递(例如,使用 Primeface 展示示例,传递一个列表所选车型)。

我正在尝试这样做:

<p:commandButton action="page1?faces-redirect=true&amp;includeViewParams=true" >
 <f:attribute name="list" value="#{bean2.convertSelectedItemsToString()}" />
</p:commandButton>

或这个:

<p:commandButton action="page1?faces-redirect=true&amp;includeViewParams=true" >
 <f:param name="list" value="#{bean2.convertSelectedItemsToString()}" />
</p:commandButton>

其中 bean2 有一个 selectedItems[] 并选择了对象。

不用说...它不起作用。

有什么帮助吗?提前致谢。

4

1 回答 1

8

命令按钮不使用属性或参数来构造发生重定向的 URL。

为此,您通常使用h:commandLink或可选的h:outputLink,但您需要注意这些将呈现参数,就像它们在请求页面时一样。如果用户在此之后对选择进行更改,这些将不会反映在链接中。

可以为您提供最新选择的另一种方法是使用操作方法并在那里构造重定向 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();
}
于 2012-09-08T21:48:21.577 回答