簡體   English   中英

無需會話bean即可優雅地處理屬性

[英]Elegant handling of attributes without a session bean

我正在使用JSF 2.0和Richfaces 4開發一個應用程序,該應用程序包含許多顯示元素的表,當然還有通常的View / Edit / Delete選項。 經過一些SO瀏覽和Google搜索后,我決定發布一個問題,因為我發現的答案不能解決我的問題。

現在,直截了當地,我的應用程序在處理存儲在請求Bean中的某些屬性時遇到問題,並且在某些方面由於連續的請求而丟失。

例如,當我要編輯一個對象時,該對象將被發送給(f:propertyActionListener)一個請求bean,該bean在表單上顯示數據,然后在請求結束時將其丟棄。 保存時,將創建一個新對象,並將表單上的屬性設置為該對象,並且將保存該項目而不是對其進行更新,因為它沒有ID(JPA + Hibernate)。

我已經研究了許多選項,這是我到目前為止所做的以及結果:

f:param + h:link或h:commandLink:使用@ManagedProperty時,param為null,我無法在Context中找到它來通過JNDI查找它。

f:setPropertyActionListener + h:commandLink +請求Bean:有效 ...但是我丟失了一些數據。 顯示數據的表單具有一些有條件地呈現的字段,我無法保存該信息,因此,如果驗證階段發現無效數據,則表單將被弄亂。

f:viewParam + h:commandLink + View Scoped Bean:這里很奇怪。 這個代碼不能直接工作,因為該bean似乎在呈現表單之前就被丟棄了,因為該表單是干凈的,因此呈現的表單沒有任何信息。

使用會話bean:就像一個魅力一樣,但是我不想為每種表單都創建一個會話bean,只是因為我仍在學習有關JSF生命周期的知識,所以我想以正確的方式來做。

如果我想保留Request會話方法,是否可以存儲參數(對象或純字符串)並稍后在request bean上獲取?

Dunno如果有幫助,但是我正在通過ui:insert和ui:define使用母版頁。

使用視圖范圍的bean。 它應該工作。 您在那里描述的問題表明您正在將其綁定到JSTL標簽或idbinding屬性。 您不應在視圖作用域的bean上執行此操作。 另請參見@ViewScoped在標記處理程序中失敗 另一個可能的原因是您使用的是CDI的@Named來管理Bean,而不是JSF的@ManagedBean 這也可以解釋為什么@ManagedProperty在您的一次嘗試中不起作用,因為它還要求該bean由JSF的@ManagedBean管理。

對於主從頁面方法,請在表頁面中將<h:link><f:param>以在主頁面中創建視圖/編輯鏈接。

例如user/list.xhtml

<h:dataTable value="#{userList.users}" var="user">
    <h:column>#{user.id}</h:column>
    <h:column>#{user.name}</h:column>
    <h:column>
        <h:link value="Edit" outcome="edit">
            <f:param name="id" value="#{user.id}" />
        </h:link>
    </h:column>
</h:dataTable>

該bean可以僅在請求范圍內。

然后,在默認頁面(在本例中為編輯頁面)中,使用<f:viewParam>轉換,驗證並將id設置為User

例如user/edit.xhtml

<f:metadata>
    <f:viewParam name="id" value="#{userEdit.user}"
        converter="#{userConverter}" converterMessage="Bad request. Unknown user."
        required="true" requiredMessage="Bad request. Please use a link from within the system." />
</f:metadata>

<h:messages />
<h:link value="Back to all users" outcome="users" />

<h:form id="user" rendered="#{not empty userEdit.user}">
    <h:inputText value="#{userEdit.user.name}" required="true" />
    ...

    <h:commandButton value="Save" action="#{userEdit.save}">
        <f:ajax execute="@form" render="@form" />
    </h:commandButton>
</h:form>

使用@ViewScoped bean來保存數據,服務和操作方法:

@ManagedBean
@ViewScoped
public class UserEdit {

    private User user;

    @EJB
    private UserService service;

    public String save() {
        service.save(user);
        return "users";
    }

    // Getter+setter.
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM