Gereksinimi yerine getirmenin birkaç yolu vardır.
Sunucu kapsayıcınız minimum Servlet 3.0 / EL 2.2 destekliyorsa, bunu UICommand
bileşen veya AjaxBehavior
etiketin eylem / dinleyici yöntemi argümanı olarak iletin . Örneğin
<h:commandLink action="#{bean.insert(item.id)}" value="insert" />
İle bütünlüğünde:
public void insert(Long id) {
// ...
}
Bu, yalnızca veri modelinin form gönderme isteği için korunmasını gerektirir. En iyisi, fasulyeyi görüş alanına koymaktır @ViewScoped
.
Hatta tüm öğe nesnesini bile iletebilirsiniz:
<h:commandLink action="#{bean.insert(item)}" value="insert" />
ile:
public void insert(Item item) {
// ...
}
Servlet 2.5 konteynerlerinde, JBoss EL gibi bunu destekleyen bir EL uygulaması sağlarsanız bu da mümkündür. Yapılandırma ayrıntısı için bu yanıta bakın .
Kullanım <f:param>
içinde UICommand
bileşen. Bir istek parametresi ekler.
<h:commandLink action="#{bean.insert}" value="insert">
<f:param name="id" value="#{item.id}" />
</h:commandLink>
Fasulyeniz istek kapsamlıysa, JSF'nin bunu ayarlamasına izin verin @ManagedProperty
@ManagedProperty(value="#{param.id}")
private Long id; // +setter
Veya fasulyenizin daha geniş bir kapsamı varsa veya daha ayrıntılı doğrulama / dönüştürme istiyorsanız <f:viewParam>
, hedef görünümde kullanın , ayrıca bkz : f: viewParam vs @ManagedProperty :
<f:viewParam name="id" value="#{bean.id}" required="true" />
Her iki durumda da bu, veri modelinin form gönderimi için korunmasına gerek olmaması avantajına sahiptir (fasulyenizin istek kapsamlı olması durumunda).
Kullanım <f:setPropertyActionListener>
içinde UICommand
bileşen. Bunun avantajı, çekirdeğin talep kapsamından daha geniş bir kapsama sahip olduğu zaman, istek parametresi eşlemesine erişim ihtiyacını ortadan kaldırmasıdır.
<h:commandLink action="#{bean.insert}" value="insert">
<f:setPropertyActionListener target="#{bean.id}" value="#{item.id}" />
</h:commandLink>
İle bütünlüğünde
private Long id; // +setter
Yalnızca mülkiyet id
eylem yöntemiyle kullanılabilir olacaktır. Bu, yalnızca veri modelinin form gönderme isteği için korunmasını gerektirir. En iyisi, fasulyeyi görüş alanına koymaktır @ViewScoped
.
DataModel<E>
Bunun yerine, verileri sırayla sarmalayan tarihlenebilir değeri bağlayın .
<h:dataTable value="#{bean.model}" var="item">
ile
private transient DataModel<Item> model;
public DataModel<Item> getModel() {
if (model == null) {
model = new ListDataModel<Item>(items);
}
return model;
}
(bunu yapmak transient
ve alıcıda tembel bir şekilde örneklemek, bunu bir görünümde veya oturum kapsamlı fasulye üzerinde kullandığınızda zorunludur çünkü DataModel
uygulanmaz Serializable
)
Ardından, geçerli satıra DataModel#getRowData()
herhangi bir şey iletmeden erişebilirsiniz (JSF, satırı tıklanan komut bağlantısının / düğmesinin istek parametresi adına göre belirler).
public void insert() {
Item item = model.getRowData();
Long id = item.getId();
// ...
}
Bu aynı zamanda veri modelinin form gönderme isteği için korunmasını gerektirir. En iyisi, fasulyeyi görüş alanına koymaktır @ViewScoped
.
Application#evaluateExpressionGet()
Akımı programlı olarak değerlendirmek için kullanın #{item}
.
public void insert() {
FacesContext context = FacesContext.getCurrentInstance();
Item item = context.getApplication().evaluateExpressionGet(context, "#{item}", Item.class);
Long id = item.getId();
// ...
}
Hangi yolu seçeceğiniz, işlevsel gereksinimlere ve birinin veya diğerinin başka amaçlar için daha fazla avantaj sunup sunmamasına bağlıdır. Ben şahsen # 1 ile devam ederdim veya servlet 2.5 konteynerleri de # 2 ile desteklemek istediğinizde.