Насправді всі ці приклади в Інтернеті, де загальний вміст / тип файлу, такі як "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ресурс у вашому власному веб-сайті, в якому ви переосмислюєте / фінутуєте деякий CSS за замовчуванням PrimeFaces; якби PrimeFaces не використовував ім'я бібліотеки для свого власного primefaces.css, тоді власне PrimeFaces не завантажуватиметься, а замість цього постачається webapp, що порушить зовнішній вигляд.
Крім того, коли ви користуєтеся користувачем ResourceHandler, ви також можете застосувати більш тонкий зернистий контроль над ресурсами, що надходять із певної бібліотеки, коли libraryвикористовується правильно. Якщо всі бібліотеки компонентів використовували б "js" для всіх своїх файлів JS, як би ResourceHandlerколи-небудь розрізнити, якщо він походить з певної бібліотеки компонентів? Прикладами є OmniFaces CombinedResourceHandlerі GraphicResourceHandler; перевірити createResource()метод, у якому перевіряється бібліотека, перш ніж делегувати до наступного обробника ресурсів по ланцюгу. Таким чином вони знають, коли створити CombinedResourceабо GraphicResourceз метою.
Помічено, що RichFaces зробив це неправильно. Він взагалі не використовував жодного libraryі вдома створив ще один шар обробки ресурсів, тому неможливо програматично визначити ресурси RichFaces. Саме це і є причиною, чому OmniFaces CombinedResourceHander довелося ввести хак на основі рефлексії , щоб змусити його працювати в будь-якому випадку з ресурсами RichFaces.
Ваш власний веб-сайт
Вашому власному веб-сайту не обов'язково потрібна бібліотека ресурсів. Краще просто пропустіть це.
<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" />
Або, коли ресурси специфічні для якогось головного шаблону Facelets, ви можете також дати йому ім'я шаблону, щоб було легше співвідносити один одного. Іншими словами, це більше для самодокументальних цілей. Напр. У /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" />
Для прикладу реального світу ознайомтесь із вітринним кодом вітрини OmniFaces .
Або, коли ви хочете поділитися одними і тими ж ресурсами на декількох веб-сайтах і створили "спільний" проект для цього, заснований на тому самому прикладі, що і в цій відповіді, яка, в свою чергу, вбудована як JAR у веб-сайт /WEB-INF/lib, а також посилайтеся на це як на бібліотеку (ім'я вільне на ваш вибір; бібліотеки компонентів, такі як OmniFaces і PrimeFaces, також працюють):
<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" />
Це створить наступний HTML з версією бібліотеки як vпараметр:
<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&v=1_0" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&v=1_0"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&v=1_0" alt="" />
Отже, якщо ви відредагували / оновили якийсь ресурс, то все, що вам потрібно зробити, це скопіювати або перейменувати папку версій у нове значення. Якщо у вас є кілька папок версій, то JSF 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&v=1_1" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&v=1_1"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&v=1_1" alt="" />
Це змусить веб-браузера запитувати ресурс прямо з сервера, а не показувати той самий ім'я з кеша, коли вперше запитується URL із зміненим параметром. Таким чином, не вимагається оновлення оновлень (Ctrl + F5 і так далі), коли їм потрібно отримати оновлений ресурс CSS / JS.
Зауважте, що версія бібліотеки неможлива для ресурсів, укладених у файл JAR. Вам потрібен звичай ResourceHandler. Див. Також Як використовувати версію JSF для ресурсів у банку .
Дивитися також: