【问题标题】:Passing parameters to a view scoped bean in JSF在 JSF 中将参数传递给视图范围的 bean
【发布时间】:2014-01-02 09:40:43
【问题描述】:

假设我的 JSF 2 应用程序中有两个页面:第一个页面显示一个对象表(汽车或其他),另一个页面能够显示一个特定对象的详细信息。 表格页面在请求范围内,因为每次用户请求时都应重新加载对象。详细信息页面在查看范围内。 所以当我点击表格内的一个对象时,这个对象应该会显示在详细信息页面中。通过重定向,我可以转到详细信息页面,但详细信息页面为空,因为生成了新的 vew。 好的,我可以将范围更改为会话,但这会导致其他问题,因此我希望在查看范围内查看详细信息页面。有没有办法将参数传递给新生成的视图范围 bean?

更新 1

这里是第一次尝试使用视图参数的代码sn-p。正如评论的那样,这不起作用。该值作为请求参数传递,但在目标页面中该值为 null。

表格页:

<h:button value="Go to details" outcome="targetPage">
     <f:param name="carId" value="This is a test" />
</h:button>

详情页:

<f:metadata>
    <f:viewParam name="carId" value="#{bean.id}" />
    <f:event type="preRenderView" listener="#{bean.loadData}"/>
</f:metadata>

详细信息页面的Bean:

private String id;

public String getId() {
    return id;
}

public void setId( String id ) {
    this.id = id;
}

public void loadData() {
    System.out.println( "Id: " + id );
}

更新 2

我发现了我的错误。元数据部分位于模板文件中。当我将标签放在详细信息页面的主文件中时,它可以工作。非常感谢。

【问题讨论】:

标签: jsf view parameters scope


【解决方案1】:

使用视图参数是最适合您的情况的方法。您实际上不需要执行 REDIRECT,而是执行普通的 GET 请求:

<h:button value="Go to details" outcome="carDetails">
    <f:param name="carId" value="#{currentCar.id}" />
</h:button>

这会将您指向这个地址:carDetails.xhtml?carId=1

之后,在您的 carDetails.xhtml 页面中,获取视图参数并加载该汽车的信息:

<f:metadata>
    <f:viewParam name="carId" value="#{carDetailBean.carId}" />
    <f:event type="preRenderView" listener="#{carDetailBean.loadData}"/>
</f:metadata>

CarDetailBean#loadData 只是加载信息以供您的汽车使用给定的 id 显示,该 id 已设置到 bean 中。

另请参阅:

【讨论】:

  • 感谢您的建议。这听起来不错,但不幸的是它不起作用。我可以使用按钮切换到详细信息页面,并且调用 CarDetailBean#loadData 方法,但参数始终为空。我还打印了我的请求参数,在那里我可以找到该值,但在目标页面中它为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2013-03-19
  • 2015-04-21
  • 2013-12-12
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多