यदि आपका सर्वलेटेनर न्यूनतम सर्वलेट 3.0 / ईएल 2.2 का समर्थन करता है, तो बस इसे UICommand
घटक या AjaxBehavior
टैग की कार्रवाई / श्रोता विधि के तर्क के रूप में पास करें । उदाहरण के लिए
<h:commandLink action="#{bean.insert(item.id)}" value="insert" />
के साथ सम्मिलन में:
public void insert(Long id) {
// ...
}
इसके लिए केवल यह आवश्यक है कि फॉर्म सबमिट अनुरोध के लिए डेटामॉडल संरक्षित है। सबसे अच्छा यह है कि सेम को व्यू स्कोप के दायरे में रखा जाए@ViewScoped
।
तुम भी पूरे आइटम वस्तु पारित कर सकते हैं:
<h:commandLink action="#{bean.insert(item)}" value="insert" />
साथ में:
public void insert(Item item) {
// ...
}
सर्वलेट 2.5 कंटेनरों पर, यह भी संभव है यदि आप एक ईएल कार्यान्वयन की आपूर्ति करते हैं जो इस तरह का समर्थन करता है, जैसे कि JBoss EL। कॉन्फ़िगरेशन विवरण के लिए, यह उत्तर देखें ।
घटक <f:param>
में उपयोग करें UICommand
। यह एक अनुरोध पैरामीटर जोड़ता है।
<h:commandLink action="#{bean.insert}" value="insert">
<f:param name="id" value="#{item.id}" />
</h:commandLink>
यदि आपकी सेम अनुरोधित है, तो JSF इसे सेट करें @ManagedProperty
@ManagedProperty(value="#{param.id}")
private Long id; // +setter
या यदि आपके बीन का व्यापक दायरा है या आप अधिक महीन दाने वाली मान्यता / रूपांतरण चाहते हैं, <f:viewParam>
तो लक्ष्य दृश्य पर उपयोग करें , यह भी देखें f: viewParam बनाम @ManagedProperty :
<f:viewParam name="id" value="#{bean.id}" required="true" />
किसी भी तरह से, इसका यह फायदा है कि डेटामोडेल को फॉर्म सबमिट करने के लिए जरूरी नहीं है (इस मामले के लिए कि आपका बीन अनुरोधित है)।
घटक <f:setPropertyActionListener>
में उपयोग करें UICommand
। लाभ यह है कि यह अनुरोध पैरामीटर मानचित्र तक पहुंचने की आवश्यकता को हटा देता है जब बीन में अनुरोध क्षेत्र की तुलना में व्यापक गुंजाइश होती है।
<h:commandLink action="#{bean.insert}" value="insert">
<f:setPropertyActionListener target="#{bean.id}" value="#{item.id}" />
</h:commandLink>
के साथ सम्मिलन में
private Long id; // +setter
यह सिर्फ id
एक्शन विधि में संपत्ति द्वारा उपलब्ध होगा । इसके लिए केवल यह आवश्यक है कि फॉर्म जमा अनुरोध के लिए डेटामॉडल संरक्षित है। सबसे अच्छा यह है कि सेम को व्यू स्कोप में रखा जाए @ViewScoped
।
DataModel<E>
इसके बजाए डेटेबल मूल्य को बांधें जो बदले में वस्तुओं को लपेटता है।
<h:dataTable value="#{bean.model}" var="item">
साथ में
private transient DataModel<Item> model;
public DataModel<Item> getModel() {
if (model == null) {
model = new ListDataModel<Item>(items);
}
return model;
}
(इसे बनाने transient
और आलसी में इसे तुरंत बनाना अनिवार्य है, जब आप इसे किसी दृश्य या सत्र में उपयोग कर रहे हैं, जो सेम को DataModel
लागू नहीं करता हैSerializable
)
तब आप वर्तमान पंक्ति के DataModel#getRowData()
चारों ओर कुछ भी पास किए बिना पहुंच सकेंगे (JSF क्लिक कमांड लिंक / बटन के अनुरोध पैरामीटर नाम के आधार पर पंक्ति निर्धारित करता है)।
public void insert() {
Item item = model.getRowData();
Long id = item.getId();
// ...
}
इसके लिए यह भी आवश्यक है कि फॉर्म जमा अनुरोध के लिए डेटामॉडल संरक्षित है। सबसे अच्छा यह है कि सेम को व्यू स्कोप में रखा जाए @ViewScoped
।
Application#evaluateExpressionGet()
प्रोग्राम का वर्तमान में मूल्यांकन करने के लिए उपयोग करें #{item}
।
public void insert() {
FacesContext context = FacesContext.getCurrentInstance();
Item item = context.getApplication().evaluateExpressionGet(context, "#{item}", Item.class);
Long id = item.getId();
// ...
}
चुनने का कौन सा तरीका कार्यात्मक आवश्यकताओं पर निर्भर करता है और क्या एक या दूसरे अन्य प्रयोजनों के लिए अधिक लाभ प्रदान करता है। मैं व्यक्तिगत रूप से # 1 के साथ आगे बढ़ूंगा, या जब आप सर्वलेट 2.5 कंटेनरों के साथ # 2 का समर्थन करना चाहेंगे।