我们以搜索页面和结果页面为例。如果我有一个处理我的搜索页面和结果页面的ViewScoped bean,我可以使用以下内容通过url传递参数:
search.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
}
results.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中的不同支持者,而不是我的搜索。 XHTML。当我这样做时,没有参数通过网址传递。当我将results {x}中的f:viewParam value
指向我在search.xhtml中使用的同一个支持者时,param会很好地通过url,但是在我需要它的结果支持者中不存在该值。如果我在results.xhtml页面中有重复的f:viewParam
- 一个有搜索支持者,一个有结果支持者,一切正常。是否有两个相同的f:viewParam
s与两个托管bean正确的方法吗?
示例:
results.xhtml - params通过url传递,但在我的resultsBacker中不可用
<f:metadata>
<f:viewParam name="firstName" value="#{searchBacker.firstName}"/>
<f:viewParam name="lastName" value="#{searchBacker.lastName}"/>
</f:metadata>
results.xhtml - 没有参数通过网址传递
<f:metadata>
<f:viewParam name="firstName" value="#{resultsBacker.firstName}"/>
<f:viewParam name="lastName" value="#{resultsBacker.lastName}"/>
</f:metadata>
results.xhtml - params通过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>
答案 0 :(得分:4)
我建议您实现两个@ViewScoped
托管bean,一个用于搜索页面,另一个用于结果页面。您还应该有两个xhtml页面,每个页面都与一个bean相关联。很可能它的页面将有自己的url(因为看起来你现在正在使用相同的bean)。
您可以使第二页的bean期望两个参数firstName
和lastName
。之后,在preRenderView
方法中,当参数已经设置到第二个托管bean中时,使用该值查询数据库。那么如何实现bean之间的过渡呢?结果应该足够了。
<p:button outcome="results">
<f:param name="firstName" value="#{searchBean.firstName}">
<f:param name="lastName" value="#{searchBean.lastName}">
</p:button>
这使得JSF使用您需要的参数构建一个URL。你现在可以做的完全一样,但是使用你的第二个bean来获取你的参数(我强烈建议你不要使用preRenderView
方法的getter方法):
<f:metadata>
<f:event type="preRenderView" listener="#{resultBacker.initialize}" />
<f:viewParam name="firstName" value="#{resultBacker.firstName}"/>
<f:viewParam name="lastName" value="#{resultBacker.lastName}"/>
</f:metadata>
答案 1 :(得分:3)
includeViewParams
时, <f:viewParam>
才有效。
因此,在您的parituclar案例中,您需要在<f:viewParam>
和name
中将search.xhtml
与results.xhtml
完全相同。在封面下,includeViewParams
只捕获当前视图的视图参数,然后仅应用在目标视图中声明的 。
无关到具体问题,你似乎有效地想要一个GET表格。在这种情况下,比使用参数执行POST-Redirect-GET更好的方法。请查看上面“另请参见”链接的底部。