¿Para qué sirve la biblioteca de recursos JSF y cómo se debe usar?

Los JSF , y tienen un atributo de library . ¿Qué es esto y cómo se debe usar? Hay muchos ejemplos en la web que lo usan de la siguiente manera con el tipo de contenido / archivo común css , js e img (o image ) como nombre de biblioteca dependiendo de la etiqueta utilizada:

    

¿Cómo es útil? El valor de la library en esos ejemplos parece estar repitiendo lo que ya ha sido representado por el nombre de la etiqueta. Para a se basa en el nombre de la etiqueta ya es obvio que representa una “biblioteca CSS”. ¿Cuál es la diferencia con lo siguiente que también funciona de la misma manera?

    

Además, la salida HTML generada es un poco diferente. Dada una ruta de contexto de /contextname y la asignación de FacesServlet en un patrón de URL de *.xhtml , el primero genera el siguiente HTML con el nombre de la biblioteca como parámetro de solicitud:

    

Mientras que este último genera el siguiente HTML con el nombre de la biblioteca justo en la ruta del URI:

    

El último enfoque hace que en retrospectiva también tenga más sentido que el enfoque anterior. ¿Cómo es exactamente el atributo de la library útil?

En realidad, todos los ejemplos en la web en los que el tipo de contenido / archivo común como “js”, “css”, “img”, etc. se han utilizado como nombre de biblioteca son engañosos .

Ejemplos del mundo real

Para empezar, veamos cómo las implementaciones JSF existentes, como las bibliotecas de componentes Mojarra y MyFaces y JSF, como PrimeFaces y OmniFaces, lo usan. Ninguno de ellos usa bibliotecas de recursos de esta manera. Lo usan (bajo las cubiertas, por @ResourceDependency o UIViewRoot#addComponentResource() ) de la siguiente manera:

         

Debería quedar claro que básicamente representa el nombre común de biblioteca / módulo / tema al que comúnmente pertenecen todos esos recursos.

Identificación más fácil

De esta forma, es mucho más fácil especificar y distinguir de dónde provienen y de dónde provienen esos recursos. Imagina que tienes un recurso de primefaces.css en tu propia aplicación web en la que estás redefiniendo / definiendo algunos CSS predeterminados de PrimeFaces; si PrimeFaces no usó un nombre de biblioteca para su propia primefaces.css , entonces el propio de PrimeFaces no se cargaría, sino el que suministraba la aplicación web, lo que rompería la apariencia.

Además, cuando está utilizando un ResourceHandler personalizado, también puede aplicar un control más detallado sobre los recursos provenientes de una biblioteca específica cuando la library se utiliza de la manera correcta. Si todas las bibliotecas de componentes hubieran usado “js” para todos sus archivos JS, ¿cómo distinguiría ResourceHandler si proviene de una biblioteca de componentes específica? Algunos ejemplos son OmniFaces CombinedResourceHandler y GraphicResourceHandler ; compruebe el método createResource() en el que se comprueba la biblioteca antes de delegar en el siguiente controlador de recursos en la cadena. De esta forma, saben cuándo crear CombinedResource o GraphicResource para este fin.

Notado debe ser que RichFaces lo hizo mal. No utilizó ninguna library y fabricó otra capa de manejo de recursos sobre ella y, por lo tanto, es imposible identificar mediante progtwigción los recursos de RichFaces. Esa es exactamente la razón por la cual OmniFaces CombinedResourceHander tuvo que introducir un truco basado en la reflexión para que funcione de todos modos con los recursos de RichFaces.

Tu propia aplicación web

Su propia aplicación web no necesita necesariamente una biblioteca de recursos. Será mejor que lo omitas.

    

O bien, si realmente necesita tener uno, puede darle un nombre común más sensato, como “predeterminado” o el nombre de una empresa.

    

O bien, cuando los recursos son específicos de una plantilla maestra de Facelets, también puede darle el nombre de la plantilla, de modo que sea más fácil relacionarse entre sí. En otras palabras, es más para fines de autodiagnóstico. Por ejemplo, en un archivo de plantilla /WEB-INF/templates/layout.xhtml :

   

Y un archivo de plantilla /WEB-INF/templates/admin.xhtml :

   

Para un ejemplo del mundo real, verifique el código fuente del escaparate de OmniFaces .

O bien, cuando desee compartir los mismos recursos en varias aplicaciones web y haya creado un proyecto “común” para eso basado en el mismo ejemplo que en esta respuesta, que a su vez está integrado como JAR en webapp /WEB-INF/lib , luego, también hágalo referencia como biblioteca (el nombre es libre para su elección; las bibliotecas de componentes como OmniFaces y PrimeFaces también funcionan de esa manera):

    

Versiones de la biblioteca

Otra ventaja principal es que puede aplicar la versión de la biblioteca de recursos de la manera correcta a los recursos proporcionados por su propia aplicación web (esto no funciona con los recursos incrustados en un JAR). Puede crear una subcarpeta secundaria directa en la carpeta de la biblioteca con un nombre en el patrón \d+(_\d+)* para indicar la versión de la biblioteca de recursos.

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

Al usar este marcado:

    

Esto generará el siguiente HTML con la versión de la biblioteca como parámetro v :

    

Por lo tanto, si ha editado / actualizado algún recurso, todo lo que necesita hacer es copiar o cambiar el nombre de la carpeta de la versión a un nuevo valor. Si tiene varias carpetas de versión, el ResourceHandler JSF automáticamente servirá el recurso desde el número de versión más alto, de acuerdo con las reglas de ordenamiento numérico.

Por lo tanto, al copiar / cambiar el nombre de la carpeta resources/default/1_1/* a resources/default/1_1/* siguiente manera:

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

Entonces, el último ejemplo de marcado generaría el siguiente HTML:

    

Esto obligará al navegador web a solicitar el recurso directamente desde el servidor en lugar de mostrar el que tiene el mismo nombre de la memoria caché, cuando la URL con el parámetro modificado se solicitó por primera vez. De esta forma, los usuarios finales no están obligados a realizar una actualización (Ctrl + F5, etc.) cuando necesitan recuperar el recurso CSS / JS actualizado.

Tenga en cuenta que la versión de la biblioteca no es posible para los recursos incluidos en un archivo JAR. Necesitarías un ResourceHandler personalizado. Consulte también Cómo usar el control de versiones JSF para recursos en jar .

Ver también:

  • Versiones de recursos JSF
  • Almacenamiento en caché de recursos estáticos JSF2
  • Estructura para múltiples proyectos JSF con código compartido
  • Especificación JSF 2.0 – Capítulo 2.6 Manejo de recursos