À quoi sert la bibliothèque de ressources du JSF et comment devrait-elle être utilisée?

le JSF <h:outputStylesheet> , <h:outputScript> et <h:graphicImage> les composants ont un attribut library . Qu'est-ce et comment cela doit-il être utilisé? Il y a beaucoup d'exemples sur le web qui l'utilisent comme suit avec le contenu commun/type de fichier css , js et img (ou image ) comme nom de bibliothèque en fonction de la balise utilisée:

<h:outputStylesheet library="css" name="style.css" />
<h:outputScript library="js" name="script.js" />
<h:graphicImage library="img" name="logo.png" />

Comment est - il utile? La valeur library dans ces exemples semble simplement répéter ce qui a déjà été représenté par le nom de la balise. Pour un <h:outputStylesheet> il est basé sur le nom de la balise déjà évident qu'il représente une"bibliothèque CSS". Quelle est la différence avec ce qui suit qui fonctionne également de la même façon?

<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />

aussi, la sortie HTML générée est un peu différente. Donné un chemin de contexte de /contextname et FacesServlet cartographie sur un modèle D'URL de *.xhtml , le premier génère le HTML suivant avec le nom de la bibliothèque comme paramètre de demande:

<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="" />

alors que ce dernier génère le HTML suivant avec le nom de la bibliothèque juste dans le chemin de L'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="" />

avec le recul, cette dernière approche a aussi plus de sens que la première. En quoi l'attribut library est-il alors utile?

214
demandé sur BalusC 2012-08-16 17:38:19
la source

1 ответов

en fait, tous les exemples sur le web où le contenu/Type de fichier commun comme" js"," css"," img", etc est utilisé comme nom de bibliothèque sont trompeur .

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 de l'utiliser. 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() ) 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 être clair qu'il représente essentiellement la bibliothèque commune/module/nom du thème , où toutes ces ressources couramment appartiennent.

plus facile à identifier

de cette façon, il est tellement plus facile de préciser et de distinguer où ces ressources appartiennent et/ou proviennent. Imaginez que vous arriviez à avoir une ressource primefaces.css dans votre propre webapp dans laquelle vous supplantez/définissez certains CSS par défaut de PrimeFaces; si PrimeFaces n'utilisait pas un nom de bibliothèque pour son propre primefaces.css , alors les PrimeFaces en possèdent un ne serait pas chargé, mais à la place de celui fourni par webapp, qui briserait le look'n'feel.

aussi, lorsque vous utilisez une ResourceHandler , vous pouvez également appliquer un contrôle plus fin sur les ressources provenant d'une bibliothèque spécifique lorsque library est utilisé de la bonne manière. Si toutes les bibliothèques de composants avaient utilisé " js "pour tous leurs fichiers JS, comment le ResourceHandler distinguerait-il jamais s'il provient d'une bibliothèque de composants spécifique? Exemples: OmniFaces CombinedResourceHandler et GraphicResourceHandler ; cochez la méthode createResource() dans laquelle la Bibliothèque est coché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 pour le but.

doit être noté que RichFaces a fait le mal. Il n'a pas utilisé de library du tout et il est donc impossible d'identifier programmatiquement les ressources RichFaces. C'est exactement la raison pourquoi OmniFaces CombinedResourceHander a dû introduire un hack basé sur la réflexion afin de le faire fonctionner de toute façon avec les ressources de RichFaces.

votre propre webapp

Votre propre webapp n'a pas nécessairement besoin d'une bibliothèque de ressources. Vous feriez mieux de simplement l'omettre.

<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />

ou, si vous avez vraiment besoin d'en avoir un, vous pouvez juste lui donner un plus nom, comme "par défaut" ou un nom d'entreprise.

<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 maître Facelets, vous pouvez également lui donner le nom du modèle, de sorte qu'il est plus facile de se relier les uns aux autres. En d'autres termes, c'est plus pour l'auto-documentaire. Par exemple: dans un fichier de modèle /WEB-INF/templates/layout.xhtml :

<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 du monde réel, consultez le code source OmniFaces showcase .

ou, lorsque vous souhaitez partager les mêmes ressources sur plusieurs webapps et que vous avez créé un projet "commun" pour cela basé sur le même exemple que dans cette réponse qui est à son tour intégré comme JAR dans /WEB-INF/lib de webapp, puis le référencer aussi comme bibliothèque (le nom est libre à 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" />

versioning de bibliothèque

un autre avantage principal est que vous pouvez appliquer bibliothèque de ressources versioning la bonne façon sur les ressources fournies par votre propre webapp (cela ne fonctionne pas pour les ressources intégrées dans un bocal). Vous pouvez créer un sous-dossier enfant direct dans le dossier de la bibliothèque avec un nom dans le motif \d+(_\d+)* pour dénoter la version de la bibliothèque de ressources.

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

lors de l'utilisation de ce markup:

<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 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&amp;v=1_0" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&amp;v=1_0"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&amp;v=1_0" alt="" />

donc, si vous avez modifié/mis à jour une ressource, alors tout ce que vous avez à faire est de copier ou de renommer le dossier version en une nouvelle valeur. Si vous avez plusieurs répertoires de version, alors le JSF ResourceHandler servira automatiquement la ressource à partir du numéro de version le plus élevé, selon les règles d'ordre numérique.

donc, quand copier / renommer resources/default/1_0/* dossier en resources/default/1_1/* comme suit:

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

puis le dernier exemple de markup générerait le HTML suivant:

<link rel="stylesheet" type="text/css" href="/contextname/javax.faces.resource/css/style.css.xhtml?ln=default&amp;v=1_1" />
<script type="text/javascript" src="/contextname/javax.faces.resource/js/script.js.xhtml?ln=default&amp;v=1_1"></script>
<img src="/contextname/javax.faces.resource/img/logo.png.xhtml?ln=default&amp;v=1_1" alt="" />

ceci forcera le webbrowser à demander la ressource directement depuis le serveur au lieu d'afficher celle avec le même nom depuis 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 de faire rafraîchir (Ctrl+F5 et ainsi de suite) quand ils ont besoin de récupérer la ressource CSS/JS mise à jour.

veuillez noter qu'il n'est pas possible de créer des versions de bibliothèque pour les ressources incluses dans un fichier JAR. Il vous faudrait un ResourceHandler personnalisé . Voir aussi comment utiliser JSF versioning pour les ressources en jar .

voir aussi:

240
répondu BalusC 2017-05-23 15:02:59
la source

Autres questions sur jsf jsf-2 resources