假设我的 JSF 2 应用程序中有两个页面:第一页显示对象表(汽车或其他内容),另一个页面能够显示一个特定对象的详细信息。
表页位于请求范围内,因为每次用户请求时都应重新加载对象。详细信息页面在视图范围内。
因此,当我单击表格内的某个对象时,该对象应该显示在详细信息页面中。通过重定向,我可以转到详细信息页面,但详细信息页面是空的,因为生成了新的视图。
好的,我可以将范围更改为会话,但这会导致其他问题,所以我希望将详细信息页面放在视图范围中。有没有办法将参数传递给新生成的视图范围 bean?
UPDATE 1
这是第一次尝试使用视图参数的代码片段。正如评论的那样,这是行不通的。该值作为请求参数传递,但在目标页面中该值为空。
表页:
<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 );
}
UPDATE 2
我发现了我的错误。元数据部分位于模板文件内。当我将标签放入详细信息页面的主文件时,它就起作用了。非常感谢。
使用视图参数是最适合您的情况的方法。您实际上并不需要执行 REDIRECT,而是执行普通的 GET 请求:
<h:button value="Go to details" outcome="carDetails">
<f:param name="carId" value="#{currentCar.id}" />
</h:button>
这会将您指向以下地址:carDetails.xhtml?carId=1
之后,在你的汽车详情.xhtml页面,获取视图参数并加载该车的信息:
<f:metadata>
<f:viewParam name="carId" value="#{carDetailBean.carId}" />
<f:event type="preRenderView" listener="#{carDetailBean.loadData}"/>
</f:metadata>
Where CarDetailBean#loadData
只需加载您的汽车的信息,以使用已设置到 bean 中的给定 id 来显示。
也可以看看:
- h:button 和 h:commandButton 之间的区别 https://stackoverflow.com/questions/13070537/difference-between-hbutton-and-hcommandbutton
- 、 和 可以用来做什么? https://stackoverflow.com/questions/6377798/what-can-fmetadata-and-fviewparam-be-used-for
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)