[英]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標簽或id
或binding
屬性。 您不應在視圖作用域的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.