2010-11-24 56 views
9

Je commence à travailler avec JSF 2 donc je voulais essayer h: outputStylesheet. Cela fonctionne bien mais j'ai essayé d'appliquer le "pattern" ou l'astuce d'ajouter une chaîne de requête à la requête qui change avec la version du fichier pour forcer les navigateurs à aller chercher les changements.Comment puis-je implémenter "CSS versioning" (pour résoudre les problèmes de cache) en utilisant JSF 2 h: outputStylesheet?

Quelque chose comme what is used here.

Malheureusement je n'ai pas été capable de le faire. En fait, lorsque vous utilisez cette balise, elle ne génère pas une URL simple mais une URL calculée qui contient déjà une chaîne de requête. J'ai trouvé quelques informations sur le versioning des ressources dans JSF 2 à la fois dans la spécification et here, mais il semble se référer à plusieurs versions d'une ressource qui n'est pas ce dont j'ai besoin.

Bien sûr, je peux toujours revenir à ne pas utiliser le nouveau tag. Mais je voulais partager ceci ici pour la discussion.

Mise à jour 1 - quelques exemples:

Ce que j'ai essayé est quelque chose comme ceci:

<h:outputStylesheet library="css" name="estilo.css?v=1" target="head"/> 

Ce qui rend comme:

<link type="text/css" rel="stylesheet" href="RES_NOT_FOUND" /> 

Très descriptif. ;-)

Ce que j'essaie d'obtenir est quelque chose comme ceci:

<link rel="stylesheet" type="text/css" href="../css/estilo.css?v=1"/> 

qui, en utilisant JSP, je mettais cette façon:

<link rel="stylesheet" type="text/css" 
href="<c:url value='/css/estilo.css?v=${initParam.version}'/>"/> 
+0

Pouvez-vous envoyer un exemple de ce que vous avez essayé? :) –

+0

Reeeally curieux à ce sujet. Cette fonctionnalité doit être intégrée dans chaque structure Web. Ajoutez-vous déjà l'en-tête HTTP expire aux ressources statiques ou pourquoi avez-vous besoin de cela (sinon les clients feraient toujours une demande pour vérifier si les fichiers ont changé et mettre à jour s'ils en ont ... ne le feraient-ils pas)? –

+0

Mise à jour avec quelques exemples. – sargue

Répondre

7

face au même défi, j'ai fini en augmentant javax.faces.application.ResourceHandlerWrapper and javax.faces.application.ResourceWrapper pour ajouter "& v = xyz" au résultat de ResourceWrapper#getRequestString(). J'ai vu ce type de solution implémenté par Primefaces et Openfaces. juste jeter un oeil à la source de

org.primefaces.application.PrimeResourceHandler#createResource(String resourceName, String libraryName) 

et

org.primefaces.application.PrimeResource#getRequestPath() 

Available here.

Ne pas oublier d'ajouter votre implémentation aux faces-config.xml:

<application> 
    <resource-handler>your.package.YourResourceHandlerWrapper</resource-handler> 
</application>