我有一個叫做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