2009-12-21 7 views
8

पर जाने से पहले, इस प्रकार इस questionईएल का उपयोग करके मैं जेएसएफ घटक मूल्य कैसे प्राप्त करूं?

यह JSF प्रपत्र फिर से दिखाया गया है देखें:

<f:view> 
    <h:form> 
     <div> 
      <label>Id</label> 
      <input type="text" name="accountId"/> 
     </div> 
     <div> 
      <label>Amount</label> 
      <input type="text" name="amount"/> 
     </div> 
     <h:commandButton value="Withdraw" action="#{accountService.withdraw(param.accountId, param.amount)}"/> 
    </h:form> 
</f:view> 

सूचना है कि मैं <h:inputText id="amount"> की <input type="text" name="amount"> का इस्तेमाल किया है बजाय। सीम ईएल रिज़ॉल्वर का उपयोग कर अपने मूल्य को पुनर्प्राप्त करने के लिए, मैं param.amount का उपयोग करता हूं।

ऐसा होता है कि यदि मैं <input type="text" का उपयोग करता हूं और सर्वर पक्ष पर कुछ गलत हो जाता है, तो मुझे पृष्ठ को फिर से दिखाना होगा। तो इसके सबमिट मूल्य को पुनर्प्राप्त नहीं किया गया है क्योंकि यह एक सादा HTML कोड है। इसके कारण, मुझे इसके बजाय <h:inputText जेएसएफ घटक का उपयोग करने की आवश्यकता है।

तो सवाल यह है कि: मैं <h:inputText जेएसएफ घटक मान अभिव्यक्ति भाषा का उपयोग कर कैसे प्राप्त करूं?

+0

शुरू करने के लिए, आपके सवाल काफी भ्रामक था। ऐसा लगता है कि सीम कहानी पूरी तरह से अप्रासंगिक है। भविष्य में कृपया जेएसएफ कोड पोस्ट करें जो आपको ** वास्तव में ** है और बताएं कि आप ** ** ** ** के साथ क्या करना चाहते हैं। – BalusC

+0

इससे कोई मतलब नहीं है। सादे जेएसपी/सर्वलेट में आप ' 'के लिए इस्तेमाल कर सकते थे। – BalusC

+0

मैं दृढ़ता से एक सभ्य जेएसएफ पुस्तक/ट्यूटोरियल के माध्यम से समझने की सलाह देता हूं कि जेएसएफ कैसे "हुड के तहत" काम करता है। "सादा वेनिला" सीखना जेएसपी/सर्वलेट इसे समझने में बहुत मदद करेगा। आप धारणाएं बना रहे हैं और अपने सभी कार्यों को अपने हाथों में ले कर जेएसएफ की विचारधारा तोड़ने की कोशिश कर रहे हैं। क्षमा करें अगर मैं कठोर लगता हूं, लेकिन यह सच है। – BalusC

उत्तर

18

JSF ग्राहक आईडी के माता-पिता UINamingContainer घटकों के cliend आईडी (जैसे h:form, h:dataTable, f:subview) द्वारा prepended कर रहे हैं। यदि आप अपने वेबब्रोसर (राइटक्लिक, स्रोत देखें) में जेनरेट किए गए HTML स्रोत की जांच करते हैं, तो आपको उन्हें देखना चाहिए। उत्पन्न इनपुट तत्वों के id और name मूल रूप से id के साथ प्रीपेड किए गए हैं। आपको पैरामीटर मानचित्र में कुंजी के समान नाम का उपयोग करने की आवश्यकता है। विभाजक चरित्र के रूप में, कोलन :, ईएल में एक "अवैध" चरित्र है, आपको उन्हें पुनर्प्राप्त करने के लिए ब्रेस नोटेशन param['foo:bar'] का उपयोग करने की आवश्यकता है।

public void withDraw() { 
    Map<String, String> map = FacesContext.getCurrentInstance().getRequestParameterMap(); 
    String id = map.get("account:id"); 
    String amount = map.get("account:amount"); 
    // ... 
} 
:

<f:view> 
    <h:form id="account"> 
     <div> 
      <label>Id</label> 
      <h:inputText id="id" /> 
     </div> 
     <div> 
      <label>Amount</label> 
      <h:inputText id="amount" /> 
     </div> 
     <h:commandButton value="Withdraw" 
      action="#{accountService.withdraw(param['account:id'], param['account:amount'])}"/> 
    </h:form> 
</f:view> 
सीवन-ईएल की तरह विधि मानकों के बिना

आप इसे ग्राहक आईडी का उपयोग कुंजी के रूप में अनुरोध पैरामीटर के नक्शे में उन तक पहुँच सकते हैं (आप जाहिरा तौर पर नहीं/यह है चाहते हैं),

कहने की जरूरत नहीं है कि यह बुरा है। बस इसे सामान्य जेएसएफ तरीका करें, मानों को बीन गुणों से बांधें।

संपादित करें: अंतिम सवाल के अनुसार जो आप संपादित किया है:

तो सवाल यह है: मैं कैसे अभिव्यक्ति भाषा का उपयोग करके एक <h:inputText JSF घटक मान प्राप्त करते हैं?

यह पहले से ही उत्तर दिया गया है। पैरामीटर नाम के रूप में जेएसएफ-जेनरेट नाम का उपयोग करें। यह आम तौर पर formId:inputId के पैटर्न में है जहां formId घटक का id है और inputIdUIInput घटक का id है। उत्पन्न <input type="text"> फ़ील्ड के सटीक नाम के लिए जेनरेट किए गए HTML आउटपुट की जांच करें। पैरामीटर मान प्राप्त करने के लिए, ब्रेस नोटेशन ['name'] का उपयोग करें, क्योंकि आप ${param.formId:inputId} में ईएल में कोलन : का उपयोग नहीं कर सकते हैं।

इस प्रकार

:

#{param['formId:inputId']} 
+0

एचएम, यह आपका स्वयं का जवाब था और यह काम करना था? खैर, मैं केवल जेनरेट किए गए HTML आउटपुट को जांचने के लिए संकेत दे सकता हूं कि नाम सही हैं या/या यदि वे अनुरोध पैरामीटर मानचित्र में उपलब्ध हैं या नहीं। – BalusC

+0

तो आप कह रहे हैं कि * वास्तव में * आपके जेएसएफ पृष्ठ में 'h: inputText' है और '' नहीं है? इस तरह आपको इसे (और मूल रूप) एक आईडी आईडी देने की आवश्यकता है और उत्पन्न क्लाइंट आईडी के साथ परम प्राप्त करें। मैं जल्द ही अपना जवाब संपादित करूंगा। – BalusC

+0

वे अनुरोध पैरामीटर मानचित्र में हैं। उदाहरण के लिए क्या आपने इसकी सामग्री डीबग की है? 'System.out.println (requestParameterMap);' ताकि आप उन्हें और पैटर्न देख सकें? – BalusC

1

पैरामीटर नाम/inputText के लिए आईडी और नियंत्रण रेंडरर द्वारा समझाया जाता है, अंत में, एक कार्यान्वयन विस्तार। अभ्यास में, वे clientId का उपयोग करते हैं। पैरामीटर मानचित्र से सीधे इन्हें पढ़ने की आवश्यकता नहीं होनी चाहिए; उन्हें मॉडल में धक्का देने के लिए बाध्यकारी मूल्य का उपयोग करें और उन्हें वहां से पढ़ें।

आप किसी प्रबंधित बीन में घटक को बाध्य करके ईएल का उपयोग करके घटक से सीधे मूल्यों को पढ़ सकते हैं। सादगी के लिए, यहाँ एक अनुरोध गुंजाइश के लिए बाध्य है:

<!-- bind a UIComponent to the request map as "foo" --> 
<h:inputText binding="#{requestScope.foo}" /> 
<!-- read value from a UIComponent that implements ValueHolder --> 
#{requestScope.foo.value} 

लेकिन, आम तौर पर, कोई लाभ पर इस के लिए है:

<!-- bind a value to the request map as "foo" --> 
<h:inputText value="#{requestScope.foo}" /> 
<!-- read value from the request scope --> 
#{requestScope.foo} 

अनुरोध नक्शा (जो टक्कर में भर में प्रभावित हो सकती है प्रदूषण से बचने के लिए विचार), अनुरोध स्कोप का उपयोग करने के बजाय सीधे अपने मूल्यों को नेमस्पेस/encapsulate करने के लिए एक प्रबंधित बीन का उपयोग करें।

+0

अच्छी जानकारी, एमसीडीओवेल। (+1) –

0

हालांकि मैं अपने क्लाइंट पहचानकर्ता के माध्यम से JSF घटक मान प्राप्त कर सकते हैं, वहाँ कुछ दोष यह इस प्रकार हैं:

  1. मैकडॉवल्स जवाब के अनुसार, क्लाइंट पहचानकर्ता एक कार्यान्वयन विस्तार
  2. क्लाइंट पहचानकर्ता से अलग कर सकते हैं नियंत्रण पदानुक्रम में एक से अधिक नामकरण कंटेनर होने पर घटक पहचानकर्ता। (कार्रवाई पुस्तक में JSF)

तो अगर आप क्लाइंट पहचानकर्ता पर भरोसा नहीं करना चाहते, आप अपने खुद के ElResolver इस प्रकार लागू कर सकते हैं:

public class ComponentIdResolver extends ELResolver { 

    public Object getValue(ELContext context, Object base, Object property) { 
     if (base instanceof UIComponent && property instanceof String) { 
      UIComponent r = ((UIComponent) base).findComponent((String) property); 

      if (r != null) { 
       context.setPropertyResolved(true); 

       return r; 
      } 
     } 

     return null; 
    } 

} 

अब मैं की तरह कुछ का उपयोग कर सकते (ध्यान विधि को वापस लेने)

<h:inputText id="accountId" /> 
<h:inputText id="amount" /> 
<h:commandButton value="Withdraw" action="#{accountService.withdraw(view.accountId.value, view.amount.value)}"/> 

दृश्य एक अंतर्निहित JSF वस्तु है (FacesContext.getCurrentInstance() के समान है। getViewRoot())

तो reg नीचे दिखाया गया है (चेहरे-config.xml) के रूप में अपने ELResolver

<application> 
    <el-resolver>br.com.view.resolver.ComponentIdResolver</el-resolver> 
</application> 

Ister आप को पता है ElResolver के बारे में एक अच्छा जानकारी देखने Extending the Java EE Unified Expression Language with a Custom ELResolver

संबंध चाहते हैं,

संबंधित मुद्दे