জেএসএফ রিসোর্স লাইব্রেরি কী এবং এটি কীভাবে ব্যবহার করা উচিত?


228

JSF <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>এটা ট্যাগ নাম ইতিমধ্যে সুস্পষ্ট যে এটি একটি "CSS লাইব্রেরী" প্রতিনিধিত্ব করে উপর ভিত্তি করে না। নিম্নলিখিতগুলির সাথে পার্থক্য কী যা ঠিক একইভাবে কাজ করে?

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

এছাড়াও, উত্পাদিত এইচটিএমএল আউটপুটটি কিছুটা আলাদা। এর ইউআরএল প্যাটার্নে একটি প্রসঙ্গের পথ /contextnameএবং FacesServletম্যাপিংয়ের প্রবণতা দেওয়া হয়েছে *.xhtml, প্রাক্তন অনুরোধের প্যারামিটার হিসাবে লাইব্রেরির নাম সহ নিম্নলিখিত এইচটিএমএল উত্পাদন করে:

<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="" />

যদিও পরবর্তীটি কেবল ইউআরআইয়ের পথে লাইব্রেরির নাম সহ নিম্নলিখিত এইচটিএমএল তৈরি করে:

<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" />

এটি স্পষ্ট হয়ে উঠতে হবে যে এটি মূলত সাধারণ লাইব্রেরি / মডিউল / থিমের নাম উপস্থাপন করে যেখানে resources সমস্ত সংস্থান সাধারণত ব্যবহৃত হয়।

আরও সহজ সনাক্তকরণ

এই সংস্থানগুলি কোথায় এবং / বা কোথা থেকে এসেছে সেগুলি নির্দিষ্ট করা এবং পার্থক্য করা এত সহজ easier কল্পনা করুন যে primefaces.cssআপনার নিজের ওয়েব অ্যাপে এমন একটি সংস্থান রয়েছে যা আপনি প্রাইমফ্রিজের কোনও ডিফল্ট সিএসএসকে ওভাররাইড / ফিনেটুনিং করছেন; যদি প্রাইমফ্রিজগুলি নিজের জন্য একটি লাইব্রেরির নাম ব্যবহার না করে primefaces.css, তবে প্রাইমফ্রিজগুলির নিজস্ব কোনও লোড হবে না, পরিবর্তে ওয়েব অ্যাপ্লিকেশন সরবরাহকৃত একটি যা লুক'নফিলকে ভেঙে ফেলবে।

এছাড়াও, আপনি যখন কোনও কাস্টম ব্যবহার করছেন, সঠিকভাবে ব্যবহার করার সময় আপনি 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" />

বাস্তব বিশ্বের উদাহরণের জন্য, ওমনিফিসগুলি শোকেস উত্স কোডটি পরীক্ষা করে দেখুন ।

অথবা, আপনি যখন একাধিক ওয়েব অ্যাপ্লিকেশনগুলিতে একই সংস্থানগুলি ভাগ করতে চান এবং সেই উত্তরটির ভিত্তিতে একই ভিত্তিতে একটি "সাধারণ" প্রকল্প তৈরি করেছেন যা ওয়েব অ্যাপ্লিকেশনে জেআর হিসাবে এম্বেড থাকে এবং /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" />

লাইব্রেরির সংস্করণ

আর একটি প্রধান সুবিধা হ'ল আপনি নিজের ওয়েব অ্যাপ্লিকেশন দ্বারা সরবরাহিত সংস্থাগুলিতে সঠিক উপায়ে সংস্থান গ্রন্থাগারটির সংস্করণ প্রয়োগ করতে পারেন (এটি কোনও জারে এম্বেড থাকা সংস্থাগুলির জন্য কাজ করে না)। \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প্যারামিটার হিসাবে লাইব্রেরি সংস্করণ সহ নিম্নলিখিত এইচটিএমএল উত্পাদন করবে :

<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সংখ্যাসূচক অর্ডারিং বিধি অনুসারে স্বয়ংক্রিয়ভাবে সর্বোচ্চ সংস্করণ নম্বর থেকে রিসোর্সটি সরবরাহ করবে।

সুতরাং, 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="" />

পরিবর্তিত প্যারামিটারের সাথে ইউআরএল প্রথমবারের জন্য অনুরোধ করা হলে এটি ওয়েব ব্রাউজারকে ক্যাশে থেকে একই নামের একটিটি না দেখানোর পরিবর্তে সার্ভার থেকে সরাসরি সংস্থানটি অনুরোধ করতে বাধ্য করবে। এভাবে আপডেট সিএসএস / জেএস রিসোর্স পুনরুদ্ধার করতে গেলে এন্ডিউজারগুলিকে একটি হার্ড রিফ্রেশ (Ctrl + F5 ইত্যাদি) করার প্রয়োজন হয় না।

দয়া করে মনে রাখবেন যে জেআর ফাইলটিতে আবদ্ধ সংস্থাগুলির জন্য গ্রন্থাগারের সংস্করণ সম্ভব নয়। আপনার একটি প্রথা দরকার ResourceHandlerজারে সংস্থানগুলির জন্য কীভাবে জেএসএফ সংস্করণ ব্যবহার করবেন তা দেখুন ।

আরো দেখুন:


2
লাইব্রেরির জন্য কি EL ব্যবহার করা সম্ভব? সুতরাং আমি যদি একটি সংস্থান / ডিফল্ট এবং একটি সংস্থান / অনুভূতিফ্রোগি টোডে পেতে চাইতাম আমি লাইব্রেরি = "# rary কিছু লাইব্রেরি হিয়ার}" এর মতো কিছু করতে পারি আমার নির্বাচিত লাইব্রেরিতে লাইব্রেরি ম্যাপ এখানে এবং প্রতিবার রিসোর্স ডিরেক্টরিটি একটি উচ্চতর সংস্করণে নামকরণের উপর নির্ভর করতে হবে না আমি তাদের পরিবর্তন করতে চেয়েছিলাম।
gebuh

আপনি যখন লাইব্রেরি = অ্যাডমিন বা লাইব্রায় = লেআউট বলছেন, সেইগুলি (অ্যাডমিন এবং লেআউট) ফোল্ডারগুলি কি সংস্থান ফোল্ডারে আছে?
Koray Tugay

উম্মে। খুব আকর্ষণীয় বালাস। আমি এমন একটি ওয়েব অ্যাপে একটি সমস্যার মুখোমুখি হয়েছি যেখানে লোড করার সময় থিম। সিএসএস ফাইলটি ফাঁকা থাকে। এটি কেবলমাত্র বিভিন্ন পুনর্বিবেচনার পরে ঘটে (জেবিওএসএস ইপিতে)। CSS url এর মতো: / javax.faces.resource/css/theme.css.xhtml?ln=default&v=3_3_0_130416 এবং এটি এইভাবে ঘোষিত হয়: <h: আউটপুটস্টাইলশিট লাইব্রেরি = "ডিফল্ট" নাম = "সিএসএস / থিম। CSS "টার্গেট =" মাথা "/>। সম্ভবত এই সমস্যাটি সংস্করণ সংক্রান্ত সমস্যার সাথে সম্পর্কিত?
রিকার্ডো ভিলা

2
libraryমোজাররা ২.২.৫ (২.২.৫-জাবোসরগ -৩, ওয়াইল্ডফ্লাই ৮.০) এবং ২.২.১১ (২.২.১১-জাবোসরগ -১) এর মধ্যে বা এর সাথে সম্পর্কিত কোনও কিছুর জন্য অনুমোদিত অক্ষরগুলি বদলেছে? আমি রিলিজ নোটগুলিতে কিছুই খুঁজে পাচ্ছি না। দেখুন stackoverflow.com/questions/35719808/...
Kukeltje

3
ধন্যবাদ @ বালুসসি। দুর্ভাগ্যক্রমে এমনকি ওরাকলের নিজস্ব জাভা ইই 7 টি টিউটোরিয়াল 8.6css অধ্যায় ওয়েব রিসোর্সগুলির একটি লাইব্রেরির নাম ব্যবহার করে এবং অনুমান-জেএসএফ উদাহরণ অ্যাপ্লিকেশনটিতে সিএসএস এবং চিত্রগুলির সাথে এটি ভুল করে ভুল উদাহরণ দেয়
জেস্পার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.