JSF命令按钮中的ViewParam

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 DataTable,遵循此示例: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[]数组,其中包含所选对象。

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

需要帮助吗? 提前致谢。

1个回答

8
一个命令按钮无法使用属性或参数来构造重定向的URL。
对于这个问题,通常使用或可选的,但您需要知道,这些将呈现页面请求时的参数。如果用户在此之后更改了选择,则不会反映在链接中。
一个替代方案是使用一个操作方法,在那里构建重定向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();
}

作为一个临时解决方案,我采用了你的第二种方法。但我不喜欢它,因为这样我的控制器(bean)会严重依赖于我的视图。我期望JSF能够提供更好的解决方案。 - userk
在JSF中,按照惯例,后备bean“应该”支持单个视图,因此后备bean可以是视图相关的。bean2.convertSelectedItemsToString已经是特定于视图的了,或者你正在做一些通用的东西吗?如果您需要通用解决方案,可以将页面作为参数传递。请参见更新的答案。 - Arjan Tijms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接