जेएसएफ संसाधन पुस्तकालय क्या है और इसका उपयोग कैसे किया जाना चाहिए?


228

जेएसएफ <h:outputStylesheet>, <h:outputScript>और <h:graphicImage>घटकों की एक libraryविशेषता है। यह क्या है और इसका उपयोग कैसे किया जाना चाहिए? वेब पर बहुत सारे उदाहरण हैं जो सामान्य सामग्री / फ़ाइल प्रकार css, jsऔर img(या) के साथ इसका उपयोग करते हैंimage ) उपयोग किए गए टैग के आधार पर पुस्तकालय के नाम के रूप में:

<h:outputStylesheet library="css" name="style.css" />
<h:outputScript library="js" name="script.js" />
<h:graphicImage library="img" name="logo.png" />

यह कैसे उपयोगी है? libraryउन उदाहरणों में मूल्य सिर्फ दोहरा जा करने के लिए जो कुछ भी पहले से ही टैग नाम से प्रतिनिधित्व किया गया है लगता है। इसके लिए <h:outputStylesheet>यह पहले से ही स्पष्ट है कि यह "सीएसएस लाइब्रेरी" का प्रतिनिधित्व करता है। निम्नलिखित के साथ क्या अंतर है जो सिर्फ उसी तरह काम करता है?

<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />

साथ ही, उत्पन्न HTML आउटपुट थोड़ा अलग है। के एक URL पैटर्न पर एक संदर्भ पथ /contextnameऔर FacesServletमानचित्रण को देखते हुए *.xhtml, पूर्व अनुरोधित पैरामीटर के रूप में पुस्तकालय के नाम के साथ निम्नलिखित HTML उत्पन्न करता है:

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/style.css.xhtml?ln=css" />
<script type="text/javascript" src="/contextname/javax.faces.resource/script.js.xhtml?ln=js"></script>
<img src="/contextname/javax.faces.resource/logo.png.xhtml?ln=img" alt="" />

जबकि बाद वाले को केवल URI के रास्ते में लाइब्रेरी नाम के साथ निम्न HTML जेनरेट करता है:

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml" alt="" />

बाद का दृष्टिकोण पूर्व दृष्टिकोण की तुलना में और भी अधिक समझ में आता है। libraryगुण वास्तव में कितना उपयोगी है?

जवाबों:


256

दरअसल, वेब पर उन सभी उदाहरणों में जिसमें सामान्य सामग्री / फ़ाइल प्रकार जैसे "js", "css", "img", इत्यादि का उपयोग किया गया है क्योंकि पुस्तकालय का नाम भ्रामक है

वास्तविक दुनिया के उदाहरण

प्रारंभ करने के लिए की तरह कैसे मौजूदा JSF कार्यान्वयन पर आइए नज़र Mojarra और MyFaces और तरह JSF घटक पुस्तकालयों PrimeFaces और OmniFaces में उपयोग करें। उनमें से कोई भी इस तरह से संसाधन पुस्तकालयों का उपयोग नहीं करता है। वे इसे का उपयोग करें (कवर के तहत, द्वारा @ResourceDependencyया UIViewRoot#addComponentResource()) निम्नलिखित तरीके:

<h:outputScript library="javax.faces" name="jsf.js" />
<h:outputScript library="primefaces" name="jquery/jquery.js" />
<h:outputScript library="omnifaces" name="omnifaces.js" />
<h:outputScript library="omnifaces" name="fixviewstate.js" />
<h:outputScript library="omnifaces.combined" name="[dynamicname].js" />
<h:outputStylesheet library="primefaces" name="primefaces.css" />
<h:outputStylesheet library="primefaces-aristo" name="theme.css" />
<h:outputStylesheet library="primefaces-vader" name="theme.css" />

यह स्पष्ट हो जाना चाहिए कि यह मूल रूप से सामान्य पुस्तकालय / मॉड्यूल / थीम नाम का प्रतिनिधित्व करता है जहां उन सभी संसाधनों का आमतौर पर संबंध होता है।

आसान पहचान

इस तरह यह निर्दिष्ट करना और भेद करना बहुत आसान है कि वे संसाधन कहाँ से हैं और / या से आ रहे हैं। कल्पना कीजिए कि आपके पास primefaces.cssअपने स्वयं के वेबऐप में एक संसाधन है, जिसमें आप कुछ डिफ़ॉल्ट सीएसएस प्राइमफेस के ओवरराइडिंग / फ़ाइनट्यूनिंग कर रहे हैं; यदि PrimeFaces ने अपने लिए लाइब्रेरी नाम का उपयोग नहीं किया हैprimefaces.css , तो PrimeFaces स्वयं लोड नहीं होंगे, बल्कि इसके बजाय वेब-आपूर्ति की गई, जो कि लुक को तोड़ देगी।

इसके अलावा, जब आप एक कस्टम का उपयोग कर रहे हैं, तो आप ResourceHandlerएक विशिष्ट पुस्तकालय से आने वाले संसाधनों पर अधिक महीन दानेदार नियंत्रण भी लागू कर सकते हैं जब libraryसही तरीके से उपयोग किया जाता है। यदि सभी घटक पुस्तकालयों ने अपनी सभी जेएस फाइलों के लिए "जेएस" का उपयोग किया होगा, ResourceHandlerतो यह विशिष्ट घटक पुस्तकालय से आने पर कैसे अलग होगा ? उदाहरण ओमनीफेस CombinedResourceHandlerऔर हैं GraphicResourceHandler; createResource()श्रृंखला में अगले संसाधन हैंडलर को सौंपने से पहले पुस्तकालय की जाँच की जाने वाली विधि की जाँच करें । इस तरह वे जानते हैं कि कब CombinedResourceया GraphicResourceकिस उद्देश्य से बनाया जाए।

नोट किया जाना चाहिए कि रिचफेसेस ने गलत किया। यह libraryसब पर किसी का उपयोग नहीं किया और इसके ऊपर एक और संसाधन हैंडलिंग लेयर को होमब्रेव किया और इसलिए प्रोग्राम को रिचफेसेस संसाधनों की पहचान करना असंभव है। यही कारण है कि ओमनीफेस CombinedResourceHander को रिचफेसेस संसाधनों के साथ वैसे भी काम करने के लिए एक प्रतिबिंब-आधारित हैक पेश करना पड़ा ।

आपका अपना वेबैप

आपके स्वयं के वेबएप को संसाधन लाइब्रेरी की आवश्यकता नहीं है। आप सबसे अच्छा इसे छोड़ देंगे।

<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />

या, यदि आपको वास्तव में एक की आवश्यकता है, तो आप इसे "समझदार" या कुछ कंपनी के नाम की तरह एक अधिक समझदार सामान्य नाम दे सकते हैं।

<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />

या, जब संसाधन कुछ मास्टर फेसलेट्स टेम्पलेट के लिए विशिष्ट होते हैं, तो आप इसे टेम्पलेट का नाम भी दे सकते हैं, ताकि एक-दूसरे से संबंधित करना आसान हो। दूसरे शब्दों में, यह स्व-दस्तावेजी उद्देश्यों के लिए अधिक है। एक /WEB-INF/templates/layout.xhtmlटेम्प्लेट फ़ाइल में उदा :

<h:outputStylesheet library="layout" name="css/style.css" />
<h:outputScript library="layout" name="js/script.js" />

और एक /WEB-INF/templates/admin.xhtmlटेम्पलेट फ़ाइल:

<h:outputStylesheet library="admin" name="css/style.css" />
<h:outputScript library="admin" name="js/script.js" />

एक वास्तविक दुनिया उदाहरण के लिए, ओमनीफेस शोकेस स्रोत कोड की जांच करें ।

या, जब आप एक से अधिक वेबपृष्ठों पर समान संसाधन साझा करना चाहते हैं और उसी के लिए एक "सामान्य" प्रोजेक्ट बनाया है, जो इस उत्तर में उदाहरण के रूप में है, जो बदले में वेब के JAR के रूप में एम्बेडेड है /WEB-INF/lib, तो इसे लाइब्रेरी के रूप में भी देखें (नाम आपकी पसंद के लिए स्वतंत्र है; ओमनीफेस और प्राइमफेस जैसे घटक पुस्तकालय भी उस तरह से काम करते हैं)

<h:outputStylesheet library="common" name="css/style.css" />
<h:outputScript library="common" name="js/script.js" />
<h:graphicImage library="common" name="img/logo.png" />

लाइब्रेरी संस्करण

एक और मुख्य लाभ यह है कि आप अपने स्वयं के वेबप द्वारा प्रदान संसाधनों पर सही तरीके से संसाधन लाइब्रेरी को लागू कर सकते हैं (यह एक JAR में एम्बेडेड संसाधनों के लिए काम नहीं करता है)। आप \d+(_\d+)*संसाधन लाइब्रेरी संस्करण को निरूपित करने के लिए पैटर्न में एक नाम के साथ लाइब्रेरी फ़ोल्डर में एक सीधा बच्चा सबफ़ोल्डर बना सकते हैं ।

WebContent
 |-- resources
 |    `-- default
 |         `-- 1_0
 |              |-- css
 |              |    `-- style.css
 |              |-- img
 |              |    `-- logo.png
 |              `-- js
 |                   `-- script.js
 :

इस मार्कअप का उपयोग करते समय:

<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />

यह vपैरामीटर के रूप में लाइब्रेरी संस्करण के साथ निम्न HTML उत्पन्न करेगा :

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&amp;v=1_0" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&amp;v=1_0"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&amp;v=1_0" alt="" />

इसलिए, यदि आपने कुछ संसाधन संपादित / अपडेट किए हैं, तो आपको बस इतना करना होगा कि संस्करण फ़ोल्डर को एक नए मान में कॉपी या नाम बदल दिया जाए। यदि आपके पास कई संस्करण फ़ोल्डर हैं, तो ResourceHandlerसंख्यात्मक क्रम नियमों के अनुसार, JSF स्वचालित रूप से उच्चतम संस्करण संख्या से संसाधन की सेवा करेगा।

इसलिए, जब resources/default/1_0/*फ़ोल्डर की नकल / नाम बदलना resources/default/1_1/*इस प्रकार है:

WebContent
 |-- resources
 |    `-- default
 |         |-- 1_0
 |         |    :
 |         |
 |         `-- 1_1
 |              |-- css
 |              |    `-- style.css
 |              |-- img
 |              |    `-- logo.png
 |              `-- js
 |                   `-- script.js
 :

तब अंतिम मार्कअप उदाहरण निम्नलिखित HTML उत्पन्न करेगा:

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&amp;v=1_1" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&amp;v=1_1"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&amp;v=1_1" alt="" />

यह वेबब्रोसर को कैश से एक ही नाम के साथ एक को दिखाने के बजाय सर्वर से संसाधन का अनुरोध करने के लिए मजबूर करेगा, जब पहली बार बदले गए पैरामीटर के साथ URL का अनुरोध किया गया है। इस तरह से एंड्यूजर्स को हार्ड रिफ्रेश (Ctrl + F5 वगैरह) करने की आवश्यकता नहीं होती है, जब उन्हें अपडेटेड CSS / JS रिसोर्स को पुनः प्राप्त करने की आवश्यकता होती है।

कृपया ध्यान दें कि JAR फ़ाइल में संलग्न संसाधनों के लिए लाइब्रेरी संस्करण संभव नहीं है। आपको एक कस्टम की आवश्यकता होगी ResourceHandlerजार में संसाधनों के लिए JSF संस्करण का उपयोग कैसे करें यह भी देखें ।

यह सभी देखें:


2
क्या पुस्तकालय के लिए ईएल का उपयोग करना संभव है? इसलिए अगर मैं एक संसाधन / डिफ़ॉल्ट और एक संसाधन / महसूस करना चाहता / चाहती हूँ, तो मैं पुस्तकालय जैसा कुछ कर सकता था = "# {someLibraryHere}" मैप someLibraryHere को अपनी चुनी हुई लाइब्रेरी में ले जाऊंगा और हर बार उच्चतर संस्करण में संसाधन निर्देशिका का नाम बदलने पर भरोसा नहीं करना पड़ेगा। मैं उन्हें बदलना चाहता था।
गबुह

जब आप लाइब्रेरी = व्यवस्थापक या लाइब्रे = लेआउट कहते हैं, तो क्या वे (व्यवस्थापक और लेआउट) संसाधन फ़ोल्डर में फ़ोल्डर हैं?
कोरे तुगे

उम्म। बहुत दिलचस्प बालू। मैं एक वेब ऐप में एक समस्या का सामना कर रहा हूं, जहां लोड होने के दौरान theme.css खाली दिखाई देती है। यह केवल विभिन्न redeploys (JBOSS EAP में) के बाद होता है। Css url कुछ इस प्रकार है: /javax.faces.resource/css/theme.css.xhtml?ln=default&v=3_3_0_130416 और इसे इस तरह से घोषित किया गया है: <h: outputStylesheet पुस्तकालय = "डिफ़ॉल्ट" नाम = "सीएसएस / थीम"। सीएसएस "लक्ष्य =" सिर "/>। हो सकता है कि यह समस्या संस्करण संबंधी समस्याओं से संबंधित हो?
रिकार्डो विला

2
क्या libraryमूजर्रा 2.2.5 (2.2.5-जॉबॉर्ग -3, वाइल्डफ्लाइ 8.0) और 2.2.11 (2.2.11-जॉबसॉर्ग -1) के बीच परिवर्तन के लिए अनुमत पात्रों या इससे संबंधित किसी चीज की अनुमति है ? मैं रिलीजन में कुछ भी खोजने के लिए प्रतीत नहीं कर सकते। देखें stackoverflow.com/questions/35719808/…
कुक्टेलजे

3
धन्यवाद @ बालसुख। दुर्भाग्य से यहां तक ​​कि ओरेकल का अपना जावा ईई 7 ट्यूटोरियल cssअध्याय 8.6 वेब संसाधन में एक पुस्तकालय के नाम का उपयोग करके गलत अनुमान देता है और यह सीएसएस और छवियों के साथ गलत तरीके से अनुमान लगाता है
जेसपर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.