让我们以搜索页面和结果页面为例。如果我有一个 ViewScoped bean 来处理我的搜索页面和我的结果页面,我可以使用以下方式通过 url 传递参数:
搜索.xhtml
<p:commandButton value="Search" type="submit" action="#{searchBacker.search}" >
后备豆
@ManagedBean(name="search")
@ViewScoped
public class searchBacker extends AbstractBacking {
private String firstName = null;
private String lastName = null;
private String results = null;
public String search() {
return "results?faces-redirect=true&includeViewParams=true";
}
public void getResults() {
MyDAO dao = new MyDAO();
results = dao.getResults(firstName, lastName);
}
//getters and setters
}
结果.xhtml
<f:metadata>
<f:event type="preRenderView" listener="#{searchBacker.getResults}" />
<f:viewParam name="firstName" value="#{searchBacker.firstName}"/>
<f:viewParam name="lastName" value="#{searchBacker.lastName}"/>
</f:metadata>
现在假设我有两个托管 bean - 一个用于搜索页面,一个用于结果页面。
查询字符串是否仍会使用 2 个不同的托管 bean 在 url 中构建,或者这仅在对两个页面使用相同的托管 bean 时才有效?
更新
我的 search.xhtml 和 results.xhtml 页面上也有相同<f:viewParam>
的内容,但唯一的区别是我f:viewParam value
在 results.xhtml 中指向的支持者与在 search.xhtml 中的支持者不同。当我这样做时,不会通过 url 传递任何参数。当我将我f:viewParam value
的 in results.xhtml 指向我在 search.xhtml 中使用的同一个支持者时,参数可以很好地通过 url,但该值在我需要的结果支持者中不存在。如果我的 results.xhtml 页面中有重复f:viewParam
的 s - 一个带有搜索支持者,一个带有结果支持者,一切正常。两个托管 bean有 2 个相同f:viewParam
的 s 是正确的方法吗?
例子:
results.xhtml - 参数通过 url 传递,但在我的 resultsBacker 中不可用
<f:metadata>
<f:viewParam name="firstName" value="#{searchBacker.firstName}"/>
<f:viewParam name="lastName" value="#{searchBacker.lastName}"/>
</f:metadata>
results.xhtml - 没有参数通过 url 传递
<f:metadata>
<f:viewParam name="firstName" value="#{resultsBacker.firstName}"/>
<f:viewParam name="lastName" value="#{resultsBacker.lastName}"/>
</f:metadata>
results.xhtml - 参数通过 url 传递并在我的 resultsBacker 中可用,但看起来很笨重。这是正确的方法还是我仍然错过了什么?
<f:metadata>
<f:viewParam name="firstName" value="#{searchBacker.firstName}"/>
<f:viewParam name="firstName" value="#{resultsBacker.firstName}"/>
<f:viewParam name="lastName" value="#{searchBacker.lastName}"/>
<f:viewParam name="lastName" value="#{resultsBacker.lastName}"/>
</f:metadata>