在JSF中向视图作用域bean传递参数

3
假设我在JSF 2应用程序中有两个页面:第一个页面显示一个对象表格(汽车或其他物品),另一个页面能够显示一个特定对象的详细信息。表格页面是请求范围,因为每次用户请求时都需要重新加载对象。详细页面是视图范围。
因此,当我在表格中单击对象时,该对象应在详细页面中显示。通过重定向,我可以进入详细页面,但详细页面为空,因为生成了一个新的视图。
好吧,我可以将作用域更改为会话,但这会导致其他问题,所以我希望详细页面处于视图范围。是否有一种方法可以传递参数给新生成的视图范围bean? 更新1 以下是使用视图参数的第一次尝试的代码片段。正如所评论的那样,这并不起作用。该值作为请求参数传递,但在目标页面中该值为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

我发现了我的错误。元数据部分在模板文件中。当我把标签放到详情页面的主文件中时,它就起作用了。非常感谢。


请访问此链接,您可以找到完整的解释。 - Sagar Koshti
1个回答

12

使用视图参数是您的情况下最合适的方式。您不需要执行重定向,只需要进行简单的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加载相关信息,并将其设置到该 bean 中,以便显示。

另请参见:


谢谢您的建议。听起来很不错,但不幸的是它并没有起作用。我可以通过按钮转到详细页面,也可以调用CarDetailBean#loadData方法,但参数始终为空。我还打印了我的请求参数,在那里我可以找到值,但在目标页面中它是空的。 - Metalhead89

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