Что такое библиотека ресурсов JSF и как ее использовать?

Компоненты JSF , и имеют атрибут library . Что это и как это следует использовать? В Интернете есть много примеров, которые используют его следующим образом: общий тип содержимого / файла css , js и img (или image ) в качестве имени библиотеки зависит от используемого тега:

    

Как это полезно? Значение library в этих примерах, похоже, просто повторяет то, что уже было представлено именем тега. Для он основан на имени тега, уже очевидном, что он представляет собой «библиотеку CSS». В чем разница со следующим, который также работает так же?

    

Кроме того, сгенерированный вывод HTML немного отличается. Учитывая путь контекста /contextname и сопоставление FacesServlet в шаблоне URL *.xhtml , первый генерирует следующий HTML с именем библиотеки в качестве параметра запроса:

    

Хотя последний генерирует следующий HTML-код с именем библиотеки только по пути URI:

    

Последний подход делает задним числом также более ощутимым, чем прежний подход. Как именно атрибут library тогда полезен?

Фактически, все эти примеры в Интернете, где общий тип содержимого / файла типа «js», «css», «img» и т. Д. Используются в качестве имени библиотеки, вводят в заблуждение .

Примеры реальных стран

Чтобы начать, давайте рассмотрим, как его используют реализации JSF, такие как библиотеки Mojarra и MyFaces и JSF, такие как PrimeFaces и OmniFaces . Ни один из них не использует библиотеки ресурсов таким образом. Они используют его (под крышками, @ResourceDependency или UIViewRoot#addComponentResource() ) следующим образом:

         

Должно быть ясно, что он в основном представляет собой общее имя библиотеки / модуля / темы, в котором все эти ресурсы обычно принадлежат.

Легче идентифицировать

Таким образом, гораздо проще указать и отличить, где эти ресурсы принадлежат и / или исходят. Представьте, что в вашем собственном webapp у вас есть ресурс primefaces.css в котором вы переопределяете / завершаете некоторые CSS CSS по умолчанию; если PrimeFaces не использовал имя библиотеки для своего собственного primefaces.css , то собственный PrimeFaces не был бы загружен, а вместо него был бы поставлен webapp, который сломал бы look’n’feel.

Кроме того, когда вы используете пользовательский ResourceHandler , вы также можете применять более мелкозернистый контроль над ресурсами, исходящими из определенной библиотеки, когда library используется правильно. Если бы все библиотеки компонентов использовали «js» для всех своих JS-файлов, как бы ResourceHandler когда-либо отличался, если он поступает из конкретной библиотеки компонентов? Примерами являются OmniFaces CombinedResourceHandler и GraphicResourceHandler ; проверьте метод createResource() котором библиотека проверяется перед передачей следующему обработчику ресурсов в цепочке. Таким образом, они знают, когда создавать CombinedResource или GraphicResource для этой цели.

Следует отметить, что RichFaces сделал это неправильно. Он вообще не использовал какую-либо library и запустил еще один слой обработки ресурсов, и поэтому невозможно программно идентифицировать ресурсы RichFaces. Именно поэтому OmniFaces CombinedResourceHander должен был внедрить хакерство на основе анализа , чтобы заставить его работать в любом случае с ресурсами RichFaces.

Ваш собственный webapp

Ваш собственный webapp не обязательно нуждается в библиотеке ресурсов. Лучше всего просто опустить это.

    

Или, если вам действительно нужно иметь его, вы можете просто дать ему более разумное общее имя, например «default» или какое-то название компании.

    

Или, когда ресурсы специфичны для какого-либо шаблона мастера Facelets, вы также можете указать ему имя шаблона, чтобы было легче связать друг друга. Другими словами, это больше для самодокументированных целей. Например, в /WEB-INF/templates/layout.xhtml шаблона /WEB-INF/templates/layout.xhtml :

   

И /WEB-INF/templates/admin.xhtml шаблона /WEB-INF/templates/admin.xhtml :

   

Для примера в реальном мире проверьте исходный код витрины OmniFaces .

Или, если вы хотите разделить одни и те же ресурсы по нескольким веб-папкам и создали для них общий проект, основанный на том же примере, что и в этом ответе, который, в свою очередь, встроен в JAR в webapp /WEB-INF/lib , затем также ссылайтесь на нее как на библиотеку (имя по своему выбору, так что такие библиотеки компонентов, как OmniFaces и PrimeFaces):

    

Управление версиями библиотеки

Другим основным преимуществом является то, что вы можете правильно использовать версию библиотеки ресурсов для ресурсов, предоставляемых вашим собственным webapp (это не работает для ресурсов, встроенных в JAR). Вы можете создать прямую дочернюю папку в папке библиотеки с именем в шаблоне \d+(_\d+)* , чтобы обозначить версию библиотеки ресурсов.

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

При использовании этой разметки:

    

Это создаст следующий HTML-код с версией библиотеки как параметр v :

    

Итак, если вы отредактировали / обновили какой-то ресурс, все, что вам нужно сделать, это скопировать или переименовать папку версии в новое значение. Если у вас несколько папок с версиями, то JSF ResourceHandler будет автоматически обслуживать ресурс с наивысшего номера версии в соответствии с правилами численного заказа.

Таким образом, при копировании / переименовании resources/default/1_0/* папке по 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-код:

    

Это заставит веб-браузер запрашивать ресурс прямо с сервера вместо того, чтобы показывать тот же имя из кеша, когда URL с измененным параметром был запрошен в первый раз. Таким образом, конечным пользователям не требуется выполнять жесткое обновление (Ctrl + F5 и т. Д.), Когда им нужно получить обновленный ресурс CSS / JS.

Обратите внимание, что управление версиями библиотеки невозможно для ресурсов, заключенных в JAR-файл. Вам нужен пользовательский ResourceHandler . См. Также Как использовать JSF-версию для ресурсов в банке .

Смотрите также:

  • Управление версиями ресурсов JSF
  • JSF2 Статическое кэширование ресурсов
  • Структура для нескольких проектов JSF с общим кодом
  • Спецификация JSF 2.0 – Глава 2.6 Обработка ресурсов
  • Утечка ресурсов: «in» никогда не закрывается
  • Как правильно получить изображение из папки «Ресурсы» в NetBeans
  • Что находится в сумке для инструментов Mathematica?
  • Как ссылаться на файлы javafx fxml в папке ресурса?
  • Файл с сырым исходным текстом для Android
  • Android: Как получить строку из ресурсов, используя ее имя?
  • Доступ к файлам ресурсов на Android
  • Как ссылаться на ресурс изображений JSF как URL-адрес фонового изображения CSS
  • Получение шаблонов / файлов Facelets из внешней файловой системы или базы данных
  • Чтение файла ресурсов изнутри банки
  • В чем разница между StaticResource и DynamicResource в WPF?
  • Interesting Posts
    Давайте будем гением компьютера.