当第一页使用与第二页相同的托管bean时,f:viewParam是否仅在url中传递查询字符串?

时间:2013-08-02 20:19:06

标签: jsf jsf-2 view-scope

我们以搜索页面和结果页面为例。如果我有一个处理我的搜索页面和结果页面的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&amp;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>

2 个答案:

答案 0 :(得分:4)

我建议您实现两个@ViewScoped托管bean,一个用于搜索页面,另一个用于结果页面。您还应该有两个xhtml页面,每个页面都与一个bean相关联。很可能它的页面将有自己的url(因为看起来你现在正在使用相同的bean)。

您可以使第二页的bean期望两个参数firstNamelastName。之后,在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.xhtmlresults.xhtml完全相同。在封面下,includeViewParams只捕获当前视图的视图参数,然后仅应用在目标视图中声明的

另见:


无关到具体问题,你似乎有效地想要一个GET表格。在这种情况下,比使用参数执行POST-Redirect-GET更好的方法。请查看上面“另请参见”链接的底部。