JSF में कब और कैसे क्लाइंट आईडी उत्पन्न होता है?



jsf-2 page-lifecycle (1)

JSF (2.x) में क्लाइंट आईडी पीढ़ी को और अधिक समझने के लिए, क्या कोई मुझे समझा सकता है जब JSF क्लाइंट आईडी उत्पन्न करता है (जो जीवन चक्र चरण, समय का निर्माण या समय प्रस्तुत करना ...)?

इसे HTML प्रतिक्रिया में समाप्त करना होगा यह रेंडर प्रतिक्रिया के दौरान उत्पन्न होता है। अगर आपने UIComponent#getClientId() विधि पर डीबग ब्रेकपॉइंट डाल दिया है, तो आप UIComponent#getClientId() में नीचे देखेंगे ( RenderResponsePhase#execute() मामले में) RenderResponsePhase#execute() को लागू किया गया है। यह जीवन चक्र में वर्तमान चरण के बारे में पर्याप्त संकेत है जब ब्रेकपॉइंट हिट हो जाता है

और ग्राहक आईडी कैसे उत्पन्न होगी (यदि घटक आईडी प्रदान नहीं कर रहा है या नहीं, बेतरतीब ढंग से या किसी विशिष्ट तर्क का उपयोग कर रहा है ...)?

अमूर्त UIComponent#getClientId() विधि के ठोस क्रियान्वयन को UIComponent#getClientId() में पाया जा सकता है। इसका स्रोत कोड grepcode पर पाया जा सकता है इसे कैसे बनाया जाएगा, इसका जवाडॉक में वर्णित है:

public abstract String getClientId(FacesContext context)

इस घटक के लिए एक क्लाइंट-साइड पहचानकर्ता लौटें, यदि आवश्यक हो तो एक जेनरेट करें संबंधित Renderer , यदि कोई हो, ग्राहक को ट्रांसमिशन के लिए उपयुक्त फॉर्म में क्लाइंट को कनवर्ट करने के लिए कहा जाएगा।

जब तक कि घटक की id संपत्ति परिवर्तित न हो जाए, या घटक को NamingContainer में रखा गया हो, जिसका क्लाइंट आईडी बदलता है (उदाहरण के लिए, UIData ), इस पद्धति से वापसी समान जीवनकाल में होनी चाहिए। हालांकि, यहां तक ​​कि इन मामलों में, इस पद्धति को लगातार कॉल हमेशा उसी मान को वापस करना चाहिए। क्लाइंट का निर्धारण करने के लिए कार्यान्वयन इन चरणों का पालन करना चाहिए:

NamingContainer लागू करने वाले दृश्य पदानुक्रम में इस घटक के निकटतम पूर्वज खोजें इस पर कॉल getContainerClientId() करें और परिणाम को parentId स्थानीय चर के रूप में parentId । इस घटक पर getId() कॉल करें और परिणाम को myId स्थानीय चर के रूप में सहेजें। यदि context.getViewRoot().createUniqueId() null , तो context.getViewRoot().createUniqueId() करें context.getViewRoot().createUniqueId() और परिणाम को context.getViewRoot().createUniqueId() असाइन करें। यदि parentId - parentId गैर- null , तो parentId + बराबर parentId + UINamingContainer.getSeparatorChar(javax.faces.context.FacesContext) + myId कॉल Renderer.convertClientId(javax.faces.context.FacesContext, java.lang.String) , Renderer.convertClientId(javax.faces.context.FacesContext, java.lang.String) गुजरती है, और परिणाम वापस लौटाता है।

बहुत साफ है, है ना? सबसे महत्वपूर्ण हिस्सा संभवत: उन घटकों को याद रखना है जो NamingContainer लागू NamingContainer और इस प्रकार उनके क्लाइंट आईडी को शामिल करते हैं मानक JSF 2.x में, जो कम से कम <h:form> , <h:dataTable> , <ui:repeat> , <f:subview> और <cc:implementation>यदि आप सभी घटकों को एक निश्चित आईडी देते हैं , तो आप उस पैटर्न को वापस उत्पन्न HTML आउटपुट में देखेंगे।

यदि आप उन घटकों को एक निश्चित आईडी नहीं देते हैं, तो इसके बजाय जेएसएफ-जनरेटेड आईडी का उपयोग किया जाएगा जो कि UIViewRoot#createUniqueId() माध्यम से प्राप्त किया जा सकता है (जैसा कि ऊपर के जवादाक निकालने में पहले से संकेत दिया गया है)। इसका जावाडॉक कहता है:

public String createUniqueId()

एक घटक के लिए एक पहचानकर्ता उत्पन्न करें पहचानकर्ता को UNIQUE_ID_PREFIX साथ प्रीफिक्स किया UNIQUE_ID_PREFIX , और इस UIViewRoot के गैर-नामकरण कॉन्टैनेयर बाल उप-पेड़ों के भीतर अद्वितीय होगा।

वह उपसर्ग j_id यह कार्यान्वयन कैसे उत्पन्न करना चाहिए पर स्पष्ट नहीं है, इसलिए सभी लागूकर्ता इसे कार्यान्वित करने के लिए स्वतंत्र हैं। वे आम तौर पर पेड़ में घटक गिनती का एक वृद्धि सूचकांक का उपयोग करते हैं। तो, पहला घटक, UIViewRoot , UIViewRoot एक आईडी प्राप्त कर सकता है। इसके पहले बच्चे को j_id2 की एक आईडी मिल सकती है। आदि। आप UIViewRoot#createUniqueId() विधि या यहां तक ​​कि UIViewRoot#createUniqueId() विधि पर डिबग ब्रेकपॉइंट डालकर तर्क को वापस ट्रैक कर सकते हैं।

यह भी देखें:

JSF (2.x) में क्लाइंट आईडी पीढ़ी को और अधिक समझने के लिए, क्या कोई मुझे समझा सकता है जब JSF क्लाइंट आईडी उत्पन्न करता है (जो जीवन चक्र चरण, समय का निर्माण या समय प्रस्तुत करना ...)?

और ग्राहक आईडी कैसे उत्पन्न होगी (यदि घटक आईडी प्रदान नहीं कर रहा है या नहीं, बेतरतीब ढंग से या किसी विशिष्ट तर्क का उपयोग कर रहा है ...)?





clientid