En fait, tous ces exemples sur le Web dans lesquels le type de contenu / fichier commun comme "js", "css", "img", etc. est utilisé comme nom de bibliothèque sont trompeurs .
Exemples du monde réel
Pour commencer, regardons comment les implémentations JSF existantes comme Mojarra et MyFaces et les bibliothèques de composants JSF comme PrimeFaces et OmniFaces l' utilisent. Aucun d'entre eux n'utilise les bibliothèques de ressources de cette façon. Ils l'utilisent (sous les couvertures, par @ResourceDependency
ou UIViewRoot#addComponentResource()
) de la manière suivante:
<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" />
Il devrait devenir clair qu'il représente essentiellement le nom de bibliothèque / module / thème commun auquel toutes ces ressources appartiennent généralement.
Identification plus facile
De cette façon, il est beaucoup plus facile de spécifier et de distinguer la provenance et / ou la provenance de ces ressources. Imaginez que vous ayez une primefaces.css
ressource dans votre propre application Web dans laquelle vous remplacez / affinez certains CSS par défaut de PrimeFaces; si PrimeFaces n'utilisait pas de nom de bibliothèque pour lui-même primefaces.css
, alors celui de PrimeFaces ne serait pas chargé, mais à la place celui fourni par l'application Web, ce qui romprait l'apparence.
De plus, lorsque vous utilisez une personnalisation ResourceHandler
, vous pouvez également appliquer un contrôle plus fin sur les ressources provenant d'une bibliothèque spécifique lorsqu'elles library
sont utilisées correctement. Si toutes les bibliothèques de composants avaient utilisé "js" pour tous leurs fichiers JS, comment ResourceHandler
distinguerait-il s'il provient d'une bibliothèque de composants spécifique? Les exemples sont OmniFaces CombinedResourceHandler
et GraphicResourceHandler
; vérifiez la createResource()
méthode dans laquelle la bibliothèque est vérifiée avant de déléguer au gestionnaire de ressources suivant dans la chaîne. De cette façon, ils savent quand créer CombinedResource
ou GraphicResource
dans quel but.
Il convient de noter que RichFaces a mal agi. Il n'en a pas utilisé library
du tout et a créé une autre couche de gestion des ressources par-dessus et il est donc impossible d'identifier par programme les ressources RichFaces. C'est exactement la raison pour laquelle OmniFaces CombinedResourceHander
a dû introduire un hack basé sur la réflexion afin de le faire fonctionner de toute façon avec les ressources RichFaces.
Votre propre webapp
Votre propre application Web n'a pas nécessairement besoin d'une bibliothèque de ressources. Vous feriez mieux de l'omettre.
<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />
Ou, si vous en avez vraiment besoin, vous pouvez simplement lui donner un nom commun plus sensé, comme "par défaut" ou un nom de société.
<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />
Ou, lorsque les ressources sont spécifiques à un modèle de Facelets maître, vous pouvez également lui donner le nom du modèle, afin qu'il soit plus facile de se relier. En d'autres termes, c'est plus à des fins d'auto-documentaire. Par exemple, dans un /WEB-INF/templates/layout.xhtml
fichier modèle:
<h:outputStylesheet library="layout" name="css/style.css" />
<h:outputScript library="layout" name="js/script.js" />
Et un /WEB-INF/templates/admin.xhtml
fichier modèle:
<h:outputStylesheet library="admin" name="css/style.css" />
<h:outputScript library="admin" name="js/script.js" />
Pour un exemple concret , consultez le code source de la vitrine OmniFaces .
Ou, lorsque vous souhaitez partager les mêmes ressources sur plusieurs webapps et avez créé un projet "commun" pour celui-ci basé sur le même exemple que dans cette réponse qui est à son tour incorporé en tant que JAR dans les webapps /WEB-INF/lib
, puis référencez-le également en tant que bibliothèque (le nom est libre de votre choix; les bibliothèques de composants comme OmniFaces et PrimeFaces fonctionnent également de cette façon):
<h:outputStylesheet library="common" name="css/style.css" />
<h:outputScript library="common" name="js/script.js" />
<h:graphicImage library="common" name="img/logo.png" />
Versionnage de bibliothèque
Un autre avantage principal est que vous pouvez appliquer le bon contrôle de version de la bibliothèque de ressources sur les ressources fournies par votre propre application Web (cela ne fonctionne pas pour les ressources intégrées dans un JAR). Vous pouvez créer un sous-dossier enfant direct dans le dossier de la bibliothèque avec un nom dans le \d+(_\d+)*
modèle pour indiquer la version de la bibliothèque de ressources.
WebContent
|-- resources
| `-- default
| `-- 1_0
| |-- css
| | `-- style.css
| |-- img
| | `-- logo.png
| `-- js
| `-- script.js
:
Lorsque vous utilisez ce balisage:
<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />
Cela générera le code HTML suivant avec la version de la bibliothèque comme v
paramètre:
<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="" />
Donc, si vous avez édité / mis à jour une ressource, il vous suffit de copier ou renommer le dossier de version dans une nouvelle valeur. Si vous avez plusieurs dossiers de versions, le JSF ResourceHandler
servira automatiquement la ressource à partir du numéro de version le plus élevé, selon les règles de classement numérique.
Ainsi, lorsque vous copiez / renommez un resources/default/1_0/*
dossier resources/default/1_1/*
comme suit:
WebContent
|-- resources
| `-- default
| |-- 1_0
| | :
| |
| `-- 1_1
| |-- css
| | `-- style.css
| |-- img
| | `-- logo.png
| `-- js
| `-- script.js
:
Le dernier exemple de balisage générerait alors le code HTML suivant:
<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="" />
Cela obligera le navigateur Web à demander la ressource directement au serveur au lieu d'afficher celle du même nom dans le cache, lorsque l'URL avec le paramètre modifié est demandée pour la première fois. De cette façon, les utilisateurs finaux ne sont pas tenus d'effectuer une actualisation matérielle (Ctrl + F5 et ainsi de suite) lorsqu'ils ont besoin de récupérer la ressource CSS / JS mise à jour.
Veuillez noter que le versionnage de la bibliothèque n'est pas possible pour les ressources contenues dans un fichier JAR. Vous auriez besoin d'une coutume ResourceHandler
. Voir aussi Comment utiliser le versioning JSF pour les ressources en jar .
Voir également: