Что такое библиотека ресурсов JSF и как ее следует использовать?
JSF <h:outputStylesheet>,<h:outputScript> и <h:graphicImage> компоненты . Что это такое и как это должно использоваться? Есть много примеров в интернете, которые используют его следующим образом с общим типом контента / файла 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" />
кроме того, сгенерированный вывод HTML немного отличается. Учитывая контекстный путь /contextname и FacesServlet отображение на шаблон URL *.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="" />
в то время как последний генерирует следующий HTML с именем библиотеки только в пути URI:
<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 атрибут чего полезного?
1 ответ:
на самом деле, все эти примеры в интернете, в которых общий тип контента/файла, такой как "js", "css", "img" и т. д., используются в качестве имени библиотеки вводит в заблуждение.
примеры из реального мира
для начала давайте посмотрим, как существующие реализации JSF, такие как Mojarra и MyFaces и библиотеки компонентов JSF, такие как PrimeFaces и OmniFaces использовать его. Никто из них не использует библиотеки ресурсов именно такой образ. Они используют его (под одеялом, by
@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ресурс в вашем собственном веб-приложении, где вы переопределяете / finetuning некоторые CSS по умолчанию из PrimeFaces; если PrimeFaces не использовали имя библиотеки для своего собственногоprimefaces.css, то PrimeFaces собственный один не будет загружен, но вместо этого веб-приложение поставляется один, который нарушит look'n'feel.кроме того, когда вы используете пользовательский
ResourceHandler, вы также можете применить более мелкозернистый контроль над ресурсами, поступающими из определенной библиотеки, когдаlibraryis использовал правильный путь. Если бы все библиотеки компонентов использовали "js" для всех своих файлов JS, как быResourceHandlerкогда-нибудь отличить, если он исходит из конкретной библиотеки компонентов? Примеры OmniFacesCombinedResourceHandlerиGraphicResourceHandler; чекcreateResource()метод, в котором библиотека проверяется перед делегированием следующему обработчику ресурсов в цепочке. Таким образом, они знают, когда создаватьCombinedResourceилиGraphicResourceдля этой цели.следует отметить, что RichFaces сделал это неправильно. Он не использовал никаких
libraryвообще и доморощенный другой слой обработки ресурсов над ним, и поэтому невозможно программно идентифицировать ресурсы RichFaces. Именно поэтому OmniFacesCombinedResourceHanderввел Хак на основе отражения чтобы заставить его работать в любом случае с ресурсами RichFaces.ваш собственный веб-приложение
ваш собственный веб-приложение не обязательно нужно библиотека ресурсов. Вам лучше просто опустить его.
<h:outputStylesheet name="css/style.css" /> <h:outputScript name="js/script.js" /> <h:graphicImage name="img/logo.png" />или, если вам действительно нужно иметь его, вы можете просто дать ему более разумное общее имя, например "default" или какое-то название компании.
<h:outputStylesheet library="default" name="css/style.css" /> <h:outputScript library="default" name="js/script.js" /> <h:graphicImage library="default" name="img/logo.png" />или, когда ресурсы специфичны для некоторого шаблона master 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 showcase исходный код.
или, когда вы хотите использовать одни и те же ресурсы в нескольких веб-приложениях и создали для этого "общий" проект на основе того же примера, что и в ответ который в свою очередь встроен как JAR в webapp
/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 с версией библиотеки как :
<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_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="" />это заставит webbrowser запрашивать ресурс прямо с сервера вместо того, чтобы показывать тот, у которого то же имя из кэша, когда URL с измененным параметром запрашивается в первый раз. Таким образом, конечным пользователям не требуется выполнять жесткое обновление (Ctrl+F5 и т. д.), Когда они необходимо получить обновленный ресурс CSS/JS.
обратите внимание, что управление версиями библиотеки невозможно для ресурсов, вложенных в файл JAR. Вам понадобится пользовательский
ResourceHandler. Смотрите также как использовать JSF versioning для ресурсов в jar.Читайте также:
- управление версиями ресурсов JSF
- JSF2 статический ресурс
- структура для нескольких проектов JSF с общим кодом
- спецификация JSF 2.0 - Глава 2.6 Обработка Ресурсов
Comments