[英]Passing data from request ManagedBeans in JSF
對於“ request”類型的ManagedBeans的生命周期,我有些困惑。
在此示例中,我使用一個請求bean“ userBean”填充此頁面,並使用一個請求bean“ userEditBean”填充以下編輯頁面。
<h:form>
<h:panelGrid border="1" columns="2">
<h:outputText value="Name" />
<h:outputText value="#{userBean.user.name}" />
...
</h:panelGrid>
<h:commandButton value="Edit" action="edit" actionListener="#{userEditBean.init}">
<f:attribute name="user" value="#{userBean.user}"/>
</h:commandButton>
</h:form>
當我按下“編輯”按鈕時,將創建一個userEditBean,但屬性映射將“ user”解析為null。
這是否意味着在銷毀userBean之后解析屬性EL? 如何將值從傳入的Bean傳遞到傳出的Bean?
您正在使用表達式設置屬性值,而不是靜態值。 每當您請求該值時,該表達式將再次被重新求值。 userBean.user
顯然不在后續請求中。 您需要確保它在那里(換句話說, userBean
的構造userBean
應確保已創建並設置了user
。
但是,還有其他選擇。 最好的方法之一就是使用Tomahawk的<t:saveState>
。 將其添加到頁面中的某個位置:
<t:saveState value="#{userBean.user}" />
也就是說,我同意博佐的觀點,即整個方法有點奇怪,但這是另一回事了。 但是,您可能會從以下任何一篇文章中獲得許多有用的想法: JSF中的通信和/或Using Datatables 。 祝好運。
request
范圍是指Bean在一個請求中存在。 然后,填寫您的編輯頁面(第一個請求),然后發送已編輯的用戶(第二個請求)。
除此之外, <f:attribute>
在父組件中而不是request
設置tha屬性。 因此,在代碼中,屬性將在button.getAttributes()
(如果已綁定按鈕)。
此外,奇怪的是有一個名為init
的actionListener
方法。 由於不需要事件,因此可以將action
設置為將執行編輯操作的方法,並使該方法返回所需的導航規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.