Насправді всі ці приклади в Інтернеті, де загальний вміст / тип файлу, такі як "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 для ресурсів у банку .
Дивитися також: