Согласно Вопросам и ответам здесь, я хотел бы реализовать подобную автосистему управления версиями для веб-приложения, работающего в JBoss 5. Там что-нибудь должно уже там сделать этот вид вещи, или я должен буду записать что-то сам? Быть ясным: Я не использую PHP.
Не зная очень о PHP, я не уверен что аналоги Tomcat/JBoss PHP's .htaccess
, и т.д. Если бы я действительно должен записать свое собственное автоуправление версиями, где я запустил бы? Принцип ясен мне - перезапись URL с помощью метки времени файла, но я не знаю много о перезаписи URL с JBoss/Tomcat.
При объединении подходов, рекомендуемых Паскалем и новичком, вот то, с чем я закончил:
1. Пользовательский
и
теги, таким образом, я не должен был бы видеть
теги везде.
<%@ tag body-content="empty" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ attribute name="src" required="true" rtexprvalue="true" %>
">
2. Следующее справедливо тесно к шагам новичка, но отображению UrlRewriteFilter
кому: /*
в web.xml:
UrlRewriteFilter
/*
3. Вводя переменную CACHE_BUST к каждой новой сессии (более или менее...), приложение развертывается
метка времени:
// On application deploy:
long CACHE_BUST = System.currentTimeMillis() / 1000;
// later...
session.setAttribute("cacheBust", CACHE_BUST);
4... так, чтобы я мог использовать эти правила в urlrewrite.xml
:
^/static/(css|js|images)/(.*)$
%{context-path}/static/%{session-attribute:cacheBust}/$1/$2
^/static/\d{10}/(css|js|images)/(.*)$
/static/$1/$2
Если вы не хотите, чтобы ваше приложение запускалось с использованием Apache HTTPD, вы можете использовать настраиваемый фильтр сервлетов или повторно использовать существующий фильтр перезаписи URL . Этот фильтр основан на Apache mod_rewrite
и предлагает аналогичные возможности. Другими словами, это позволило бы реализовать то же решение, что и другой ответ PHP.
Я уже видел фильтр перезаписи URL. Не могли бы вы рассказать, как я это использую? Я действительно не понимаю, как применить фильтр к этой проблеме, поскольку я бы не стал вызывать функцию JSP / JSTL, обернутую вокруг каждого включенного файла JS / CSS, и я не знаю, как получить дата изменения из файла, находящегося в WAR.
Что ж, идея заключалась в том, чтобы точно имитировать «PHP-решение» ответа, на который вы ссылаетесь (назовем этот вариант 1):
/ css / my.123456.css
в / css / my.css
сервлет
, который получит объект File
для данного ресурса внутри WAR и вставит File # lastModified ()
в возвращенный путь к этот ресурс. сервлет
из JSP для CSS. Другой подход (вариант 2) заключался бы в добавлении уникальной строки запроса к URL-адресу статического содержимого, например время запуска сервера:
ServletContextListener
(скажем, под ключом «ключ»
). В вашем JSP
Pro : больше не нужно перезаписывать URL. Против: Менее оптимально (контент будет запрашиваться при перезапуске), но приемлем.
При поиске в Интернете кода, который мог бы помочь реализовать шаг №2 варианта 1, я обнаружил Spring o.s.w.s.ResourceServlet
, который делает нечто подобное, вы можете посмотреть его исходный код. Но, более внимательно читая его javadoc, я понял, что этот сервлет на самом деле именно то, что вы ищете. Сопоставьте это следующим образом:
<servlet>
<servlet-name>Resource Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.ResourceServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Resource Servlet</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
И установите для его свойства applyLastModified
значение true
. Насколько я понимаю, javadoc должен помочь. Это вариант 3, и это лучший вариант IMO, если добавление зависимости от этого сервлета не является проблемой.
В нашем веб-приложении мы делаем следующее: