我有一个叫做trip.xhtml
,我带出来的参数使用下面的代码的URL的网页:查看参数
<f:metadata>
<f:viewParam name="tripid" value="#{tripBean.tripId}" />
<f:viewParam name="seats" value="#{tripBean.seats}" />
<f:event type="preRenderView" listener="#{tripBean.processParams}" />
</f:metadata>
的TripBean
看起来像这样(简化):
@ManagedBean
@RequestScoped
public class TripBean implements Serializable {
private static final long serialVersionUID = -4885781058258859229L;
private Long tripId;
private int seats;
// Getters and setters for tripId and seats
在trip.xhtml
页面的底部我有一个h:link
:
<h:link outcome="/customer/booking.xhtml" value="Book this trip"
includeViewParams="true" />
我期望的是当我点击这个链接时,我得到的URL就像"/customer/booking.jsf?tripid=2&seats=1"
。这是只有当我把下面的代码我booking.xhtml
页面上的情况:
<f:metadata>
<f:viewParam name="tripid" value="#{tripBean.tripId}" />
<f:viewParam name="seats" value="#{tripBean.seats}" />
</f:metadata>
虽然我其实想是用另外一个bean。代码更改为:
<f:metadata>
<f:viewParam name="tripid" value="#{bookingBean.tripId}" />
<f:viewParam name="seats" value="#{bookingBean.seats}" />
</f:metadata>
的BookingBean
也有2个属性tripId
和seats
这是相同的TripBean
,但是当我尝试点击现在的联系,我只看到它被设置为0个席位参数("/customer/booking.jsf?seats=0"
)
有没有人有任何想法,当我试图使用另一个bean来存储它们时,为什么我不能将viewparams传递到另一个页面?如果不能将它存储在另一个bean中,我怎么能把TripBean
中的那些值放在BookingBean
?
我使用的快速解决方法: 不使用includeViewParams="true"
,但手动向链接添加参数(参见下文)“修复”问题。虽然我仍然想知道为什么它不适用于includeViewParams
!
<h:link outcome="/customer/booking.xhtml" value="#{msg['page.trip.booking']}">
<f:param name="tripid" value="#{tripBean.tripId}" />
<f:param name="seats" value="#{tripBean.seats}" />
</h:link>
trip.xhtml页面可以获取参数tripid和座位。如果我理解的很好,参数可以在Apply Request Values阶段读取。这些被放入更新模型值的TripBean中,并且在渲染 - 响应阶段生成链接。因此,当我将这两个参数提供给trip.xhtml时,预订链接应该生成正确的,对吧?但是,这似乎只发生在booking.xhtml也使用tripBean来捕获参数,而不是当我尝试使用另一个(bookingBean)bean时! – StefK
@Trinorae:你误解了f:paramView。您描述的行为完全是它应该如何工作的,这不是一个错误或问题,因此它不需要解决方法。 f:paramView不是意味着在两个bean之间移动值。它旨在保持源与目标相同。这种行为与其他JSF组件的工作方式是一致的。从任意源生成参数的优雅方式是f:param ...基本上,你试图将一个精心设计的JSF轻松地压缩成你认为“好”的错误,同时拒绝学习。唷。 – fdreger
我想我误解了viewParams的使用!感谢您给我启发。 – StefK