9
votes

Version automatique de contenu statique avec JBoss

Selon le Q & A ici , j'aimerais implémenter un système de versement automatique similaire pour une application Web en cours d'exécution dans JBoss 5. Y a-t-il déjà quelque chose pour faire ce genre de chose, ou devrai-je écrire quelque chose moi même? Pour être clair: Je n'utilise pas php. Strong>

Ne pas savoir grand chose sur PHP, je ne suis pas sûr de quoi les analogues Tomcat / JBoss de PHP .htaccess CODE>, etc. . sommes. Si je dois écrire ma propre version automatique, où puis-je commencer? Le principe est clair pour moi - réécrire l'URL à l'aide de l'horodatage du fichier, mais je ne sais pas grand chose à propos de la réécriture de l'URL avec JBoss / Tomcat. P>


Mise à jour: H2>

Combinaison Les approches recommandées par Pascal et Novice , voici ce que j'ai fini avec: p> 1. strong> personnalisé code> et code> tags, donc je n'aurais donc pas à voir CODE> Tags partout. p>

<outbound-rule>
    <from>^/static/(css|js|images)/(.*)$</from>
    <to>%{context-path}/static/%{session-attribute:cacheBust}/$1/$2</to>
</outbound-rule>

<rule>
    <from>^/static/\d{10}/(css|js|images)/(.*)$</from>
    <to>/static/$1/$2</to>
</rule>


0 commentaires

3 Réponses :


3
votes

Si vous ne voulez pas avoir avant votre application avec Apache httpd, vous pouvez utiliser un filtre de servlet personnalisé ou réutiliser le URL Réécrire le filtre . Ce filtre est basé sur l'Apache mod_rewrite et offre des capacités similaires. En d'autres termes, il permettrait d'implémenter la même solution que la PHP une des autres réponses.


J'ai vu le filtre de réécriture URL avant. Pourriez-vous élaborer comment j'utiliserais cela? Je ne suis vraiment pas clair sur la façon dont j'appliquerais un filtre à ce problème, car je n'appellerais pas exactement une fonction JSP / JSTL enveloppée autour de chaque fichier JS / CSS inclus, et je ne sais pas comment obtenir le Date modifiée d'un fichier qui est en guerre.

Eh bien, l'idée était d'imiter exactement la "solution php" de la réponse que vous avez liée (appelons cette option 1):

  1. Configurez le filtre de réécriture d'URL pour réécrire toute demande de Dire /css/my.123456.css dans /css/my.css
  2. implémente un servlet qui obtiendrait un objet objet pour une ressource donnée à l'intérieur de la guerre et insérer fichier # lastmodified () dans le retour voie vers cette ressource.
  3. invoquez ce servlet du JSP pour le CSS.

    Une autre approche (option 2) serait d'ajouter une chaîne de requête unique à l'URL du contenu statique, par exemple L'heure de démarrage du serveur:

    1. Mettez l'heure de démarrage du serveur dans la portée de l'application à partir d'un servleContextExtener (par exemple sous la touche " Key ").
    2. en vous JSP XXX

      pro: aucune URL réécrit plus de choses. Con: Moins optimal (le contenu sera demandé sur le redémarrage) mais acceptable) mais acceptable.


      Tout en recherchant sur le Web pour un certain code qui pourrait aider à mettre en œuvre l'étape 2 de l'option 1, j'ai trouvé le printemps OSWSRESURRESServille qui fait quelque chose de similaire, vous pouvez regarder son code source. Mais, tout en lisant son Javadoc plus avec précaution, j'ai réalisé que ce servlet est en fait exactement ce que vous recherchez. Cartographiez-la comme ceci: xxx

      et définir son ApplastModified propriété sur true . Ma compréhension de la Javadoc est que cela devrait faire l'affaire. Ceci est l'option 3 et c'est imo la meilleure option si l'ajout d'une dépendance sur ce servlet n'est pas un problème.


1 commentaires

J'ai déjà vu le filtre de réécriture d'URL auparavant. Pourriez-vous élaborer comment j'utiliserais cela? Je ne suis vraiment pas clair sur la façon dont j'appliquerais un filtre à ce problème, car je n'appellerais pas exactement une fonction JSP / JSTL enveloppée autour de chaque fichier JS / CSS inclus, et je ne sais pas comment obtenir le Date modifiée d'un fichier qui est en guerre.



1
votes

Nous faisons ce qui suit dans notre application Web:

  1. Build Process récupère le numéro de référentiel Subversion et le stocke dans une propriété de l'application Web.
  2. Build Process crée également une structure de répertoires pour des actifs statiques dans la guerre qui intègre ce numéro de révision: / Actifs / 1234 / Styles /...
  3. Filtre / Intercepteur met le chemin des actifs (y compris le numéro de révision) dans toutes les demandes d'attribut
  4. Les modèles JSP utilisent cet attribut de chemin d'accès à la construction d'URL pour les actifs

2 commentaires

Ce n'est pas si utile. Comme je l'ai dit, je reçois le principe; Je cherche des spécificités de la mise en œuvre.


Je ne suis pas au courant de rien "intégré" qui gère spécifiquement ce problème. Ce que j'ai décrit ci-dessus, c'est exactement notre mise en œuvre et fonctionne assez bien pour nous.



4
votes

solution suivante est mieux adaptée dans un environnement de production que vous seriez incrémentant le numéro de version pour chaque version

Approche:. Strong> p>

  • append le numéro de version du produit (numéro de version) aux js / css / images / urls de contenu statique dans les fichiers jsp li>
  • navigateur ne cache (js / css / statique) fichiers avec l'URL contenant le numéro de version li>
  • quand une nouvelle version est disponible, les fichiers jsp aura les urls de js / css / fichiers statiques avec le nouveau numéro de version, de sorte que le navigateur fera un appel car il ne trouve pas le contenu de la nouvelle URL li> Ul>

    Étapes: strong> p>

    • inclure urlrewritefilter.jar dans le chemin de classe (obtenir de http://www.tuckey.org/ UrlRewrite / ) li>
    • update web.xml avec le motif d'URL, pour par exemple, p> XXX PRE> LI>

    • 'mise à jour' abc.js dans le fichier JSP, pour par ex., P> XXX PRE> LI>

    • urlrewritefilter.xml d'écriture, pour par ex., P>

      p>

      <outbound-rule>
          <from>^/v/(css|js|static)/(.*)$</from>
          <to>%{context-path}/v/updateVersionNumberHere/$1/$2</to>
      </outbound-rule>
      
      <rule>
          <from>^/v/updateVersionNumberHere/(css|js|static|images)/(.*)$</from>
          <to>/$1/$2</to>
      </rule>
      


2 commentaires

Cela semble très prometteur. Va tester dès que possible. Peut combiner avec la suggestion de temps de démarrage du serveur de @ Pascal.


Cela l'orthographié magnifiquement. Merci!