2009-12-19 21 views
0

我對「請求」類型的ManagedBeans的生命週期有些困惑。通過JSF中的請求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> 

當我按下Edit按鈕時,創建了一個userEditBean,但屬性映射將「user」解析爲null。

這是否意味着在userBean已被銷燬之後EL屬性被解析?我如何將傳入bean中的值傳遞給傳出的bean?

回答

1

您正在使用表達式設置屬性值,而不是靜態值。無論何時您請求該值,該表達式都將被重新評估。 userBean.user顯然不存在於隨後的請求中。您需要確保它的存在(換句話說,該userBean的構造應確保user被創建和設置。

但是也有替代品。其中最好的是使用Tomahawk<t:saveState>爲。在頁面某處添加:

<t:saveState value="#{userBean.user}" /> 

這麼說,我與Bozho同意,整個方法是有點奇怪,但這是另外一個故事你可以但是得到很多有用的想法了以下任一操作。文章:Communication in JSF和/或Using Datatables。祝你好運

+0

必須傳入傳入數據的奇怪之處是什麼? – Stroboskop 2009-12-19 19:58:13

+0

什麼也沒有,但只是當你使用標準的JSF組件時,你需要做更多的工作,因爲你試圖將整個Java對象傳遞給後續請求,而HTTP/HTML只需要和產品字符串。但我明白你想要什麼,'t:saveState'就是你需要的。在'UserEditBean'中只需訪問'UserBean'(託管屬性注入?)以獲取其'用戶'屬性。 – BalusC 2009-12-19 20:38:01

+0

看起來像t:saveState做我想要的。而另一個罐子,我需要包括... – Stroboskop 2009-12-19 20:52:55

0

request範圍意味着bean在一次請求期間生活。然後填寫編輯頁面(第一個請求),併發送編輯的用戶(第二個請求)。

除此之外,<f:attribute>會在父組件中設置屬性,而不是在request中。所以在你的代碼中,這些屬性將在button.getAttributes()中找到(如果你已經綁定了你的按鈕)。

此外,有一個名爲initactionListener方法很奇怪。由於您不需要該事件,因此您可以將action設置爲將執行編輯操作的方法,並使該方法返回所需的導航規則。

+0

是的,但button.getAttributes()似乎只包含一個EL表達式。當我嘗試解決它(調用userEditBean.init)時,它解析爲null。我該怎麼做? – Stroboskop 2009-12-19 18:34:08