In realtà, tutti quegli esempi sul web in cui il tipo di contenuto / file comune come "js", "css", "img", ecc. È stato usato come nome della biblioteca sono fuorvianti .
Esempi del mondo reale
Per iniziare, diamo un'occhiata a come le implementazioni JSF esistenti come Mojarra e MyFaces e le librerie di componenti JSF come PrimeFaces e OmniFaces lo usano. Nessuno di loro usa le librerie di risorse in questo modo. Lo usano (sotto le coperte, da @ResourceDependency
o UIViewRoot#addComponentResource()
) nel modo seguente:
<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" />
Dovrebbe essere chiaro che in sostanza rappresenta il nome della libreria / modulo / tema comune a cui appartengono comunemente tutte quelle risorse.
Identificazione più facile
In questo modo è molto più facile specificare e distinguere la provenienza e / o la provenienza di tali risorse. Immagina di avere una primefaces.css
risorsa nella tua webapp in cui stai sovrascrivendo / perfezionando alcuni CSS predefiniti di PrimeFaces; se PrimeFaces non utilizzava il nome di una libreria per conto proprio primefaces.css
, allora quello di PrimeFaces non sarebbe stato caricato, ma invece quello fornito da webapp, che avrebbe interrotto l'aspetto.
Inoltre, quando si utilizza un'abitudine ResourceHandler
, è anche possibile applicare un controllo più preciso sulle risorse provenienti da una libreria specifica quando library
viene utilizzato nel modo giusto. Se tutte le librerie dei componenti avrebbero usato "js" per tutti i loro file JS, come si ResourceHandler
distinguerebbe mai se proviene da una libreria di componenti specifica? Esempi sono OmniFaces CombinedResourceHandler
e GraphicResourceHandler
; controlla il createResource()
metodo in cui viene controllata la libreria prima di delegare al gestore delle risorse successivo nella catena. In questo modo sanno quando creare CombinedResource
o GraphicResource
per lo scopo.
Si noti che RichFaces ha sbagliato. Non ne usava library
affatto e produceva un altro livello di gestione delle risorse su di esso ed è quindi impossibile identificare a livello di programmazione le risorse RichFaces. Questo è esattamente il motivo per cui OmniFaces ha CombinedResourceHander
dovuto introdurre un hack basato sulla riflessione per farlo funzionare comunque con le risorse RichFaces.
La tua webapp
La tua webapp non ha necessariamente bisogno di una libreria di risorse. Faresti meglio a ometterlo.
<h:outputStylesheet name="css/style.css" />
<h:outputScript name="js/script.js" />
<h:graphicImage name="img/logo.png" />
Oppure, se hai davvero bisogno di averne uno, puoi semplicemente dargli un nome comune più sensato, come "predefinito" o un nome di società.
<h:outputStylesheet library="default" name="css/style.css" />
<h:outputScript library="default" name="js/script.js" />
<h:graphicImage library="default" name="img/logo.png" />
Oppure, quando le risorse sono specifiche per alcuni template master di Facelets, puoi anche dargli il nome del template, in modo che sia più facile relazionarsi. In altre parole, è più per scopi di auto-documentario. Ad esempio in un /WEB-INF/templates/layout.xhtml
file modello:
<h:outputStylesheet library="layout" name="css/style.css" />
<h:outputScript library="layout" name="js/script.js" />
E un /WEB-INF/templates/admin.xhtml
file modello:
<h:outputStylesheet library="admin" name="css/style.css" />
<h:outputScript library="admin" name="js/script.js" />
Per un esempio reale, controlla il codice sorgente della vetrina OmniFaces .
Oppure, quando desideri condividere le stesse risorse su più webapp e hai creato un progetto "comune" per quello basato sullo stesso esempio di questa risposta che è a sua volta incorporato come JAR in webapp /WEB-INF/lib
, quindi fai riferimento anche a libreria (il nome è gratuito a tua scelta; anche le librerie di componenti come OmniFaces e PrimeFaces funzionano in questo modo):
<h:outputStylesheet library="common" name="css/style.css" />
<h:outputScript library="common" name="js/script.js" />
<h:graphicImage library="common" name="img/logo.png" />
Controllo delle versioni della libreria
Un altro vantaggio principale è che puoi applicare il controllo delle versioni delle librerie di risorse nel modo giusto sulle risorse fornite dal tuo webapp (questo non funziona per le risorse incorporate in un JAR). È possibile creare una sottocartella figlio diretta nella cartella della libreria con un nome nel \d+(_\d+)*
modello per indicare la versione della libreria di risorse.
WebContent
|-- resources
| `-- default
| `-- 1_0
| |-- css
| | `-- style.css
| |-- img
| | `-- logo.png
| `-- js
| `-- script.js
:
Quando si utilizza questo 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" />
Questo genererà il seguente HTML con la versione della libreria come v
parametro:
<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="" />
Quindi, se hai modificato / aggiornato alcune risorse, tutto ciò che devi fare è copiare o rinominare la cartella della versione in un nuovo valore. Se si dispone di più cartelle di versione, JSF ResourceHandler
servirà automaticamente la risorsa dal numero di versione più alto, in base alle regole di ordinamento numeriche.
Quindi, quando si copia / rinomina la resources/default/1_0/*
cartella resources/default/1_1/*
come segue:
WebContent
|-- resources
| `-- default
| |-- 1_0
| | :
| |
| `-- 1_1
| |-- css
| | `-- style.css
| |-- img
| | `-- logo.png
| `-- js
| `-- script.js
:
Quindi l'ultimo esempio di markup genererebbe il seguente 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="" />
Questo costringerà il browser web a richiedere la risorsa direttamente dal server invece di mostrare quello con lo stesso nome dalla cache, quando viene richiesto per la prima volta l'URL con il parametro modificato. In questo modo agli utenti finali non è richiesto di eseguire un aggiornamento completo (Ctrl + F5 e così via) quando devono recuperare la risorsa CSS / JS aggiornata.
Si noti che il controllo delle versioni della libreria non è possibile per le risorse racchiuse in un file JAR. Avresti bisogno di un'abitudine ResourceHandler
. Vedi anche Come utilizzare il versioning JSF per le risorse nel vaso .
Guarda anche: