JSF

2011-03-11 16 views
20

में पैरामीटर के साथ विधि को कॉल करने के लिए कैसे करें मेरे पास एक जेएसएफ पृष्ठ है जो किसी फ़ोल्डर की सामग्री दिखाता है (वास्तव में यह एक ड्रॉपबॉक्स की खाता सामग्री है)।JSF

मैं एक DataTable उपयोग कर रहा हूँ एक ListArray वस्तु की सामग्री रेंडर करने के:

<h:dataTable style="text-align: left" width="600" var="dContent" value="#{backedBean.contents}"> 
    <h:column> 
    <f:facet name="header"> 
     <f:verbatim>NAME</f:verbatim> 
    </f:facet> 
    <h:commandButton value="#{dContent.fileName}" action="#{backedBean.updateContents(dContent)}"/> 
    </h:column> 
    <h:column> 
    <f:facet name="header"> 
     <f:verbatim>SIZE</f:verbatim> 
    </f:facet> 
    <h:outputText value="#{dContent.size}"/> 
    </h:column> 
</h:dataTable> 

लेकिन जब मैं इस पेज मैं निम्न त्रुटि प्राप्त चलाएँ:

/browse.xhtml @34,110 action="#{backedBean.updateContents(dContent)}" Error Parsing: #{backedBean.updateContents(dContent)}
...
...
Caused by: org.apache.el.parser.ParseException: Encountered " "(" "("" at line 1, column 28. Was expecting one of:
"}" ...
"." ...
"[" ...
">" ...
"gt" ...
"<" ...
"lt" ...
">=" ...
"ge" ...
...
...

अजीब बात यह है कि है नेटबीन्स विधि नाम को स्वतः पूर्ण करने में सक्षम है, इसलिए मैं छवि देता हूं कि मेरा बैकएंड बीन ठीक है। समस्या तब होती है जब मैं पैरामीटर के साथ एक विधि को कॉल करता हूं।

कोई विचार?

बहुत धन्यवाद

उत्तर

38

ईएल 2.2 में पासिंग विधि तर्क प्रस्तुत किए गए थे। तो यह केवल तभी संभव है जब आप एक सर्वलेट 3.0/ईएल 2.2 सक्षम कंटेनर जैसे टॉमकैट 7, ग्लासफ़िश 3, जेबॉस एएस 6, आदि और पर अपने web.xml को सर्वलेट 3.0 विनिर्देश के अनुसार घोषित किया गया हो।

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
> 
    <!-- Config here --> 
</web-app> 

आप नहीं कर रहे हैं, तो this answer विकल्पों के लिए संबंध के साथ datatables में वर्तमान पंक्ति प्राप्त करने के लिए this answer ईएल कार्यान्वयन की जगह के संबंध में एक जो विधि तर्क गुजर इतना है कि आप उस पर उपयोग कर सकते हैं का समर्थन करता है के द्वारा जांच करें, या सर्वलेट 2.5/ईएल 2.1 कंटेनर भी।

+0

बहुत बहुत धन्यवाद, मैं अभी जांच कर रहा था कि शायद कारण यह है कि मेरा कंटेनर (tomcat6) इस सुविधा का समर्थन नहीं करता है। वास्तव में ग्लासफ़िश v3 पर ऐप को तैनात करना त्रुटि गायब हो जाती है। बहुत धन्यवाद। – Neos76

+0

बस एक नोट: मैंने पढ़ा है कि जेएसएफ 2.0 और नेटबीन्स में विधि तर्क समर्थित हैं मुझे इस ऐप को टॉमकैट 6 और जेएसएफ 2.0 समर्थन के साथ कॉन्फ़िगर करने दें। क्या जेएसएफ 2.0 और ईएल 2.2 कुछ तरीकों से संबंधित हैं? – Neos76

+1

यह एक जेएसएफ 2.0 सुविधा नहीं है। यह एक ईएल 2.2 है। सुविधा। जेएसएफ 2.0 जावा ईई 6 के साथ बंडल किया गया है जो बदले में सर्वलेट 3.0/ईएल 2.2 बंडल करता है। तो यह * एक जेएसएफ 2.0 सुविधा की तरह दिखता है। हालांकि, जेएसएफ 2.0 जावा ईई 5 के साथ पिछड़ा संगत है जो बदले में सर्वलेट 2.5/ईएल 2.1 बंडल करता है, फिर भी ईएल 2.1 इसका समर्थन नहीं करता है। – BalusC

3

जेबॉस सीम भी सुविधा प्राप्त करने में मदद कर सकता है।

सीम जेबॉस ईएल का उपयोग करता है जो मानक एकीकृत अभिव्यक्ति भाषा (ईएल) का विस्तार प्रदान करता है। जेबॉस ईएल कई संवर्द्धन प्रदान करता है जो ईएल अभिव्यक्तियों की अभिव्यक्ति और शक्ति को बढ़ाता है।

उदाहरण:

पास शाब्दिक एकल उद्धरण का उपयोग कर तार: <h:commandLink action="#{printer.println('Hello world!')}" value="Hello"/>

या गतिशील मूल्य के लिए <h:commandButton action="#{hotelBooking.bookHotel(hotel)}" value="Book Hotel"/>

सीमा:

JBoss ईएल वर्तमान में JSP के साथ नहीं किया जा सकता 2.1 क्योंकि संकलक पैरामीटर के साथ अभिव्यक्ति को अस्वीकार करता है। इसलिए, यदि आप इस एक्सटेंशन का उपयोग जेएसएफ 1.2 के साथ करना चाहते हैं, तो आप Facelets का उपयोग करने की आवश्यकता होगी। एक्सटेंशन जेएसपी 2.0 के साथ सही ढंग से काम करता है।

+0

यह काम करता है: मैं जेबॉस 4.2.3.जीए और समृद्ध 3.3.3 में सीम 2.2.0.GA का उपयोग कर रहा हूं। अंतिम: मेरा कोड काम कर रहा है: rendered = "# {bean.method (स्ट्रिंगअर्गमेंट)}" –

1

वास्तव में जेएसएफ 1.0 के बाद से ऐसा करने का "हैक" तरीका रहा है। आप बस अपनी बैकिंग बीन पर एक विधि बनाते हैं जो एक मानचित्र लौटाता है, और आप जेएसएफ ईएल का उपयोग उस विधि को पारित करने के लिए कर सकते हैं, क्योंकि जेएसएफ सोचता है कि आप मानचित्र की कुंजी गुजर रहे हैं।

इस बीच, आपकी बैकिंग बीन विधि में आप वास्तव में एक "प्रेरक" मानचित्र उदाहरण लौटाते हैं जो वास्तव में एक नक्शा नहीं है, जिसका get() विधि जिस तरीके से आप कॉल करना चाहते हैं, उसमें प्रतिनिधि प्रतिनिधि हैं। अपने .xhtml या .jsp फ़ाइल में आप चर को पारित करने के लिए स्क्वायर ब्रैकेट नोटेशन का उपयोग कर सकते हैं।

HashMap विस्तारित करने के लिए एक तरीका है जो प्रेरित करने वाले मानचित्र को परिभाषित करने में आसान बनाता है - इस तरह अज्ञात आंतरिक वर्ग का उपयोग करने के लिए पर्याप्त संक्षेप में।

यह एक हैक है, लेकिन यह अतीत में मेरे लिए अच्छा काम करता है।